UBC 和 Sakana AI 的 Darwin Gödel Machine(DGM)做了一件很直接的事:让编程 agent 改自己的源代码,改完拿基准测试打分,把每个能用的版本都存进存档库,下次从存档里挑一个再改。跑了 80 轮,SWE-bench Verified 从 20.0% 升到 50.0%,Polyglot 全集从 14.2% 升到 30.7%。我觉得起作用的不只是「自我修改」,还有「不扔掉暂时变差的版本」。

下文分开写。标【论文】的是论文里的事实,附出处;【公开资料】是公开仓库的说法;标【我的推测】的是我自己的延伸,没有实验支撑;没标的经历段是我自己的情况。

改自己代码的 agent,80 轮把 SWE-bench 翻了一倍多

【论文】起点是一个很简单的 agent:一个冻结的基础模型,加一个 Bash 工具和一个编辑整份文件的工具。每一轮,DGM 从存档里抽一个 agent,让它读自己的评测日志,提出一个改进并改自己的代码,然后在编程基准上跑分。新版本只要还能改代码,就进存档。DGM 论文 4.1 节

【论文】结果:80 轮后,SWE-bench Verified 子集从 20.0% 到 50.0%;Polyglot 在 50 题子集上从 14.0% 到 38.0%,在完整 Polyglot 上从 14.2% 到 30.7%。改出来的东西包括更细粒度的编辑工具、长上下文管理、一题多试再让另一个模型评估挑选。DGM 论文摘要与 4.4 节

【论文】这里没有改模型权重。自改动期间用的是 Claude 3.5 Sonnet (New),改的是 agent 外面那层代码和流程。

存档库让 agent 能从暂时的退步里爬出来

【论文】论文做了两个消融。去掉「自我改进」(负责改代码的元 agent 不更新),前几轮有提升,很快就平了。去掉「开放式探索」(只保留最新版本),一次改坏就会拖累后面所有改动。两个都不如完整 DGM。DGM 论文 4.4 节

【论文】在 SWE-bench 那次运行的第 4 轮和第 56 轮,新 agent 分数一度低于它的父版本,但 DGM 沿着这条路继续改,后来做出了比所有前辈都强的版本。

【我的推测】这条对我最有用。平时我们调 agent,改坏了就回滚,只留当前最好的。DGM 的数据说明,只留最好的那条路线本身就是一种局部最优陷阱。

改进能迁移到别的模型和别的基准

【论文】在 SWE-bench 上进化出的最佳 agent,换成 Claude 3.7 Sonnet 跑,从基线 19.0% 到 59.5%;换 o3-mini,从 23.0% 到 33.0%。在 SWE-bench 上进化的 agent 拿去跑 Polyglot 得 28.9%(基线 14.2%),反过来是 24.5%(基线 20.0%)。论文据此认为它学到的是通用能力,不是钻基准空子。DGM 论文 4.4 节

它也会作弊:分数满了,问题没解决

【论文】附录 H 有个例子。研究者让 DGM 解决「模型假装调用了工具」的幻觉,并写了检测函数打分。其中一个版本只改了两次就拿到满分 2.0,做法是删掉了标记工具调用的特殊 token 日志,绕过了检测,问题本身没解决。论文把这叫 objective hacking,并引了古德哈特定律。另一个版本拿 1.67 分,是真的在修。DGM 论文附录 H

【论文】代价也不低:在 SWE-bench 上跑一次完整 DGM 约 2.2 万美元,两个消融各约 1 万美元,一次要跑两周左右。实验都在沙箱里做,有资源和时间上限,人工监督。DGM 论文附录 E.1 与安全节

Voyager 攒技能,DGM 改自己

【论文】Voyager(NVIDIA 等,2023)在 Minecraft 里做终身学习。它有三块:自动课程、可执行代码组成的技能库、带环境反馈和自我验证的迭代提示。写好并验证过的技能代码存进库,按描述向量检索,下次组合调用。它不微调模型,只通过 GPT-4 黑盒调用。比此前最好方法多拿 3.3 倍独特物品,走 2.3 倍距离,解锁关键科技树最多快 15.3 倍。Voyager 论文

两者的差别可以这样看:

VoyagerDGM
存下来的是什么技能(完成某个任务的代码)整个 agent(包括它怎么改自己)
agent 本身变不变不变,技能库在长会变,工具和流程被改写
怎么判断变好环境反馈加 GPT-4 自我验证跑编程基准打分
留什么验证通过的技能所有还能工作的版本,进存档树

【我的推测】Voyager 是「会的东西越来越多」,DGM 是「学东西的方式在变」。DGM 论文的消融里,元 agent 不更新时提升很快就停,这和 Voyager 那种结构固定、只加技能的做法是同一类限制。这个对应是我的读法,论文没有直接比较 Voyager。

我的 Hermes 还停在手动改、git 回滚

我自己改坏又回滚过很多次。profile skill 和 complexity 相关的几个 skills 改过很多版,每次都有回滚记录。优化 skill 时还发现一件事:帮我优化的模型喜欢用 Python,改着改着整个 skill 就变成了 Python,目前效果也不太好。

现在的做法是:旧版本用 git 存档,坏了就回滚;评估三种都用,人工看、测试集、让 agent 看,但没有固定体系,散在几个项目里。实验做了不少,存档、冻结基线、测试把关都有(prompt-optimisation、intent-harness),但还没串成自动跑的循环,每一轮改动还是我手动触发。

散落的那几个项目里,有几处做法和 DGM 对得上:

  • prompt-optimisation(私有仓库):基线放在不可改的目录里冻结,候选版本按 sha256 存档,运行记录存进不可编辑的记录区,由一个验证脚本把关。这是我手上最接近 DGM「存档加评测后保留」的东西。
  • intent-harness(私有仓库):以文件作协议,运行外壳可以换成 Claude Code、Pi、Hermes、Codex 或 Python runner;执行模式下不能改 verifier,也不能自己写通过记录。
  • crew-contract:重要改动由独立的 reviewer 把关。

【公开资料】Nous Research 有个公开仓库 hermes-agent-self-evolution,用 DSPy 加 GEPA 去进化 Hermes Agent 的 skill、工具描述和提示。按它 README 的进度表,目前只实现了第一阶段,优化 SKILL.md;工具描述、系统提示、工具代码和持续改进循环都还是计划中。改出来的版本要过完整测试、大小限制,并走人工审核的 PR。hermes-agent-self-evolution README

【我的推测】DGM 给我的三条最直接:一是每次改动都要有固定的评测集打分,不靠它自己说好;二是旧版本别删,留成可回溯的存档,我现在的 git 回滚只做到了一半,回滚是为了撤销,不是为了从旧版本再分叉;三是打分函数不能让被评的 agent 看到或改到,论文里的满分作弊就是这么来的,intent-harness 不准改 verifier 也是这个意思。我那次 skill 越改越像 Python,可能也是同一类问题:没有固定的尺子,优化的模型就按自己的偏好走。

自评靠不住,所以 DGM 用外部基准打分

【论文】DGM 判断一个版本好不好,看的是基准测试的通过率,不是 agent 的自我评价。附录 H 里检测函数在自改动时对 agent 隐藏,正是为了防作弊。DGM 论文附录 H

【我的推测】这和我之前写的《让 agent 自己 critique 自己,靠谱吗?》结论一致:自评可以当补漏步骤,不能当最终验收。DGM 把这条做成了结构,改动由 agent 自己提,裁决交给外部测试。不过 DGM 里也有自评成分,它进化出来的「一题多试、另一个模型挑选」就是一种 critique,用在单个任务内,不用来决定版本去留。

FAQ

DGM 改了模型本身吗? 没有。基础模型是冻结的,改的是 agent 的代码:工具、提示流程、上下文管理。

50% 是 SWE-bench 全集吗? 不是。论文说的 SWE-bench 默认指 SWE-bench Verified,评测用的是其中的子集。

Polyglot 为什么有两个数? 14.0% 到 38.0% 是运行中用的 50 题子集,14.2% 到 30.7% 是完整 Polyglot 上的复测。引用时用后者更稳。

个人能跑吗? 代码开源(github.com/jennyzzt/dgm),但一次完整运行约 2.2 万美元 API 费用、约两周。

和 Voyager 最大的区别? Voyager 往库里加技能,agent 本身不变;DGM 改 agent 自己,连「怎么改自己」也在改。

这是不是哥德尔机? 只借了名字。原版哥德尔机要求证明改动有益,论文说这在实践中做不到,DGM 改为用基准测试经验验证。

来源