經過 Tokenize 之後,一串文本就變成了一串整數組成的向量。OpenAI 的 Tiktoken 是 更高級的 Tokenizer , 編碼效率更高、支持更大的詞彙表、計算性能也更高。 OpenAI在其官方GitHub上公開了一個開源Python庫:tiktoken,這個庫主要是用力做字節編碼對的。 字節編碼對(Byte Pair Encoder,BPE)是一種子詞處理的方法。其主要的目的是爲了壓縮文本數據。主要是將數據中最常連續出現的字節(bytes)替換成數據中沒有出現的字節的方法。該算法首先由Philip Gage在1994年提出。
下圖是tiktoken中公開的OpenAI所有大模型所使用的詞表。
可以看到,ChatGPT和GPT-4所使用的是同一個,名爲“cl100k_base”的詞表。而text-davinci-003和text-davinci-002所使用的是名爲”p50k_base“的詞表。
OpenAI 官方開源了Python版本, .NET社區 移植了https://github.com/dmitry-brazhenko/SharpToken, 它提供了使用基於 GPT 的編碼對令牌進行編碼和解碼的功能。此庫是爲 .NET 6 和 .NET Standard 2.1 構建的,使其與各種框架兼容。
下面是一個示例函數,用於對傳遞到 gpt-3.5-turbo-0381 或gpt-4-314 的消息的tokens進行計數。請注意,從消息中計算tokens的確切方式可能會因模型而異。將函數中的計數視爲一個估計值:
public int CountMessagesTokens(string Model ,string Messages)
{
int tokensPerMessage;
if (Model.StartsWith("gpt-3.5-turbo"))
{
tokensPerMessage = 5;
}
else if (Model.StartsWith("gpt-4"))
{
tokensPerMessage = 4;
}
else
{
tokensPerMessage = 5;
}
var encoding = GptEncoding.GetEncoding("cl100k_base");
int totalTokens = 0;
foreach (var msg in Messages)
{
totalTokens += tokensPerMessage;
totalTokens += encoding.Encode(msg.Content).Count;
}
totalTokens += 3;
return totalTokens;
}