トークナイザ(トークナイザ)
トークナイザは、自然言語テキストをLLMが処理可能なトークン(数値ID)列に変換するコンポーネントで、BPE・WordPiece・Unigram等のアルゴリズムを用いてサブワード分割を行う。
トークナイザとは
トークナイザは、人間が読むテキスト文字列をLLM(大規模言語モデル)が処理できる数値トークンID列に変換する、自然言語処理の最も基礎的なコンポーネントである。すべてのLLMはトークナイザを持ち、入力テキストのエンコード(文字列→トークンID列)と出力のデコード(トークンID列→文字列)を担当する。GPT-4oはtiktoken(cl200k_base)、LLaMA 3はHuggingFace Tokenizers、Gemini 1.5 ProはSentencePiece等、モデルごとに異なるトークナイザを使用している。
トークナイザの役割と処理フロー
テキストがLLMで処理される全体フロー:
- 正規化: Unicode正規化(NFC/NFKC)、小文字化、特殊文字処理
- 前トークン化: 空白・句読点での初期分割(BPE系)、または生テキストのまま(SentencePiece)
- サブワード分割: BPE/WordPiece/Unigramアルゴリズムでサブワードに分割
- ID変換: 各サブワードを語彙テーブル内の整数IDにマッピング
- 特殊トークン付加:
[CLS]、[SEP]、<|endoftext|>等の制御トークンを追加 - テンソル化: トークンID列をモデル入力テンソルに変換
主要トークナイザの比較
| トークナイザ | 開発元 | 実装言語 | 採用モデル | 語彙サイズ | 処理速度 |
|---|---|---|---|---|---|
| tiktoken | OpenAI | Rust+Python | GPT-4o / GPT-4 | 200,000 / 100,256 | 最高速 |
| HuggingFace Tokenizers | HuggingFace | Rust+Python | LLaMA 3 / Mistral | 128,256 / 32,768 | 高速 |
| SentencePiece | C++ | LLaMA 2 / Gemma / T5 | 32,000-256,000 | 中程度 | |
| spaCy Tokenizer | Explosion | Cython | 各種NLPパイプライン | ルールベース | 高速 |
| MeCab + 辞書 | オープンソース | C++ | 日本語BERT | 辞書依存 | 高速 |
トークン数とコストの関係
LLM APIの料金はトークン数で課金されるため、トークナイザの効率が直接コストに影響する:
- GPT-4o(cl200k_base): 英語 約4文字/トークン、日本語 約1.5文字/トークン、入力$2.50/1Mトークン
- Claude 3.5 Sonnet: 英語 約4文字/トークン、日本語 約1.5文字/トークン、入力$3.00/1Mトークン
- Gemini 1.5 Pro: 英語 約4文字/トークン、日本語 約2文字/トークン、入力$1.25/1Mトークン
日本語は英語に比べて約2-3倍のトークン数が必要となるため、日本語中心のアプリケーションではコスト見積もりに注意が必要である。
トークナイザ選定の実践ガイド
用途別の推奨トークナイザ:
- 新規LLM学習: HuggingFace Tokenizersで独自BPE/Unigramを学習。語彙サイズは32K-128Kが目安
- OpenAI API利用: tiktokenでトークン数を事前計算し、コスト管理とプロンプト最適化に活用
- 多言語対応: SentencePieceのBPEモード+byte_fallback。語彙サイズは100K以上推奨
- 日本語NLP: MeCab前処理+WordPiece(BERT系)またはSentencePiece直接適用(LLM系)
- エッジ推論: 語彙サイズを16K-32Kに抑え、埋め込み層のメモリを削減
コンテキスト長とトークナイザの関係
モデルのコンテキスト長制限はトークン単位で定義される:
| モデル | コンテキスト長 | 日本語換算文字数(概算) |
|---|---|---|
| GPT-4o | 128,000トークン | 約192,000文字 |
| Claude 3.5 Sonnet | 200,000トークン | 約300,000文字 |
| Gemini 1.5 Pro | 2,000,000トークン | 約4,000,000文字 |
| LLaMA 3.1 | 128,000トークン | 約192,000文字 |
長文処理では、トークン数を正確に把握してコンテキスト窓に収めることが重要である。
よくある質問(FAQ)
Q1: トークナイザの語彙サイズが大きいほど良いのですか? A: 一概にそうとは言えない。語彙サイズが大きいと1トークンあたりの情報量が増えて効率的だが、埋め込み層のパラメータ数(語彙サイズ×埋め込み次元)が増大しメモリを消費する。GPT-4oの200Kは多言語対応の結果であり、英語特化なら50K程度で十分。
Q2: 同じ文章でもモデルによってトークン数が違うのはなぜですか? A: モデルごとにトークナイザのアルゴリズム・語彙・学習データが異なるため。例えば「機械学習」はGPT-4oでは2-3トークン、LLaMA 2では4-6トークンになる場合がある。API料金の見積もりには各モデル専用のトークンカウンタを使用すべき。
Q3: カスタムトークナイザを学習するメリットは何ですか? A: ドメイン特化語彙(医療用語、法律用語、プログラミング言語等)を効率的にトークン化できる。例えば、Codex系モデルではプログラミング言語のキーワードや構文を1トークンで表現するよう語彙が最適化されている。
まとめ
- トークナイザはテキストとLLMの間をつなぐ必須コンポーネント
- BPE(GPT系)、WordPiece(BERT系)、Unigram(T5系)が3大アルゴリズム
- 語彙サイズは圧縮効率・メモリコスト・多言語対応のトレードオフ
- API料金はトークン数課金のため、トークナイザ効率がコストに直結
- 日本語は英語比2-3倍のトークン数が必要な点に注意