一篇新论文的作者提出了一种“强化”代码生成的方法。
代码生成是人工智能中一项越来越重要的能力。它指训练机器学习模型,基于对所需程序功能的自然语言描述自动生成计算机代码,并有许多潜在的应用,从将软件规格转换成实用代码、自动化后端开发到协助人类程序员,不一而足。
然而,与翻译或总结等相关语言任务相比,生成高质量代码对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/。