3行でいうと

  • BPEは、よく出る文字の並びを順にひとまとめにして「語彙」を作る方法。語彙に載りにくい文字は、細かく切られる。
  • 論文(NeurIPS 2023)では、同じ内容を英語と比べたとき、日本語は旧来の切り方で約3.0倍、GPT-4系の切り方で約2.3倍のトークンだった。
  • OpenAIの2024年の発表では、新しい切り方で日本語の例文が37トークンから26トークンになった。
  • Claudeは、Opus 4.7以降の切り方で、同じ文章が従来より約30%多いトークンになると公式に書かれている。

この記事は、実際に使って確かめた記録ではありません。この記事は公式の文書や論文を読んでまとめたものです。

先に結論

前提:トークンとトークナイザー

BPEの仕組み

BPE(Byte Pair Encoding、バイト対符号化)は、もともとはデータ圧縮の技術でした。機械翻訳に応用したSennrichらの論文(ACL 2016)が、「よく出る並びを順に新しい記号にまとめる」やり方を説明しています。

  1. 最初の語彙を、1文字ずつにします。
  2. 文章の中で、隣り合う2つの記号の組を数え、いちばん多い組を、1つの新しい記号にまとめます。
  3. これを決めた回数だけ繰り返します。最終的な語彙の大きさは、最初の語彙と、合併の回数を足した数になり、合併の回数が唯一の調整値です、と論文は書いています。

頻繁に出る並び(よく使う単語など)は1つの記号にまとまります。まれな並びは、まとまらず小さな単位のまま残ります。「語彙に載りにくいものほど、細かく切られる」という性質は、この仕組みから出てきます。

小さな例で見るBPE

論文と同じ形の例です(単語と回数は論文の例を借りましたが、計算は僕らのものです)。単語「low」が5回、「lower」が2回、「newest」が6回、「widest」が3回、語末を表す記号を「·」とします。

合併の順 まとめる組 その組が出る回数 できる記号
1 e と s 9(newestとwidest) es
2 es と t 9 est
3 est と · 9 est·
4 l と o 7(lowとlower) lo
5 lo と w 7 low

同じ回数の組が並ぶときは、どれを先にするかで順番が変わります。論文の図でも、実装によって細かい違いがあります。

5回の合併のあと、「newest」は「n e w est·」、「widest」は「w i d est·」のように、よく出る語尾「est·」が1つの記号になります。「low」は1つの記号になりますが、まれな「lower」は「low e r ·」と細かい部分が残ります。

バイト単位のBPE

論文の元のやり方は、文字(Unicodeの符号位置)を単位にします。GPT-2の論文は、これだと世界中の文字を最初の語彙に入れる必要があり、13万個を超えてしまうと指摘しています。通常のBPEの語彙は3万2千〜6万4千個くらいだからです。そこで、バイト(情報量の最小の単位。0〜255の256通り)を単位にするBPEを使いました。256個の基本の記号で、どんな文字列も表せます。tiktokenのREADMEも、OpenAIのモデル向けのBPEのトークナイザーで、可逆で(元の文章に戻せる)、学習データにない文章も扱え、平均で1トークンが約4バイトに相当する、と説明しています。

なぜ日本語は多くなりやすいのか

文字がバイトにどう変わるかが、ひとつの手がかりです。UTF-8という文字の符号化の規格(RFC 3629)では、英字(ASCII)は1バイト、ひらがな・カタカナ・漢字のある範囲(U+0800〜U+FFFF)は3バイトで表されます。

見立てです。バイト単位のBPEでは、日本語の1文字は、そのまま語彙に載っていなければ最大3バイト分の小さな記号に分かれます。語彙に載っているのは、学習データによく出た並びです。学習データに日本語が少なければ、日本語の並びは載りにくく、細かく切られます。ただし、新しいトークナイザーでは、語彙に日本語の並びを多く載せる設計もあり得ます。実際の切り方は、トークナイザーごとに調べないと分かりません。

論文の実例があります。GPT-2のトークナイザーは、「言」という漢字を3トークンで表した、と書かれています。さらに、日本語の漢字の半分以上が3トークンを必要としたとも書かれています。

数字で見る:論文と公式の発表

論文:同じ文を各言語で比べた倍率

PetrovらのNeurIPS 2023の論文は、同じ内容を翻訳した文章(FLORES-200という多言語の対訳データ、同じ2000文)を各言語でトークン化し、英語との倍率(premium)を出しています。論文の要旨には、言語によって差は最大15倍、多言語を想定したトークナイザーでも差は残る、とあります。

日本語の欄は次のとおりです(英語を1.00とした倍率)。

トークナイザー 日本語の倍率
GPT-2、RoBERTa 3.00
ChatGPT、GPT-4(cl100k_base) 2.30

つまり、この論文の条件では、GPT-4系で同じ内容が英語の約2.3倍のトークンになります。

OpenAI:2024年のGPT-4oの発表

OpenAIの「Hello GPT-4o」には、新しいトークナイザーの圧縮の例が20言語分あります。2回の読み取りで同じ数字でした。

言語 発表の表記
日本語 1.4倍少ない(37から26トークン)
中国語 1.4倍少ない(34から24)
韓国語 1.7倍少ない(45から27)
英語 1.1倍少ない(27から24)

OpenAIは、この20言語を「新しいトークナイザーの圧縮を、いろいろな言語の系統で示すために選んだ」としています。例文1つずつの数字であり、日本語全体の平均ではありません。

Anthropic:Claudeの切り方の変更

Claude Platform Docsのトークン数えの文書には、Claude Opus 4.7以降のモデルは新しいトークナイザーを使い、同じ入力文が従来のモデルより約30%多いトークンになる(内容によって増え方は違う)、と書かれています。Fable 5.1、Mythos 5.1、Fable 5、Mythos 5も、同じトークナイザーを共有します。Sonnet 5.5の移行ガイドも、Sonnet 4.6やHaiku 4.5と比べて約30%多い、と書いています。

モデル一覧の注記には、コンテキストウィンドウ100万トークンは、現在のトークナイザーで、おおよそ55万5千語、またはUnicodeの文字で250万字、と書かれています。以前のモデルでは約75万語です。日本語に限った数字は、読んだ範囲にはありません。

料金と上限への影響

僕らの計算です。トークン数が増えると、入力料金もコンテキストの消費も、同じ比率で増えます。

項目 計算
同じ内容が2.3倍のトークンになる場合の入力料金 英語で1万トークンなら日本語で約2万3千トークン。Sonnet 5.5の入力(100万トークンあたり2ドル)で、0.02ドルと0.046ドル
同じ内容のコンテキストの消費 100万トークンの上限に対し、使える内容の量は約1/2.3
同じ文章で、切り方が約30%増えるモデルに移った場合 1万トークンが約1万3千トークン。入力料金も約1.3倍(出力の文章も同様の影響を受けるはずですが、出力側は読んだ文書に明記がありません)

倍率2.3は、英語との比較で、GPT-4系の論文の数字です。Claudeや最新のモデルにそのまま当てはまるとは言えません。

実務でのやり方(見立てです)

見立てです。以下は、読んだ文書から組み立てた考え方です。

  1. トークン数は文字数から推定せず、数えるAPIで測る。 OpenAIの文書は、文字数÷4のような推定は画像やファイルでは不正確とし、入力トークン数えのAPIを勧めています。AnthropicのトークンカウントAPIも、実際に使う model で数えるよう書いています。どちらも見積りであり、小さな誤差はあり得ると注意しています。
  2. モデルを替えるときは、同じ文章の数を再測定する。 Anthropicは、古いモデルで測った数を、新しいモデルの料金や上限の見積りに使い回さないよう書いています。
  3. 日本語の長い資料では、上限に余裕を持たせる。 英語で「入る」と思った量が、日本語では入らないことがあります。
  4. 同じ内容を短くできるなら、短くする。 トークン数は文章の長さにほぼ比例します。

つまずきやすい点

気をつけること

出典

更新履歴