tiktoken(ティックトークン)
OpenAIが開発したBPEベースの高速トークナイザーライブラリ。Rust実装のコアにPythonバインディングを提供し、GPT-3.5/4/4oのトークン数算出に使われる。
tiktokenとは
tiktokenは、OpenAIが2022年末にオープンソース公開したBPEトークナイザーライブラリです。Rust実装のコアエンジンにPythonバインディングを被せた構造で、SentencePieceやHugging Face tokenizersと比較して3〜6倍高速なエンコード/デコードを実現します。GPT-3.5、GPT-4、GPT-4oで使用されるトークナイザーのリファレンス実装として広く利用されています。
エンコーディング(語彙セット)
tiktokenは複数のエンコーディング(語彙セット)を提供しています。
| エンコーディング | 語彙サイズ | 対応モデル |
|---|---|---|
| cl100k_base | 100,277 | GPT-4, GPT-3.5-turbo, text-embedding-ada-002 |
| o200k_base | 200,019 | GPT-4o, GPT-4o-mini |
| p50k_base | 50,281 | text-davinci-003, Codex |
| r50k_base | 50,257 | GPT-2, GPT-3 |
cl100k_baseからo200k_baseへの進化
GPT-4oで採用されたo200k_baseは語彙を約2倍に拡大し、非英語言語(日本語、中国語、韓国語、アラビア語等)のトークン効率を大幅に改善しました。同じ日本語テキストに対してcl100k_baseの約60〜70%のトークン数で表現できるため、APIコストの削減にも寄与します。
基本的な使い方
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4o")
tokens = enc.encode("自作パソコンの組み立て方")
print(len(tokens)) # トークン数
print(tokens) # トークンIDのリスト
print(enc.decode(tokens)) # 元テキストに復元
トークン数の確認
OpenAI APIの課金はトークン数ベースのため、リクエスト前にトークン数を確認するのが実用上最も多いユースケースです。
def count_tokens(text, model="gpt-4o"):
enc = tiktoken.encoding_for_model(model)
return len(enc.encode(text))
cost_per_1k = 0.0025 # GPT-4o input
tokens = count_tokens(long_prompt)
estimated_cost = (tokens / 1000) * cost_per_1k
性能比較
| ライブラリ | 言語 | エンコード速度 | デコード速度 |
|---|---|---|---|
| tiktoken | Rust + Python | 約3.5M tokens/s | 約4.0M tokens/s |
| HF tokenizers | Rust + Python | 約2.0M tokens/s | 約2.5M tokens/s |
| SentencePiece | C++ + Python | 約1.0M tokens/s | 約1.2M tokens/s |
tiktokenの速度優位はRust実装のコアエンジンと正規表現ベースのpre-tokenization(事前分割)に起因します。テキストを正規表現パターンで大まかに分割してからBPEマージを適用するため、長いテキストでも効率的に処理できます。
他言語への対応
tiktoken自体はPythonライブラリですが、コミュニティによって各言語への移植が進んでいます。
- JavaScript/TypeScript: js-tiktoken(Deno/Node対応)
- Go: tiktoken-go
- Rust: tiktoken-rs(ネイティブ)
- Java: jtokkit
Webアプリケーションでリアルタイムにトークン数を表示したい場合、js-tiktokenをブラウザ上で動かすことも可能です。
OpenAI API開発での活用
プロンプトの最適化
モデルのコンテキストウィンドウ(GPT-4o: 128K tokens)に収まるようプロンプトを設計する際、tiktokenでトークン数を正確に把握することが不可欠です。
コスト見積もり
大量のAPIリクエストを送信する前に、tiktokenでバッチ全体のトークン数を事前計算し、コストを見積もれます。
チャンク分割
RAGパイプラインでドキュメントをチャンクに分割する際、文字数ではなくトークン数でチャンクサイズを制御することで、APIの入力制限を正確に管理できます。
FAQ
Q1: tiktokenはOpenAI以外のモデルにも使えますか?
tiktokenのエンコーディングはOpenAIモデル専用です。LLaMA系はSentencePiece、Mistral/Gemmaは独自のtokenizer.jsonを使うため、Hugging Face tokenizersの方が汎用的です。ただしトークナイゼーションの概念を理解する学習用としては有用です。
Q2: トークン数と文字数の換算目安は?
英語: 1トークン ≈ 4文字(0.75単語)。日本語: 1トークン ≈ 1〜2文字(o200k_baseの場合)。GPT-4oのo200k_baseでは日本語の効率がcl100k_baseより30〜40%改善されています。
Q3: tiktokenのインストール方法は?
pip install tiktoken で即座にインストールできます。Rustのビルド環境は不要で、事前にコンパイル済みのwheelがPyPIで配布されています。