
Token到底是什么?一文从切词原理到动手计数讲透它
先说结论:Token到底是什么
我一开始也觉得Token很玄乎,后来发现一句话就能讲清:Token是大模型处理文本的最小单位。
模型并不会像人一样「读懂」一整段话,它做的事情是:先把你的文字切成一个个小碎片(也就是Token),给每个碎片编号,再用这些编号做计算。所以你可以把Token理解成模型的「字」——只不过这个「字」不是汉字,而是一小块文本。
一块Token可能是:
- 一个英文单词的一部分,比如
learn、ing - 一个完整的短英文单词,比如
the、token - 一个汉字,或者半个词组
- 一个标点、一个空格、一个换行符
要点记住三条:
- 模型的输入和输出,都是按Token计的
- 你说的每个字、模型回的每个字,都会消耗Token
- 上下文窗口、输出上限,单位也都是Token
模型眼里的文字:为什么字数不等于Token数
切Token的主流方法叫子词切分(subword tokenization,常见算法有BPE等)。它的思路很朴素:
- 从海量文本里统计哪些小片段出现频率高
- 高频片段保留成一个Token,低频的长词拆成多个Token
这带来两个你一定会遇到的现象:
现象一:英文比中文「省」。 英文单词很多本身就是一个Token,中文因为字形组合多,一个汉字经常要占1个甚至更多Token,遇到生僻词组可能拆得更碎。
现象二:标点和空格也占Token。 很多人没意识到,换行、缩进、连续空格都会算进去,写代码、写Markdown时尤其容易低估Token量。
一张粗略的换算感受表(不同模型、不同语言的切法不同,具体以官方Tokenizer为准):
| 内容类型 | 粗略感受 |
|---|---|
| 英文普通文本 | 约4个字符 ≈ 1个Token |
| 中文普通文本 | 约1个汉字 ≈ 1个上下Token |
| 代码 | 空格缩进多,Token偏多 |
| 网址、乱码、生僻组合 | 容易被切得很碎,Token暴增 |
所以「我写了3000字」和「模型收到3000Token」完全是两回事,别再拿字数直接换算了。
动手数一数:三种实用方法
方法一:用tiktoken库本地精确计数
如果你想在自己电脑上数Token,OpenAI开源的tiktoken库是最常用的工具(注意:它统计的是OpenAI系列模型的切法,其他厂商模型的切法可能略有差异)。
安装:
pip install tiktoken
计数代码:
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")
text = "你好,这是一段用于统计Token数量的中文示例。"
ids = enc.encode(text)
print("Token数量:", len(ids))
print("Token编号:", ids)
print("逐块拆开看看:")
for tid in ids:
print(enc.decode([tid]), end=" | ")
运行后你会直观看到:一句话被切成了哪些小块。这比我讲十遍原理都管用,建议你自己换几段文字试试(比如中英混排、带换行的文本)。
方法二:用官方在线Tokenizer可视化
主流模型厂商基本都提供网页版的Token可视化工具,把文本粘进去就能看到每个Token的颜色分块。适合不确定「这段话到底会被切成什么样」时快速确认,具体入口以各官方文档为准。
方法三:直接看接口返回的usage字段
调用大模型API时,响应里通常会带回本次请求的输入Token数、输出Token数。这是最真实的统计口径,写脚本批量跑任务时,建议把这个字段记录下来,方便你复盘成本和长度分布。
三种方法怎么选:
| 场景 | 推荐方法 |
|---|---|
| 写代码前预估输入长度 | tiktoken本地统计 |
| 想直观看切分效果 | 官方在线Tokenizer |
| 线上任务复盘 | 接口usage字段 |
Token数如何影响你的使用体验
搞懂Token后,很多使用上的「玄学」都能解释清楚了:
1. 上下文窗口是Token额度,不是字数额度。 模型一次能「看见」的内容有上限,你的历史对话+当前提问+检索到的资料,全都挤在这个额度里。塞太满会触发截断,最早的对话内容可能被丢掉。
2. 输出也有Token上限。 很多人遇到「回答写到一半就停了」,不是模型坏了,而是触到了单次输出的Token上限。解决办法是让它「继续」,或分段生成。
3. 长输入会影响理解和成本。 输入越长,处理越慢、消耗越大,超长无关内容还会稀释重点,让回答变水。
实操建议:写长内容时怎么控制Token
如果你经常让模型写长文、总结长文档,这几条是我自己总结下来最有效的:
- 先量再喂。 处理长文档前先统计Token数,超过上下文预算的三分之一就要警惕。
- 去重再喂。 把明显的重复段落、无关的页眉页脚、连续空行删掉,Token立省一大截。
- 分块处理。 超长文本按主题切块,分批总结再合并,比一次性塞进去效果更好。
- 控制对话轮次。 长对话定期开新会话,只把结论性的要点带过去,避免历史冗余堆积。
- 代码和JSON单独算。 缩进和符号多,别用「大概几百字」来估。
常见误区小结
- 误区:中文字数≈Token数。实际中文Token往往比字数多。
- 误区:只有对话文字算Token。图片、文件内容进模型同样折算成Token。
- 误区:所有模型切法完全一样。不同厂商、不同版本的Tokenizer有差异,预估时留出余量更稳妥。
把Token当成模型的「计量单位」来理解,你对上下文、输出长度、长文本处理的直觉会立刻清晰很多。