一篇新论文的作者提出了一种“强化”代码生成的方法。
代码生成是人工智能中一项日益重要的能力。它通过训练机器学习模型,根据自然语言描述自动生成计算机代码。这一技术具有广泛的应用前景,可以将软件规格转化为可用的代码,自动化后端开发,并协助人类程序员提高工作效率。
然而,生成高质量代码对AI系统仍然具有挑战性,与翻译或总结等语言任务相比。代码必须准确地符合目标编程语言的语法,能够优雅地处理各种极端情况和意外输入,并精确地处理问题描述中的许多小细节。即使是其他领域看似无害的小错误也可能完全破坏程序的功能,导致编译或运行失败。
最近,CodiumAI的研究人员提出了AlphaCodium,这是一种新方法,可以显著提升GPT-4等大型语言模型的代码生成能力。他们的观点是,仅仅微调提示的措辞在解决复杂编码问题上具有固有的限制。相反,他们设计了一个多阶段流程,专注于通过迭代生成、运行和调试代码来对照测试用例,从而使模型能够从实践中学习。
提示工程的局限性
在自然语言任务中,提示工程是指对提示的措辞和结构进行仔细调整,以引导模型生成所需的输出。例如,在输入文本前加上“写简明的摘要:”这个短语,可以使模型生成更加准确的摘要。
提示工程已被证明在做文本生成引导大语言模型行为方面非常有效。然而针对编码问题,研究人员发现,即使进行广泛的及时调整,也只能获得微小的效益。这一发现令人深思。因此,生成高质量的代码仍然需要其他解决方案:
- 精确匹配目标编程语言的语法
- 优雅地处理极端情况和意外输入
- 解决问题陈述中描述的所有小细节和需求
- 为所有的有效输入确保代码正确编译和运行
这些结构性需求超出了文本生成的范围,无法硬编码到提示中。提示本身缺乏模型学习所需的编码技巧和具体反馈。
AlphaCodium迭代流程
为了应对这些挑战,研究人员开发了一种迭代流程,专门针对代码生成问题的结构。其中的关键创新在于利用所生成代码的执行结果作为学习信号,以提供直接的反馈。
AlphaCodium的流程有两个主要阶段:
预处理
- 模型将问题描述释义为项目符号,以提取关键细节。
- 解释每个示例输入/输出背后的预期逻辑。
- 提供两三个自然语言解决方案。
- 为代码覆盖生成额外的不同测试用例。
代码迭代
- 模型生成初始代码解决方案。
- 针对公共测试用例重复运行该代码,修复出现的错误。
- 对模型生成的测试用例执行同样的事情。
- 额外的测试用例被添加到不断增大的“测试锚”(test anchor)套件中,以防止回归。
通过增量推理问题、开发解决方案假设、扩展测试覆盖,以及反复生成和调试代码,模型通过经验来学习——这正是高质量代码生成所需的技能。
图1. 具有结构化输出的提示示例(生成可能的解决方案阶段)
研究人员发现,与端到端模型相比,将流程设计为具有清晰接口和目标的模块可以获得更好的结果。每个阶段首先专注于更简单的子任务,以积累知识,并发掘为下游阶段提供依据的洞察力。像测试生成这样的上游阶段不需要完整的解决方案,只需要基本的推理。
实验结果
研究人员依据CodeContests衡量基准对AlphaCodium进行了评估,该衡量基准包含来自竞争性编程比赛的数百个编码问题。
图2. 问题描述和反思——一个典型的CodeContests问题的例子,基于人工智能对问题进行自我反思。虽然最初的描述冗长而复杂,但适当的自我反思可以使问题更清晰、更连贯,从而改进代码解决方案
针对GPT-4模型,与经过大量优化的单个提示相比,AlphaCodium将验证集上的代码生成准确率从19%提高到了44%。面对不同的模型大小和测试集,这个好处依然适用,与单独的提示工程相比收效显著。
AlphaCodium的性能也显著优于之前发布的方法,比如AlphaCode和CodeChain,同时使用更少的计算资源。比如说,它通过避免不必要的蛮力生成,其准确性可以媲美AlphaCode,而模型查询少10000倍。
这些结果证明了围绕任务结构整体设计AI系统的价值,而不是将其视为通用文本生成器。通过合并迭代代码运行和调试,AlphaCodium更好地将训练过程与生成健壮实用代码的最终目标结合起来。
更广泛的影响
虽然针对竞争性编程问题进行了演示,但AlphaCodium中使用的概念为AI推进代码生成提供了更广泛的适用经验:
- 单单提示工程对于处理复杂的代码任务具有局限性。具体解决问题的经验至关重要。
- 基于测试的开发规范可以为模型训练提供依据。测试提供了明确的适应度函数。
- 迭代代码调试将模型改进的重点放在实际发生的错误上。
- 测试覆盖扩展突出了提示中不可见的泛化性差距。
- 具有双重验证的软决策减少了脆弱性和偏差。
AlphaCodium为基于软件工程最佳实践的代码生成提供了一种大有前途的新范式。关于泛化性和计算开销仍然存在有待商榷的研究问题。但这里展示的原则(从经验中学习、测试驱动开发、模块化推理和迭代式调试)似乎为提高AI的编码能力提供了坚实的基础。
论文链接:https://arxiv.org/pdf/2401.08500.pdf。
代码库:https://github.com/Codium-ai/AlphaCodium。
原文标题:"Flow engineering" doubles code generation accuracy (19% vs 44%),作者:Mike Young
链接:https://notes.aimodels.fyi/flow-engineering-intensifies-for-code-generation/。