OpenAI的子詞標記化神器--tiktoken 以及 .NET 支持庫SharpToken

經過 Tokenize 之後,一串文本就變成了一串整數組成的向量。OpenAI 的 Tiktoken 是 更高級的 Tokenizer , 編碼效率更高、支持更大的詞彙表、計算性能也更高。 OpenAI在其官方GitHub上公開了一個開源Python庫:tiktoken,這個庫主要是用力做字節編碼對的。 字節編碼對(Byte Pair Encoder,BPE)是一種子詞處理的方法。其主要的目的是爲了壓縮文本數據。主要是將數據中最常連續出現的字節(bytes)替換成數據中沒有出現的字節的方法。該算法首先由Philip Gage在1994年提出。

下圖是tiktoken中公開的OpenAI所有大模型所使用的詞表。

image

可以看到,ChatGPT和GPT-4所使用的是同一個,名爲“cl100k_base”的詞表。而text-davinci-003和text-davinci-002所使用的是名爲”p50k_base“的詞表。

image

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;
   }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章