问一下语言模型“strawberry”这个单词里有多少个字母。它很有可能会答错。它可能会说是十个,或者猜是十一个。它听起来会非常自信,但结果依然是错误的。让同一个模型计算贷款的复利,或者将两个大数相加,或者计算两个日期之间的工作日,你经常会得到一个看起来很合理的答案,但其中的数字却有轻微且危险的偏差。

发生这种情况是因为大语言模型并不像人类那样进行数字推理。它们预测的是 token。一个 token 可能是一个完整的单词、单词的一部分或单个数字。当模型看到“strawberry”时,它看到的并不是排成一排的八个独立字母,而是一堆文本块。它从未被教过如何计算字符数,而只是被教过如何预测下一个文本块是什么。同样的局限性也适用于算术。模型没有内置计算器,缺乏进位逻辑,也没有对位值的真实理解。当它计算 148 乘以 279 时,它并不是在进行乘法运算,而是在针对训练期间见过的类似表达式进行模式匹配,猜测应该跟随什么样的数字序列。对于极小的求和,这种模式足够强大,可以奏效;但对于任何需要真正精确度的计算,这种猜测最终都会失效。

一个机器人,两项任务

标准的提示词方法要求单个系统同时完成两件截然不同的事情:首先,理解问题的逻辑;其次,执行精确的数学计算。模型在第一项任务上表现得非常出色,它可以阅读应用题、提取变量、映射关系并规划解题路径。但随后它必须充当自己的计算器。这就是链条断裂的地方。第三步中一个数字的疏忽就会感染后续的所有步骤。逻辑本身可能很完美,但最终答案却是垃圾,因为模型加错了。

程序辅助语言模型(Program-Aided Language Models,简称 PAL)通过拆分工作来解决这个问题。你不再是向模型索要答案,而是向它索要一段程序。

以下是实际的工作流程:你提出问题。模型理清逻辑,定义变量并构建算法结构。然后,它不再亲自计算结果,而是编写一段简短的脚本(通常是 Python)。这段脚本会被交给一个真正的代码解释器。解释器运行逻辑并返回精确的、确定性的结果。模型负责描述数学逻辑,Python 负责执行数学计算。

实践中的可执行推理

将 PAL 视为“可执行推理”。如果一段脚本可以解决问题,那就让模型去写脚本。

考虑一个具体的例子。你需要计算一笔 ₹50,000 定期存款的到期金额,年利率为 8.5%,按季度复利,持有七年。直接询问语言模型,它可能会写出一个公式,代入数值,并在思维链中计算结果。但仔细观察,你可能会发现它在处理季度复利时除错了利率,或者在中间步骤进行了四舍五入并延续了误差。答案看起来很合理,但却偏差了几百卢比。

使用 PAL,交互方式发生了变化。你指示模型生成 Python 代码,定义 principal = 50000rate = 0.085time = 7n = 4,然后计算 amount = principal * (1 + rate/n) ** (n * time)。模型输出代码,Python 运行时执行它。你每次都能得到精确到小数点后每一位的数字。乘法中没有猜测,没有幻觉出的余数,也没有自信的四舍五入错误。

同样的模式也适用于日期计算。询问模型从今天起,排除周末后正好经过 120 个工作日是哪一天。纯文本模型可能会向前计数,却在某个周六出错。PAL 方法会让模型使用 datetimecalendar 逻辑编写脚本,然后让解释器进行精确迭代。数据处理也是同理。如果你需要解析混乱的 CSV、过滤嵌套的 JSON 或运行快速的统计转换,模型应该起草逻辑,而由解释器来处理迭代。

为什么这至关重要

从文本答案向可执行代码的转变带来了三个实际优势。

确定性。 一个语言模型在被问及同一个问题两次时,可能会改变措辞或修改某个数字。而解释器对于相同的输入,每次都会返回相同的输出。这种稳定性在会计、物流、调度以及任何一致性并非可选的工程计算中都至关重要。

可验证性。 当模型给你三段推理过程时,你必须阅读每一句话来寻找那个错误的数字。当它给你一个十行的脚本时,你可以审查代码。在解释器运行之前,你可以验证复利公式是否正确。你可以检查变量名,发现差一错误(off-by-one errors),甚至对解决方案进行版本控制。隐藏错误的潜在范围大幅缩小。

可靠性。 模型各司其职。它做它被设计去做的事:对结构、语义和问题分解进行推理。机器做它被设计去做的事:进行精确计算。这种关注点分离(separation of concerns)正是构建可靠软件的方式。组合优于单体设计。

像对待不可信代码一样运行它

需要提醒的是,生成的代码应被视为不可信的输入。模型可能会编写带有死循环、不必要的网络请求或你并未要求的系统文件操作的脚本。请务必在隔离的沙箱中执行这些程序。使用权限受限的容器、没有网络访问权限的无服务器函数(serverless functions),或者 CPU 时间有限且没有持久化存储的严格控制环境。在这里,安全性不是一个脚注,而是系统设计的一部分。

PAL 的优势所在与局限所在

PAL 在数学、日期和结构化数据处理方面表现出色。它消除了困扰纯文本推理的机械性错误。

然而,它无法修复错误的逻辑。如果模型选择了错误的公式,