彻底搞懂 Token —— 大模型世界的”字数”到底怎么算?中文一定比英文费钱吗?

前言

“中文一个 token 对应一个字?那文言文那么简短,岂不是能省很多 token?”

这是我给外行同事解释 Token 时最常听到的问题。

这个想法看起来很有道理:文言文用几个字就能表达一大段白话文的意思,如果每个字=一个 token,那文言文应该能省 50% 以上的 token 对吧?

答案是:不对。完全不对。

不仅不对,有时候文言文反而更费 token

这篇文章会把 Token 这个概念从里到外掰开揉碎讲清楚,看完你就知道为什么了。


1. Token 到底是什么?

1.1 最直白的定义

Token 是 LLM(大语言模型)处理文本时的最小基本单位

它不是字母,也不是完整的单词,而是一个”词块”(subword)。

类比:句子是一面墙,Token 就是砌墙的。一块砖可能大、可能小,但它是不可再分的基本单元。

1.2 为什么需要 Token?

大模型本质上是数学机器,它不认识文字,只认识数字。

所以需要一个步骤把文本转换成数字:

1
2
3
原始文本 → Token(分词)→ ID(查表)→ 向量(嵌入)→ LLM 处理
↑ ↑
你花的每一分钱 模型理解的起点

这就是 Tokenization(分词/令牌化)——把文本切成 Token,再给每个 Token 分配一个唯一的数字 ID。

1.3 Token 决定了什么

维度 说明
计费 输入 token 数 + 输出 token 数 = 你要付的钱
上下文窗口 模型能处理的最大 token 数(如 128K),决定了你能输入多长的内容
处理速度 Token 越多,推理越慢
模型能力上限 同样 128K 窗口,中文可能只能放 68 万字,英文能放 1012 万词

1.4 一条铁律

Token ≠ 字符 ≠ 单词 ≠ 汉字

每种语言的 Token 化方式完全不同。下面就来细讲。


2. Tokenizer —— 把文本变成数字的翻译官

2.1 Tokenizer 的工作原理

目前绝大多数大模型(GPT、Claude、LLaMA、Qwen 等)都使用 BPE(Byte-Pair Encoding,字节对编码) 算法。

BPE 的核心思路很简单:从”字”开始,把最常见的”字组合”逐步合并成更大的 Token。

1
2
3
4
第1步:把文本拆成最细的粒度(字符/字节)
第2步:统计相邻字符的"共现频率"
第3步:把出现频率最高的"字符对"合并成一个新的 Token
第4步:重复第2~3步,直到达到预设的 Token 词表大小

2.2 一个超简化的例子

假设我们要用 BPE 训练一个 Tokenizer,训练语料只有三句话:

1
2
3
"我今天吃饭"
"我今天喝茶"
"你昨天吃饭"

第 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
2
3
4
高频词 → 合并成一个 Token → 省 Token
低频词/生僻字 → 拆成多个 Token → 费 Token
常见词根 → 合并 → 省 Token
罕见组合 → 拆开 → 费 Token

这就是理解”文言文是否省 Token”的关键。


3. 各种语言的 Token 化差异

每种语言都有自己的”Token 特性”,这是由语言的统计规律决定的。

3.1 英语 —— 接近”一个词 ≈ 一个 Token”

英语是最”经济”的语言之一,因为:

1
2
3
4
5
6
"Hello"          → 1 token
"world" → 1 token
"tokenization" → 2 tokens ("token" + "ization")
"unbelievably" → 3 tokens ("un" + "believe" + "ably")
"ChatGPT" → 1 token ✅ (常见词)
"Supercalifragilisticexpialidocious" → 多个 token ❌ (生僻词)

比例:英语平均 1 个单词 ≈ 1.3 ~ 1.5 个 token

1
2
3
Hello world → 2 tokens
I am a software engineer → 5 tokens
The quick brown fox jumps over the lazy dog → 8 tokens

3.2 中文 —— 一个字 ≈ 1 ~ 2 个 Token?

中文的 Token 化完全不同于英语:

1
2
3
4
5
6
7
"我"       → 1 token  ✅ (高频单字)
"吃" → 1 token ✅ (高频单字)
"饭" → 1 token ✅ (高频单字)
"吃饭" → 1 token ✅ (高频词组,合并了!)
"饕餮" → 2 tokens ❌ (生僻字,拆开)
"你好" → 1 token ✅ (高频词)
"人工智能" → 2~3 tokens ✅ (常见词,部分合并)

中文的关键是:

1
2
高频词(出现在训练语料中足够多的次数)→ 合并成一个 token
低频词/生僻字 → 拆成 1 个字 1~2 个 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
2
3
4
5
"I am learning about tokens today"
→ 6 tokens

"Tokenization is fascinating and complex"
→ 6 tokens

中文

1
2
3
4
5
"我今天学习token的知识"
→ 6 tokens

"我们今天一起吃饭吧"
→ 5 tokens("我们""今天""一起""吃饭""吧")

关键观察"我们""今天""吃饭" 这些高频词都是一个 token,不是两个。


4. 为什么文言文不一定省 Token?实验验证

4.1 直觉陷阱

很多人这样想:

1
2
3
4
文言文: "知之为知之,不知为不知,是知也。"  (13个字)
白话文:"知道就是知道,不知道就是不知道,这才是智慧。" (20个字)

13 < 20,所以文言文省 token?

错。 原因有两个。

4.2 原因一:文言文字典出现频率低

文言文用的是古代汉语的词汇和用法,这些在大模型的现代训练语料中出现频率极低

BPE 的训练语料主要是:

  • 互联网网页(现代中文,占 90%+)
  • 书籍(现代小说、科普,占 5~8%)
  • 代码(占 1~2%)
  • 古文(占不到 0.1%)

所以:

1
2
3
4
"我们" → 几十亿次出现 → 合并成一个 token ✅
"之" → 在古文里高频,在整体语料里低频 → 拆成 1~2 个 token
"乎" → 极低频 → 拆成 1~2 个 token
"曰" → 极低频 → 拆成 1~2 个 token

低频 = 拆得更碎 = 更多 token。

4.3 原因二:古文的”单字”在 Token 化时可能更碎

现代汉语中大量双字词被合并了:

1
2
3
4
"因为" → 1 token(高频双字词)
"所以" → 1 token(高频双字词)
"知识" → 1 token(高频双字词)
"智慧" → 1 token(高频双字词)

而文言文大量使用单字:

1
2
3
4
"知"  → 1 token
"为" → 1 token
"是" → 1 token
"也" → 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
2
3
4
"然后" → 1 token ✅ (现代人也在用,语料中高频)
"然而" → 1 token ✅ (同上)
"虽然" → 1 token ✅ (同上)
"所以" → 1 token ✅ (同上)
  1. 该文言句式特别简短,且每个字都是高频字
1
2
3
"何为?" → 2 tokens ✅
"为什么?" → 3 tokens ✅
确实省了 1 个 token

但总的来说,文言文省 Token 是个巨大的误解。真实情况是:

文言文 ≈ 同等 token 数甚至更多,但信息密度确实更高。

所以文言文的好处是同样的 token 数可以传达更多信息(即信息密度高),而不是”省 token”。


5. Token 的实际影响

5.1 对成本的影响

1
2
3
4
5
6
7
8
9
以 GPT-4o 为例(假设 1K tokens = $0.005):
┌─────────────────────────────────────┐
│ 一段 1000 字的博客 │
│ │
│ 英文版:~1300 tokens → $0.0065 │
│ 中文版:~700 tokens → $0.0035 │
│ 中英混杂:~1000 tokens → $0.005 │
│ 文言版:~1200 tokens → $0.006 │
└─────────────────────────────────────┘

中文其实比英文省钱,因为同样含义中文的字数更少,同样的上下文窗口中文能放更多内容。

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
"我们今天一起吃饭"
→ 5 tokens(不是我/今/天/一/起/吃/饭 7 个token)

误区 2:”英文一个单词 = 一个 Token”

实际:常见高频词 ≈ 1 token,生僻词/复合词会拆开。

1
2
"the" → 1 token ✅
"antidisestablishment" → 5 tokens ❌

误区 3:”文言文省字数 = 省 Token”

实际:文言文用字在现代语料中出现频率低,Token 化更碎,综合下来几乎不省甚至更费

误区 4:”空格和标点不算 Token”

实际:空格、换行、标点、Emoji 全部算 Token。

1
2
3
4
5
" "(空格)         → 1 token
"\n"(换行) → 1 token
"."(句号/点) → 1 token
"🔥"(Emoji) → 1 token(高频emoji)
"🧑‍💻"(复杂Emoji) → 3~5 tokens(由多个Unicode组合而成)

误区 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌──────────────────────────────────────────────────┐
│ Token │
│ 大模型世界的最小"字数"单位 │
├──────────────────────────────────────────────────┤
│ │
│ Tokenizer (BPE) 决定怎么切: │
│ │
│ 高频词 ──────────→ 合并成 1 个 token ✅ │
│ "我们""因为""今天""吃饭" │
│ │
│ 中频词 ──────────→ 可能合并,也可能拆开 │
│ "人工智能""不可思议" │
│ │
│ 低频/生僻字 ─────→ 拆成更碎 ❌ │
│ "饕餮""之乎者也""嗟乎" │
│ │
└──────────────────────────────────────────────────┘

核心观点一句话

问题 答案
Token 是什么? 大模型处理文本的最小基本单位,不是字也不是单词
怎么算 Token? BPE 算法:高频合并,低频拆分
中文一个 Token 对应一个字吗? 不是。高频词(”我们””吃饭”)是一个 token,低频字才一个字一个 token
中文和英文哪个省 Token? 中文省,同样信息量中文 token 数大约是英文的一半
文言文省 Token 吗? 不省。虽然字数少,但每个字在现代语料中低频,token 化更碎,综合不省甚至更费
空格算 Token 吗? 。空格、换行、标点、Emoji 全部算 Token
怎么省 Token? 用高频词、避免生僻字、精简 Prompt

关于”信息密度”的最终澄清

回到文章开头的问题——

为什么文言文不省 Token 但显得更”高效”?

因为文言文的信息密度更高。

1
2
3
4
5
6
相同的 token 数:
文言文:传达了 10 分信息
白话文:传达了 7 分信息

= 文言文在每个 token 里塞了更多信息
≠ 文言文用了更少的 token

如果我们做两个实验:

1
2
3
4
5
6
7
实验 A:文言文和白话文表达同样的内容
→ Token 数:文言文 ≈ 白话文(甚至可能更多)
→ 信息量:文言文 = 白话文(相同内容)

实验 B:文言文和白话文用同样的 Token 数
→ Token 数:文言文 = 白话文
→ 信息量:文言文 > 白话文(文言文更浓缩)

所以正确的理解是:文言文不省 Token,但在同样的 Token 预算下,文言文能表达更多内容。 这是两个完全不同的概念。


写在最后:Token 是使用大模型时最基本的”计量单位”,理解它的工作原理能帮你更好地控制成本、设计 Prompt、选择合适的模型。下次跟同事解释时,可以用这篇文章里的例子——尤其是文言文那个,效果拔群。