代码生成——将自然语言规范自动翻译成计算机代码——是大语言模型(LLMs)最具前景的应用之一。但编程任务越复杂,LLMs出错的可能性就越高。当然,任务越复杂,人类程序员也越容易出错,这正是调试成为软件开发流程关键环节的原因。
在2024年神经信息处理系统大会(NeurIPS)上发表的论文中,提出了一种新方法,通过同时训练LLMs成为更好的调试器来提升代码生成能力。此前利用LLMs调试代码的尝试主要采用小样本学习,即提供少量成功调试示例让模型推断其余情况。而该研究同时采用监督微调(SFT)和强化学习(RL)来专门训练调试模型。
由于调试训练数据稀缺,研究团队利用LLMs生成高质量合成训练数据。具体流程包括:
- 从现有代码生成数据集中获取自然语言提示
- 多次生成对应代码实现(如20个版本)
- 通过单元测试筛选失败案例(即有缺陷代码)
- 将缺陷代码与错误信息输入LLMs要求诊断问题
- 根据诊断结果指导模型修复代码
- 最终保留通过全部测试的修正版本
由此构建的新数据集包含:自然语言提示、缺陷代码、错误诊断、调试后代码及单元测试。
模型更新采用两种方式:
- 监督微调(SFT):输入自然语言指令、缺陷代码和单元测试错误信息,根据测试结果评估输出
- 强化学习(RL):结合单元测试通过率和CodeBLEU评分(衡量与规范代码差异的连续指标)构建奖励函数
实验使用三类模型对比:
- 纯提示工程的基础LLM
- 仅SFT更新的模型
- SFT+RL联合更新的模型
测试涵盖三种LLM架构(StarCoder-15B、CodeLlama-7B/13B),每种模型评估三种输出(初始生成、直接修正、思维链推理修正),并比较单次生成与10次生成的效果,共24组对照。
结果显示,更新模型全面超越基线。在绝大多数情况下,SFT+RL模型优于仅SFT模型。其中在MBPP等标准基准测试中,pass@k指标(k次生成至少一次通过测试的概率)最高提升达39%。该方法证明了利用执行反馈和规范示例来优化代码模型调试能力的可扩展路径。