個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

C# だけで Azure OpenAI の RAG を試してみたい (3)TokenCounter の実装

 
前の記事
hiro128.hatenablog.jp
 

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

 
次の記事
hiro128.hatenablog.jp