想象一下,你正在试图教一个非常有天赋但有时过于自信的机器人厨师如何烹饪一道复杂的、多道菜的盛宴。这个机器人非常擅长遵循指令,但当被要求制作一道复杂的菜肴时,它往往会操之过急、混淆步骤,或者在中间过程中添加错误的食材,导致做出一顿烧焦的饭菜。
这篇论文介绍了一种名为 FunPRM 的新型“品尝教练”,旨在帮助这些 AI 厨师(大语言模型)写出更好的代码。以下是它的工作原理,通过简单的概念进行了拆解:
1. 问题所在:“逐行”带来的混乱
以前,在对机器人的烹饪过程进行评分时,教练们会逐句检查食谱。
- 问题: 在数学中,步骤是清晰的(第一步:加法;第二步:除法)。但在编程中,“一步”很难定义。一个步骤是一行代码吗?如果是,那么一道复杂的菜可能有 500 个步骤。对 500 个微小的步骤进行评分既慢又容易出错,而且往往是不准确的,因为单行代码看起来可能没问题,但却是一个破碎计划的一部分。
- 类比: 这就像一位老师在批改学生的作文时,通过检查每一个字母来评分。如果学生写了“T-h-e”,老师会说“好!”,即使下一个词是“b-a-d”。你会因此忽略了大局。
2. 第一项创新:“函数链”(食谱书)
FunPRM 改变了规则。它不再要求查看每一行代码,而是告诉机器人厨师:“将你的食谱分解为不同的、有名称的章节。”
- 工作原理: AI 被提示编写结构化的代码,其中每一个主要任务都是一个独立的“函数”(一个带有自己名称和描述的微型程序)。
- 类比: 机器人不再写成一大段文字,而是写一本带有清晰章节的食谱书:第一章:切菜,第二章:炒洋葱,第三章:炖酱汁。
- 益处: 教练(FunPRM)现在可以将整个“切菜”章节作为一个步骤进行评分。如果切菜的过程很糟糕,教练能立即发现。这使得代码更易于人类阅读,也更容易让 AI 学习。
3. 第二项创新:“元教练”(清理噪声)
即使有了清晰的章节,教练仍然面临一个问题:我们如何知道一份半成品是否合格?
- 问题: 为了训练教练,我们通常通过模拟“如果我们把它做完会怎样?”(一种称为蒙特卡洛采样的方法)来猜测一个半成品是否良好。这就像是通过摇晃烤盘来猜测一个半熟的蛋糕是否会膨胀。这种方法很快,但其猜测往往带有“噪声”(噪声 = 充满静态干扰或错误)。
- 解决方案: FunPRM 使用了一个“元教练”系统。
- 它能确定最终的成品是否合格,因为它可以通过运行代码并接受严格的测试(类似于味觉测试)。
- 它利用这个“干净”的最终得分,来修正对早期步骤那些“有噪声”的猜测。
- 类比: 想象一位体育教练,他不确定球员的热身是否到位。但他确实知道球员最终赢得了比赛。元教练会观察这场胜利并说:“既然他们赢得了比赛,那么那次热身一定是还不错的,即使我最初的判断有些偏差。”它利用已知的终点真相来清理起点的混乱。
4. 结果:一位更好的厨师
研究人员在两个主要的“烹饪比赛”(数据集称为 LiveCodeBench 和 BigCodeBench)上测试了这个新系统。
- 结果: FunPRM 始终能帮助 AI 厨师比其他方法产出更好的代码。
- 纪录: 当与顶尖 AI(OpenAI 的 O4-mini)配对时,FunPRM 在 LiveCodeBench 排行榜上取得了有史以来的最高分。
- 人类反馈: 当人类开发者查看代码时,他们更倾向于使用 FunPRM 版本。他们发现它更易于阅读和复用,就像比起杂乱无章的段落说明,人们更喜欢带有清晰章节的食谱一样。
总结
FunPRM 是一个教学系统,它教会 AI 以组织化的“章节”(函数)而非杂乱的文本流来编写代码。然后,它使用一种聪明的“清理”技巧,通过观察最终结果来理解中间步骤,从而修正自身的评分错误。其结果是,生成的代码不仅更有可能正常运行,而且更易于人类理解。
技术摘要:FunPRM
问题陈述
代码生成仍然是大语言模型(LLM)的核心应用领域,然而即使是目前最先进的模型,在面对需要多步推理的复杂编程任务时也经常失败,主要原因是由于其存在幻觉倾向。虽然测试时扩展(test-time scaling)方法——过程奖励模型(PRM)在通过评估中间步骤来提升数学推理能力方面取得了成功,但将其应用于代码生成面临两个显著障碍:
- 缺乏有意义的步骤分解: 与通过思维链(CoT)提示自然分解为显式推理步骤的数学问题不同,代码缺乏一个明确的“步骤”定义。现有方法通常将单行代码视为步骤,这会导致每个程序产生数百个步骤,从而带来极高的计算成本。
- 噪声部分解奖励: 训练 PRM 需要部分解(partial solutions)的真实正确性得分。虽然人工标注的成本对于大规模使用而言过高,但自动化的蒙特卡洛(MC)估计方法会产生带有噪声的奖励。这些噪声信号源自于采样判断一个部分解是否能导向最终正确答案,它们会降低 PRM 的性能。
方法论:FunPRM
作者提出了 FunPRM,一种专门为代码生成量身定制的过程奖励模型,它通过两种主要机制解决了步骤定义和奖励噪声的问题。
1. 函数链(Chain-of-Function, CoF)提示
为了解决步骤分解问题,FunPRM 采用了一种全新的提示策略,鼓励 LLM 生成以函数为组织的模块化代码。
- 函数即步骤: FunPRM 不再将代码行视为步骤,而是将每个函数视为一个推理步骤。
- 提示策略: 系统提示引导 LLM 将逻辑独立的运算提取到独立的函数中,进行自顶向下(先高层函数后低层函数)的组织,并包含描述性的文档字符串(docstrings)。
- 收益: 这为 PRM 创建了一个清晰、具有语义意义的推理步骤序列进行评估,同时也提高了代码对人类开发者的可读性和可重用性。
2. 基于元学习的奖励修正
为了解决蒙特卡洛估计的部分解奖励中的噪声问题,FunPRM 引入了一个双层元学习框架,该框架利用了编程任务的一个独特属性:能够通过单元测试系统获得关于最终解的干净且可靠的正确性得分。
- 噪声 vs. 清洁信号: 该框架利用了一个包含部分解的噪声数据集(通过 MC 采样估计)和一个包含最终解的清洁元数据集(通过单元测试评估)。
- 奖励修正表: 引入了一个轻量级的、可训练的奖励修正表 (gθ),用于在噪声的部分解奖励之上添加一个可学习的残差。
- 双层优化:
- 内循环: PRM (fϕ) 使用当前的修正后奖励在噪声部分解上进行训练。PRM 参数通过单步梯度下降进行更新。
- 外循环: 更新后的 PRM 在清洁的最终解数据集上进行评估。由此产生的损失(元损失)被用于计算相对于奖励修正参数 θ 的梯度。
- 目标: 这一过程旨在优化修正表,以“净化”噪声的部分解奖励,确保在这些奖励上训练出的 PRM 能够很好地泛化到正确识别成功的最终解。
核心贡献
- FunPRM 框架: 一种专为代码生成设计的 PRM,通过函数链提示将推理步骤重新定义为函数级,从而实现了有效的步骤级评估,且不会产生行级粒度带来的高昂计算开销。
- 元奖励修正: 一种新颖的机制,利用来自单元测试的清洁最终解奖励来消除蒙特卡洛估计的部分解奖励中的噪声,在无需人工标注的情况下提高了训练信号的质量。
- 经验优越性: 大量的实验证明,FunPRM 在多个基础 LLM 和基准测试上一致地优于现有的测试时扩展基准方法(包括 Self-Certainty、结果奖励模型 [Outcome Reward Models] 和 Skywork-PRM)。
实验结果
作者在 LiveCodeBench 和 BigCodeBench 上对 FunPRM 进行了评估,并在 HumanEval+ 和 MBPP+ 上进行了领域泛化测试。
- 最先进的性能: 当与 OpenAI 的 O4-mini (High) 结合使用时,FunPRM 在 LiveCodeBench 上达到了 80.9% 的 pass@1,超越了排行榜上的所有其他模型,包括 O3 (High)、DeepSeek-R1 和 Gemini-2.5-Pro。
- 跨模型的稳定性: 在五个不同的基础 LLM(Qwen3-30B, GPT-4o-mini, DeepSeek-Coder, Qwen2.5-7B, O4-mini)上,FunPRM 在 LiveCodeBench 和 BigCodeBench 上的表现均优于所有基准测试时扩展方法。
- 消融研究: 移除函数链提示或元奖励修正机制中的任何一个组件都会导致性能下降,这证实了这两个组件的必要性。
- 人工评估: 在一项涉及三位研究人员的研究中,FunPRM 生成的代码在可读性(针对正确解)以及可重用性/易修复性(针对错误解)方面,一致优于基准代码。
- 领域泛化: 在 LiveCodeBench 和 BigCodeBench 上训练的 FunPRM 在无需额外训练的情况下,成功提升了在 HumanEval+ 和 MBPP+ 上的表现,表明其在不同编码风格和难度水平下具有鲁棒的泛化能力。
意义
论文声称 FunPRM 代表了一种提高基于 LLM 的代码生成中测试时扩展能力的实用且有效的方法。通过将推理步骤的定义与软件工程的自然模块化特性(函数)相对齐,并利用单元测试的确定性来精炼训练信号,FunPRM 克服了阻碍 PRM 在编程领域应用的特定局限性。结果表明,这种方法可以实质性地推动代码生成的性能前沿,即使对于已经表现优异的模型也是如此,同时还能生成对开发者而言更具可读性和可重用性的代码。
每周获取最佳 machine learning 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。