做过大模型后端开发的人,几乎都踩过Token的坑:估算1000字的文档刚好塞进32K上下文,结果调用直接被截断;按通用公式算好的API成本,月底账单直接超了50%;同一段代码在Qwen里Token数明明够用,换到LLaMA里直接触发长度超限。
本质上,很多开发者对Token的认知还停留在“1个汉字约等于2个Token”的粗略估算阶段,完全没意识到不同模型的分词器差异,才是Token相关问题的核心根源。今天我们就从最基础的换算规则讲起,一步步拆解到跨模型精准计数的工程实现,彻底把Token这件事搞透。
1. 入门 — Token的基础换算逻辑
大模型并不直接 "读文字",它处理的基本单位是Token(词元)。Token是分词器(Tokenizer)对文本拆分后的最小语义单元,它既不是单个汉字,也不是单个英文单词。
输入文本:"我爱自然语言处理" ↓ 分词器切分 Token 序列:["我", "爱", "自然", "语言", "处理"] 关键认知:Token 不是字,也不是词,而是介于两者之间的 "子词(Subword)" 单位。行业通用的经验换算规律,适合日常快速预估场景:
老一代英文优化分词器,代表模型:GPT-3.5/4 早期版本(cl100k_base)
- 中文场景:1 个汉字约等于 1.5~2 个 Token,1 个 Token 约对应 0.5~0.7 个汉字,1000 个汉字大约消耗 1500~2000 个 Token。
- 英文场景:1 个英文单词约等于 1.2~1.3 个 Token,1 个 Token 约对应 0.75~0.85 个英文单词,1000 个英文单词大约消耗 1200~1300 个 Token。
新一代多语言优化分词器,代表模型:GPT-4o、Qwen、DeepSeek
- 中文场景:1 个汉字约等于 0.6~1 个 Token,1 个 Token 约对应 1~1.7 个汉字,1000 个汉字大约消耗 600~1000 个 Token。
- 英文场景:1 个英文单词约等于 0.7~1 个 Token,1 个 Token 约对应 1~1.4 个英文单词,1000 个英文单词大约消耗 700~1000 个 Token。
- 特殊字符:标点、数字、换行符常常单独占用 1 个 Token,中文标点也常单独占 1 个 Token,英文空格通常与后一个词合并,代码、专业术语、生僻字、emoji 的 Token 消耗通常高于普通文本,但整体压缩率通常略好于老一代英文优化分词器。
注意:上面所有的换算比例,都只是快速估算用的经验值,绝对不能直接用于生产环境的成本核算和上下文边界判断。
2. 进阶 — 不同模型的分词器差异,才是Token数不同的核心原因
为什么同一段1000字的中文文本,在GPT-4里要1800个Token,在Qwen3里只要1000个Token?根本原因是不同大模型的自研分词器,底层拆分规则完全不一样。
目前主流的分词算法主要分三类,不同算法的Token拆分逻辑天差地别:
① BPE(Byte Pair Encoding,字节对编码)
代表模型:GPT 系列、LLaMA 系列、Claude
核心思想:从最基础的字节开始,反复合并出现频率最高的相邻字节对,直到词表达到目标大小。
初始:h e l l o h e l l o ↓ "l"+"l" 出现2次,合并 h e ll o h e ll o ↓ "h"+"e" 出现2次,合并 he ll o he ll o ↓ "he"+"ll" 出现2次,合并 hello hello特点:
- 词表通常 50K 左右(GPT-3 为 50257)
- 对中文不友好,因为中文字符多,每个字可能占多个字节,导致中文 token 膨胀
- 未登录词会被拆成字节级,保证任何文本都能编码
② WordPiece
代表模型:BERT、Claude早期版本
核心思想:与 BPE 类似,但合并依据不是 "频率最高",而是 "能最大化语言模型似然的对"。
判断是否合并 "un" + "likely": 合并前 P(un) × P(likely) 合并后 P(unlikely) 如果合并后似然提升更大 → 合并特点:
- 用
##前缀标记子词(如un+##likely) - 词表通常 30K 左右
- 对中文同样按字或子词切分
③ Unigram / SentencePiece
代表模型:T5、ALBERT、部分多语言模型
核心思想:先构建一个大词表,然后反复移除 "对语言模型损失影响最小" 的词,直到词表达标。
特点:
- 概率化分词,同一文本可能有多种切法
- 直接基于 Unicode 字符,不依赖预分词
- 多语言场景表现好
④ 中文专属:字级分词
代表模型:部分中文大模型(如早期的 ERNIE)
核心思想:直接以单个汉字为基本单位。
特点:
- 1 个汉字 = 1 个 token,换算最简单
- 但词表利用率低,序列更长
举个实际例子,文本(13 个字):"大语言模型的分词器很重要"
| 模型 | 分词器类型 | 大致 Token 数 | 可能的切分 |
|---|---|---|---|
| GPT-4 (cl100k_base) | BPE | 10-13 | 大语言模型的分词器很重要 |
| LLaMA-2 | BPE (SentencePiece) | 13-18 | 每个字可能独立成 token |
| Claude | BPE | 10-14 | 类似 GPT |
| Qwen(通义千问) | BPE | 8-12 | 中文词表优化,常见词合并更多 |
| DeepSeek | BPE | 8-12 | 中文优化 |
差异来源:
- 词表大小不同:GPT-3 是 50K,LLaMA 是 32K,Qwen 是 151K—— 词表越大,中文常见词越可能被合并成 1 个 token
- 训练语料不同:中文语料占比高的模型,中文词合并更充分
- 分词算法细节不同:即使都是 BPE,合并顺序、终止条件也不同
3. 如何准确计算不同模型的 Token 数
任何 "1 token = X 个字" 的换算公式都是近似值。要精确统计,必须用对应模型官方提供的专属分词器来统计,绝对不能跨模型混用。
方法一:使用官方 Tokenizer 库
OpenAI 模型(GPT-3.5/4、o1):
官方提供tiktoken库,是目前最成熟的分词统计工具,支持所有GPT-3.5/4/4o模型。示例:
import tiktoken # 选择对应模型的编码 enc = tiktoken.encoding_for_model("gpt-4") # 或手动指定:enc = tiktoken.get_encoding("cl100k_base") text = "大语言模型的分词器很重要" tokens = enc.encode(text) print(f"Token 数: {len(tokens)}") print(f"Token 列表: {tokens}") print(f"解码回看: {[enc.decode([t]) for t in tokens]}")常见编码对照表:
| 编码名称 | 适用模型 |
|---|---|
cl100k_base | GPT-4、GPT-3.5-turbo、text-embedding-ada-002 |
o200k_base | GPT-4o、o1 系列 |
p50k_base | text-davinci-003、davinci |
r50k_base | 早期 GPT-3 模型 |
LLaMA / HuggingFace 模型:
from transformers import AutoTokenizer # LLaMA-2 tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf") # Qwen tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-7B") # DeepSeek tokenizer = AutoTokenizer.from_pretrained("deepseek-ai/deepseek-llm-7b-base") text = "大语言模型的分词器很重要" tokens = tokenizer.encode(text) print(f"Token 数: {len(tokens)}")Anthropic Claude:
from anthropic import Anthropic client = Anthropic() text = "大语言模型的分词器很重要" token_count = client.count_tokens(text) print(f"Token 数: {token_count}")方法二:在线工具
| 工具 | 支持模型 | 地址 |
|---|---|---|
| OpenAI Tokenizer | GPT 系列 | platform.openai.com/tokenizer |
| HuggingFace Tokenizer | 各类开源模型 | huggingface.co/spaces |
| 各模型官方文档 | 对应模型 | 查看 API 文档中的 token 计数接口 |
方法三:API 返回值
大多数模型 API 的返回结果中会直接包含 token 使用量:
{ "usage": { "prompt_tokens": 256, "completion_tokens": 128, "total_tokens": 384 } } # 这是最准确的数字,因为它就是模型实际处理时的计数。跨模型 Token 估算速查表(不要求精确)
| 模型系列 | 中文经验值(字 /token) | 英文经验值(词 /token) |
|---|---|---|
| GPT-4 / GPT-3.5 | 0.6-0.8 字 /token | 0.75 词 /token |
| LLaMA 系列 | 0.5-0.7 字 /token | 0.7 词 /token |
| Qwen / DeepSeek | 0.8-1.2 字 /token | 0.8 词 /token |
| Claude | 0.6-0.8 字 /token | 0.75 词 /token |
中文优化的模型(Qwen、DeepSeek、GLM 等)通常中文 token 效率更高,因为词表中中文词占比更大。
4. 总结与最佳实践
核心要点
- Token 是子词单位,不是字也不是词,1 token 对应多少字没有固定答案
- 中文比英文更耗 Token,通常 1 个中文字 ≈ 1-1.5 个 token
- 不同模型分词器差异巨大,同一段文本 token 数可能差 2 倍
- 中文优化模型(Qwen、DeepSeek、GLM 等)中文 token 效率更高