Token 是大模型读写文本的单位。模型看到 prompt 之前,分词器先把文本切成小段,再把每一段换成词表里的一个编号。API 按 token 计费,限速按 token 计算,上下文窗口也是 token 数的上限。下面的数字都来自 Token 计算器,与 OpenAI tiktoken、DeepSeek 官方分词器的结果一致。
一句中文被切成了什么
用 DeepSeek V4 的官方 tokenizer.json 切「什么是 AI 里的 token?」:
| 片段 | 什么是 | AI | | 里的 | token | ? |
|---|---|---|---|---|---|---|
| token id | 25043 | 7703 | 223 | 7210 | 17840 | 1148 |
16 个字符,6 个 token。「什么是」「里的」各占一个 token;「里」前面的空格单独成了一个 token,因为 DeepSeek 的分词规则先把连续的汉字和假名切成独立片段,空格不会和后面的汉字合并。同一句话在 GPT-4o 等模型用的 o200k_base 下是 7 个,在 GPT-4 用的 cl100k_base 下是 10 个。
cl100k_base 词表里没有的汉字会被拆成字节。「你好,世界!」在 cl100k_base 下是 7 个 token,其中「世」拆成了 E4 B8 和 96 两段,两段单独都不是完整的字。
分词器怎样决定切在哪里
GPT 和 DeepSeek 用的都是字节级 BPE(byte pair encoding,Sennrich 等人 2016 年的论文)。先用正则表达式把文本粗切成词、数字、标点、空白等片段,片段之间不会合并;再在每个片段内部从单个字节开始,反复合并词表里排名最靠前的相邻一对,直到没有可合并的对为止。
词表大小不同:cl100k_base 有 100,277 项,o200k_base 有 200,019 项,DeepSeek V4 有 129,280 项(都含特殊 token)。词表越大,能整块收下的中文词越多。
按字数估算差多少
各家文档都给了经验值:DeepSeek 说 1 个中文字符约 0.6 个 token、1 个英文字符约 0.3 个;Google 说 Gemini 约 4 个字符一个 token;Anthropic 说英文约 4 个字符一个 token。它们都补了一句「以接口返回为准」。用 Token 计算器自带的 192 字中英混排示例对比:
| 方法 | token 数 |
|---|---|
| 按「4 个字符一个 token」估算 | 48 |
| DeepSeek V4 精确 | 111 |
| o200k_base 精确 | 133 |
| cl100k_base 精确 | 172 |
按 4 个字符估算只有实际的一半不到;三个分词器之间也差了 55%。比较不同厂商的价格,要先用各自的分词器数,再乘单价。
Claude 和 Gemini 没有公开可在本地运行的分词器。Anthropic 说明 Claude 4.7 及以后的模型换了新分词器,同一段文本约多 30% 的 token,所以去年模型上数出的 token 数不能直接套到今年的模型上。
在代码里精确计数
OpenAI 模型用 tiktoken(0.14.0):
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
print(len(enc.encode_ordinary("你好,世界!"))) # 4
print(tiktoken.encoding_name_for_model("gpt-5.5")) # o200k_base
用户输入请用 encode_ordinary();encode() 遇到 <|endoftext|> 会抛 ValueError。tiktoken 的对照表里没有 GPT-6,OpenAI 没有公开它的分词器。
DeepSeek 用离线计数包里的 tokenizer.json:
from tokenizers import Tokenizer
tok = Tokenizer.from_file("deepseek_v4_tokenizer/tokenizer.json")
print(tok.encode("什么是 AI 里的 token?").ids)
# [25043, 7703, 223, 7210, 17840, 1148]
计数包的示例脚本用 transformers 加载。2026 年 10 月 1 日实测,transformers 5.18.0 对这个包里的中文文本返回空列表,4.57.6 与 tokenizers 0.23.2 返回上面的结果。离线脚本请固定 transformers 4.x,或像上面这样直接用 tokenizers。
Claude 用 POST /v1/messages/count_tokens(免费,文档称结果是估算),Gemini 用 models.countTokens。OpenAI 的 POST /v1/responses/input_tokens 会把消息角色、分隔符、图片、文件和工具定义一起算进去,这部分本地分词器看不到。
计费时的几处坑
- DeepSeek 分时段计价:中文价格页(2026-10-01)中 deepseek-flash 输入 2 元、输出 8 元每百万 token,北京时间工作日 9:00–12:00、14:00–18:00 以外半价。
- 输出比输入贵:上面的 192 字示例加 1,000 个输出 token,在 gpt-5.5 上约 0.0307 美元,其中 0.03 美元是输出。
- 长上下文加价:gpt-5.5 与 GPT-6 输入超过 272,000 token 时整次请求按 2 倍输入、1.5 倍输出计价;gemini-3.1-pro-preview 超过 200,000 token 也会加价。
- 向量模型:text-embedding-3 系列用
cl100k_base,单条输入上限 8,192 token。
相关工具:字数统计工具、API Key 脱敏工具。