如果你问大模型一个简单的问题,单词 strawberry 里面有几个字母 r?
答案是 3 个,你我一眼就能数清。但很多当下最聪明的大模型都会答错。
这并不是个例。让模型去算一些普通的加减乘除、做简单的拼字游戏,或者数一段话里某个汉字出现了几次,它们往往都会在这些人类一眼就能看清的地方栽跟头。
很多人第一反应是模型太笨、记性差,或者推理能力不够强。
但这篇由谷歌牵头、联合 20 多家研究机构共 32 位作者完成的 154 页综述,把这类失败直接摆在最前排。它指出,病根不全在模型的脑子,而在文本进入模型之前的最前置环节,也就是模型「认字」的方式。
论文地址:https://www.alphaxiv.org/zh/abs/2609.tokenization-survey-modern-nlp大模型越来越能干,但在现有的认字方式下,这几类错会反复出现。
今天我就对照这篇小白综述,带大家把大模型底层的「认字」机制彻底看个明白。
一、模型读到的不是字,是一块块带编号的拼图
要理解大模型为什么数不对字母,首先要明白它眼里的文字到底长什么样。
我们人类看 strawberry 这个词,眼前浮现的是十个整整齐齐的英文字母,s、t、r、a、w、b、e、r、r、y。我们能轻而易举地指出第三个、第八个和第九个字母是 r。
计算机模型并不能直接理解这些字符。在模型真正看到文字之前,文本必须先经过分词器。分词器是一种把文字切成字块并编号的工具,它把长长的文本切成一块块带编号的拼图碎片,每个碎片分配一个唯一的数字编号。这些带编号的字块碎片,在论文里被称为「token」。
模型最终吃进去并用来计算的,根本不是字母本身,而是一串数字编号。
对于像 strawberry 这样在英文世界里极度常见的词,分词器通常会把它整个打包成一个完整的字块,或者切成极少数几个大块。在模型的视野里,它拿到的就是一个代表该词的数字代号。里面的那些字母早就已经糊在了一起,模型从来没有逐个字母读过这个词,自然数不出里面有几个 r。
当研究人员让模型把 strawberry 里的字母 r 全部换成 z 时,模型往往会输出像 sztawbezzy 这样怪异的结果。因为一旦把 r 换掉,原本熟悉的整块拼图就被打碎了,变成了一堆模型很不熟悉的零散小块,模型理解起来立刻就变得极其吃力。
论文里还有几个例子,说明模型看到的东西和人类完全不同。
比如地名 California,人类看到的是一个完整的词。但如果让模型按底层的字节单位去读,字节是计算机存文字的最小单位,一个英文字母占 1 个字节、一个汉字占 3 个字节,它需要依次处理 10 个字节。如果是 Japan,在底层则是 5 个字节。
在更早期的纯词级模型里,情况甚至更极端。如果分词器的词表里收录了 America,却恰好漏掉了复数形式 Americans,那么输入「Americans are from America」这句话时,Americans 就会因为不在词表里,被强行替换成一个代表生词的特殊符号 。模型看到的实际句子就变成了「 属于 America」。这时候模型根本无法推断这个位置原本指的是美国人,它完全有可能是德国人,或者是别的什么词。
更微妙的是,很多在人类看来意思一模一样的表达,在模型眼里可能是完全不同的编号。
单词 intelligence、带了双引号的 "intelligence",以及同根词 intelligent,表面上看只差了一个标点或几个字母,但经过切分后,得到的编号序列天差地别。哪怕仅仅是在句子的末尾多敲了一个空格,整个句子的切分方式都会彻底改变。
模型从头到尾都不直接读文字,它读的只是分词器给它的这串数字编号。认字这道工序,在文本真正送进模型之前,就已经尘埃落定了。
讲到这里你可能会问,好好的文字为什么非要切碎?
原因很实际。如果一个字母、一个字节地读,哪怕一句很短的话也会变成很长的序列,模型算起来又慢又贵,还要为每个字母单独准备一组参数。把高频出现的字母组合打包成大字块,序列立刻变短,模型算得快、参数也省。这是这套做法被整个行业采用的根本理由,只不过这份便利后面会附上代价。
二、这些字块怎么来:从字母开始,反复合并最常见的一对
既然大模型读的是带编号的字块,那么这些字块到底是谁造出来的?
很多人的直觉是,语言学家肯定给模型编了一本厚厚的字典,规定了哪些词该切成一块。
真实情况完全相反。现代大模型的字块表,不是人工写死的规则,而是算法从海量真实语料里统计出来的。
还有一个容易忽略的前提,分词器是先独立训练好的,和后面训练大模型用的不是同一批语料。分词器只负责决定怎么切,大模型则在切好的编号上学习,两者是分开的两套东西。
整个制作分词器的过程通常包含几步。先准备好海量文本,做一些基础的文字清洗和粗切分(学术上叫预分词),然后用算法去挖掘字块。
在当代大模型里,统治地位最高的算法叫 BPE,全称是「字节对编码」。它的核心思想用一句话就能概括。从单个字母或字节出发,反复找出挨在一起出现次数最多的一对,把它合并成一个新字块,直到字块表的大小达到我们的预期。
为了让零基础的朋友看明白,我设一个极简的小例子来演示这个合并过程。
假设我们的训练数据里只有两个词,每个词后面标了它出现的次数。
"low" 出现了 5 次
"lower" 出现了 2 次
一开始,我们的字块表里只有单个字母,l, o, w, e, r。每个词都被拆得最碎。
l o w(5 次)
l o w e r(2 次)
现在算法开始统计,哪两个相邻的字母凑在一起出现的次数最多? 字母 l 和 o 挨在一起,在两个词里都出现,一共 5 + 2 = 7 次,次数最高。算法先把它们合并成新字块 "lo"。此时文本如下。
lo w(5 次)
lo w e r(2 次)
接着再数一遍。新字块 "lo" 和后面的 "w" 挨着,同样出现了 7 次,于是合并成 "low"。
low(5 次)
low e r(2 次)
再往下,"low" 只在第二个词里和 "e" 相邻,出现 2 次,其余相邻对的次数更低,算法就按频率高低依次继续合并。
只要语料足够大、循环合并的次数足够多,原本碎成单字的文本就会逐渐长出常见的前缀、后缀、高频词根乃至完整的常用词。以后模型在读新文本时,就会严格按照这套学出来的合并顺序,一步一步把碎片拼成大字块。
不过,这种每一步只挑当前最高频的贪心做法,并不能保证切出全局最短的结果。
论文在第 13.2 节用一组小数据集证明了这一点,换成一种不贪心的合并方式,切出来的总长度能比 BPE 更短。所以 BPE 是工程上实用、算起来快的近似,不是理论上的最优解。
除了 BPE 之外,学术界还有另外两派主流做法。一派是 Unigram,它的逻辑正好反过来,先准备一个超大的候选词表,然后计算删掉哪个词对整体概率影响最小,像修剪树枝一样不断往下砍;另一派是 WordPiece,它合并的依据不是看谁出现的次数多,而是看合并之后能不能让模型更好地预测下一个词,当年的 BERT 模型用的就是它。
这带来了一个关键认知。在计算机眼里,同一个词从来不止一种切法。
比如单词 disjointed,既可以按词根切成 dis + joint + ed,也可以切得更碎,甚至直接当成一个整词。理论上,一个单词所有可能的切分方式会随着长度呈指数级暴增。模型最终看到哪一种,完全取决于它当初学到的是哪一个分词器。
三、这套认字法的代价:能力、成本、公平与安全
把文本打包成字块,确实大幅压缩了文本长度,帮大模型省下了海量的计算资源。但这套认字法绝非免费的午餐,它在能力、成本与安全上都留下了巨大的隐患。
被打包的字,模型很难拆开看
最直接的影响是算术能力。文字被打包之后,内部细节对模型来说几乎是隐形的,这在数字和算术上表现得尤为突出。
早期的 GPT-2 在切分数字时非常随意,比如遇到一串数字 8675309,分词器可能会把它切成零散的 [8] [67] [5] [30] [9]。
到了新一代的模型,为了整齐,工程师通常在预分词阶段加上规则,让模型按每三个数字一组从左往右切。于是 8675309 就被切成了 [867] [530] [9]。
但这与人类的数学运算规律完全相悖。我们在小学学竖式加减乘除时,进位和借位全都是从右往左算的。大模型从左往右三位一切,把原本属于最高位的结构打散,末尾孤零零的个位数 [9] 被单独甩在后面。模型很难感知每个数位真正的权重,做多位数加减法经常算错,根本不足为奇。
论文指出,探针实验表明,大模型虽然能感知字块内部的组成,但这种感知并不完全。
论文引用的反证实验也指向同一结论。在训练时打乱切分规则,或者让模型直接读底层字节的模型,在数字母 r 和多位数算术上表现更好。这从反面说明,算术差和数不清字母,病根就在字块打包。
同一段话,不同语言代价不同
第二个代价直接关系到大家的钱包。
各大模型厂商的 API 都是按照字块数量来计费的,而且模型生成输出的单价通常比输入的单价还要贵得多。
这就引出了一个天然的语言不平等问题。
英文在互联网上的语料极其丰富,分词器在训练时,绝大多数常用的英文单词乃至短语都被合并成了非常短、非常规整的单一字块。
但对于低资源语言,以及很多非拉丁语系的语言,分词器里根本没有为它们预留足够的高频词位置。结果就是,同样的这一段话,用英文可能只需要几十个字块就能表达,换成其他语言就会被切得稀碎,变成几百个碎片。
这背后还有一层计算成本。在大模型的主流架构中,注意力机制的开销随序列长度平方增长,序列长度翻倍,计算量约涨四倍。
论文图 6.2 显示,研究者用 GPT-4o 生成同一份《世界人权宣言》,如果把生成的费用除以本国的平均时薪,换算成各国民众为了支付这笔生成费用需要工作多少秒的活,美国所需的时间最短,而缅甸所需的时间最长,两者相差了 54.3 倍。
需要特别说明的是,这 54.3 倍反映的是劳动时间维度的差距,是低资源语言切分太碎导致的字块溢价,与不同国家国民收入差距双重叠加后的结果,而不是说缅甸语的字块单价本身比英语贵 54 倍。
虽然学界已经提出了像 PA-BPE 这样在训练时主动照顾压缩率较差语言的改进方案,但正如论文所感叹的,绝大多数这类补救措施至今依然只停留在学术论文里。
94% 的模型,用的是别人的分词器
第三个代价关乎安全,还牵扯出一组生态现状。
因为 BPE 纯粹依赖统计频率,这导致分词器经常会收录一些奇怪的生僻长字块。这些字块在分词器训练语料里偶然出现过,但在后来真正训练大模型大脑的海量语料里,它们几乎从未露面。
由于模型从未在上下文中真正学过这些字块,它们在模型内部对应的向量表示基本处于完全随机的状态。
一个著名的案例是 SolidGoldMagikarp(纯金鲤鱼王)。这个奇怪的网名在分词器语料里频率很高,但在模型的正文语料里几乎没有。一旦提问里出现这个词,它对应的随机表示会破坏模型对整句话的理解,让模型行为失常,因此成了一个隐蔽的攻击入口。
还有一类人类肉眼根本无法察觉的攻击。攻击者把英文单词里的拉丁字母 a,悄悄换成外观一模一样的西里尔字母 а,或者在字符之间插入一个看不见的零宽连接符。人类肉眼看过去没有任何异样,但底层的分词器却会被彻底打乱,原本一个完整的安全敏感词会被切成几个毫无关联的碎片,从而轻松绕过大模型的内容安全审核。
整个开源社区的分词器生态也呈现出高度集中。
论文团队在 Hugging Face 社区做了一次普查。截至 2025 年 11 月 3 日,他们扫描了约 74 万个候选模型,其中能成功加载的过半。
最关键的结论是,有整整 94% 的模型,所用的分词器与社区里另一个模型的分词器在底层逐字节完全相同。
大家根本没有重新训练自己的分词器,全都在直接复制粘贴别人的规则。在全网总计 279 亿次的历史下载量中,下载量排名第一的竟然是 2018 年发布的 BERT 分词器,单它一家就占了全部下载量的 23.2%。
在这股全行业都在扩大字块表的浪潮中,Anthropic 旗下的 Claude 反着走。
据社区逆向估计(这并不是官方公开信息),Claude 3 到 Claude 4.6 的字块表规模大概在 49,000 左右,而到了最新的 Claude 4.7 以上版本,字块表反而急剧缩减到了约 16,000。而且它的切分行为不像传统的 BPE,更接近寻找最短路径的动态规划算法。
别人都在把字块表做大,Claude 反其道而行之主动删减字块表。一种外界的推测是,这是为了剔除没学透的冷门字块、收窄攻击面,但论文并未证实这一因果关联。
四、能不能让大模型换一种认字法
既然现有的分词规则有这么多毛病,我们能不能彻底换掉它?
前沿学术界一直在尝试几种全新的认字思路。
最彻底的想法是干脆不要中间商,直接让模型读底层的字节。
世界上所有语言的文字在计算机里最终都是由字节组成的。一个字节只有 256 种可能的状态,这意味着模型的词表只需要区区 256 个基础单元,就足以覆盖全世界所有的语言、生僻符号甚至火星文,彻底告别生词问题。
像 ByT5 这样的纯字节模型,在多语言任务上的表现甚至超过了同等参数量的传统模型。但它的致命死穴在于序列太长。一个汉字在 UTF-8 编码下是 3 个字节,一段话转成字节后长度会膨胀数倍。大模型在输出时必须一个字节一个字节往外蹦,推理速度慢到让人无法忍受。
第二种思路是不死守固定的字块表,动态决定在哪里下刀。
比如 Meta 提出的 BLT 架构,它让模型在读字节流时,实时预测下一个字节的信息量。一旦遇到信息量急剧飙升的地方,就说明这里大概率是一个词或语义的边界,模型就在这里动态切一刀。这种方式把切分的权力交给了模型自己,灵活得多。
还有一种更为激进的方案,干脆把文字当成图片来看。
比如 PIXEL 模型,它不管文本底层是什么编码,直接把文字渲染成图像,让模型像看图一样认字。这种方案在跨语种、识别生僻字形上的表现远超传统 BERT。一个 2200 万参数的 PIXEL 模型,在一组主流语言理解任务上能打平 8600 万参数的 BERT 同族模型。像 DeepSeek-OCR 这样的后续工作,也在证明把文字视觉化是一条有潜力的路线。唯一的难点在输出端,模型看懂图之后,还要再把结果转回可编辑的文字。
综述作者对这些尝试的判断很冷静。新思路各有亮点,但要替换现有的分词地基,需要付出的训练和评测成本很高。
论文据此点出三个最值得做的方向,更好的分词器缩放定律、能针对子词缺陷的替代方案,以及更可靠的评测基准。
回到最开始的问题。
大模型数不对 strawberry 里有几个字母 r,不是它记性差,也不是它在偷懒。在它睁开眼睛的那一刻,呈现在它面前的就不是人类所书写的文字,而是一串由分词器提前打包好、学出来的数字编号。
读到这里,每个人留下的印象可能不太一样。有人会对某个分词器的特殊设计好奇,比如 Claude 为什么反着把字块表越做越小;有人会记住一个反常识的事实,原来几十万个模型用的都是同一套分词器;也有人以后看到模型出错,会多往「认字」这一环想一想。
无论留下的是哪一条,下次再看到大模型算错多位数乘除法、发现非英语提问收费莫名昂贵,或者看到有人用一串乱码把模型搞崩溃时,你都可以先不急着猜它哪里没想通,而是退一步,问自己一个问题。
文本在进入它大脑的第一步,到底被切成了什么?
论文在开篇列出了一个数据。2025 年三个机器学习顶会的论文摘要里,提到分词相关词的占比最多只有 2%。
但就是这不到 2% 的研究者关注的一环,悄悄决定了每个模型擅长什么、又会在哪里栽跟头。我们天天谈论大模型聪不聪明,却很少低头看看它睁开眼看到的第一个东西。读完这篇综述,下次再聊起模型的表现,你心里大概会多出「认字」这个绕不开的起点。

