这是现代人工智能领域最令人啼笑皆非的现象之一:当今的大型语言模型(LLM)可以编写复杂的 Python 代码、起草严密的法律合同、翻译冷门语言,甚至能模仿莎士比亚创作十四行诗。然而,如果你问它一个看似幼稚的问题——“单词 strawberry(草莓)里有几个字母 r?”或者“刚才那句话里有几个单词?”,它却经常给出一个错误且自信的答案。
对于人类来说,这种失败是难以理解的。一个能通过图灵测试、智商看起来远超常人的系统,为什么会在幼儿园水平的计数任务上栽跟头?
答案并不在于模型“笨”,而在于人工神经网络的底层架构。大模型本质上不是计算器,它们“阅读”文本的方式与人类有着根本的区别。要理解 AI 为什么不会数数,我们需要剥开神经网络的外壳,观察它们是如何感知世界、处理数据并生成语言的。
1. 分词瓶颈:只见森林,不见树木(Tokenization)
大模型无法准确计算字母或单词的首要原因,是一个被称为分词(Tokenization)的预处理步骤。
当人类阅读“strawberry”这个单词时,我们的眼睛会扫描到 10 个独立的字母,并能轻易地在视觉上定位并统计字母“r”的出现次数。
然而,大模型并不直接处理原始文本。在文本进入神经网络之前,它会被输入到一个“分词器”中(通常基于 BPE,即字节对编码算法)。分词器会将单词切分成被称为 Token(词元) 的区块。这些 Token 可能是完整的单词、音节,或者是根据模型训练数据中的出现频率而生成的字符簇。
- 示例:分词器可能会将“strawberry”拆分为两个独立的 Token:
straw和berry。 - 后果:对于 AI 来说,这两个 Token 是被视为原子的数值 ID(例如,Token 4912 和 Token 813)。
模型对单词内部的字母分布是完全“致盲”的。 要求大模型数“strawberry”里的“r”,就像是递给一个人类一罐密封且涂黑的草莓酱,然后问他里面有多少颗草莓籽。模型知道“草莓”这个概念,知道它与“水果”或“红色”有关,但它无法直接“看到”Token 内部的拼写结构。
2. 自回归生成:概率预测 vs. 逻辑计算
即使我们绕过分词(例如,让模型数句子里的单词数,而每个单词刚好是一个 Token),大模型依然可能出错。这涉及到了第二个核心问题:自回归生成(Autoregressive Generation)的本质。
人类编写的标准软件程序是执行算法。如果你写一段 Python 脚本来数单词,计算机会运行一个确定的算法:创建一个设为 0 的变量(计数器),循环遍历文本,每发现一个目标项,计数器就加 1。
大模型不运行算法,它们运行的是统计概率。它们是“下一个词预测器”。
当你问 AI:“这段话里有多少个单词?”时,它并不会在内部运行一个循环遍历。相反,它会观察提示词中的词序列,并计算“下一个词”应该是哪个数字的数学概率。它依赖海量的训练数据来“猜测”一个在该语境下听起来最合理的数字。
由于计数是一项严谨、基于规则的数学操作,而不是一种语言模式,大模型的概率引擎往往会根据直觉给出一个“听起来很像”但数学上错误的答案。这就像是一个人试图通过观察罐子的形状来盲猜里面有多少粒豆子,而不是把豆子倒出来一颗颗数。
3. 缺乏工作记忆与状态寄存(Working Memory)
计数需要一种特定的认知功能:工作记忆。人类数数时,脑子里会有一个运行中的计分板(“1,2,3……”)。这是一个线性的、具有状态的过程。
大模型的底层——Transformer 架构——是以并行方式处理信息的,而非线性。它们利用“注意力机制”(Attention Mechanism)同时分析整个上下文窗口。由于它们是在一次大规模的数学前向传递(forward pass)中处理所有内容的,因此它们缺乏一个内部的“草稿本”或状态变量来保存累加的数字。
计算机科学家将计数描述为一种需要 $O(n)$ 时间复杂度的过程(n 是物品数量)。然而,标准 Transformer 试图在固定数量的计算层内直接跳到最终答案,这在生成单个词的步骤中本质上是一个 $O(1)$ 操作。如果不通过外部化中间步骤,模型根本无法执行计数所需的顺序逻辑。
4. 数字编码的不一致性
在涉及数字本身的计算和计数时,分词机制再次作祟。人类数学依赖于严格的、基于权重的十进制系统。但分词器对待数字的方式极不一致。
- 数字
123可能是一个 Token。 - 数字
1234可能会被拆分为12和34两个 Token。 - 数字
12345可能会被拆分为123和45。
由于数字被切分的方式看似随机,模型在对齐数位、进行加减法或统计数值分布时会感到非常困惑。它试图将数学作为一种“语言翻译任务”来学习(将“2+2”翻译为“4”),而不是学习算术背后的底层规则。
5. 桥接鸿沟:我们如何教 AI 数数?
既然大模型在设计上就不适合数数,我们该如何解决这个问题?研究人员和工程师开发了一些聪明的策略:
- 思维链(Chain of Thought, CoT)提示词:我们可以通过让模型写出思考过程来模拟“工作记忆”。如果我们告诉模型:“请逐个写出 strawberry 的字母,每写到一个 r 就标记出来,最后统计总数。” 这就强迫模型生成了一个外部“草稿本”,将任务从一次性的概率跳跃转变为一系列微小的、可管理的语言逻辑步骤。
- 工具调用(Code Interpreter):这是目前最有效的方案。现代模型(如带插件的 GPT-4 或 Gemini)可以识别出这是一个计数问题,然后自动编写一段 Python 代码。代码在确定的运行环境中执行,返回精确的数学结果。它将确定性的数学外包给了传统的计算机处理器。
- 字节级模型(Byte-level Models):未来的 AI 架构正在尝试绕过词元化,直接在字节或字符级别进行学习。这样模型就能“原生”地看到每一个字符,从而在底层具备更强的结构化感知能力。
语言与逻辑的分水岭
大模型无法可靠地数数,这与其说是系统的“漏洞”,不如说是其设计的必然特征。它揭示了人类生物脑与人工神经网络之间深刻的区别。
大模型是模式识别和语言合成的天才,但它们缺乏定义传统计算的、刚性的、步进式的逻辑处理器。了解这一点,能让我们更好地与 AI 协作:在涉及创意激发、文案创作和信息摘要时,大模型无与伦比;但在涉及数数、精准算术或严密逻辑校验时,我们最好还是给它配个计算器,或者……信任我们自己的手指。
