トークンは、言語モデルがテキストを読み書きする単位です。モデルがプロンプトを受け取る前に、tokenizer がテキストを断片に切り、各断片を語彙表の番号に置き換えます。API の料金もレート制限もコンテキストウィンドウも、この数で決まります。以下の数字はすべてトークン数カウンターで計測したもので、OpenAI の tiktoken、DeepSeek 公式の tokenizer と同じ結果です。
日本語はどう切られるか
「東京の天気は晴れ」(8 文字)を 3 つの tokenizer で数えます。
| tokenizer | 主なモデル | トークン数 |
|---|---|---|
| o200k_base | GPT-5.x、GPT-4.1、GPT-4o | 7 |
| DeepSeek V4 | deepseek-flash、deepseek-v4-pro | 7 |
| cl100k_base | GPT-4、GPT-3.5 Turbo | 10 |
GPT-4 の cl100k_base は語彙が約 10 万で、語彙にない漢字を UTF-8 のバイト単位に分けます。GPT-4o 以降の o200k_base は約 20 万語彙で、同じ文が 7 トークンに減ります。
短いあいさつでは順位が入れ替わります。「こんにちは、世界」は o200k_base で 3、cl100k_base で 5、DeepSeek V4 で 7 トークンです。
tokenizer が区切りを決める仕組み
GPT と DeepSeek の tokenizer はバイトレベルの BPE(byte pair encoding、Sennrich ら 2016 年の論文)です。
- 正規表現でテキストを単語、数字、記号、空白などのまとまりに粗く分けます。まとまりをまたいだ結合はしません。DeepSeek V4 はさらに、漢字・ひらがな・カタカナが続く部分を独立したまとまりとして切り出します。
- 各まとまりを 1 バイトずつから始め、学習で決まった順位の高い隣接ペアを繰り返し結合します。
語彙数は cl100k_base が 100,277、o200k_base が 200,019、DeepSeek V4 が 129,280 です(特殊トークンを含む)。
文字数からの概算はどれくらいずれるか
各社の資料には目安が書かれています。Google は Gemini について「1 トークンは約 4 文字」、Anthropic は英語で「約 4 文字、0.75 語」、DeepSeek は「英字 1 文字は約 0.3 トークン、漢字 1 文字は約 0.6 トークン」。いずれも、実際の数は API の返す値を正とするとしています。カウンターの日本語サンプル(275 文字)で比べると次のとおりです。
| 数え方 | トークン数 |
|---|---|
| 「4 文字で 1 トークン」の概算 | 69 |
| DeepSeek V4(正確) | 180 |
| o200k_base(正確) | 189 |
| cl100k_base(正確) | 242 |
日本語では「4 文字で 1 トークン」は実際の 4 割にも届きません。モデルを比べるときは、実際の文章をそれぞれの tokenizer で数えてから単価を掛けます。
Claude と Gemini はローカルで動かせる tokenizer が公開されていません。Anthropic は、Claude 4.7 以降は新しい tokenizer で同じテキストのトークンが約 30% 増えると説明しています。古いモデルで数えた値を新しいモデルの見積もりに使うとずれます。
コードで数える
OpenAI のモデルは tiktoken(0.14.0)で数えます。
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
print(len(enc.encode_ordinary("東京の天気は晴れ"))) # 7
print(tiktoken.encoding_name_for_model("gpt-5.5")) # o200k_base
ユーザー入力には encode_ordinary() を使います。encode() は <|endoftext|> を含むテキストで ValueError になります。tiktoken の対応表に GPT-6 はありません。
DeepSeek はオフライン計算パッケージの tokenizer.json を tokenizers で読み込みます。パッケージのサンプルは transformers を使いますが、2026 年 10 月 1 日の確認では transformers 5.18.0 で中国語テキストが空のリストになりました。4.57.6 か tokenizers を直接使うと正しい ID が返ります。
from tokenizers import Tokenizer
tok = Tokenizer.from_file("deepseek_v4_tokenizer/tokenizer.json")
print(len(tok.encode("東京の天気は晴れ").ids)) # 7
Claude は POST /v1/messages/count_tokens(無料、結果は推定値とされています)、Gemini は models.countTokens を使います。OpenAI の POST /v1/responses/input_tokens は、ロールや区切りの書式トークン、画像、ファイル、ツール定義まで含めて数えます。
料金で気をつける点
- 出力は入力より高く、短いプロンプトでは回答の長さで料金が決まります。日本語サンプルに出力 1,000 トークンを足すと、gpt-5.5 では約 0.031 ドルのうち 0.03 ドルが出力です。
- gpt-5.5 と GPT-6 は入力 272,000 トークン超でリクエスト全体が入力 2 倍・出力 1.5 倍、gemini-3.1-pro-preview は 200,000 トークン超で単価が上がります。
- DeepSeek は日本時間の平日 10 時〜13 時と 15 時〜19 時以外が半額です。
関連ツール:単語・文字数カウンター、APIキーマスキング。