トークナイゼーション:LLMがテキストを理解する最初のステップ

AIを知りたい
先生、ChatGPTなどのLLMは「トークン数」で料金が決まりますよね。そもそもトークンって何なんですか?

AIエンジニア
いい質問だね。LLMは人間のようにテキストをそのまま読むことができないんだ。トークナイゼーション(Tokenization)とは、テキストを「トークン」と呼ばれる小さな単位に分割する処理のことだよ。英語の場合、1トークンは大体1単語の4分の3くらいの長さで、「Hello」は1トークン、「unbelievable」は3トークンに分割されるんだ。

AIを知りたい
単語ごとに分けるのではなく、単語をさらに細かく分けることもあるんですか?

AIエンジニア
その通り。現代のLLMの多くは「サブワード分割」という手法を使い、頻出する部分文字列をトークンとして扱うんだ。例えば「playing」は「play」+「ing」の2トークンに分割される。こうすることで、語彙数を抑えながらも未知の単語にも対応できるんだよ。英語の100万単語を全て覚えるのは非効率だけど、3〜5万のサブワードトークンがあれば大半のテキストをカバーできるんだ。
トークナイゼーションとは。
トークナイゼーション(Tokenization)は、テキストを「トークン」と呼ばれる処理単位に分割する自然言語処理の基本操作です。大規模言語モデル(LLM)では、入力テキストをトークン列に変換してからモデルに入力し、モデルの出力もトークン列として生成されます。現代のLLMでは、BPE(Byte Pair Encoding)、WordPiece、SentencePieceなどのサブワード分割アルゴリズムが標準的に使用されています。GPT-4はcl100kベースのBPE、Claudeは独自のBPE、GeminiはSentencePieceを採用しています。トークン数はLLM APIの利用料金やコンテキストウィンドウの上限に直結するため、ビジネスでLLMを活用する際にはトークナイゼーションの理解が不可欠です。特に日本語は1文字あたりのトークン数が英語より多くなる傾向があり、コスト最適化の観点からも重要な知識です。
主要なトークナイゼーション手法の比較
LLMで使われるトークナイゼーション手法にはいくつかの種類があり、それぞれ特徴が異なります。
| 手法 | 開発元 | 仕組み | 採用モデル | 特徴 |
|---|---|---|---|---|
| BPE(Byte Pair Encoding) | Sennrich et al. (2016) | 頻出する文字ペアを順次マージ | GPT-4, Claude, Llama 3 | 最も広く使用、バランスが良い |
| WordPiece | Google (2016) | 尤度ベースで最適なサブワードを選択 | BERT, DistilBERT | ##プレフィックスで分割位置を表示 |
| SentencePiece | Google (2018) | 言語非依存のサブワード分割 | Gemini, T5, mBART | 前処理不要、多言語に強い |
| Unigram LM | Kudo (2018) | ユニグラム言語モデルに基づく確率的分割 | XLNet, ALBERT | 複数の分割候補を確率的に扱える |
| Byte-level BPE | OpenAI (2019) | バイト単位でBPEを適用 | GPT-2, GPT-3, RoBERTa | 未知文字なし、全Unicode対応 |

AIを知りたい
日本語のトークナイゼーションは英語と違うんですか?「日本語は不利」と聞いたことがあるのですが。

AIエンジニア
鋭い指摘だね。日本語は英語と比べて1文字あたりのトークン消費量が多いというのは事実だよ。英語では「Hello」が1トークンだけど、日本語の「こんにちは」は3〜5トークンになることがある。これはBPEの学習データに英語が多く含まれているため、英語のサブワードが効率的に圧縮される一方、日本語は漢字・ひらがな・カタカナの文字種が多く、効率が下がるんだ。GPT-4のcl100kトークナイザーでは改善が進んだけど、それでも同じ意味を表現するのに日本語は英語の1.5〜2倍のトークンを消費する傾向があるよ。
トークナイゼーションの実務的な影響とコスト最適化
LLM APIを業務で使う際、トークン数は直接コストに影響します。効率的な運用のためのポイントを整理します。
| 観点 | 影響 | 最適化のコツ |
|---|---|---|
| API利用料金 | 入力・出力トークン数に比例して課金 | プロンプトを簡潔に、不要な修飾を削除 |
| コンテキストウィンドウ | 最大トークン数を超えると処理不可 | 要約やチャンク分割で入力を圧縮 |
| レスポンス速度 | トークン数が多いほど生成が遅い | max_tokensパラメータで出力長を制限 |
| 日本語コスト | 英語の1.5〜2倍のトークンを消費 | 重要部分のみ日本語、定型文は短縮 |
| 特殊文字・コード | 記号やコードは想定外のトークン数になりがち | tiktokenなどで事前にトークン数を確認 |

AIを知りたい
トークン数を事前に確認する方法はありますか?

AIエンジニア
OpenAIのモデルなら「tiktoken」というPythonライブラリで正確にトークン数を計算できるよ。pip install tiktokenでインストールして、encoding.encode(text)でテキストをトークン列に変換すれば、そのリストの長さがトークン数になる。OpenAIの公式サイトにも「Tokenizer」というWebツールがあって、ブラウザ上でトークン分割を可視化できるよ。LLMを業務で活用するなら、トークナイゼーションへの理解は必須の基礎知識だから、ぜひ実際に試してみてね。

AIを知りたい
トークナイゼーションってLLMの裏側で行われる地味な処理だと思っていましたが、コストや性能に直結する重要な技術なんですね。tiktokenを使って自分のプロンプトのトークン数を確認してみます!
