代码生成 · 语言模型

AlphaCode 解读:竞赛级代码生成

DeepMind 的 AlphaCode 给每道题生成至多百万份候选程序,再过滤、聚类压到十份提交,在五千多人参赛的 Codeforces 竞赛中平均排到前 54.3%。

AlphaCode 解读:竞赛级代码生成

快速答案

AlphaCode 是 DeepMind 的代码生成系统。在对近期 Codeforces 竞赛的模拟评测中,面对五千多名参赛者,它平均排到前 54.3%,大致相当于一名中位水平的人类选手。它靠的不是写出一份精妙程序,而是给每道题生成一个极大的候选解池(最多一百万份),再过滤、聚类,压缩到竞赛允许的十份提交。真正的主角是这条流水线,不是某个模型。

为什么编程竞赛对模型这么难

当时主流的代码评测(HumanEval、MBPP)大多只要求短小、自包含的函数,题面基本就是在描述实现步骤。Codeforces 的题完全不同:题面是一段多段落的故事,你得先把它翻译成形式化问题,再设计出复杂度合适的算法,正确实现,并通过包含刁钻边界的隐藏测试。一份对了 95% 的解,得分是零。

这恰恰是 2022 年大语言模型的短板。它们能补全看上去合理的代码,但合理不等于正确,竞赛也没有部分分。AlphaCode 的贡献与其说是「更会写代码」,不如说证明了一件事:只要采样足够多、筛选足够好,就能把单份解很低的成功率,转化成一个体面的竞赛名次。

采样、过滤、聚类

系统主体是一个编码器-解码器 Transformer,先在公开 GitHub 代码上预训练,再在精心整理的 CodeContests 竞赛题数据集(带测试)上微调。推理阶段,论文点名了三个关键点:

  1. 干净的数据集。 直接爬来的竞赛数据充满假阳性——能过可见测试、却过不了隐藏测试的解。团队为题目额外生成测试用例来降噪,训练和评测都用得上。
  2. 为廉价采样而设计的架构。 非对称的编码器-解码器(大编码器、小解码器)配合多查询注意力,让每道题能采样的数量比常规设置高出数个量级。
  3. 海量采样,再按行为过滤。 AlphaCode 每题最多生成一百万份候选,先滤掉约 99% 过不了题面示例测试的,再把幸存者按行为聚类,每个簇提交一个代表。

聚类这一步常被低估。过滤后可能仍有上千份程序,全提交是不可能的。按执行行为分组——在相同输入上输出一致的程序视为同一个「解」——让 AlphaCode 挑出多样的十份,而不是十份近乎重复的,这才是真正抬升通过率的环节。

关键结果

  • 在五千多人参赛的模拟 Codeforces 竞赛中平均排到前 54.3%,约为中位水平,这是系统首次在真实编程竞赛中具备竞争力。
  • 成绩高度依赖采样预算:样本数从几百涨到几十万,解题率稳步上升,这也正是架构要为廉价采样调优的原因。
  • 用题面示例测试过滤,会在聚类前就刷掉绝大多数候选,因此大部分算力都花在了随即被丢弃的程序上。

一句实话:这本质上是一套披着语言模型外衣的搜索系统。Transformer 提供一个不错的「提议分布」,竞赛名次来自大量提议的采样与挑选。

局限与存疑

  • 算力成本是头号局限。 每题最多一百万次采样,根本不是日常自动补全跑得起的;竞赛级数字是研究演示,不是产品级延迟预算。
  • 只是编程的一小块。 竞赛题是规格清晰、带单测的自包含谜题。真实开发——读大型代码库、安全重构、处理依赖与安全、应对模糊需求——这里几乎没触及。
  • 单份解仍然偏弱。 AlphaCode 靠数量取胜,这也引出后续工作的问题:模型能否靠推理给出更少、更准的尝试,而不是暴力搜遍解空间?

常见问题

AlphaCode 在 Codeforces 上排到多少名?

在近期 Codeforces 竞赛的模拟评测中,面对五千多名参赛者,AlphaCode 平均排到前 54.3%,大致相当于一名中位水平的选手。

AlphaCode 每道题只生成一份程序吗?

不是。它每题最多生成一百万份候选程序,先滤掉过不了示例测试的,再按执行行为聚类,最后提交约十份多样的代表——这是竞赛允许的上限。

AlphaCode 用的是什么模型架构?

一个编码器-解码器 Transformer,采用非对称设计(大编码器、小解码器)并配合多查询注意力,专为让大规模采样变便宜而选,而不是为最大化单份样本的质量。

AlphaCode 对今天的编程工具有什么意义?

它较早、且具体地证明了:生成大量候选程序、再按行为从中挑选,胜过只信任一份答案。这种「测试加过滤」的范式,如今支撑着各类编程智能体和自检型代码模型。

AlphaCode 真正的启示是:至少在 2022 年,通往竞赛级代码的路靠的是搜索,而不只是更聪明的下一个 token 预测。原文见 arXiv:2203.07814