AIのトークンとは?日本語が不利になる理由
画像出典: 写真: Ph0kin(CC BY-SA 3.0 / Wikimedia Commons)
トークンとは、AIが文章を処理するときの最小単位です。1文字でも1単語でもなく、英語は「1単語≒1トークン」に近い一方、日本語は「1文字≒1〜3トークン」になりやすいという偏りがあります。この偏りは、API料金と、一度に渡せる文章量の両方に効いてきます。
トークンは文字数でも単語数でもない、AI独自の単位です。だから「3000文字くらいだから大丈夫だろう」という見積もりは、そもそも別の物差しで測っていることになります。しかも日本語は、この物差しの上でかなり不利な位置に立たされています。
正直なところ、トークンは知らなくてもAIは使えます。ただ、料金が思ったより高い、長い資料が丸ごと入らない、といった場面にぶつかったとき、原因が説明できるかどうかで打てる手が変わります。ここでは分割のしくみから順に見ていきます。
トークンとは何か?文字数・単語数とどう違う?
トークンとは、AIが文章を処理するときに扱う単位のことです。OpenAIの公式ヘルプでは、トークンは言語や文脈によって1文字より短いこともあれば、単語1つより長いこともあると説明されています。つまり「1トークン=○文字」という固定の換算はありません。
ここで前提を合わせておきます。AIは文章を、私たちが読むような文字の並びとしては受け取っていません。入力された文章をまずトークンの列に切り分け、そのトークンに割り当てられた番号として処理します。私たちが見ている「文字」と、AIが見ている「トークン」は、最初から別のものなのです。
イメージとしては、文章をレゴブロックに組み替える作業に近いところがあります。ブロックの種類はあらかじめ決まっていて、その決まった種類の組み合わせだけで文章を表現し直す。よく使われる形のブロックは大きな1個で済み、めったに出てこない形は小さなブロックを何個も重ねて作ることになります。
- 文字数:人間が数える単位。「こんにちは」は5文字
- 単語数:意味のまとまりで数える単位。英語の課金などで使われる
- トークン数:AIが処理する単位。文字とも単語とも一致しない
なぜ日本語はトークンを多く消費するのか?
日本語と英語では、トークンあたりに詰め込める情報量が違います。英語はおおむね「1単語≒1トークン」に近い分割になりやすいのに対し、日本語は「1文字≒1〜3トークン」になる傾向があります。さらに細かく見ると、ひらがなは1文字あたり1〜2トークン、漢字は1文字あたり1〜3トークンとされています。
同じ内容を書いた文章なら、日本語のほうが文字数は少なく収まることが多いはずです。それでもトークン数では逆転しうる、というのがここでの厄介なところです。
BPEという分割方式が原因の中心にある
この差はどこから生まれるのか。鍵になるのがBPE(Byte Pair Encoding)という、文章をトークンに切り分ける方式です。名前は難しそうですが、やっていることは単純で、「よく一緒に出てくる並びを、1つのまとまりとして登録しておく」という仕組みです。
処理の流れは「文字 → UTF-8というルールでバイト列に変換 → よく出てくるバイトの並びをまとめる(BPE)→ トークン」となります。ここで効いてくるのが「よく出てくる」の基準が、学習に使った文章の集まりで決まるという点です。
GPT系のトークナイザー(文章をトークンに切り分ける部品)は、主に英語中心の大規模なテキストで語彙を作っています。だから英単語やその一部は「よく出てくる並び」として1トークンに登録されていることが多い。一方、日本語の漢字はUTF-8で複数バイトを使ううえ、学習した文章の中での出現頻度も英語ほど高くありません。結果として、細かいバイト単位のまま複数トークンに分かれることになり、漢字1文字が最大3トークンになることもあります。
ただし、いつも不利というわけではありません。日本語でも頻繁に現れる並びであれば、5文字分のまとまりが丸ごと1トークンになることもあります。よく使われる表現ほど効率よく詰め込まれる、という理屈自体は日本語にも働いています。
トークン数が多いと実務では何が起きるのか?
ここまでは分割のしくみの話でした。では、それが実際の作業にどう跳ね返るのか。影響は大きく2つです。
- 料金が割高になりやすい:APIがトークン数で課金される場合、同じ内容でも日本語のほうが多く課金されうる
- 一度に渡せる文章量が減る:コンテキストウィンドウ(一度に扱えるトークンの上限)に収まる実質の分量が、英語より少なくなる
2つ目のほうが、日常的には効いてきます。長い議事録や資料を丸ごと貼りつけたつもりが上限に届いてしまう、あるいは長い会話の途中で最初の指示が押し出されてしまう、といった現象の背景にはこの偏りがあります。上限そのものの話はコンテキストウィンドウの記事で詳しく扱っています。
「文字数」で見積もると外れる
実務上いちばん大事な結論は、文字数を物差しに使わないことです。「1トークン=○文字」の固定換算がない以上、文字数からの逆算はどうしてもぶれます。漢字の多い硬い文章と、ひらがな中心のやわらかい文章では、同じ文字数でもトークン数が変わってきます。
トークン数を実際に確認するにはどうすればいい?
OpenAIは公式ツールとしてTokenizer(platform.openai.com/tokenizer)を公開しています。テキストを貼りつけると、その場でトークン数と、どこで区切られたかを確認できます。
- 普段使う文章を貼るいつも投げているプロンプトや、扱う資料の一部をそのまま入力します。
- トークン数と文字数を見比べる自分の書き方で「文字数の何倍くらいのトークンになるか」の感覚をつかみます。
- 区切り位置を眺める漢字がどう分割されているか、逆にどんな並びが1トークンにまとまっているかを見ておくと、次からの見積もりが速くなります。
- 冗長な表現を削って再測定する回りくどい言い回しを削るだけでトークンが減ります。効果を数字で確認できます。
一度自分の文章で測っておくと、「この長さならだいたい何トークン」という体感が持てます。トークンは、見積もる前に一度実測しておくだけで扱いやすくなる単位です。
チャット画面で短いやり取りをしているだけなら、トークンを意識する必要はほとんどありません。トークン数が実際に効いてくるのは、APIを従量課金で使っている場合と、長い資料をまとめて処理させたい場合です。逆に言えば、その2つに当てはまらないうちは、しくみを知っておくだけで十分です。
また、ここで挙げた「1文字≒1〜3トークン」といった数値は傾向であって、固定の換算式ではありません。モデルやトークナイザーの世代によって分割の仕方は変わるため、正確に知りたいときは必ず実際のツールで測ってください。
トークンを知ると、AIの見え方が変わる
トークンは料金や上限の話として登場することが多いのですが、もとをたどればAIが文章をどう受け取っているかという、動作の根っこにある単位です。AIは次に来るトークンの確率を予測して1つずつ出力を伸ばしていく仕組みで動いており、その予測の単位こそがトークンです。
だから「日本語だとトークンを食う」という現象は、料金表の都合ではなく、AIの内部で文章がどう切り分けられているかの反映だと言えます。しくみのほうから見たい人は次の単語予測の記事もあわせてどうぞ。
よくある質問
1トークンは日本語で何文字ですか?
固定の換算はありません。日本語ではひらがなが1文字あたり1〜2トークン、漢字が1文字あたり1〜3トークンになる傾向があります。正確な数を知りたい場合は、OpenAI公式のTokenizerツールに実際の文章を入力して確認してください。
なぜ日本語は英語よりトークンを多く消費するのですか?
GPT系のトークナイザーはBPE(Byte Pair Encoding)という方式で、主に英語中心の大規模テキストから語彙を作っています。そのため英単語は1トークンにまとまりやすい一方、日本語の漢字はUTF-8で複数バイトを使い、学習データでの出現頻度も相対的に低いため、より細かい単位に分割されやすくなります。
トークン数を事前に確認する方法はありますか?
OpenAIが公式ツール「Tokenizer」(platform.openai.com/tokenizer)を提供しています。任意のテキストを入力すると、リアルタイムでトークン数と分割位置を確認できます。
トークン数が多いと具体的に何が困りますか?
主に2つです。1つはAPIがトークン数で課金される場合にコストが割高になること、もう1つはコンテキストウィンドウ(一度に扱えるトークンの上限)に収まる実質の文章量が少なくなることです。
※記事で使用した内容・数値は変更される場合があります。最新情報は公式サイトをご確認ください。