代码生成问题与常见的自然语言处理问题不同,代码生成需要匹配目标语言的确切语法,关注代码规范的众多细节,所以适用于常见自然语言生成的优化方法和技巧并不一定对代码生成产生同样好的效果。
为此CodiumAI提出了一种LLM生成代码的新方法:AlphaCodium,该方法让GPT4准确率(pass@5)从19%提高到44%,火爆了AI社区,目前GitHub一周之内达到了1.5K Star!
https://arxiv.org/pdf/2401.08500v1.pdf
由于稀疏的奖励信号,代码生成任务需要在巨大结构化空间中进行搜索。对于同一个问题来说,正确的解决方案可能完全不同,那么判断解决方案是否有用,对于我们来说是一项艰巨的挑战 。单字符的改变可以完全改变整个解决方案的行为。所以由于代码生成任务的独特性,针对自然语言任务优化的常见提示技术在应用于代码生成时可能不会那么有效。
最近基于Transformer的大型语言模型已经可以生成解决简单编程任务的代码。然而,实际应用过程中的代码问题在本质上是不同的--它们更加复杂,并且通过很长的自然语言任务描述(即规范)来定义,其中包含解决方案代码必须解决的多个细节和规则。
CodeContests数据集是由Google的DeepMind推出的一个具有挑战性的代码生成数据集,其中包括从Codeforces等竞争性编程平台精选出的问题。该数据集包含1万个代码问题,可用于训练LLMs,并包括验证集和测试集,用于评估LLMs解决具有挑战性的代码问题的能力。
基于CodeContests 数据集,DeepMind 开发的代码生成系统AlphaCode。首先,AlphaCode生成大量可能的解决方案(最多 1M),然后对这些解决方案进行处理和聚类,并选择少量方案进行提交。虽然 AlphaCode 的结果惊人的好,但它需要针对代码任务进行模型微调,并且需要大量的计算资源,这使得它难以在实际应用场景落地。CodeChain是另一项解决竞争性编程任务的工作,它引入了一种新颖的推理框架,通过一系列基于子模块的自我修订来改进LLM中的代码生成。
基于以上背景,本文提出了AlphaCodium是一种以代码为导向的流程,围绕一个迭代过程展开,其中生成的代码会被反复运行和修复,以满足输入-输出测试。AlphaCodium流程的主要包含两个关键要素:
AlphaCodium具体流程如上图所示,分为两个主要阶段:一个是预处理阶段,在这个阶段中,问题会以自然语言进行推理;另一个是迭代代码生成阶段,在这个阶段中,会生成、运行和修复代码解决方案,以满足公共和人工智能生成的测试。
设计 AlphaCodium 流程时的一个关键发现,即生成额外的有用测试比生成正确的代码解决方案更容易。添加具体测试主要需要理解问题、提升洞察力以及实现基本逻辑推理,并且生成附加测试时无需完全“解决”问题。
「AlphaCodium流程还利用了面向代码的设计概念、技巧和最佳实践」,例如:
与精心设计的单一提示相比,AlphaCodium 的流程显著提高了LLM在代码生成问题上的表现。对于开源模型DeepSeek和闭源模型GPT 都是如此。例如,对于验证集上的 GPT-4,pass@5 准确率从19%提高到 44%。AlphaCodium 的性能也优于以前的作品,同时计算预算显着减少,并且比 AlphaCode 取得了更好的结果,例如,LLM 调用减少了四个数量级。
如下表所示,将 AlphaCodium 结果与通过单个精心设计的直接提示获得的结果进行了比较。「使用的指标是pass@k」,定义为针对每个问题使用 k 个生成的解决方案解决的问题的百分比。可以发现AlphaCodium显着地提高了LLM在代码生成问题上的表现。「对于验证集上的GPT-4,pass@5分数从19%提高到44%」 。
如下表所示,将 AlphaCodium 结果与文献中的其他方法进行了比较。可以看出,当使用相同模型(GPT-3.5)和相同指标(pass@5)将 AlphaCodium 与 CodeChain 进行比较时,「AlphaCodium 始终表现更好」。