TokenCounter の実装
SplitPlainTextParagraphs メソッドで正しくトークンをカウントするために必要な tokenCounter パラメーターはソースコードを確認すると、string を受け取り、int を返すデリゲートになっており、文字列内のトークンをカウントする関数を与える必要があります。指定しない場合は、デフォルトのカウンターが使用されますが、意図しないカウントをされてしまう可能性があります。
よって、自分がデプロイした Enbedding モデルに適合したトークンカウンターのデリゲートを渡すようにします。
トークンカウンターは、ベクトルインデックス作成時の embedding モデルに合わせる必要があります。
デリゲートは、Tokenizer のライブラリを利用して作成します。
Tokenizer のライブラリ
Tokenizer のライブラリは Python では https://github.com/openai/tiktoken がスタンダードです。
github.com
C# には tiktoken をもとにした C# 実装の Microsoft.DeepDev.TokenizerLib がありますので、これを利用します。
github.com
作成した C# のソースコード
作成した C# のソースコードの詳細は以下の GitHub または下記を参照ください。EstimateTokens メソッドがトークンカウンターです。
(※クラスにはこのサンプルで使用する別のメソッドも実装してあります)
github.com
using Microsoft.DeepDev; namespace IndexCreator { public class TokenEstimator { ITokenizer tokenizer; public TokenEstimator(string modelToEncoding = "text-embedding-ada-002") { BuildTokenizer(modelToEncoding).Wait(); if (tokenizer == null) throw new Exception("Tokenizer is not built"); } async Task BuildTokenizer(string modelToEncoding) { tokenizer = await TokenizerBuilder.CreateByModelNameAsync(modelToEncoding); } public int EstimateTokens(string text) { return tokenizer.Encode(text).Count; } public string ConstructTokensWithSize(string tokens, int numberOfTokens) { var encodedTokens = tokenizer.Encode(tokens, Array.Empty<string>()); var newTokens = tokenizer.Decode(encodedTokens.Take(numberOfTokens).ToArray()); return newTokens; } } }