
什么是 Token?把大模型的基本单位一次讲透
我在刚接触大模型的时候,最懵的一个词就是 Token。各家文档都在说「上下文多少 Token」「按 Token 计费」,但就是没人正面回答一句:它到底是个啥?
后来我把这件事彻底搞明白之后才发现,Token 是理解大模型一切行为的地基。这篇文章我就把自己梳理清楚的思路完整讲一遍,争取让你看完就能自己动手验证。
先给一句话定义:Token 是模型眼里的「积木块」
大模型不认识汉字,也不认识英文单词,它只认识一串数字 ID。Tokenizer(分词器)会先把你的文本切成一小块一小块,每一块映射成一个数字 ID,这一小块就是一个 Token。
所以你可以把 Token 理解成:
- 模型读写文本的最小单位
- 一切计费、上下文长度、速率限制的度量单位
- 一个 Token 通常对应一小段字符,而不是一个完整的字或词
这里有个反直觉的点:Token 既不等于「字」,也不等于「词」。一个英文单词可能被切成 2 到 3 个 Token,一个常见汉字可能占 1 个 Token,生僻字或组合可能占更多。
为什么要按 Token 切,而不是按字数算
我一开始也觉得按字数算不是更直观吗?后来理解了两点就释然了。
第一,词表(vocabulary)是有限的。分词器背后有一张几万到几十万条的「常用片段表」,遇到文本就按最长匹配的方式去切。太长的词、太生僻的词都会被拆成常见小片段。
第二,模型内部要对齐算力成本。序列越长,注意力计算越贵,用 Token 统一长度,才能公平地衡量「这一段输入到底有多长」。
所以 Token 的本质是「压缩效率和计算成本之间的折中」。
一段文本是怎么变成 Token 的:4 个步骤
我用流程的方式给你拆开看:
- 输入原始文本
- 分词器按预训练好的切分规则,切成若干片段
- 每个片段查表得到一个数字 ID
- 模型处理完后,把输出的 ID 再反查成片段,拼回文本给你看
有几个关键点你一定要记住:
- 不同模型的 Tokenizer 不一样,同一段文字在不同模型里的 Token 数可以差很多
- 中文、英文、代码、表情符号,切分密度都不一样
- 常见词往往是 1 个 Token,罕见词会被拆成多个子词(subword)
- 空格、换行、标点也占 Token,别忽略它们
自己动手数一数:3 步实测
看十篇解释不如自己跑一次代码。下面是最简单的验证方式,用开源的 tiktoken 举例(安装方式以官方为准)。
第 1 步:安装并载入分词器
import tiktoken
# 不同编码对应不同模型系列,具体对应关系以官方文档为准
enc = tiktoken.get_encoding("cl100k_base")
第 2 步:把文本切成 Token 并计数
text = "Hello, 大模型世界!"
tokens = enc.encode(text)
print("Token 列表:", tokens)
print("Token 数量:", len(tokens))
print("字符数量:", len(text))
第 3 步:反向还原,确认没丢信息
back = enc.decode(tokens)
print("还原结果:", back)
print("是否一致:", back == text)
跑完你就亲眼看到了:Token 数量和字符数量是两个完全不同的数字。如果你用的是开源模型,可以用 transformers 库里的 AutoTokenizer 做同样的实验,思路完全一样,只是加载方式换成对应模型的 tokenizer。
不同语言的 Token 直觉(经验值)
下面这张表是我用来快速估算的粗略直觉,注意是经验值,不同模型差异很大,精确数值一定要以你自己的实测为准。
| 文本类型 | 大致感觉 | 说明 |
|---|---|---|
| 英文常见文本 | 约 4 个字符 ≈ 1 个 Token | 常见单词通常整词成 Token |
| 中文常见文本 | 约 1 到 2 个汉字 ≈ 1 个 Token | 高频词组可能合并成 1 个 |
| 代码 | 变量名、符号往往被切碎 | 缩进和空行也计数 |
| 表情符号 | 可能占多个 Token | 别在提示里堆一堆 emoji |
| 生僻字、错别字 | 往往占更多 Token | 越少见切得越碎 |
看这张表你会发现:同样字数的中英文,Token 成本并不一样。这也是为什么你在做实际项目时,一定要针对自己的语料实测一次,而不是套用网上的固定系数。
为什么你非搞懂 Token 不可:3 个直接影响
| 影响面 | 会发生什么 | 你应该怎么做 |
|---|---|---|
| 上下文长度 | 输入加输出的 Token 总和有上限 | 长文档要先做摘要或分段 |
| 费用 | 多数 API 按 Token 计量 | 精简提示、去掉冗余模板 |
| 响应速度 | 序列越长处理越慢 | 控制输入长度,避免无用粘贴 |
一句话总结:Token 就是大模型世界的「度量衡」。不懂它,你就没法判断一次对话有多长、多贵、多快。
我踩过的 4 个常见误区
- 误区一:以为 1 个 Token 等于 1 个汉字。实际上要看具体文本和具体模型。
- 误区二:以为所有模型的 Token 数一样。换模型必须重新估算。
- 误区三:以为只有正文算 Token。系统提示、历史对话、工具返回结果全都算。
- 误区四:用字符数去申请上下文预算。一定要按 Token 换算并留出输出空间。
上手清单:今天就能做的 3 件事
- 挑一段你常用的提示词,用上面的代码数一数 Token
- 把同样的内容用另一套 Tokenizer 再数一次,感受差异
- 统计你最近一次长对话的总 Token,估算它在不同上下文上限下的占比
做完这三步,你对「模型的记忆边界」会有非常具体的感觉,后面学提示词、上下文管理都会顺很多。
写在最后
Token 是大模型最基础、也最容易被跳过的概念。它不复杂,但它决定了你能塞进多少资料、要花多少钱、模型答得快不快。建议你把这篇文章里的代码跑一遍,把抽象概念变成手上的真实数字。