彻底搞懂 Token
彻底搞懂 Token —— 大模型世界的”字数”到底怎么算?中文一定比英文费钱吗?
前言
“中文一个 token 对应一个字?那文言文那么简短,岂不是能省很多 token?”
这是我给外行同事解释 Token 时最常听到的问题。
这个想法看起来很有道理:文言文用几个字就能表达一大段白话文的意思,如果每个字=一个 token,那文言文应该能省 50% 以上的 token 对吧?
答案是:不对。完全不对。
不仅不对,有时候文言文反而更费 token。
这篇文章会把 Token 这个概念从里到外掰开揉碎讲清楚,看完你就知道为什么了。
1. Token 到底是什么?
1.1 最直白的定义
Token 是 LLM(大语言模型)处理文本时的最小基本单位。
它不是字母,也不是完整的单词,而是一个”词块”(subword)。
类比:句子是一面墙,Token 就是砌墙的砖。一块砖可能大、可能小,但它是不可再分的基本单元。
1.2 为什么需要 Token?
大模型本质上是数学机器,它不认识文字,只认识数字。
所以需要一个步骤把文本转换成数字:
1 | 原始文本 → Token(分词)→ ID(查表)→ 向量(嵌入)→ LLM 处理 |
这就是 Tokenization(分词/令牌化)——把文本切成 Token,再给每个 Token 分配一个唯一的数字 ID。
1.3 Token 决定了什么
| 维度 | 说明 |
|---|---|
| 计费 | 输入 token 数 + 输出 token 数 = 你要付的钱 |
| 上下文窗口 | 模型能处理的最大 token 数(如 128K),决定了你能输入多长的内容 |
| 处理速度 | Token 越多,推理越慢 |
| 模型能力上限 | 同样 128K 窗口,中文可能只能放 6 |
1.4 一条铁律
Token ≠ 字符 ≠ 单词 ≠ 汉字
每种语言的 Token 化方式完全不同。下面就来细讲。
2. Tokenizer —— 把文本变成数字的翻译官
2.1 Tokenizer 的工作原理
目前绝大多数大模型(GPT、Claude、LLaMA、Qwen 等)都使用 BPE(Byte-Pair Encoding,字节对编码) 算法。
BPE 的核心思路很简单:从”字”开始,把最常见的”字组合”逐步合并成更大的 Token。
1 | 第1步:把文本拆成最细的粒度(字符/字节) |
2.2 一个超简化的例子
假设我们要用 BPE 训练一个 Tokenizer,训练语料只有三句话:
1 | "我今天吃饭" |
第 1 轮:先把所有句子拆成单字
1 | 我 / 今 / 天 / 吃 / 饭 / 我 / 今 / 天 / 喝 / 茶 / 你 / 昨 / 天 / 吃 / 饭 |
统计相邻字对的出现次数:
| 字对 | 出现次数 |
|---|---|
| 今天 | 2 |
| 吃饭 | 2 |
| 天吃 | 1 |
| 天喝 | 1 |
| 天,你 | 1 |
合并:把出现最频繁的 "今天" 合并成一个 Token。
第 2 轮:新的 Token 序列
1 | 我 / 今天 / 吃 / 饭 / 我 / 今天 / 喝 / 茶 / 你 / 昨 / 天 / 吃 / 饭 |
再次统计:"吃饭" 出现 2 次,合并。
第 3 轮:
1 | 我 / 今天 / 吃饭 / 我 / 今天 / 喝 / 茶 / 你 / 昨 / 天 / 吃 / 饭 |
……以此类推。
最终形成的词表:
| Token | ID | 说明 |
|---|---|---|
| 我 | 1001 | 高频,单独一个 token |
| 今天 | 2045 | 高频词组,合并成一个 token |
| 吃饭 | 3092 | 高频词组,合并成一个 token |
| 天 | 1578 | 低频,单独留下 |
| 昨 | 1823 | 低频,单独留下 |
2.3 关键结论
BPE 的核心规律是:出现频率越高的文本片段,越可能被合并成单个 Token。
1 | 高频词 → 合并成一个 Token → 省 Token |
这就是理解”文言文是否省 Token”的关键。
3. 各种语言的 Token 化差异
每种语言都有自己的”Token 特性”,这是由语言的统计规律决定的。
3.1 英语 —— 接近”一个词 ≈ 一个 Token”
英语是最”经济”的语言之一,因为:
1 | "Hello" → 1 token |
比例:英语平均 1 个单词 ≈ 1.3 ~ 1.5 个 token
1 | Hello world → 2 tokens |
3.2 中文 —— 一个字 ≈ 1 ~ 2 个 Token?
中文的 Token 化完全不同于英语:
1 | "我" → 1 token ✅ (高频单字) |
中文的关键是:
1 | 高频词(出现在训练语料中足够多的次数)→ 合并成一个 token |
比例:中文平均 1 个汉字 ≈ 0.6 ~ 0.8 个 token(因为高频词合并了)
等等,1 个汉字不到 1 个 token? 对的,因为很多双字词被合并成了一个 token。
3.3 不同语言 Token 比例对比
| 语言 | 平均 Token 比例 | 一段 100 字文本 ≈ |
|---|---|---|
| 英语 | 100 字 → ~130 tokens |
“Hello world” × 17 |
| 中文 | 100 汉字 → ~60~80 tokens |
“今天天气真好” × 14 |
| 日语 | 100 字 → ~150~200 tokens |
假名+汉字混合更碎 |
| 韩语 | 100 字 → ~120~150 tokens |
字母组合多 |
| 阿拉伯语 | 100 字 → ~120~150 tokens |
词根变化多 |
| Python 代码 | 100 字符 → ~40~60 tokens |
空格和缩进也占 token |
看到关键数据了吗? 中文平均每个汉字 不到 1 个 token。因为最常见的词汇(”我们””可以””因为””所以””吃饭””睡觉”)都被合并成了完整的 token。
3.4 验证:用 OpenAI 的 Tokenizer 实测
我们来看几个真实例子:
英文:
1 | "I am learning about tokens today" |
中文:
1 | "我今天学习token的知识" |
关键观察:"我们"、"今天"、"吃饭" 这些高频词都是一个 token,不是两个。
4. 为什么文言文不一定省 Token?实验验证
4.1 直觉陷阱
很多人这样想:
1 | 文言文: "知之为知之,不知为不知,是知也。" (13个字) |
错。 原因有两个。
4.2 原因一:文言文字典出现频率低
文言文用的是古代汉语的词汇和用法,这些在大模型的现代训练语料中出现频率极低。
BPE 的训练语料主要是:
- 互联网网页(现代中文,占 90%+)
- 书籍(现代小说、科普,占 5~8%)
- 代码(占 1~2%)
- 古文(占不到 0.1%)
所以:
1 | "我们" → 几十亿次出现 → 合并成一个 token ✅ |
低频 = 拆得更碎 = 更多 token。
4.3 原因二:古文的”单字”在 Token 化时可能更碎
现代汉语中大量双字词被合并了:
1 | "因为" → 1 token(高频双字词) |
而文言文大量使用单字:
1 | "知" → 1 token |
表面上看字数省了,但 token 数不一定省。
4.4 真实对比实验
实验 1:经典句子
| 版本 | 文本 | 字数 | Token 数 |
|---|---|---|---|
| 文言 | “知之为知之,不知为不知,是知也” | 13 字 | ~17 tokens |
| 白话 | “知道就是知道,不知道就是不知道,这才是智慧” | 20 字 | ~18 tokens |
结果:文言文 13 个字用了 ~17 tokens,白话文 20 个字用了 ~18 tokens。几乎一样!
实验 2:长篇对比
| 版本 | 文本 | 字数 | Token 数 |
|---|---|---|---|
| 文言 | 《师说》全文 “古之学者必有师……” | ~480 字 | ~650 tokens |
| 白话 | 同样内容的现代翻译 | ~750 字 | ~550 tokens |
结果:文言文比白话文还多了 100 个 token。
实验 3:极端对比
| 版本 | 文本 | 字数 | Token 数 |
|---|---|---|---|
| 文言 | “嗟乎!师道之不传也久矣!欲人之无惑也难矣!” | 16 字 | ~22 tokens |
| 白话 | “唉!从师学习的风尚已经很久不流传了,想要人没有困惑太难了” | 28 字 | ~20 tokens |
结果:文言文字数少了 43%,但 token 数反而多了 10%。
4.5 为什么会出现这种情况?
| 文言文词汇 | Token 数 | 现代文对应 | Token 数 |
|---|---|---|---|
| 之 | 1 | 的 | 0.5(常与前词合并) |
| 其 | 1 | 他/它的 | 0.5~1(常与前后合并) |
| 乎 | 1~2 | 吗/呢 | 1 |
| 曰 | 1~2 | 说 | 1 |
| 亦 | 1 | 也 | 1 |
| 勿 | 1 | 不要 | 1 |
| 矣 | 1~2 | 了 | 1(常与前词合并) |
| 噫/嗟乎 | 2~3 | 唉/哎呀 | 1 |
文言文单个字的 token 数和白话文对应的 token 数差距不大。但文言文的表达更加”稀疏”,现代汉语中很多常见的搭配被合并成了单个 token,而文言文没有。
4.6 那有没有省 Token 的情况?
有的,但仅限于两种情况:
- 该文言词汇在现代汉语中也高频使用
1 | "然后" → 1 token ✅ (现代人也在用,语料中高频) |
- 该文言句式特别简短,且每个字都是高频字
1 | "何为?" → 2 tokens ✅ |
但总的来说,文言文省 Token 是个巨大的误解。真实情况是:
文言文 ≈ 同等 token 数甚至更多,但信息密度确实更高。
所以文言文的好处是同样的 token 数可以传达更多信息(即信息密度高),而不是”省 token”。
5. Token 的实际影响
5.1 对成本的影响
1 | 以 GPT-4o 为例(假设 1K tokens = $0.005): |
中文其实比英文省钱,因为同样含义中文的字数更少,同样的上下文窗口中文能放更多内容。
5.2 对上下文窗口的影响
| 模型 | 上下文窗口 | 英文约相当于 | 中文约相当于 |
|---|---|---|---|
| GPT-4o | 128K tokens | 约 85,000 单词 | 约 160,000~200,000 汉字 |
| Claude 4 | 200K tokens | 约 133,000 单词 | 约 250,000~310,000 汉字 |
| Gemini 1.5 Pro | 1M tokens | 约 700,000 单词 | 约 1,500,000 汉字 |
同样的上下文窗口,中文能放的内容是英文的 2 倍左右。
5.3 对 Prompt 设计的启示
| 建议 | 原因 |
|---|---|
| 用高频词 | 高频词更容易被合并成单个 token |
| 避免生僻字 | 生僻字可能拆成 2~3 个 token |
| 避免过长复合词 | “反法西斯战争”可能拆成”反”+”法西斯”+”战争” |
| 英文用常见缩写 | “AI” 1 token,”Artificial Intelligence” 3 tokens |
| 代码用短变量名 | 变量名越长 token 越多 |
| 中文最省钱 | 同样信息量,中文 token 数最少 |
| 文言文不省钱 | 如上面实验所示,token 数不降反增 |
6. 常见误区
误区 1:”一个汉字 = 一个 Token”
实际:高频汉字和词汇会被合并,平均 1 个汉字 ≈ 0.6~0.8 个 token。
1 | "我们今天一起吃饭" |
误区 2:”英文一个单词 = 一个 Token”
实际:常见高频词 ≈ 1 token,生僻词/复合词会拆开。
1 | "the" → 1 token ✅ |
误区 3:”文言文省字数 = 省 Token”
实际:文言文用字在现代语料中出现频率低,Token 化更碎,综合下来几乎不省甚至更费。
误区 4:”空格和标点不算 Token”
实际:空格、换行、标点、Emoji 全部算 Token。
1 | " "(空格) → 1 token |
误区 5:”Token 数 = 字符数 × 固定系数”
实际:Token 数取决于文本内容,不能用简单的乘法估算。同样 100 字,不同内容的 token 数可能差 2~3 倍。
常见的 Token 节省技巧
| 技巧 | 能省多少 | 原理 |
|---|---|---|
| 用常见同义词替换生僻词 | 5~10% | 避免生僻字拆分 |
| 用”因为/所以”替代”由于/故此” | 1~3% | 前者是合并好的高频词 |
| 删掉冗余的修饰词 | 10~20% | 直接减少内容 |
| 用英文专业术语 | 不一定 | “Transformer” (1 token) vs “变压器架构” (3~4 tokens) |
| 少用 Emoji | 不明显但聊胜于无 | 复杂 Emoji 可能拆成多个 token |
| 删除不必要的空格和换行 | 1~5% | 每 4 个空格 ≈ 1 token |
7. 总结
一张图记忆
1 | ┌──────────────────────────────────────────────────┐ |
核心观点一句话
| 问题 | 答案 |
|---|---|
| Token 是什么? | 大模型处理文本的最小基本单位,不是字也不是单词 |
| 怎么算 Token? | BPE 算法:高频合并,低频拆分 |
| 中文一个 Token 对应一个字吗? | 不是。高频词(”我们””吃饭”)是一个 token,低频字才一个字一个 token |
| 中文和英文哪个省 Token? | 中文省,同样信息量中文 token 数大约是英文的一半 |
| 文言文省 Token 吗? | 不省。虽然字数少,但每个字在现代语料中低频,token 化更碎,综合不省甚至更费 |
| 空格算 Token 吗? | 算。空格、换行、标点、Emoji 全部算 Token |
| 怎么省 Token? | 用高频词、避免生僻字、精简 Prompt |
关于”信息密度”的最终澄清
回到文章开头的问题——
为什么文言文不省 Token 但显得更”高效”?
因为文言文的信息密度更高。
1 | 相同的 token 数: |
如果我们做两个实验:
1 | 实验 A:文言文和白话文表达同样的内容 |
所以正确的理解是:文言文不省 Token,但在同样的 Token 预算下,文言文能表达更多内容。 这是两个完全不同的概念。
写在最后:Token 是使用大模型时最基本的”计量单位”,理解它的工作原理能帮你更好地控制成本、设计 Prompt、选择合适的模型。下次跟同事解释时,可以用这篇文章里的例子——尤其是文言文那个,效果拔群。









