一句话定义:数字分词的坑,是指 tokenizer(分词器)把「12345」这类数字切成几段互不相干的碎片,模型看到的不是“数值大小”,而是一串没有位值含义的符号,因此在算数、比大小、对齐位数这类任务上天然吃亏。
为什么会这样
分词器的训练目标很朴素:用尽量少的 token 覆盖尽量多的文本。高频片段(“the”“的”“ing”)会被合并成一个 token。数字的麻烦在于,任意长的数字几乎不会重复出现,频率统计帮不上忙,分词器只好用一套和数值毫无关系的规则去切。常见的切法有按位切(1|2|3|4|5)、按固定宽度切(123|45),或者按训练语料里偶然出现过的模式切。
更麻烦的是,同一个数字在不同写法下会被切成完全不同的样子:带千分位的 12,345、带空格的 12 345、纯 12345,三者的 token 序列可能毫无交集。
打个比方
把一张写着 12345 的纸条随机撕成三片,再让你做进位加法。你不是不会加,而是看不清哪一位是哪一位。人做竖式会把个位对齐,模型没有“对齐”这回事,它手上只有一串 token。所以它要花很大的力气去“猜”这些碎片各自代表哪一位,猜错就全错。
还有一层:token 之间的距离不等于数值距离。3.14 和 3.15 数值上挨着,token 序列却可能完全不同;100 和 999 差得远,反而可能共享前缀。模型对“接近”没有直觉。
| 切分方式 | “12345” 变成 | 后果 |
|---|---|---|
| 按位切分 | 1 2 3 4 5 | 位值关系清楚,但 token 数变多、上下文开销大 |
| 按固定宽度或偶然片段切 | 123 45 | 进位要跨 token 传递,最容易出错 |
| 随上下文变化 | 有时 12 345,有时 123 45 | 同一个数“长得不一样”,行为更不稳定 |
和相邻概念的区别
- 与“中文分词”不是一回事:中文分词是切词,这里说的是子词级、字节级的切分规则。
- 与“模型不会推理”也不是一回事:数字分词只是算数差的原因之一,还有缺少中间草稿(scratchpad)、不能调用工具等因素。它属于“输入表示”层面的坑,不是“思考能力”层面的坑。
- 与 embedding(嵌入)无关:坑发生在文本变成 token 的那一刻,早于向量化。
对实际工作的意义
对普通职场人:凡是要精确数字的地方——金额、日期、订单号、身份证号、坐标、表格里的长数字——尽量让模型调用计算器或代码执行,不要指望它心算。提示词里让它先把数字逐位抄写一遍、写竖式、分步算,通常比直接问答案稳。让它输出结构化数据时,也要检查数字有没有被改写或截断。
对做模型和分词器的人:是否强制按单个数字切分是个取舍——按位切分对算术友好,但长数字会占用更多 token;按片段切分省 token,却把进位难题留给了模型。至于“加千分位或空格能不能提升准确率”,效果依具体分词器而异,需要自己测。
一句话收尾:模型算错数,未必是它笨,有时是它压根没看清你给的那串数字长什么样。涉及具体模型行为,以官方文档和实测为准。
