🎃

Semantic Kernel でトークンを数える

2023/05/01に公開

以前 C# で Azure OpenAI Service のトークン数を数えよう という記事で Microsoft.DeepDev.TokenizerLib パッケージを使ってトークンをカウントする方法を紹介しました。今回は、Semantic Kernel を使ってトークンをカウントする方法を紹介します。

Semantic Kernel では Microsoft.SemanticKernel.Connectors.AI.OpenAI.Tokenizers 名前空間の GPT3Tokenizer クラスを使って数えることが出来ます。
Encode 静的メソッドを呼び出すと文字列をトークンに分割してくれるので、その数を数えるだけです。

using Microsoft.SemanticKernel.Connectors.AI.OpenAI.Tokenizers;

var tokenCount1 = GPT3Tokenizer.Encode("春は曙やうやう白くなりゆく山際少し明かりて紫立ちたる雲の細くたなびきたる。").Count;
Console.WriteLine(tokenCount1);

var tokenCount2 = GPT3Tokenizer.Encode(
    "祇園精舍の鐘の声、諸行無常の響きあり。娑羅双樹の花の色、盛者必衰の理をあらはす。驕れる人も久しからず、ただ春の夜の夢のごとし。猛き者もつひにはほろびぬ、ひとへに風の前の塵に同じ。").Count;
Console.WriteLine(tokenCount2);

実行結果は以下のようになります。

56
140

以前 Microsoft.DeepDev.TokenizerLib を使った記事の時とトークンの数が異なりますが、これは想定しているモデルが違うためです。
Microsoft.DeepDev.TokenizerLib を使った場合でもモデル名に text-davinci-003 を使用すると同じ結果になります。

以下のようなコードで確認してみました。

using Microsoft.DeepDev;
using Microsoft.SemanticKernel.Connectors.AI.OpenAI.Tokenizers;

CountToken("春は曙やうやう白くなりゆく山際少し明かりて紫立ちたる雲の細くたなびきたる。");
CountToken("祇園精舍の鐘の声、諸行無常の響きあり。娑羅双樹の花の色、盛者必衰の理をあらはす。驕れる人も久しからず、ただ春の夜の夢のごとし。猛き者もつひにはほろびぬ、ひとへに風の前の塵に同じ。");

void CountToken(string input)
{
    var tokenizer = TokenizerBuilder.CreateByModelName("text-davinci-003");
    var tokenCount1 = tokenizer.Encode(input, Array.Empty<string>()).Count;
    Console.WriteLine($"Microsoft.DeepDev.TokenizerLib(text-davinci-003): {tokenCount1}");

    var tokenCount2 = GPT3Tokenizer.Encode(input).Count;
    Console.WriteLine($"GPT3Tokenizer: {tokenCount2}");
}

実行すると以下のようになります。カウントされたトークン数が同じになっていることが確認できます。

Microsoft.DeepDev.TokenizerLib(text-davinci-003): 56
GPT3Tokenizer: 56
Microsoft.DeepDev.TokenizerLib(text-davinci-003): 140
GPT3Tokenizer: 140

まとめ

トークン数をカウントするときは、対象にするモデルにあわせたものを選びましょう。

Microsoft (有志)

Discussion