打开 OpenAI 官网的 tokenizer 页面,粘一句「我喜欢吃麻辣烫」,你会看到这句话被切成几段彩色小方块。再粘一句英文 unbelievable,它可能被切成 un、believ、able 三块——中间那块 believ 连一个完整的英文词都算不上。
这就是大模型嘴里的 token。官方定义朴素得惊人:token 是文本中常见的字符序列。不是词,不是字,是「经常一起出现的那么一段字符」。多常见算常见?不问语言学,问统计学——让语料自己投票。
让语料自己决定在哪下刀
切法叫 BPE(Byte Pair Encoding,字节对编码,一种数据压缩出身的老算法:反复把语料里出现最频繁的相邻片段合并成一个新单位,直到攒够几万种单位为止)。想象你面前摊着全网文本,然后玩一个贪吃蛇游戏:
- 第一步,每个字符都是独立的小段;
- 看一眼全语料,发现
t和h老黏在一起,合并成th; - 再看,
th和e老黏在一起,合并成the; - ……一直合并到攒出一张「常用零件表」——规模几万到几十万个片段不等,各家模型自己定。
从此任何文本都能用这张零件表拼出来:常见词整个是现成的零件(一个 token),生僻词拆成几个零件拼,没见过的怪词就退到单个字母去拼。高频的整块批发,低频的拆件零售——压缩效率就是这么来的。
大白话:语言学那套「什么是词」的知识,这里一概不用。BPE 只认一条:哪段字符老一起出现,哪段就焊死成一个零件。「麻辣烫」如果语料里出现得够多,就是一个 token;「麻辣小龙虾」如果不够多,就拆成「麻辣」+「小龙虾」或更碎的几块。词不词的,统计学不在乎。
半个词也是合法公民
这套刀法切出来的东西,在语言学家眼里相当「不正经」:英文里 believ 这种残肢是合法 token;中文里常见的是一个字或一个常见词,但「凤梨酥」也可能被拆成「凤梨」+「酥」。维基百科特意强调了这一点:大模型的概率切分和编程语言的词法切分,是两种不同的东西——前者靠统计,切出来的可能不成词;后者靠规则,切出来的必是合法的语法单位。
更「不正经」的是,这张零件表没有标准答案。每家模型各自在自己的语料上焊零件,焊出来的表就不一样;同一家公司的新版模型换了语料、调了参数,切法也会变。同一句话,在 GPT-4 里是 12 个 token,换一家可能是 10 个也可能是 15 个。token 在这里第一次露出它的相对性:它不是文本的天然关节,而是「某个模型的某种刀法」的产物。
为什么大模型偏偏要这么切
因为模型干的那件事——OpenAI 文档里那句话:学习 token 之间的统计关系,擅长在一个 token 序列后面预测下一个 token——天生需要一批颗粒度刚好的「棋子」:
- 按整词切?词表爆炸,没见过的词直接抓瞎;
- 按单字母切?序列太长,模型刚读到
t-h-e就忘了开头; - BPE 是两头妥协的甜点:零件表不大不小,什么文本都拼得出,序列还不至于太长。
回头对一下全书的主线。这个阿凡达代表什么?token 在这里是文本的最小可处理单位——正主是「这段文字」,替身是「一串编号」。而它依然是便宜的替身:模型不必直接面对无穷无尽的原始字符,只面对一张有限的零件表。连「可计量」都被继承并放大了——每个 token 有编号,编号可以数,数出来就是下一章的账单。
本章留下的问题
到这里,token 已经从「代表权利的铜板」一路变成了「代表文本碎片的编号」。化身离灯芯越来越远,远到很多人已经感觉不到它们和「凭证」有什么关系。
但下一章画风一转,我们去一个看似八竿子打不着的地方——区块链——你会惊讶地发现,那里的 token 居然返祖了:它重新做回了凭证,只不过代表的东西从「玩一次游戏」变成了「一笔资产」。而再往后一章,连大模型的 token 也被拽回了价值世界:当每个 token 都明码标价,智能本身变成了可以按斤称两的商品。