正確なトークン数には、エンコーディングと対象範囲の指定が必要
2つのカウンターの数値が違っても、故障とは限りません。比較する前に、使うエンコーディングと数えている範囲を確認しましょう。
まず何の単位かを確認する
単語は読むための単位で、UTF-8のバイト数は符号化されたデータ量です。トークンへの分割はエンコーディングによって決まるため、すべての単語や文字に使える固定の換算率はありません。
ToolRoofは文字列をそのままcl100k_baseで数え、トークン数とバイト数を表示します。正確さはこのエンコーディングに対するもので、全モデル共通ではありません。別のモデルを選んでも、このカウンターの方式は変わりません。
見えている文章がリクエストの全部ではない
APIリクエストにはメッセージの役割、ツール定義、ファイル、構造上の情報などが加わります。段落の数が正しくても、リクエスト全体を測ったことにはなりません。
上限に近い場合は、提供元が対応するリクエストの計測方法や利用実績を確認します。一定の余裕を足すだけでは、未計測の部分をすべて含む保証になりません。
参考資料: OpenAI — Plain-text counts versus complete request token counts
計測した文字列をそのまま残す
空白、改行、文字の表現方法も入力の一部です。比較を再現できるよう、計測した版を保存してください。
カウンターはUnicodeの正規化や数字の置換を行いません。上限は20000 UTF-16コード単位であり、見た目の文字数やトークン数の上限とは別です。不正な文字列は黙って直さず、拒否します。
例:見た目が近くても内部の表現が違う
cl100k_baseではhello worldはUTF-8で11バイト、2トークンです。バイト数とトークン数は別の量です。
éをU+00E9で表すと1トークン、2バイトです。eの後にU+0301を置くと似た見た目でも2トークン、3バイトになります。言語の優劣ではなく、元の文字列とエンコーディングを計測結果に添える必要性を示す例です。