什么是 AI 中的 token?
token 是 AI 模型真正读取的单位——不是词,也不是字母。它解释了你的账单、你的上下文上限,以及模型为什么会数错字母。
先动手,再深入阅读
词不等于 token · 5 分钟本页目录
你大概已经和 token 打过三次照面,只是没人给你介绍过。
你见过按「每百万 token」计价的报价。你见过规格表上写着「20 万 token 的上下文窗口」。还有人告诉你,模型数错字母「是切分方式导致的」。三场看似无关的对话,背后是同一个单位。
token 就是语言模型真正读取的文本单位。一旦你能看见 token,这三件事就变成了同一场对话。
token 是一小段,不是一个词
模型从不以字母的形式接收你的句子。在一切开始之前,你的文本就被切成许多小片,来自一张固定的清单,叫做词表(vocabulary),每一片都被换成它的 ID 编号。那张清单在模型被造出来时建好一次,之后再也不变。
这些片段就是 token。一个 token 可以是:
- 一个完整的常见词——
water - 一个词带着它前面的空格——
␣water,通常和water是不同的 token - 一个生僻词或长词的一部分——
un+fathom+able - 一个后缀——
ing、ed、's - 一个标点、一个数字、一个换行
由此立刻引出两个后果,两个都让人意外。
常见词便宜,生僻词贵。 cat 很可能就是一个 token。一个不常见的姓氏或一个专业术语可能是四五个——不是因为它的字母更多,而是因为词表从来没为它留过一个单独的条目。
空格跟着 token 走。 多数现代 tokenizer 会把前导空格留在词上,所以同一个词在句子中位置不同,ID 就可能不同。
为什么不直接用词?或者直接用字母?
两个极端都有人试过,两个都受伤。
一个词一个 token 听起来自然,但一碰上现实就垮。你得为每个词、每种变形、每个名字、每个错别字都留一个条目。清单会爆炸,而任何漏掉的都会变成彻底无法表示——也就是未登录词问题。
一个字符一个 token 覆盖范围永远不会不够,但会让每个序列都长得多。由于注意力的开销随序列长度增长得比线性还快,这恰恰在你负担不起的地方最贵。
子词切分是最终胜出的折中:常见的词整着留,生僻词拆成可复用的片段。词表保持固定、可控的大小,而没有任何东西是无法表示的,因为最坏情况会退回到很小的片段。
词表从哪来
主流方法是字节对编码(Byte Pair Encoding),思路短到可以完整讲完:
- 从最小的单位开始——字节或字符。
- 扫描一大批文本。找出出现最频繁的相邻对。
- 把这个对合并成一个新单位,加进词表。
- 重复,直到词表达到目标大小。
跑得够久,常见的词会被合并成单个单位,而生僻词仍然由片段拼装而成。这份清单没有人手写过;它是从训练文本的统计里长出来的。
最后这一点值得记住:词表是它所依据的文本留下的化石。 那段文本里什么是常见的,此后就永远便宜。词表是从哪来的?详细讲了这件事。
token 在你生活里出现的地方
你的账单
API 按 token 计费,不是按词,也不是按请求。输入和输出 token 分开定价,而输出始终是更贵的那个。
有个实际后果容易让人栽跟头:一份你只发一次的长文档,可能比一次简短的来回对话更便宜,因为在对话里,全部历史每一轮都要作为输入重发一遍。开销随对话长度的平方增长,而不是线性增长。
你的上下文窗口
「20 万 token 的上下文窗口」指的是 20 万个 token,而这份预算要同时覆盖所有东西——system prompt、你的问题、到目前为止的对话、任何粘贴进来的文档,还要留出正在生成的回答的位置。见什么是上下文窗口?。
看起来像犯傻的失败
问一个模型 strawberry 里有几个 r,它可能答错。让它把一个词倒过来写,它可能磕磕绊绊。
部分原因是模型从来没有收到过单个字母。它收到的是一小把代表片段的 ID。数字母,等于要它汇报自己输入分辨率以下的东西。
这一点要小心措辞,因为它经常被夸大:切分方式是一个真实的成因,但不是全部解释。模型在被直接要求时,往往确实能正确拼写单词,这说明字母层面的信息从训练数据里是可以部分还原的。诚实的说法是:切分让字符级任务变得不自然地难,但不是严格不可能。
token 在每种语言里并不一样便宜
因为词表是它训练文本留下的化石,而那段文本严重偏向英文,英文拿到了最多的整词条目。同样的意思用另一种语言表达——尤其是非拉丁字母的语言——通常要花更多 token。
这份差别你要付两次钱:一次是钱,一次是上下文窗口。差距有多大完全取决于你用的是哪个 tokenizer,所以去实测,别信别人引用的倍数。
自己动手试一下
拿真正的 tokenizer 玩 10 分钟,胜过再读一篇文章。多数模型厂商都提供网页版 tokenizer;打开一个,然后:
- 切一句你自己写的话。把 token 数和词数比一比。
- 把一个词分别带前导空格和不带空格各切一次。比较 ID。
- 切一个你自己领域的专业术语。看它怎么碎掉。
- 把同一段话用两种语言各切一次。比较总数。
要点回顾
- token 是来自固定词表的一小段文本——通常是一个常见词、一个片段,或者一个词加上它的前导空格。
- 词表在模型被造出来时就冻结了,反映的是它据以构建的文本,这就是常见英文便宜的原因。
- 成本、上下文上限,以及一整类「为什么它这方面这么差」的失败,都记在这同一个单位上。
下一篇: LLM 是什么?——那个读着这些 token 的机器,到底是什么。