大模型的认字逻辑:token分词的底层真相

当你向一个顶尖大模型提问“strawberry里有几个字母r”,人类只需扫一眼就能得到答案3,但很多先进的大模型往往会给出错误结果。这并非模型推理能力不足,问题根源藏在文本进入模型的第一道关卡——分词系统。
模型读到的不是文字,是带编号的碎片
人类看待单词strawberry时,能清晰分辨出s、t、r、a、w、b、e、r、r、y十个字母,准确指出第三、第八、第九位都是r。但计算机模型无法直接理解字符,在模型处理文本前,必须先经过分词器的转换。
分词器的作用是将长文本切割成小块并赋予唯一数字编号,这些带编号的文本块被称为token,模型最终接收和计算的,正是这一串数字编号,而非原始的文字本身。
对于像strawberry这类高频英文单词,分词器通常会将其作为一个完整的块处理,模型拿到的只是代表该词的单个数字代号,内部的字母细节完全被隐藏,自然无法统计出r的数量。当研究人员将strawberry中的r替换为z时,模型往往会输出类似sztawbezzy的怪异结果——原本熟悉的完整token被打乱,模型需要处理大量陌生的碎片,理解难度陡增。
这类情况并非个例。早期纯词级分词器如果词表中收录了America却漏掉Americans,当输入“Americans are from America”时,Americans会被替换为代表生词的特殊符号<OOV>,模型看到的句子变成“<OOV> are from America”,完全无法推断此处指代的是美国人。
更微妙的是,人类眼中语义完全一致的表达,在模型看来可能对应完全不同的token序列。比如intelligence、带双引号的"intelligence"以及同根词intelligent,仅存在标点或少量字母差异,切分后的编号序列却天差地别;哪怕句子末尾多一个空格,整个文本的切分方式也会彻底改变。
模型自始至终不会直接读取文字,它只能读懂分词器输出的数字编号,认字的规则在文本送入模型前就已经确定。
那么为什么要把文字切碎呢?如果按单个字母或字节处理,哪怕很短的文本也会生成极长的序列,模型计算成本高、速度慢,还需要为每个单位单独配置参数。将高频出现的字母组合打包为大token,能大幅缩短序列长度,提升计算效率、节省资源,这也是这套方案被行业广泛采用的核心原因,但这份便利背后也伴随着诸多代价。
token是怎么造出来的:从字母开始的合并游戏
很多人会以为,分词器的词表是语言学家手动编写的字典,但现代大模型的token集合,其实是算法从海量真实语料中统计生成的,而非人工预设的规则。
需要注意的是,分词器的训练和大模型的训练是独立进行的,分词器只负责文本切分规则,大模型则在切分好的token序列上完成后续学习,二者是完全分离的两个系统。
主流的分词算法以BPE(字节对编码)为主,其核心逻辑非常直观:从单个字母或字节出发,反复统计相邻出现次数最多的字符对,将其合并为一个新的token,直到token表的大小达到预设目标。
我们可以用一个极简的例子演示这个过程:假设训练数据只有两个词,low出现5次,lower出现2次。初始阶段,token表仅包含单个字母l、o、w、e、r,每个词都会被拆分为最细的单元:low被拆为l o w,lower被拆为l o w e r。
算法首先统计相邻字符对的出现频率,l和o在两个词中都出现,总次数为5+2=7次,是频率最高的组合,因此会被合并为新tokenlo。此时文本变为:low被拆为lo w,lower被拆为lo w e r。
再次统计后,lo和w的相邻次数同样为7次,会被合并为low,文本进一步变为:low拆为low,lower拆为low e r。后续算法会继续按频率高低合并剩余的字符对,最终生成符合语料特征的token集合。
当语料规模足够大、合并循环足够多时,原本细碎的单字token会逐渐组合为高频前缀、后缀、词根乃至完整的常用词,模型在处理新文本时,就会按照这套学习到的合并规则,将文本切割为对应的token序列。
不过这种每一步选择当前最高频组合的贪心算法,无法保证得到全局最优的切分结果。有研究证明,使用非贪心的合并方式,能得到比BPE更短的token序列,因此BPE只是工程上兼顾效率的近似方案,并非理论上的最优解。
除了BPE之外,学术界还有另外两类主流分词方案:Unigram算法先构建超大候选词表,再通过计算删除哪些词对整体概率影响最小来逐步精简;WordPiece则以提升模型对下一个词的预测能力为依据来合并字符对,早期的BERT模型就采用了这套方案。
这也带来一个关键认知:在计算机视角下,同一个单词可以有多种不同的切分方式。比如disjointed既可以按词根切分为dis+joint+ed,也可以切分得更细碎,甚至直接作为一个完整token。理论上,一个单词的可能切分方式会随长度呈指数级增长,模型最终看到的切分结果,完全取决于它所使用的分词器训练规则。
这套认字机制的隐形成本
被打包的细节,模型难以拆解
将文本打包为token确实大幅压缩了序列长度,但也让模型难以访问token内部的细节,这一问题在数字和算术场景中表现得尤为突出。
早期的GPT-2在处理数字时切分非常随意,比如数字8675309可能被切分为[8] [67] [5] [30] [9]。后续的模型为了规整性,在预分词阶段加入了从左到右每三位一组的切分规则,8675309会被切分为[867] [530] [9],但这种方式和人类的数学运算习惯完全相悖。
人类在学习竖式加减乘除时,进位和借位都是从右往左计算的,但模型从左到右三位一切的规则,打散了数字的高位结构,将末尾的个位数单独拆分出来,导致模型难以感知每个数位的真实权重,做多位数加减法时经常出错也就不足为奇。
相关探针实验表明,大模型虽然能感知token内部的组成部分,但这种感知并不完全。有研究通过打乱切分规则,或者让模型直接读取底层字节的方案,发现模型在统计字母数量和多位数算术任务中的表现都有提升,这直接证明了算术失误和字母统计错误的根源,正是token打包机制。
同一段文本,不同语言的成本天差地别
分词机制还带来了一个天然的语言不平等问题。
目前主流大模型的API服务都是按照token数量计费,且模型生成输出的单价通常高于输入的单价。英文在互联网上的语料资源极其丰富,分词器在训练过程中,绝大多数常用英文单词乃至短语都会被合并为简短规整的单个token。但对于低资源语言和非拉丁语系语言,分词器中往往没有预留足够的高频词位置,同样的语义内容,用英文可能只需要几十个token,换成其他语言却会被切分为数百个细碎的token。
除此之外,大模型主流架构中的注意力机制开销,会随序列长度的平方增长,序列长度翻倍,计算量约增加四倍。有研究使用GPT-4o生成同一份《世界人权宣言》,将生成费用除以各国平均时薪后换算为工作时长,结果显示所需时间最短与最长的国家相差高达54.3倍。这个差距是低资源语言token碎片化带来的成本溢价,与各国国民收入差距双重叠加后的结果,并非单纯的token单价差异。
尽管学界已经提出了PA-BPE等改进方案,在训练时主动照顾压缩率较差的语言,但正如相关论文所指出的,绝大多数这类补救措施至今仍停留在学术研究阶段,并未得到广泛应用。
潜藏的安全风险与生态集中问题
分词机制还带来了诸多安全隐患,同时也折射出开源社区的生态现状。
由于BPE算法完全依赖语料频率统计,分词器时常会收录一些生僻的长token。这些token在分词器的训练语料中偶然出现过,但在后续训练大模型的海量正文语料中几乎从未露面,因此模型从未在真实语境中学习过这些token,对应的向量表示基本处于随机状态。
一个著名的案例是SolidGoldMagikarp这个奇怪的网名,它在分词器语料中频率较高,但在模型训练的正文语料中几乎没有出现过。当输入中包含这个token时,其随机的向量表示会破坏模型对整句话的理解,导致模型行为失常,成为一个隐蔽的攻击入口。
还有一类更隐蔽的攻击:攻击者将英文单词中的拉丁字母a,替换为外观完全一致的西里尔字母а,或是在字符之间插入不可见的零宽连接符。人类肉眼无法察觉这些变化,但底层分词器会被彻底打乱,原本完整的安全敏感词会被切分为多个毫无关联的碎片,从而轻松绕开大模型的内容安全审核。
开源社区的分词器生态也呈现出高度集中的特点。有研究团队在相关社区进行了普查,截至2025年11月3日,扫描约74万个候选模型后发现,能成功加载的超过半数,其中94%的模型都使用了第三方的分词器,而非自行训练的专属方案。
论文地址:https://www.alphaxiv.org/zh/abs/2609.tokenization-survey-modern-nlp

