Byte Pair Encoding(BPE)に基づくサブワード分割アルゴリズム。テキストを統計的に最適なサブワード単位に分割し、LLMが処理可能なトークン列に変換する。GPT系のtiktoken、LLaMA系のSentencePieceが代表的な実装である。
BPEトークナイザーとは、Byte Pair Encoding(バイトペアエンコーディング)アルゴリズムを用いてテキストをサブワード単位に分割する自然言語処理の基盤技術である。GPT-4o・Claude 4・Gemini 2.0など2026年の主要LLMはすべてBPE派生のトークナイザーを採用している。
BPEは1994年にPhilip Gageがデータ圧縮アルゴリズムとして発表し、2016年にSennrichらが機械翻訳のサブワード分割に応用した。従来の単語単位分割では語彙外(OOV)問題が発生し、文字単位分割では系列長が爆発する。BPEはこの中間解として、頻出するバイト列(文字ペア)を繰り返し結合して最適な語彙を構築する。
学習手順は単純である。初期語彙をUTF-8バイト(256種)に設定し、コーパス中で最頻出のバイトペアを結合して新トークンを追加する操作を、目標語彙サイズに達するまで繰り返す。GPT-4oのtiktoken(cl100k_base)は約100,256トークンの語彙を持つ。
| トークナイザー | 開発元 | 語彙サイズ | 採用モデル | 特徴 |
|---|---|---|---|---|
| tiktoken (cl100k_base) | OpenAI | 100,256 | GPT-4o, GPT-4o mini | Rust実装で高速、日本語対応改善 |
| tiktoken (o200k_base) | OpenAI | 200,000 | o1, o3, GPT-4.1 | 多言語効率向上、日本語トークン数30%削減 |
| SentencePiece (BPE) | 32,000〜256,000 | LLaMA 3, Gemma 2 | 言語非依存、Unigram方式も選択可 | |
| HuggingFace Tokenizers | HuggingFace | 可変 | 各種OSSモデル | Rust実装、WordPiece/Unigramも対応 |
| Claude Tokenizer | Anthropic | 非公開 | Claude 4 Opus/Sonnet/Haiku | 日本語効率が高い独自BPE |
<|endoftext|>, <|im_start|> 等の制御トークンを語彙末尾に追加語彙サイズのトレードオフ:
日本語はスペース区切りがないため、BPEの分割品質が学習コーパスの日本語比率に強く依存する。
# tiktoken の使用例(Python)
import tiktoken
enc = tiktoken.encoding_for_model('gpt-4o')
tokens = enc.encode('自作PCのメモリ選び') # → [... 5トークン程度]
print(f'トークン数: {len(tokens)}')
print(f'デコード: {enc.decode(tokens)}')
処理速度の実測値(Apple M3 Pro、1MBテキスト):
Q1: BPEとWordPieceの違いは何か? A: BPEは頻出バイトペアを結合する方式、WordPieceは結合による言語モデル尤度の改善量で選択する方式。BERTがWordPiece、GPT系がBPEを採用。実用上の差は小さいが、BPEの方が実装が単純で高速。
Q2: トークナイザーの選択がLLMのコストにどう影響するか? A: 語彙サイズが大きいほど同じテキストを少ないトークンで表現でき、API課金が削減される。o200k_baseはcl100k_baseより日本語テキストのトークン数を約30%削減し、同じ処理でコストが3割安くなる。
Q3: カスタムトークナイザーを学習する意味はあるか? A: 特定ドメイン(医療・法律・プログラミング言語)に特化したモデルでは、ドメイン語彙をトークナイザーに含めることでトークン効率が10〜20%改善する。ただし既存モデルのファインチューニングではトークナイザー変更は非推奨。