AlphaEvolve:进化式编码 Agent 本节摘要:把一个前沿编码模型、一个进化循环、一个机器可验证的评估器凑在一起,让它跑足够久——它发现了用 48 次标量乘法完成 4×4 复矩阵乘法的程序,这是 56 年来首次改进 Strassen 的 49 次纪录;它还找到了一个 Google 全网 Borg 调度启发式,在生产中回收约 0.7% 的集群算力。AlphaEvolve(DeepMind,2025)的架构故意很朴素:LLM 给程序数据库提出定向编辑,自动评估器给每个变体打分,高分变体成为下一代的父代,循环跑几小时到几周。它的胜利全部来自评估器的严格;它在评估器不严格的领域里根本不工作。
本节摘要:把一个前沿编码模型、一个进化循环、一个机器可验证的评估器凑在一起,让它跑足够久——它发现了用 48 次标量乘法完成 4×4 复矩阵乘法的程序,这是 56 年来首次改进 Strassen 的 49 次纪录;它还找到了一个 Google 全网 Borg 调度启发式,在生产中回收约 0.7% 的集群算力。AlphaEvolve(DeepMind,2025)的架构故意很朴素:LLM 给程序数据库提出定向编辑,自动评估器给每个变体打分,高分变体成为下一代的父代,循环跑几小时到几周。它的胜利全部来自评估器的严格;它在评估器不严格的领域里根本不工作。这种不对称就是本节的核心教训——而 reward hacking(优化度量而非目标)正是这枚硬币的另一面。
对应原课程:Phase 15 · Lesson 03 ·
alphaevolve-evolutionary-coding(原英文phases/15-autonomous-systems/03-alphaevolve-evolutionary-coding/docs/en.md)。
阅读完本节,你应当能够:
大模型能写代码,进化算法能在代码上搜索。两者各自都被试了几十年,各自撞到天花板。LLM 的天花板是臆构(confabulation):模型写出看起来合理、却名不副实的代码。进化的天花板是搜索成本:在语法上随机变异几乎从不出可编译的程序,更别提更好的。
AlphaEvolve 把两者合起来:LLM 给程序数据库提定向编辑,自动评估器给每个变体打分,高分变体成为下一代的父代。LLM 干了「写出合理代码」这件贵活;评估器抓住臆构。循环跑几小时到几周。
报告成果:48 次标量乘法的 4×4 复矩阵乘法(Strassen 1969 的界是 49)、Google 生产中的 Borg 调度启发式、FlashAttention 内核提速 32.5%、Gemini 训练吞吐改进。
这套架构之所以有效,是因为评估器是机器可验证的;它在评估器不行的领域就无效。这个不对称就是本节的教训。
💡 这个循环本质上是「代码版 STaR」:把 STaR 里的「答案标签」换成了「程序评估器」。第 02 节与第 03 节是同一族自我改进。
原课程 code/main.py 在一个玩具符号回归问题上跑一个最小 AlphaEvolve 式循环:「LLM」是个标准库代理,对计算目标函数的程序提小的语法变异;「评估器」在留出测试点上量均方误差。你能直观看到三件事:最优分数怎样随代数爬升;MAP-elites 网格怎样保住多样解避免陷入局部最优;把留出测试关掉(只用训练评估器),循环会过拟合得多惨。
def evolve(seed, evaluator, llm_edit, db, generations=200): db.insert(seed, evaluator.score(seed)) for _ in range(generations): parent = db.sample_parent() # MAP-elites / 岛屿选父代 context = {"parent": parent, "top_variants": db.top_k(5), "eval_signature": evaluator.signature, "task": "降低 MSE,不要破坏正确性"} child = llm_edit(context) # LLM 提定向编辑 if child is None or not compiles(child): continue score, feats = evaluator.run(child) # 编译 + 运行 + 打分 db.insert(child, score, feats) # 按分数与特征向量入库 return db.best()
第一,LLM 收到的不止是父程序:通常还有数据库里的若干最优变体、评估器签名、一段任务描述。模型的职责是提一个可能提升分数的定向修改——改一个函数,而不是随机改字节。
第二,数据库是结构化的(MAP-elites 网格、岛屿模型),让循环探索多样性,而不仅仅追逐当前冠军。
AlphaEvolve 的胜利全部来自评估器快、确定、难以被钻空子的领域:
每一例中,评估器都抓住了那类「否则会占主导」的 LLM 错误:臆构的正确性声明、在硬件上消失的性能声明、边界情况失败。拿掉评估器,循环就开始优化「漂亮的代码」。
进化优化评估器测的一切。评估器不完美,循环就找到那个不完美。DeepMind 在论文里明说:AlphaEvolve 的成功只迁移到「评估器严格程度与搜索野心匹配」的领域。2025-2026 代码搜索循环里 reward hacking 的具体例子:
AlphaEvolve 的缓解:上一个 LLM 从未见过的留出评估器,输入在评估时生成。即便如此,DeepMind 仍建议对任何拟部署的方案做强审查。
| 系统 | 生成器 | 评估器 | 领域 | 代表性胜利 |
|---|---|---|---|---|
| AlphaEvolve | Gemini | 正确性 + 基准 | 算法、内核、调度 | 48 次乘法 4×4 矩乘 |
| FunSearch(DeepMind, 2023) | PaLM / Codey | 正确性 | 组合数学 | cap-set 下界 |
| AI Scientist v2(Sakana,L5) | GPT/Claude | LLM 批判 + 实验 | ML 研究 | ICLR workshop 论文 |
| Darwin Godel Machine(L4) | Agent 脚手架 | SWE-bench / Polyglot | Agent 代码 | SWE-bench 20%→50% |
四者都是同一配方的变体:生成器 + 评估器 + 循环。差异在于评估器评什么、有多严——这正是 AlphaEvolve 与 AI Scientist v2 的根本分野:前者评估器机器可验证,后者评估器里有 LLM 批判(严格度天然更弱,见第 05 节)。
⚠️ 判别准则:一个领域适不适合 AlphaEvolve 式循环,只看一件事——你能不能写出一个 LLM 钻不过的评估器。能,就值得跑;不能,循环就会优化表面特征。
outputs/skill-evaluator-rigor-audit.md 是在新领域考虑 AlphaEvolve 式循环前的 precondition 检查清单:你的评估器真的能抓住你在乎的那些失败吗?它覆盖四个维度——(a) 正确性条件是否机器可验证、(b) 性能度量是否在真实硬件上测、(c) 是否有 LLM 没见过的留出输入、(d) 是否至少一条反 reward-hacking 检查(如拒绝空解、拒绝与测试集哈希碰撞的输出)。
code/main.py 是零依赖玩具,把「关掉留出评估器」做成一个开关(--no-holdout),适合在评审里现场演示「同样跑 200 代,有/无留出评估器的最优分数差距」。
跑 code/main.py:记录最优分数轨迹。关掉留出评估器(--no-holdout)再跑一次,量化过拟合程度。
读论文第 3 节关于 MAP-elites 网格,为一个新问题(如编译器优化 pass)设计一个特征向量描述子,让搜索保持多样。
48 次乘法的 4×4 结果 56 年来首次改进 Strassen 的 49 次界。读论文附录 F,用三句话解释为什么这个问题的评估器特别好做对,以及为什么多数领域不像它。
提出一个 AlphaEvolve 会失败的领域,精确指出评估器在哪里崩、为什么。
为一个你熟悉的领域写评估器签名,包含:(a) 正确性条件、(b) 性能度量、(c) 留出输入生成规则、(d) 至少一条反 reward-hacking 检查。
下一节,把进化对象从「程序」换成「Agent 脚手架自身」——Darwin Godel Machine 让 Agent 重写自己的代码并自评,看自我改进在「改进者自己也是被改进对象」时会怎样。