随笔
#大模型#Tokenizer#算术比较#分词#训练数据

为什么大模型会把 9.11 算得比 9.9 大

围绕 2024 年 7 月大模型集体答错「9.11 和 9.9 哪个大」的现象,从分词器对数字的切分、训练数据的语境偏差与概率预测机制切入,解释错误成因、成立边界与改进方向。

2024 年 7 月,一个小学算术题让几乎所有主流大模型同时「翻车」。第一财经记者实测 12 个大模型,其中 8 个认为 9.11 大于 9.9,包括 ChatGPT-4o、Gemini Advanced、Claude 3.5 Sonnet 等头部产品;只有通义千问、文心一言、Minimax、腾讯元宝答对。更耐人寻味的是,当记者追问「为什么」时,大多数模型又会改口承认错误。

这个现象值得追问,因为它把大模型「看似会算、实则靠猜」的短板,暴露在了一个任何人都能验证的例子上。常见直觉认为,能通过奥数题的模型处理小数比较应该毫无压力;但事实说明,模型的「计算」并不走人类熟悉的符号规则,而是取决于文本如何被切分、以及训练语料里这类数字以什么语境出现。要理解这一矛盾,需要从大模型读取文本的第一步——分词——讲起。

起因:综艺得票率点燃的连环翻车

事件的导火索是《歌手》节目的一期得票率:孙楠 13.8%,香缇莫 13.11%。有网友质疑 13.11% 明明大于 13.8%,排名却有出入,便把截图发给大模型求证,得到的却是同样的错误判断。Scale AI 的提示工程师 Riley Goodside 顺着这条线索直接测试「9.11 vs 9.9」,多个主流模型集体答错,相关截图迅速在社交平台传播,最终演变成一场媒体实测。

第一财经的实测把样本扩大到 12 个模型,结果只有 4 个答对。答错的方式各有不同:ChatGPT 直接比较小数点后的数字,得出 11 大于 9;智谱清言虽然正确指出十分位 1 小于 9,结论却仍是 9.11 更大;豆包甚至举例「9.11 元比 9.9 元多 0.21 元」。而当记者追问推导过程时,几乎所有模型都开始自我修正——有的在推演中算出了 0.11 小于 0.9,却话锋一转得出 9.11 大于 9.9。这种「一追问就改口」的现象,暗示模型并非在稳定地计算,而是在生成一段符合概率分布的文本。

机制一:分词器把小数拆成了 Token

要解释错误来源,先看大模型处理输入的起点——分词器(Tokenizer)。模型不能直接处理字符,而是把文本切分成称为 Token 的片段,再映射为编号。OpenAI 开源的 GPT-2 分词器(基于 BPE 算法,可在其在线工具中直接观察)对这两个数字的切分是:

  • 「9.9」被切为三个 Token:9、.、9;
  • 「9.11」同样被切为三个 Token:9、.、11。

在 OpenAI 的 gpt2 词表里,前者的编号序列是 24、13、24,后者是 24、13、806。也就是说,模型「眼」中并没有一个完整的小数 9.11,而是一串离散片段。两个数的小数部分——「9」与「11」——成了模型最容易直接比较的对象。

这里需要澄清一个常见误解:Token 编号 806 大于 24,并不代表模型「按编号比大小」。编号只是词汇表的索引,本身没有数值含义。真正的影响在于,分词把「9.11」拆成了互不粘连的片段,丢失了小数点后位数对齐这一算术结构;当模型要在 X.9 与 X.11 之间做判断时,它不再有「两个都是一位小数」这种结构可依,只能退回到语料里见过的表面模式。

分词方式由训练语料决定:BPE 会把语料中高频共现的片段合并成同一个 Token,所以常见数字(如 1 到 100、年份)往往被合并,不常见的数字则被拆得更碎。早期语言模型基本不对数字做特殊处理,切分完全取决于统计,这为后续的多位计算埋下了隐患。

机制二:训练语料里,「9.11 大于 9.9」更常见

光有分词还不足以解释全部现象,因为即使把数字换成没有歧义的其他组合,问题依然存在。真正起作用的第二个因素,是训练数据的语境偏差。

互联网语料中,「9.11」最常见的语义是日期(9 月 11 日)和版本号。在版本号语境里,9.11 确实「大于」9.9——比如软件版本迭代,3.11 排在 3.9 之后;在日期语境里,9.11 又是一个记忆点极强的日子。而像「9.11 与 9.9 哪个大」这种小学算术,在语料中出现的频率远低于上述语境。语言模型通过预测下一个 Token 训练,本质上是在拟合文本的统计分布:给定上下文,它输出的总是概率最高的延续。于是面对这个问句,模型更「见过」的是版本号与日期里「9.11 更大」的写法,自然倾向于输出这个答案。

两个对照证据支持这一解释。其一,把数字换成 9.35 与 9.9,同样问「哪个大」,模型大多能答对——因为不存在「9 月 35 日」,也没有对应版本号,语料里没有可借用的错误模式,而分词切分与 9.11 并无区别。其二,第一财经实测中,个别模型在答错后追问「为什么」会改口,说明模型并不是被某条固定规则锁死,而是被新的上下文重新分配了概率。

自注意力与提示顺序:为什么换一种问法就能答对

Riley Goodside 在反复测试中还发现,把选项放到提问之前(如「哪个更大:9.9 还是 9.11?」)时,模型更容易答对;而把问题放在前面、再列出两个数字时,错误率更高。这涉及自注意力机制:模型处理每个 Token 时,会依据上下文动态调整各 Token 之间的注意力权重。当「更大」这个词与两个数字出现在相近的位置,模型更有可能把两个数字当作同一比较关系中的两个操作数来处理。

但这只是概率层面的松动,而非机制层面的修复。即使模型在某个提示下答对了,也不代表它稳定理解了小数结构。第一财经的实测中,有模型在联网查询时先做对,随后又话锋一转导向错误结论;也有模型在推演中已经算出 0.11 小于 0.9,结论却依然写 9.11 大于 9.9。正确与错误之间的摇摆,说明答案来自概率采样,而不是一次可靠的算术计算。

对照:什么问法能救,什么问法救不了

下表汇总了不同语境下大模型的表现与判断依据,供读者在遇到类似问题时作参考:

问法或语境模型常见表现判断依据
直接问「9.11 和 9.9 哪个大」多答错(9.11 大)第一财经实测 12 个模型 8 个答错
换数字「9.35 和 9.9 哪个大」多能答对无日期或版本号联想,分词相同却答对
选项前置,如「9.9 还是 9.11 更大」更易答对自注意力把两数关联到同一比较
明确按数学比较或指出是浮点数基本答对上下文消除版本号与日期歧义
追问「为什么」多数改口新上下文重新分配概率分布
版本号、目录等语境按语境判断(9.11 大)语料中该模式高频出现

这张表说明了一个更本质的结论:模型的表现主要被语境与概率主导,而不是被数学规则主导。同样的两个数字,换一个问法就能得到相反的答案,这在符号计算里是不可想象的。

成立条件与边界:什么时候模型真正「会算」

那么是否存在让模型稳定答对的条件?从实测与检索资料看,可以归纳为三类。

一是明确语境。把「9.11」限定为浮点数或「按数学比较」,能显著提高正确率——这相当于把版本号、日期等歧义消除,让模型回到算术语境。二是借助工具。第一财经实测中答对的通义千问调用了代码解释器实际计算,腾讯元宝则整理了公开讨论并给出有出处的结论——它们没有依赖模型的内部「算术」,而是绕过了它。三是提示技巧。零样本思维链(如要求「一步一步地想」)对这类问题有一定帮助,而角色扮演式提示(如「你是一个数学天才」)效果有限,说明触发可靠推理并不容易。

但这些方法都有边界。工具调用依赖外部计算能力,思维链也只是提高概率而不是保证正确。更关键的证据来自学界:2024 年一篇研究分词对算术影响的论文(Singh 与 Strouse)发现,把数字按从左到右三位的切分方式改成从右到左按逗号分隔,GPT-3.5 与 GPT-4 的加法准确率最高可提升约 20%;从左到右切分还会导致系统性的进位错位——当答案位数与加数不一致时,模型会稳定地输出某种错误模式。这说明分词方式是真实、可复现的影响因素,同时也意味着问题很难靠单一手段根治:即使改进分词,也可能影响其他任务的表现,且更大的模型只是缩小、并未消除这种偏差。

还需强调一点:即使模型在单次比较中答对,也不能推广到其他算术场景。数字比较只是精确符号操作里最简单的形式,进位、借位、括号优先级等多步运算同样容易出错。更稳妥的使用方式,是把模型的数值输出当作一个候选答案,用外部工具或人工复核来兜底,而不是默认它正确。

流程图:一次错误回答的完整链路

下图串联了从输入到错误输出的完整过程,也呼应了上文提到的两个机制:

flowchart TD
    A[输入: 9.11 和 9.9 哪个大] --> B[分词器切分]
    B --> C[Token 序列: 9 . 11 与 9 . 9]
    C --> D[自注意力编码]
    D --> E[按训练语料预测下一个 Token]
    E --> F{语料中哪种模式更常见?}
    F -- 版本号与日期语境更常见 --> G[输出: 9.11 更大]
    F -- 算术语境更常见 --> H[输出: 9.9 更大]
    G --> I[用户追问原因]
    I --> J[新上下文重算概率分布]
    J --> K[多数模型改口答对]

关键转折发生在两个节点:一是分词把小数拆散,让「9.11」失去整体性;二是模型根据语料统计而非数学规则决定输出。追问之所以有效,是因为它提供了新的上下文,把概率分布从「版本号模式」推向「算术模式」——但这与「真正理解」是两回事。

结论:模型不是算错,而是根本没在算

回到最初的问题:为什么大模型会把 9.11 算得比 9.9 大?直接原因是分词器把小数拆成了互不粘连的 Token,间接原因是训练语料中「9.11 大于 9.9」的版本号与日期语境远比算术语境常见,两者叠加,使「9.11 更大」成为模型概率上的首选输出。模型并没有做错算术——它根本没有执行算术,而是在猜测最像样的回答。

这一现象对使用者的实际含义是:当模型给出的数值比较结果与直觉冲突时,不必先怀疑自己的数学,更值得怀疑的是模型的语境与概率偏好。给它一个明确的数学语境、要求推导,或者直接交给计算工具,往往比反复追问更有效。大模型的「智能」建立在统计规律之上,而算术是一种精确规则——在规则与统计冲突的地方,正是它最容易出错的地方。

资料来源

  1. 翻车了!9.11和9.9哪个大?记者实测12个大模型8个都答错
  2. 9.9 和 9.11 哪个大?内在原因是tokenizer的问题
  3. Tokenization counts: the impact of tokenization on arithmetic in frontier LLMs