想在将 prompt 发给大模型之前用 C# 代码计算对应的 token 数量,请问如何计算?
通过下面的基于 Semantic Kernel 的代码可以拿到 OpenAI 计算出来的 prompt tokens,对于博客园是什么网站
提示词,token 数量是 29
var builder = Kernel.CreateBuilder();
builder.AddOpenAIChatCompletion("gpt-3.5-turbo", "******");
var kernel = builder.Build();
var result = await kernel.InvokePromptAsync("博客园是什么网站");
if (result.Metadata?.TryGetValue("Usage", out var value) == true &&
value is CompletionsUsage usage)
{
Console.WriteLine("Prompt tokens: " + usage.PromptTokens);
}
OpenAI 计算出来的 token 数量怎么这么多?使用阿里云 DashScope
+ 通义千问 qwen-max
计算出来的 token 只有 4
个
下面是通过 Semantic Kernel 获取 DashScope 基于通义千问 qwen-max 模型计算出来的 token 数量
var builder = Kernel.CreateBuilder();
builder.AddDashScopeChatCompletion("qwen-max", "sk-xxxxxx");
var kernel = builder.Build();
var result = await kernel.InvokePromptAsync("博客园是什么网站");
if (result.Metadata?.TryGetValue("Usage", out var value) == true &&
value is ChatTokenUsage usage)
{
Console.WriteLine("Prompt tokens: " + usage.InputTokens);
}
Console.WriteLine(result);
注:需要安装 nuget 包 Cnblogs.SemanticKernel.Connectors.DashScope
使用 one-api
+ DashScope
+ qwen-max
,计算出来的 token 变成了 11
个
通过这篇博文 Microsoft Semantic Kernel – Some Tips & Tricks To Get Prompt & Completion Tokens 发现一个开源库 Tiktoken
Tiktoken 计算出来的 token 数量是 11
,gpt-3.5-turbo
与 gpt=4
都是这个结果
var tokenCount = Tiktoken.Encoding.ForModel("gpt-3.5-turbo").CountTokens("博客园是什么网站");
在调用 OpenAI 的 API 时,返回的 token 数量可能会受到多个因素的影响,包括使用的模型、输入的 prompt 的复杂度等。不同的 API 和模型可能会采用不同的计算方式来确定 token 的数量。而且,不同的 API 提供商可能会在计算 token 数量时使用不同的标准。
在你的示例中,你使用了不同的 API(OpenAI 和阿里云)以及不同的模型(OpenAI 的 gpt-3.5-turbo 和阿里云的 qwen-max),这就解释了为什么得到的 token 数量不同。
针对你的问题,如果想在调用 OpenAI 的 API 之前计算 prompt 对应的 token 数量,你可以采用以下步骤:
确定使用的模型和 API。
编写代码,在发送 prompt 给模型之前对其进行分词或者其他方式的处理,以确定 token 数量。
根据 API 提供商的文档和规范,确保你的代码和 API 之间的交互满足其要求。
具体来说,你可以使用 C# 中的字符串处理方法来对 prompt 进行分词,然后计算分词后的 token 数量。例如,你可以根据空格将 prompt 分割成单词,然后统计单词的数量。注意,这只是一种简单的方法,具体的实现可能会因为模型的要求而有所不同。
另外,确保在与 API 交互时,按照 API 提供商的文档传递正确的参数,并处理返回结果。