大模型 Coding-for-Reasoning 代码赋能推理(PAL + PaD + CSV)
大语言模型在常识推理中表现出色,却在复杂的数学与逻辑问题上频频“失手”。它们善于分解问题,却常在精确计算和推导上犯错。为了攻克这一瓶颈,“代码辅助推理” 范式应运而生,它将大模型的规划能力与程序解释器的精确性相结合,开启了AI推理的新篇章。本文系统梳理了这一领域的三大经典工作:PAL 开创了“模型写代码,解释器做计算”的分工模式;PaD 通过程序蒸馏,将强大的推理能力高效迁移至小模型;CSV 则引
近年来,大语言模型在NLP领域取得了突破性进展,但在需要精确数学计算或复杂符号推理的任务中,
它们依然会暴露致命弱点:擅长分解问题,却屡屡在计算和逻辑推导上“翻车”。
为此,研究者们开始探索一种全新的范式——代码辅助推理,让大模型负责生成可执行程序,
而把精确计算交给外部解释器。从最早提出“程序即推理”的PAL,到通过程序蒸馏提升小模型泛化能力的PaD,
再到引入自验证机制实现逻辑闭环的CSV,这一技术路径不仅显著提升模型的推理准确率,更重新定义了“神经-符号”协同的未来可能性。
目录
1. PAL: Program-aided Language Models 代码辅助解数学题
2. PaD: Program-aided Distillation 程序辅助蒸馏
3. Code-based Self-Verification (CSV) 基于代码的显式自验证方法
3.1 代码使用频率 Code Usage Frequency:模型在解题过程中执行代码的次数。
1. PAL: Program-aided Language Models 代码辅助解数学题
将大语言模型(LLM)的 “推理分解能力” 与 “程序解释器的精确计算能力” 结合,解决了传统 LLM 在复杂数学、符号推理中易出错的问题。
大语言模型 在少样本提示(few-shot prompting)下,通过 “思维链(Chain-of-Thought, CoT)” 等方法已能完成常识推理、简单数学计算,但在复杂推理任务中存在致命缺陷:
- 分解能力强,但计算 / 逻辑易出错:LLM 擅长将自然语言问题拆解为中间步骤(如 “先算总销量,再算剩余量”),但在执行具体计算(尤其是大数、复杂运算)或逻辑推导时,容易出现低级错误(如加减乘除算错、符号逻辑混淆)。
- 错误不可控:即使思维链的分解逻辑正确,最终结果仍可能因计算失误失效(如图 1 中 CoT 将 “200-93-39+6” 误算为 62,正确结果应为 74)。
- 泛化性差:对包含大数、复杂算法(如排序、递归)的问题,LLM 性能急剧下降,且模型规模扩大(如 PaLM-540B)也难以根治。
“神经 - 符号混合推理框架”,核心思路是分工协作:
1. Interpret the math problems as Python codes.
2. Execute the codes with an external Python interpreter to obtain the answer.
- LLM 的角色:读取自然语言问题,将其分解为可执行的程序步骤(如 Python 代码),无需直接输出答案。
- 程序解释器的角色:执行 LLM 生成的代码,输出精确结果(如 Python 解释器计算数值、执行算法)。
提示词构建(Crafting prompts for PAL)
- 复用现有工作的提示词:若已有基准任务(如 GSM8K)的 CoT 提示词,直接将其改造为 PAL 风格(即给自然语言步骤添加对应代码)。
- 代码设计原则:
- 按需使用编程结构:复杂任务(如排序、多变量计算)可使用 for 循环、字典等 Python 特性。
- 变量名语义化:如 “篮子里的苹果数” 命名为
num_apples_in_basket,确保代码与问题中的实体强关联
PAL(Program - Aided Language Models)可执行代码为核心,自然语言通过注释嵌入代码中。(重计算)
PoT(Program of Thoughts) 自然语言推理语句 + 编程语句的混合形式(重推理)
2. PaD: Program-aided Distillation 程序辅助蒸馏
LLMs 的推理能力蒸馏到小模型中。
CoT 提示能引导 LLMs 生成中间推理步骤,显著提升推理性能。
随后,数据合成通过 LLMs 生成 CoT 并整理为下游微调数据集,用于训练小模型以迁移推理能力。
传统 CoT 微调的核心问题是合成数据存在「伪正确推理」
(答案对但步骤错),小模型学习后无法真正掌握推理逻辑。
PaD 的解决思路:
- 用「代码程序」替代自然语言推理步骤:代码的语法和逻辑可通过 Python 解释器自动校验,直接过滤错误样本;
- 迭代优化:通过错误注入让小模型学习修正推理程序,提升鲁棒性;
- 缩小输出空间:自然语言的推理步骤具有模糊性(如「先乘后加」的表述差异),而代码语法固定(如
a*b + c),降低小模型学习难度。
数据集准备:上下文 C 为 (输入x,代码r,结果y)
将上下文 C 作为前缀添加到输入问题 x_i 前生成 r_i;得到初步的微调数据集 S。
数据过滤:S 中生成的代码 r;放到 Python 解释器,只留下跑通且答案正确的。
数据增强:由于一个问题可能对应多种解决方案,多样化的推理数据可提升模型性能。
小模型微调 两大任务:
- 推理任务:输入问题 (x) → 推理程序 (r)
- 自我优化(错题改正)任务:输入问题 (x) + 错误代码 (r') → 推理程序 (r) 改正错误,提升推理性能。
- (错误数据集的构建流程:抽象语法树 AST 的节点注入错误)
应用推理时:
分步验证:中间步骤对推理任务至关重要 —— 错误的推理步骤会快速累积导致最终答案错误。
生成多个候选步骤,用推理评分器计算每个步骤与问题的语义一致性,选择评分最高的步骤继续生成,避免错误步骤累积。
3. Code-based Self-Verification (CSV) 基于代码的显式自验证方法
GPT4-Code优势:
- 基于代码执行反馈调整解题策略的 自调试(self-debugging) 能力;
- 步骤化代码生成与自然语言推理的结合(而非孤立的 “计算 + 推理”)。
1. 设计动机
PAL:代码只是用于精确计算;
GPT4-Code 的默认自调试仅验证 “单步代码执行是否正确”,但未验证:
- 整体推理逻辑是否连贯(如 “步骤 A→步骤 B” 的因果关系);
- 最终答案是否与问题要求一致(如单位、取值范围)。
CSV 的核心目标:让模型用代码 验证整个解题过程的逻辑闭环,而非仅验证单步计算。
3.1 代码使用频率 Code Usage Frequency:模型在解题过程中执行代码的次数。
| 提示词类型 | 核心约束 | 推理模式(输出格式) | 本质类比 |
|---|---|---|---|
| Prompt 1(无代码) | 禁止使用任何代码 | 纯自然语言推理链(中间步骤 + 最终答案) | 传统 CoT |
| Prompt 2(单代码块) |
仅允许在推理结束后用 1 个代码块 验证计算结果 |
自然语言推理 + 单段 Python 代码(Post-hoc 验证) | PAL |
| Basic Prompt(自由代码) |
无任何代码使用约束,模型可 自主决定何时用代码、用多少次 |
自然语言推理与代码执行并行 (增量式:每步推理可配代码,执行后根据结果调整下一步) |
GPT4-Code 默认模式 |
数学题难度越高(Level 4-5),代码使用频率的影响越显著。
关键原因拆解:
- Prompt 1 vs Prompt 2:代码能解决自然语言的 “计算误差”(如大数运算、根号计算)
- 但 Prompt 2 的 “单代码块” 无法自调试(代码出错则无法修正);
Basic Prompt 的优势来自两点:
- ① 分步代码(短而频繁)比单段长代码更易准确生成;
- ② 自调试机制(代码执行出错 / 结果不合理时,模型自动修正推理步骤)。
3.2.CSV 的工作流程(零样本提示,无需微调)
论文设计的提示引导模型完成以下四步,类比人类 “解题→检查→纠错” 的思维:
- 初始求解:用自然语言 + 代码并行推理(延续 Basic Prompt 的优势),得到初步答案;
- 代码自验证:生成专门的 “验证代码”,从两个维度检查:
- 计算验证:重新计算关键步骤(如方程求解、积分结果);
- 逻辑验证:验证答案是否满足题目所有约束条件(如 “正整数解”“概率在 0-1 之间”);
- 迭代纠错:执行验证代码,输出验证状态(True/Uncertain/False):
- True:验证通过(逻辑 + 计算均无问题)Uncertain:问题无法验证;直接输出答案
- False:验证失败(计算错误 / 逻辑漏洞);根据反馈重新迭代调整答案
3.3 加权多数投票(LLM的一致性)
同一个问题,由于一些随机性,LLM输出的答案可能是不一样的,让 LLM 完整推理多次,加权结果。
(传统多数投票仅看答案出现次数)我们对模型多轮生成的答案,按 “验证状态” 分配权重:
- 验证为 True 的答案:权重更高(更可靠);
- 验证为 False 的答案:权重较低(但不直接丢弃,避免误判);
- 最终选择 “加权得分最高” 的候选答案,而非 “出现次数最多” 的答案。
四大数据集:
| 数据集 | 核心定位 | 领域内角色 |
|---|---|---|
| GSM8K | 基础计算与简单逻辑推理的 “入门基准” | 评估 LLM “准确完成基础算术运算” 的能力(排除计算错误对推理的干扰) |
| MMLU-Math | 数学常识与基础概念的 “知识基准” | 评估 LLM 对数学概念的理解能力(而非纯计算或复杂推理) |
| MMLU-STEM | 跨学科数学应用的 “泛化基准” | 评估 LLM 在 STEM 领域(科学、技术、工程、数学)中运用数学知识解决实际问题的能力 |
| MATH | 高阶数学推理的 “黄金基准”(难度天花板) | 评估 LLM 解决复杂数学问题的能力上限,是领域内 “顶级模型竞争” 的核心战场 |
更多推荐



所有评论(0)