トークン数の数え方と節約術:Tiktokenライブラリの使い方

AI開発、特にOpenAIのAPIを利用するプロジェクトにおいて、**「トークン(Token)」**の管理はコストとパフォーマンスの両面に直結する重要課題です。

「文字数」と「トークン数」はイコールではありません。日本語の場合、ひらがな1文字が1トークン以上になることもあれば、漢字が複数トークンになることもあります。このズレを正確に把握していないと、想定外の課金が発生したり、Context Windowの上限を超えてエラーになったりします。

本記事では、OpenAI公式のトークン計算ライブラリTiktokenの使い方と、実践的な節約術を解説します。

Tiktokenとは?

Tiktokenは、OpenAIが公開している高速なBPE(Byte Pair Encoding)トークナイザです。Python版が最も一般的ですが、RustやJavaScript版もあります。

基本的な使い方

pip install tiktoken
import tiktoken

def count_tokens(text: str, model: str = "gpt-4-turbo") -> int:
    try:
        encoding = tiktoken.encoding_for_model(model)
    except KeyError:
        # モデルが見つからない場合はcl100k_base(GPT-4系)を使用
        encoding = tiktoken.get_encoding("cl100k_base")
        
    tokens = encoding.encode(text)
    return len(tokens)

text = "こんにちは、世界!"
print(count_tokens(text)) 
# 出力例: 5 (モデルによって異なる)

実践的な節約テクニック

トークン数を減らすことは、コスト削減だけでなく、レスポンス速度の向上(レイテンシ低下)にも繋がります。

1. プロンプトの圧縮

指示内容(System Prompt)を簡潔にするだけで、数万リクエスト積み重なれば大きな差になります。

  • 「お願いします」「ください」を削除: AIに対する敬語はトークンの無駄です。命令形で記述しましょう。
  • 例示(Few-Shot)の厳選: 10個の例を提示するより、代表的な3個に絞った方が精度が高い場合もあります。

2. レスポンスの制限

max_tokens パラメータを設定するだけでなく、プロンプトで「箇条書きで3点のみ答えて」「JSON形式のキーのみ出力して(解説不要)」と制約をかけることで、無駄なおしゃべりを防げます。

3. RAGにおけるチャンク戦略

検索拡張生成(RAG)では、検索して取得したドキュメントをプロンプトに埋め込みます。この際、無関係なチャンクまで含めてしまうと、トークンを浪費するだけでなく、回答精度も下がります(Lost in the Middle現象)。

  • リランク(Rerank)の導入: ベクトル検索で取得した上位20件に対し、Cross-Encoderモデルで再ランク付けを行い、本当に関連性の高い上位5件のみをLLMに渡す。
  • メタデータの活用: 本文全体ではなく、要約(Summary)メタデータのみを先に検索対象とする。

まとめ:計測なくして改善なし

「なんとなく高い気がする」ではなく、Tiktokenを使ってリクエストごとの消費トークンをログに記録し、可視化環境(Dashboard)を作ることが第一歩です。

1トークンの重みを知るエンジニアこそが、持続可能なAIサービスを構築できるのです。