正確なトークン数には、エンコーディングと対象範囲の指定が必要

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バイトになります。言語の優劣ではなく、元の文字列とエンコーディングを計測結果に添える必要性を示す例です。

参考資料