📖标题:From Code to Correctness: Closing the Last Mile of Code Generation with Hierarchical Debugging
🌐来源:arXiv, 2410.01215
摘要
🔸虽然大型语言模型在代码生成方面取得了重大进展,但生成的代码的通过率却受到细微错误的限制,通常需要人为干预才能通过测试,尤其是对于复杂的问题。现有的基于LLM的调试系统将生成的程序视为单片单元,无法在多个粒度级别上解决错误,从低级语法错误到高级算法缺陷。
🔸本文介绍了多粒度调试器(MGDebugger),这是一种分层代码调试器,通过在不同粒度级别隔离、识别和解决错误。MGDebugger将有问题的代码分解为子功能的层次树结构,每个级别代表特定的错误粒度。在调试过程中,它分析每个子功能,并以自下而上的方式迭代解决错误。为了有效地测试每个子函数,我们提出了一个LLM模拟的Python执行器,它跟踪代码执行并跟踪重要的变量状态,以准确地查明错误。
🔸大量实验表明,MGDebugger的性能优于现有的调试系统,在HumanEval中种子生成的准确性提高了18.9%,在HumanEvanFix中的修复成功率提高了97.6%。此外,MGDebugger有效地修复了不同类别和难度级别的错误,展示了其健壮性和有效性。
🛎️文章简介
🔸研究问题:LLM生成的代码因细微错误而受到瓶颈,现有的调试方法将错误代码作为一个整体来处理,忽略了不同层次和类型的错误。
🔸主要贡献:论文提出了一种新的分层调试方法MGDebugger,通过自底向上的策略系统来调试代码,显著提高了调试的准确性和效率。
📝重点思路
🔺相关工作
🔸LLM代码生成:GPT4、Codestral和DeepSeek-Coder等通过指令调优和RLHF实现了高级代码生成,包括使用规划算法、多次编程排名采样、多代理协作等策略提高代码质量。
🔸修复LLM生成的代码:一个方向是训练一个专门修复代码的模型,另一个方向是通过外部反馈自我修复。
🔺论文方案
🔸层次化代码分解:将输入的有缺陷代码分解为子函数的层次结构,以便在不同粒度级别上系统地识别和解决错误。
🔸生成子函数的测试用例:从主函数的公共测试用例中推导出子函数的私有测试用例,确保测试用例不仅反映子函数的预期功能,还符合公共测试用例的约束。
🔸LLM模拟执行调试子函数:利用LLM模拟代码执行过程,跟踪关键变量和状态变化,以准确识别错误原因。
🔸自底向上的调试:在修复子函数后,更新层次结构中的子函数,并通过自底向上的方式将更改传播到依赖函数中。
🔎分析总结
🔸MGDebugger在所有模型和数据集上均优于现有方法。
🔸分层调试策略至关重要,去除分层调试策略后,修复成功率显著下降。
🔸MGDebugger在处理不同类型的错误和代码长度时表现出色。
🔸MGDebugger的设计选择有效,分层调试策略、LLM模拟执行和测试用例生成均显著提高了准确性和修复成功率。
💡个人观点
论文的核心是利用LLM的固有能力进行自底向上的代码修复,通过解构、生成测试用例、执行测试并逐层更新,类似复杂任务分解后逐步求解。
附录