
大模型为什么连 strawberry 里有几个 R 都会数错?
模型并不像人一样逐字母阅读。它看到的是 token 编号——这个设计取舍,解释了经典的「数字母」失误。
问早期的大语言模型:strawberry 这个单词里有几个字母 R,它常常答错。最直觉的结论是「模型不会数数」。更有用的结论是:它一开始就不是在字母层面看这件事。
模型最先拿到的是什么
你在对话框打完一句话、按下发送之后,模型并不会直接读那些汉字或字母。一个叫分词器的程序,会把字符串转成一串整数。每个整数对应固定词表里的一个条目——现代大模型的词表通常有几万到几十万个条目。这个步骤就叫分词(tokenization)。
因此,你看到的是「今天天气怎么样」这几个字;模型看到的,往往是几个编号。之后几乎所有计算,都在这些编号及其对应向量上进行,而不是在原始字母或笔画上进行。
为什么不用「整词一个 token」
若词表用完整单词,体积会变得极大,而且训练时没见过的新词几乎无法处理。若改成单个字符,词表的确变小,但模型得从零学习最基本的拼写模式,计算效率很低。子词分词取了中间值:常见片段成为单一 token;罕见词与新词则由更小的片段拼起来。
在这种设计下,tokenization 可能被切成 token 与 ization;running 可能切成 run 与 ning。模型擅长预测下一个片段,并不天生逐个检查片段内部的每个字母。
strawberry 这个教训
所以 strawberry 的谜题其实没那么神秘。人会自然地把词拆成字母;模型却常常只看到几个子词单元——这些编号刚好拼出一个人类会逐字母拆开的词。数错 R 的个数,并不直接证明模型完全不会算术;它提醒我们:文字与模型之间的界面,对「字母级任务」本来就有损耗。
- 不同模型家族使用不同分词器——例如 GPT 系列常见的是 BPE 变体,LLaMA 系列则常用 SentencePiece。
- 同一句话若被分成更少的 token,通常代表更少的计算量;分词器选择也会影响多语言覆盖能力。
- 基本形态始终一样:文本进去,整数出来。
一旦把分词看成工程取舍而不是魔法,许多「奇怪」的模型行为就比较好定位了。模型并不是用你读书的方式在读文字;它读的是一套为训练效率而压缩的编码——而那套编码,未必保留人们习以为常的字母视角。