[ICML] NExT: Teaching Large Language Models to Reason about Code Execution
约 978 个字 预计阅读时间 3 分钟
Info
- Author: Ansong Ni, Miltiadis Allamanis, Arman Cohan, Yinlin Deng, Kensen Shi, Charles Sutton, Pengcheng Yin
- Conference: ICML 2024
- arXiv: 2404.14662
论文
研究背景与问题定义
研究背景
近年来,大型语言模型(LLMs, Large Language Models)在代码生成、代码解释、代码审查等任务中取得了显著进展。然而,尽管这些模型在生成高质量代码方面表现出色,它们在需要深入理解程序执行行为的复杂软件工程任务(如程序修复)中仍然存在局限性。
研究问题
如何使大型语言模型具备理解和推理程序执行过程的能力,从而提高其在代码修复任务中的表现?
关键挑战
- 模型无法自然理解执行信息:LLMs 对程序执行的变量状态缺乏理解,难以有效利用执行信息进行推理。
- 执行轨迹的复杂性:原始程序执行轨迹信息量大,直接编码会超出模型上下文窗口,且难以处理。
- 推理合理性与正确性评估:需要一种方法评估模型生成的推理过程是否合理,并确保其能够有效指导代码修复。
NExT 方法概述
方法框架
NExT (Naturalized Execution Tuning) 通过自训练(Self-Training)方法,增强 LLMs 在代码修复任务中的执行推理能力。
核心思想:
- 生成带有执行轨迹的自然语言推理(NL rationales)和修复代码。
- 使用单元测试验证修复代码的正确性,筛选有效的推理和修复对。
- 通过多轮微调增强模型的执行推理能力。
方法流程
给定程序修复任务数据集 \(D = \{(x_j, \tilde{y}_j, T_j, \epsilon_j)\}\),NExT 采用以下流程:
- 输入信息:
- 自然语言任务描述 \(x\)
- 有缺陷代码 \(\tilde{y}\)
- 测试用例集合 \(T\)
- 执行轨迹 \(\epsilon\)
- 采样 (Sampling):从当前模型 \(P_\theta\) 生成一组候选推理 \(r\) 和修复代码 \(\hat{y}\)。
- 过滤 (Filtering):使用单元测试执行修复代码,保留通过所有测试的 \((r, \hat{y})\) 对。
- 微调 (Training):对模型进行多轮微调,目标是最大化这些合理推理-修复对的生成概率。
实验设置与结果分析
数据集
- Mbpp-R:基于 MBPP 数据集扩展,包含 10,047 个训练任务和 1,468 个开发任务。
- HeFix+:来自 HumanEvalFix 数据集,扩展了更严格的测试用例,包含 164 个修复任务。
评估指标
- End-to-End Fix Rate (pass@k):表示在 \(k\) 次生成中至少有一次生成的修复代码能通过所有测试用例的比例。
- Proxy-based Evaluation:利用生成的推理过程作为提示,使用更小的 LLM 解决原始任务,以此评估推理质量。
主要结果
-
修复成功率显著提升
- 在 Mbpp-R 上,PaLM 2-L 经过 NExT 微调后,pass@1 提升 26.1%。
- 在 HeFix+ 上,PaLM 2-L+NExT pass@1 提升 14.3%。
-
推理质量提升
- Proxy-based 评估表明,NExT 训练后的模型生成的推理对更小的 LLM 更具指导性。
-
无需执行轨迹也能有效工作
- 在测试阶段去除执行轨迹输入时,NExT 训练的模型 pass@1 仍比原始模型高 21.8%。
论文贡献与未来工作
论文贡献
- 提出了 NExT 方法,使 LLMs 能够通过执行轨迹进行自然语言推理,提升代码修复能力。
- 设计了基于单元测试的弱监督自训练框架,避免繁琐的人工标注。
- 证明了 NExT 方法在缺乏执行轨迹的情况下仍能有效工作。
未来工作
- 将 NExT 扩展到更多编程语言和代码理解任务。
- 探索更复杂的执行信息(如运行时环境、数据依赖关系)。