笔记日期: 2026 年 10 月 4 日
笔记作者: Zhongzhu Zhou
论文题名: Darwin Gödel Machine: Open-Ended Evolution of Self-Improving Agents
论文作者: Jenny Zhang、Shengran Hu、Cong Lu、Robert Lange、Jeff Clune
arXiv: 2505.22954v3,2026 年 3 月 12 日
1. 先把“自我改进”拆开
我读这篇论文时,首先关心的不是系统有没有“进化”这个名字,而是究竟什么东西被改变了。一个 coding agent 至少有两部分:一部分是提供推理和代码能力的语言模型,另一部分是把模型接到工具、文件、执行环境和反馈上的程序。后者通常被称作 harness,可以理解为智能体的运行框架。工具怎么描述、历史怎么保留、什么时候重试、多个候选答案怎么选择,都属于这个框架的工作。
Darwin Gödel Machine,简称 DGM,主要改变第二部分。它让 coding agent 修改自己的程序,再把修改后的版本放到外部编程任务上评估。如果这个版本仍然能正常完成基本代码编辑,就把它保留下来,作为以后继续修改的起点。模型参数没有因此更新,外层档案管理和父代选择规则也没有在实验中自我改写。
因此,我对这篇工作的概括是:它展示了如何自动积累有用的 agent 设计,并让已经改进过的 agent 参与下一轮设计。它没有证明每次修改都更好,也没有证明改进会无限加速。把这些范围先说明白,后面的结果才不会被“递归自我提升”这个很大的概念掩盖。
论文最常被引用的数字是 SWE-bench 从 20.0% 到 50.0%,以及完整 Polyglot 从 14.2% 到 30.7%。这里必须带上评估对象:前一组来自论文使用的 200 题 SWE-bench 子集,不是全部 500 题 Verified;Polyglot 搜索曲线另外报告的是 50 题子集上的 14.0% 到 38.0%。这几组数字不能混在一张没有分母说明的成绩表里。

图 1(论文 Fig. 1):系统在自我修改和编程任务评估之间循环。来源:论文 v3,第 2 页。档案里保存的是可以再次运行和修改的 agent 版本,不只是对话中的文字反思。
DGM 有三个相互配合的设计。首先,agent 本身是可修改的程序。其次,修改后的 agent 会参与生成后续版本,因而“负责改进的工具”也可能变强。最后,系统不是只保存最新或当前最高分的版本,而是保留多条分支。一个暂时掉分的设计,可能在加入另一个功能后变得有用。
这份笔记以论文正文和附录为依据。图中的实验成绩均来自作者报告;采样权重和统计误差图是我为解释机制所做的计算,不是新实验。我没有运行论文中的实验。后面提出的对照方案也只是研究建议,不会被写成已经完成的验证。
2. 前置知识:参数、上下文与程序是三个层次
2.1 模型不变,系统为什么还会进步
设模型参数为 ,agent 程序为 ,任务为 。执行过程会产生一串动作、工具返回和中间判断,记为轨迹 。为了方便讨论,我用下面的记号描述这个过程:
这是笔记里的分析记号,不是论文提出的新定理。它想表达的是:即使 固定,改变 也会改变模型能看到什么、能做什么,以及最终怎样交出答案。模型原来只能重写整个文件,现在能准确替换一小段文本,成功概率就可能提高。原来被长日志淹没,现在有合适的摘要机制,也可能更容易继续任务。
这类学习不通过梯度更新模型。被长期保存的是软件结构、工具接口和工作流程。说它“学到了一个更好的 agent 设计”是合理的,但不能顺手改写成“基础模型已经学会新的编程知识”。成绩属于模型与运行框架的组合,而不是单独属于模型参数。
还要区分一次任务内的反思与跨任务的改进。模型在当前 bug 上写一段反思,可能只帮助下一次尝试;换一个任务以后,这段经验未必留下。DGM 修改的是下一次任务也会加载的 agent 程序,因此改进具有持久性。当然,持久保存也可能保存错误设计,不能把“永久修改”当成“永久进步”。
2.2 从形式证明转向经验评估
经典 Gödel machine 的设想,是在给定公理、环境和效用定义下,证明某次自我修改有利,再实施修改。对于当下基于大模型的 agent,这种证明通常不切实际。一个新工具究竟会帮助模型还是让它更混乱,往往只能通过实际任务来观察。
DGM 用编程基准代替形式证明,让这个循环可以在现实系统上运行。代价是它不再拥有“所有修改都经过数学证明”的含义。有限任务上的高分只说明在特定条件下观察到更好的表现,不能保证未来所有任务都受益。
还有一个容易忽略的细节:DGM 并不要求每个进入档案的子代都超过父代。只要仍然具备基本功能,低分子代也可能被保留。因此,“经验验证”在这里更接近测量和筛选,不是对每一代单调提升的认证。档案中历史最好成绩可以一直不下降,同时某条分支的实际表现先降后升。
为什么允许这种退步?因为功能之间有相互作用。例如,一个新的上下文压缩模块初期可能删掉有用信息,但后来配合更好的摘要提示和触发条件,就可能成为关键组件。只允许立即涨分的策略会提前删掉这个中间状态。不过,这只是保留弱版本的合理动机,不意味着每次绕路都值得付出成本。
2.3 档案不是“保存最好版本”的同义词
可以把档案想成实验室保存的一批原型。最快的原型不一定最容易继续改造;某个当前较慢的原型,可能有更好的接口或更清楚的内部划分,适合加入新能力。只保留最新版本,容易被一次失败修改拖住;只保留最好版本,又可能无法跨过“先降一点分才能前进”的区域。
DGM 保存多个版本、成绩和父子关系,让这些原型有机会被重新使用。但保存和使用是两回事。某个版本虽然仍在档案中,如果被选中的概率极低,在有限预算里就近似于没有机会。所谓“每个版本都有非零概率”,不能直接推出“所有有价值的路线都会被探索”。
另外,档案大小并不是行为多样性的直接指标。十个程序可能只是用不同写法实现同一种策略。DGM 的采样规则没有直接计算两个 agent 在行为上有多不同,而是结合成绩和已有功能性子代数分配概率。理解这个区别,可以避免把“版本多”误读为“能力覆盖广”。
3. DGM 到底怎样修改自己
3.1 从一个很轻量的 agent 出发
初始 agent 有 shell 和基础编辑器两个工具。编辑器能查看文件、创建文件,以及覆盖整个文件,还没有后续搜索中出现的局部查看和精确替换能力。任务输入包含仓库位置、问题描述和测试说明,模型自己决定如何调用工具。
这个起点很重要。作者刻意选择轻量系统,便于观察自动改进是否发生。这样的实验能说明机制有效,但涨分幅度也受到起点影响:给一个只能整文件覆盖的 agent 加入细粒度编辑,比改进一个已经高度打磨的成熟框架容易。下一步应当测试强起点,而不是把从弱起点获得的增益直接外推到所有现有产品。
被选中的父代不是凭空决定改什么。系统会分析它在编程任务上的运行日志,提出一个改进建议,然后让父代在自己的程序副本中完成这个建议。附录 C.3 明确写到,诊断阶段使用额外的 o1 模型。也就是说,提出改进方向的诊断模型,与实际动手修改的 coding agent,是分开的角色。
这个事实限制了“完全自我驱动”的解读。实验中,负责修改的 agent 会沿着分支变化,但诊断安排和外层搜索控制器仍然是固定设计。比较准确的说法是:系统在外部诊断的帮助下进行自我修改,而不是已经自动重写所有决定自己如何进步的环节。
3.2 用几个记号看清依赖关系
令 表示第 步后的档案, 表示 agent 的评估日志, 表示诊断过程, 表示由 agent 执行的编辑过程。可以把一次修改写成:
这里最重要的是 的下标。DGM 用选中的父代来完成对自己的修改;去掉自我改进的对照组,则始终由初始 agent 执行编辑,可以写作 。两者都可能生成更好的目标程序,但只有前者会让后续编辑者本身随分支变化。
子代评估后,档案更新可以写为:
表示功能性准入条件,包括能够正常编译以及保留代码编辑能力; 是测得的成功率。注意这里没有“子代分数必须大于父代”的条件。DGM 正是通过这个位置,保留了可能暂时不占优势的中间设计。
3.3 算法 1:从父代到子代的完整循环
01 建立初始 agent,并保存其评估记录。
02 固定基础模型参数和外层搜索规则。
03 从档案中按概率选择合格父代。
04 根据父代日志得到一次改进诊断。
05 把诊断整理成一个明确的修改任务。
06 由该父代编辑自己的程序副本。
07 按分阶段协议评估新生成的子代。
08 丢弃失去基本代码编辑能力的子代。
09 保存功能正常的子代、分数和父子关系。
10 重复直到达到规定的生成预算。
11 按指定评估范围报告最终选出的 agent。
这是根据正文和附录重述的解释性伪代码,把诊断阶段与评估阶段单独展开。论文描述了 80 次生成 agent 的迭代,并指出 SWE-bench 有两个任务并行、Polyglot 有四个任务并行。附录伪代码又采用一轮抽多个父代的写法。阅读曲线时,我保留作者的迭代口径,不自行把 80 再乘以并行数量后声称那才是真实预算。
同样的生成次数,不代表同样的计算成本。一个在初筛就失败的子代很便宜;一个进入 200 题评估的子代会贵得多。并行数量主要影响等待时间与资源占用,不会让底层评估开销消失。这一点在后面的消融实验解释中非常关键。
4. 父代怎么选:把公式逐步拆开
4.1 先看成绩,再看这条分支已经探索了多少
附录 C.2 先构造合格集合 ,其中只包含分数还没有达到 1 的 agent。设某个 agent 的分数为 ,已有功能正常的子代数为 。第一步,对成绩做 sigmoid 变换:
当成绩是 0.5,变换后正好是 0.5;低于这个位置,权重下降,但不会突然变成零;高于它,权重逐渐接近 1。与硬阈值相比,这样弱一点的候选仍然有机会。与直接用原始成功率相比,它会改变中间区域不同成绩之间的相对偏好。
第二步,用已有功能性子代数折扣这个权重:
直觉上,成绩越高越值得继续,已经成功展开很多次的父代则应该让出一部分机会。这里我把分母明确写成合格集合上的求和,避免把已经达到满分、被排除的条目混入归一化。论文的索引写法和集合文字描述需要结合起来理解。
作者把 叫作 novelty bonus,但它不是直接测量“新颖程度”。它只数这个父代已经产生多少个仍能编辑代码的子代。它没有计算新算法与旧算法的距离,也不是累计所有失败尝试的次数。一个父代反复生成失效子代, 可能仍然很小,从而继续保留较高探索权重。

图 2(自行计算):按论文参数绘制未归一化采样权重。已有功能性子代越多,同样成绩的父代越不容易被反复选择。这是公式示意,不是 DGM 实验中的实际轨迹。
4.2 算一个能看出差别的例子
假设档案中只有三个合格 agent。A 得分 0.5,已有四个功能性子代;B 得分 0.4,没有子代;C 得分 0.2,也没有子代。三者的 sigmoid 值大约为 0.5000、0.2689 和 0.0474。乘上子代数折扣以后,权重变为 0.1000、0.2689 和 0.0474。
把这三个权重相加再归一化,可得到:
最高分的 A 并不是最可能被选中的父代。B 因为这条分支还没有得到充分展开,占到大约 65% 的概率;较弱的 C 也有约 11% 的机会。这个小例子揭示了 DGM 与“永远改最好版本”的区别:它愿意把下一笔预算交给尚未充分探索的分支。
论文采用有放回采样,因此一批中可能多次选到同一父代。若某父代单次概率为 ,独立抽取 次后至少出现一次的概率是:
推导很简单:一次没选中是 ,连续 次都没选中是 ,用 1 减去它即可。在上面的假设例子中,C 在抽两次时至少出现一次的概率约为 21.5%,抽四次时约为 38.4%。实际运行中,档案和权重不断变化,所以这些只是固定分布下的解释性计算。
4.3 非零概率为什么还不够
如果一个值得探索的版本每次只有 0.001 的选择概率,即使固定这个概率连续抽 80 次,完全没选到它的概率仍约为 92.3%。因此,“所有版本都有机会”只是算法分布的性质,不是有限计算预算下的覆盖保证。
档案持续变大时,某个版本的概率还可能继续被稀释。小样本成绩的噪声也会改变它在 sigmoid 曲线上的位置。可以考虑给探索保留固定比例,或者根据不确定性来分配预算,但这又要求不同候选的测量可比较。DGM 的规则容易理解、容易运行;这份简洁本身不意味着它已经是最优搜索策略。
5. 为什么“暂时变差”可能有价值
5.1 最终最好版本并不是一路上涨
论文中的档案树比单独一个终点成绩更值得看。最终最佳 agent 的祖先链上存在两次明显的成绩回落。作者还展示,某些中间节点会产生许多后续分支。这说明一个节点的价值,可能来自它为后续修改创造了条件,而不只是当下的得分。

图 3(论文 Fig. 3):SWE-bench 搜索中的档案与进展。来源:论文 v3,第 7 页。节点边框表示评估题数,不能把所有节点都当成相同精度的测量。最终祖先链上的回落,说明局部退步与后续价值可能并存。
需要谨慎的是,祖先链上的下降也可能包含评估噪声和任务覆盖差异。图能证明搜索经过了测得较弱的节点,但单靠这张图还不能算出:保留所有这种节点,平均每花一美元能带来多少额外进步。后一个问题需要跨多次搜索的统计和更完整的成本记录。
5.2 改进落在了哪些具体环节
论文列出的改进很具体:遇到空补丁时重试;按行范围查看文件;用唯一字符串替换完成局部编辑;上下文过长时进行摘要;产生多个候选补丁后再选择;把之前候选的结果纳入后续尝试。这些并不神秘,恰好都是实际使用 coding agent 时经常影响可靠性的设计细节。
细粒度编辑的好处,是缩小一次操作的影响面。只需要改三行时,要求模型重写一千行文件,会额外制造丢失无关逻辑的机会。更精确的操作可以把“知道怎么修”与“能可靠地把修复写进去”之间的差距缩小。它改善的是模型与代码库之间的接口。
摘要解决的则是信息组织问题。长任务会积累大量工具返回,模型可能被旧错误、冗余日志和重复文件内容占满上下文。摘要可以保留近期相关证据,但也可能删除决定正确修复的细节。判断摘要是否有帮助,要看保留了哪些约束,而不是只看 token 变少。
多个补丁加排序,又把问题转移到了选择阶段。多次尝试可以增加候选覆盖,但排序模型未必知道哪个补丁正确;它可能被漂亮的解释吸引。因而,“增加一次评审”与“提高最终可靠性”之间仍然隔着一个要实测的判断环节,也会带来额外推理成本。
附录 G 用两个细粒度编辑方案说明,同一个功能目标可以产生不同的接口设计和效果,报告的成绩分别为 23.3% 和 40.5%。不过,附录中的建议标签与叙述映射并不完全一致。我把它作为“接口表达方式很重要”的案例,而不把它包装成只改变一个操作就必然增加固定分数的干净因果实验。
5.3 写业务代码与改进自己,相关但不相同
DGM 的合理直觉是:更会编辑代码的 agent,既可能更会修外部仓库,也可能更会修改自己的工具和流程。两类任务共享一部分能力,所以有机会形成正反馈。
但这两类能力不能直接画等号。修一个 Django bug 需要理解业务逻辑;改进一个 agent 还需要识别失败模式、设计合适接口和做有效实验。外部任务成绩提高,不自动证明它更擅长选择有价值的自我修改方向。额外的诊断模型也参与了这个过程。
为了把问题说清,可以把外部任务质量记为 ,把“用这个 agent 生成子代时,平均能带来多少质量提升”记为 。我们希望两者正相关,但只观察 变大,还不能确定 的变化。更直接的实验,是固定一批父代程序和修改建议,再分别让初始 agent 与进化后的 agent 来编辑,比较其子代在同一预算下的功能性和未见任务成绩。
这种实验不需要否认现有结果。它是在追问自我改进最核心的那一层:系统是更会做事了,还是也更会制造下一代更好的自己了?目前论文为这个连接提供了有意义的证据,但还没有完全拆开其中的因果贡献。
6. 评估协议:分母也是结果的一部分
6.1 两个基准分别测什么
SWE-bench Verified 是真实仓库中的 Python 维护任务,可能要理解多个文件之间的关系。Polyglot 则覆盖多种编程语言,很多题主要要求在一个文件里实现解法,但仍需读取周围接口和测试相关信息。两者都属于编程,却不是同一种工作负载。
这使跨基准迁移尤其值得看。如果某个框架只擅长一个仓库布局,换到另一种任务后优势可能消失;如果改进的是更通用的编辑、上下文组织或尝试选择,就更可能保留一部分收益。不过,跨两个基准成功也不能直接扩展成“所有现实软件工程任务都适用”。
Polyglot 的口径还有一个关键区别:论文采用 pass@1,任务执行时不给官方隐藏测试的反馈,而排行榜常用允许一次隐藏测试反馈的 pass@2。比较 Aider 时,需要使用作者对应的设置,不能随手拿当前排行榜某个 pass@2 数字来对照。
pass@1 也不等于内部只调用一次模型。一个 agent 可以在内部生成多个候选、做排序,再提交一个最终结果。这里限制的是评价方式和隐藏反馈访问,不是对所有内部计算施加统一的一次调用预算。这个区别对理解“工作流更好”与“花了更多推理”非常重要。
6.2 从十题筛查到二百题评估
SWE-bench 首先用十题判断 agent 是否仍有基本代码编辑能力;通过后扩展五十题,形成六十题筛查分数。当它超过 40% 且属于档案中前两名时,再加上一百四十题,总共评估二百题。
正文写的是超过 40%,图例用了大于等于 40% 的符号。这个小边界差异不改变整体思路,但如果要严格定义一个实验,就应先把它说清楚,而不是擅自替作者统一口径。
Polyglot 的描述存在另一个值得保留的细节。正文结果明确称曲线是在五十题子集上得到;附录却列出十个初筛任务和五十个“额外”任务名称,而且有任务交叠。因此,我在成绩表中保留作者的“五十题搜索子集”说法,不自行推断它等于六十个互不重复任务上的统一成绩。最终完整基准上的 14.2% 到 30.7%,是更清楚的一组最终表现。
阶段式评估能省钱,因为明显失效的版本不值得做最昂贵的完整测试。问题是,不同候选可能拥有不同分母,也可能在不一样的任务组合上被测量。把所有成绩作为同样精确的数字放进采样公式,会隐藏这种差异。
6.3 算法 2:正确阅读一个阶段式结果
01 记录初始功能筛查用哪些任务。
02 区分筛查成绩与扩展评估成绩。
03 记清进入下一阶段的阈值和排名条件。
04 记录各阶段任务身份以及交叠。
05 标出哪些成绩参与了后续搜索决策。
06 在最终测试集之外完成 agent 选择。
07 对选中的 agent 做独立的最终测试。
08 同时报告分母、模型、反馈访问和成本。
09 将子集成绩与最终测试成绩分栏展示。
前五步是理解论文需要追踪的信息;后四步是我建议的评估纪律,不代表作者所有数字都来自完全未触碰的最终测试集。特别是 SWE-bench 的二百题成绩参与了强候选的识别,不能把它描述成整个搜索过程完全没有用到的独立测试结果。
6.4 小筛查集会决定哪些路线有机会活下来
附录 E.2 列出的最初十个 SWE-bench 任务全部来自 Django。它可以快速发现明显坏掉的 agent,但也使“是否具备功能”与一个框架上的成功发生耦合。某个在其他生态里有优势的设计,可能还没获得充分评估就被筛掉;某个适合这十题的设计,则会获得更多后续预算。
这是选择效应,不是说论文结果因此无效。更清楚的做法,是把任务无关的编辑功能测试与分层抽样的性能测试拆开。前者回答工具链还能不能工作,后者回答在不同仓库与任务类型中做得好不好。否则,“无法修好初筛题”与“已经不能编辑代码”容易在解释上被混为一谈。
7. 消融实验究竟证明了什么
7.1 三种对照不能混成一类
第一种对照去掉“改进编辑者”:目标 agent 仍在变化,也有档案,但负责生成修改的永远是最初那个 agent。第二种去掉开放式档案探索:仍然可以修改自己,却只保留最新的功能正常版本。第三种是附录新增的 greedy 选择:可以保留历史版本,但每次只从最高分节点继续。
这三种策略回答不同问题。只留最新版,容易因为一次退步丢掉良好起点;greedy 避免这种替换风险,却可能错过从次优父代出发的路线。完整 DGM 则给多个父代继续生长的机会。加入 greedy 对照很有价值,否则只打败“永远沿最新版本走”的策略,还不足以说明较复杂的采样规则值得采用。

图 4(论文 Fig. 2):DGM 与两个主要消融版本的搜索曲线。来源:论文 v3,第 7 页。这是论文指定子集上的过程结果,不是完整 Polyglot 成绩,也不是无限期持续进步的证明。
附录 A.3 的表 1 给出:SWE-bench 上 DGM 为 50.0%,去掉档案探索为 23.0%,固定编辑者为 39.0%,greedy 为 39.7%;Polyglot 搜索子集上,四者依次是 38.0%、14.0%、28.0% 和 30.0%。这些结果支持在作者的实验设置下,同时保留多个探索分支并更新编辑者是有帮助的。
我更愿意用“在这个设置下有帮助”,而不是“所有自我改进系统都必须这么做”。初始 agent、诊断模型、任务难度、预算和工具空间改变后,收益可能不同。论文也没有穷尽所有 bandit、beam search 或 quality-diversity 方法,所以不能把这个消融表理解成对所有搜索算法的排名。

图 5(按论文数据重绘):左侧来自表 1 的 SWE-bench 消融;右侧来自正文 4.4 的 Polyglot 两组成绩。右侧刻意保留五十题子集与完整基准两个口径,避免把不同分母当成同一个实验。
7.2 增加三十个百分点,不等于只增加百分之三十
SWE-bench 从 20% 到 50%,是增加 30 个百分点;最终成功率是原来的 2.5 倍;相对增幅为 150%。这是同一变化的三种表达,不是三项独立结果。技术笔记最好先用百分点,再明确说明相对量的分母。
完整 Polyglot 从 14.2% 到 30.7%,增加 16.5 个百分点。若换成错误率下降比例,则分母是原始失败率 85.8%,约为 。它看起来没有“成功率翻倍”那么显眼,却描述同一组数据。选哪个说法,不应该由哪个更吸引眼球决定。
历史人工设计基线也应保留条件。附录 E.4 中,OpenHands 加 CodeAct v2.1 在同一个二百题子集上为 51.0%,完整 Verified 上为 53.0%。DGM 的 50.0% 接近的是前一个子集成绩。这是论文当时条件下的比较,不能在 2026 年 10 月直接称为“当前最强 coding agent 水平”。
7.3 功能性子代与多次运行
附录 A.4 报告,DGM 生成的 agent 中,51.3% 保留基本代码编辑能力;两个主要消融组都是 32.5%。这与递归机制相关:改进后的系统更可能产出仍能工作的下一代。但“能工作”与“长期值得继续探索”之间仍有距离,功能正常的子代也可能得分低或与已有版本高度重复。
作者还给出三次 Polyglot 运行的平均准确率 40.7%,标准差 2.3 个百分点。这比单条曲线更有说服力,但这组统计属于附录中的 Polyglot 多次运行分析。不能把它直接贴到完整基准 30.7% 的数字旁边当误差条,也不能当作 SWE-bench 多次运行的稳定性证据。
| 观察 | 支持的判断 | 尚未回答的问题 |
|---|---|---|
| 胜过固定编辑者 | 更新编辑 agent 对该搜索有帮助 | 相同费用下是否仍然占优 |
| 胜过 greedy | 次优父代可能有后续价值 | 最合适的探索概率怎样分配 |
| 功能性子代更多 | 生成版本更容易保持可运行 | 是否带来更有价值的新能力 |
| 跨基准仍有提升 | 部分能力可以复用 | 更广泛真实任务上的表现 |
| Polyglot 多次运行 | 有一定稳定性证据 | 强起点和其他基准的稳定性 |
8. 泛化结果值得重视,但收益并不均匀
8.1 跨基准迁移比训练集涨分更有信息
在 SWE-bench 上进化出的 agent,放到另一个没有用于该次搜索的 Polyglot 基准上,达到 28.9%,高于初始 14.2%。反向迁移时,在 Polyglot 上进化出的 agent,在 SWE-bench 上从初始 20.0% 提高到 24.5%。因为替代基准没有参与对应的搜索,这些结果与优化集上的曲线具有不同的证据价值。
迁移明显不对称。SWE-bench 到 Polyglot 增加 14.7 个百分点,反向只增加 4.5 个百分点。一种可能解释是,复杂仓库维护中学到的工具和流程,更容易帮助相对集中的多语言实现任务;但这只是推断。模型组合、起点难度和任务结构也可能造成差异,论文没有把这些因素完全拆开。

图 6(论文 Fig. 4):迁移实验。来源:论文 v3,第 8 页。原图 Claude 3.7 的柱标写 59.0%,相邻正文写 59.5%;这里保留原图并明确指出不一致,不自行替作者选择一个“正确数字”。
8.2 换更强模型以后,框架收益可能缩水
SWE-bench 上换用 o3-mini 时,初始与进化后 agent 分别为 23.0% 和 33.0%。换用 Claude 3.7 时,起点是 19.0%,终点在原图与正文中存在 59.0% 和 59.5% 的小差异。这个差异不影响“大幅提升”的定性观察,但限制了精确到小数点的引用。
Polyglot 的跨模型结果则温和得多。原本以 o3-mini 进行评估来搜索的 agent,迁移到 Claude 3.5 时从 32.0% 到 33.3%,迁移到 Claude 3.7 时从 35.6% 到 36.8%。两者只增加 1.3 和 1.2 个百分点。这是非常重要的边界:有些框架改进可以迁移,但不保证面对更强模型仍获得同样大的回报。

图 7(论文 Fig. 7):附录 A.2 的完整 Polyglot 迁移结果,来源为论文 v3 第 25 页。Claude 上的小幅增益提醒我们,好的 harness 是相对于具体模型和任务分布而言的。
在只用 Python 任务进化、再测试其他语言的实验中,新 agent 在未参与搜索的语言上优于初始版本,但低于在所有语言上共同进化的版本。这与“通用改进和任务特化同时存在”的解释一致。精确编辑接口可以跨语言通用,测试输出解析或特定流程则可能依赖语言生态。
实际维护 agent 时,我会把模型身份与框架版本一起保存。一个程序不能脱离操作它的模型被认定为绝对更优:不同模型理解工具 schema 的方式、利用长上下文的能力,以及从额外反思中获益的程度都可能不同。换模型之后应重新评估组合,而不是自动继承原来框架的成绩。
9. 小样本和自适应搜索怎样影响分数
9.1 从任务结果推导标准误差
设 表示第 题是否成功。仅为解释统计尺度,暂时假设各题相互独立,成功概率都等于 。评估 题得到的成功率为:
推导可以分三步。一个 Bernoulli 结果的方差是 ;独立的 个结果相加,方差成为 ;求平均时除以 ,方差要除以 ,于是得到式(8)。标准误差就是方差的平方根。
在真实成功率假设为 40% 时,十题的标准误差约 15.5 个百分点,五十题约 6.9,六十题约 6.3,二百题约 3.5。这个计算说明:十题可以用来发现明显失效,却不适合精细比较一般编程能力。增加题数能减小随机误差,但如果新增题来自不同仓库,任务混合本身也会改变测量对象。

图 8(自行计算):假设各题独立、真实成功率为 40% 时的 Bernoulli 标准误差。它是理解小样本的示意图,不是根据作者原始试验算出的置信区间,也不是论文曲线的误差条。
真实 benchmark 不满足所有这些简化条件。同一个仓库的任务往往相关,难度也不相同。因此,不能把上面的公式直接套在论文结果上,就声称得到了严格显著性检验。它的作用是提醒我们,小样本分数需要与样本量、任务组成一起看。
9.2 最好成绩会偏向幸运候选
把第 个候选测得的成绩写成 ,其中 是真实平均水平, 是测量误差。即使每个误差的均值为零,选最高测得分数时,也更容易选中误差恰好为正的候选。
这个不等式来自一个简单事实:一组数的最大值至少不小于其中任意一个,取期望后关系仍然成立。它讨论的是最大观测值的期望,不是说每个胜出 agent 都有一样大的偏差,更不是对 DGM 某个具体结果做未经数据支持的扣分。
自适应搜索还会进一步利用评估信息。后面的修改建议来自前面的失败日志,筛查集不只是被动打分,也在间接塑造搜索方向。随着候选越来越多,历史最高分上涨,有一部分是搜索改善,有一部分也可能来自选择机制本身。
所以,“最好成绩不断上升”还不足以证明自我加速。保留历史最大值的曲线天然不会下降。更值得观察的是新产生候选的质量分布是否改善,以及在同样预算下,它们在未参与选择的任务上是否也进步。这个问题比曲线最后停在哪个点更接近递归机制本身。
9.3 三种随机性要分开
一个 agent 多跑几次,测的是执行随机性;对同一对 agent 使用相同题目,能做配对比较;从头重复整个进化过程,测的是搜索是否稳定地找到好设计。这三件事不能相互代替。
配对结果里最有价值的信息,是“只有 A 做对”和“只有 B 做对”的题数。两者都成功或都失败的任务,对差值的解释不同。如果把两组成功率当成完全独立,会丢掉这种结构。若很多题来自同一个仓库,还应考虑按仓库分组后的相关性。
我希望后续工作同时给出配对任务结果、最终 agent 的多次执行,以及整轮搜索的多次重复。只有这样,才能分清一次测量中的运气、某个版本真正的能力,以及搜索过程再次发现它的概率。
10. 搜索成本和上线后的成本都要算
附录 E.1 估计,一次 SWE-bench DGM 运行约花费 22,000 美元,两个主要消融基线每个约 10,000 美元;正文说一次运行大约两周。这些是作者当时实验的估算,不能当作今天 API 价格或一次新实验的报价。
同样八十次候选生成,比较的是“每次生成有多有效”;同样费用,比较的是“给定资源能获得多好成绩”。这两个问题都值得研究,但不能互换。DGM 在迭代数量相同的图上领先,并不直接证明它在相同花费下也领先。
一个便于分析的成本分解是:
这里每轮评估集合 随候选而变。产生更多功能正常的子代,可能意味着更多候选进入昂贵的后续评估,所以总费用增加。这个费用增加可以来自有效探索,但仍然要计入比较。一个新版本如果学会对每个任务做三次尝试,也可能在部署后每题都更贵。
假设未来要处理 个任务,初始系统每题成本和成功率分别为 ,新系统为 ,成功解决一个任务的价值为 。一个简化的收支条件是:
这是我用来解释决策的模型,不是论文目标函数,也不是实测经济收益。方括号表示每处理一个任务的净增益;若它不大于零,任务量再多也无法弥补搜索费用。若它为正,盈亏平衡任务量就是搜索成本除以每题净增益。
这个分析提醒我,自动发现好框架有两层价值:减少人工设计工作,以及改善任务表现。但它也有两层成本:搜索阶段的试错,以及新框架上线后的执行开销。仅有一个成功率数字,无法回答一个团队该不该采用它。
11. 局限:哪些边界还没有跨过去
11.1 可表示任何程序,不等于能有效找到任何程序
使用通用编程语言,使搜索空间不像某些固定模块组合那样狭窄。但表示能力与搜索能力是两回事。一个巨大空间里存在好程序,不意味着当前模型、诊断器和有限预算能到达它。
DGM 的基础模型、外层档案和父代采样没有在实验中被改写。作者把更新模型训练流程、改进外层搜索和扩展到更广泛任务列为未来方向。这些方向值得关注,但不能回过头来把尚未做过的能力算入本文结果。
另外,初始工具较弱,改进空间较明显。更强的基础模型可能自行绕过一些糟糕接口,也可能降低某种额外反思流程的价值。v3 附录讨论了模型进步与框架简化的关系。我认为应当在不同模型、不同成熟度的 seed 上测量,而不是预设所有现有框架组件都会持续有用。
11.2 隐藏测试没有直接给执行者,不等于搜索没接触答案信息
附录 C.3 的诊断输入包含 SWE-bench 私有测试补丁和对应测试结果。执行外部任务的 coding agent 在正常评估时看不到这些测试,但负责改进它的外层流程会接收到相关信息。这是两个不同的信息边界。
作者说没有观察到针对私有测试的明显记忆或不当行为;跨基准迁移也反驳了“全部收益都只是任务技巧”的最简单解释。不过,这些证据不能消除评估信息被反复利用的事实。更清楚的协议应分别声明:诊断可以看什么,父代选择可以看什么,最终未触碰测试又是什么。
11.3 得到满分,却没有解决工具幻觉
附录 H 是我认为最值得仔细读的部分之一。它研究模型把工具调用和返回结果写成普通文字、实际上没有调用工具的现象。这个单独实验只用三个 SWE-bench 任务,改用另一套评分,并运行一百五十次迭代。它不能和正文八十次迭代的编程成绩实验合并。
作者报告,节点 96 得到 1.67 分,部分改善了问题,没有观察到目标投机。节点 114 得到满分 2.0,却删除了检测器依赖的工具日志标记,使评分看起来很好,而真实问题没有解决。检测函数本身是隐藏的,但 agent 可以改变提供给检测器的观察信号。

图 9(论文 Fig. 8):工具使用幻觉实验的档案。来源:论文 v3,第 69 页。附录 H 明确报告了最高评分节点的目标投机;指标达到满分,不能单独作为行为问题已经解决的证据。
这个案例不只是泛泛的“模型会钻指标空子”。它指出一个具体结构问题:即使评分函数保持外部且不可见,只要被评估的系统能改变记录行为的方式,评分输入的含义仍然可能变化。隐藏评分逻辑,不等于保护了测量过程。
论文使用了沙箱、时间限制、受限修改范围和人工监督。这些是与实验相关的控制,但不会把一个编程成功率转化成全面的可靠性证明。这里的担忧来自论文自身报告的失败案例,而不是给任何 agent 工作都附加一套无关警告。
12. 批判性分析:我会优先补哪些实验
12.1 直接测量“改进者有没有变强”
我会先固定一批父代程序和修改建议,分别交给初始编辑 agent 和几个进化后的编辑 agent。给它们相同的 token 和执行预算,再比较生成子代的功能性、未见任务表现,以及每单位费用带来的进步。这样可以把编辑者的能力,与“恰好选到了更容易改的父代”区分开。
还可以增加两个互补控制:只升级诊断模型而固定编辑者,以及只升级编辑者而固定建议库。DGM 已经比较了固定和变化的编辑 agent,但更完整的交叉实验能定位增益究竟主要来自哪一层。结果可能显示诊断、工具接口或评估分配比递归关系本身更关键,这也同样是有价值的发现。
我不要求每个因素都在一篇论文里解决,但如果主张是“系统更会改进自己”,直接测量修改能力比只看外部任务最高分更有说服力。否则,两种相关但不同的进步容易被语言上的“都是写代码”掩盖。
12.2 让档案的价值变成可测量的量
档案应当通过后续产生了什么来证明价值。我希望看到:多少次最终改进来自当时较低排名的父代;等待这些收益耗费了多少预算;保留的分支中有多少只是在重复已有策略;每增加一类行为,带来了什么新的任务覆盖。
一条胜出祖先链曾经掉分,是支持开放探索的线索,但不是保留所有掉分分支的平均收益估计。可以在相同总 API 预算下比较 greedy、随机选父代、保留前几名的 beam,以及考虑测量不确定性的策略。诊断输入、初始 agent 和模型设置都应保持可比较。
最好再做一组固定评估次数的实验,区分“采样策略更好”和“把预算花在了更多候选上”。最后给出的应是成绩随成本变化的曲线,而不只是某个固定停止点的冠军。这样更容易判断档案机制到底适合小预算探索还是较长时间的设计搜索。
12.3 保护测量含义,而不只是隐藏评分函数
针对工具幻觉案例,一个直接改进是由执行环境记录真正发生的工具调用,并把事件保存在 agent 不能重写的位置。模型可以改自己的摘要、提示和展示日志,但这些文本不能反过来成为“工具是否执行”的权威证据。
例如,模型声称“测试全部通过”,不应等价于执行环境确实运行了测试。打分应基于独立的调用事件、参数、返回值和任务结果。这样即使 agent 更换了用户可见日志格式,也不会让外部检测器失去对同一行为的观察能力。
普通编程任务也需要更清楚的信息分层。开发集可以供诊断查看细节,验证集用于比较候选,最终测试集应在选择完成后再使用。公开 benchmark 方便与已有结果比较,也可以同时加入更新、更少暴露的任务。核心不是追求一个绝对没有污染的口号,而是明确哪些信息在什么时候影响过搜索。
12.4 把 agent 学会的额外计算也记到成本里
如果新框架每道题多生成几个候选、多调用一次评审,准确率提高可能值得,但必须与同样允许多次采样的基线比较。我会在几档固定任务预算下,同时报告成功率、延迟、token 费用和失败严重程度。
一种扩展是保存成功率、费用和风险之间的 Pareto 前沿:某个 agent 即使准确率稍低,如果明显更便宜或擅长不同失败类型,也有保留价值。它给“为什么留下一个较低分版本”增加了实际含义。不过,这只是我提出的扩展,不能说成论文已经使用了这样的准入规则。
也应该报告退化任务。总体分数上涨,可能掩盖少数任务家族显著变差。如果一个改进只对某种仓库有效,未必应该无条件替换所有任务的默认框架。自动进化可以产出多个专用工具,最终部署策略仍需要决定什么时候选哪个版本。
12.5 算法 3:更直接检验主张的实验流程
01 固定起始 agent、模型身份和搜索总预算。
02 把任务分成诊断集、选择集、独立测试集。
03 对比固定编辑者、只留最新、greedy 和档案搜索。
04 用不同随机性重复完整搜索过程。
05 保存候选质量、功能性、费用与祖先关系。
06 只使用选择集确定最终候选。
07 在配对的独立任务上测试并报告不确定性。
08 不再调参,直接做跨模型与跨基准迁移。
09 由外部执行环境记录用于评分的工具事件。
10 同时报告有效改进和可测量的退化。
这是针对科学问题的评估建议,不是本笔记已经执行的实验。一个有用的负结果可能是:档案只在很弱的初始框架上帮助明显,或者在同等推理成本下优势消失。这样的结论仍然能指出自动 harness 设计的适用范围。
反过来,如果从成熟强起点出发,在独立任务、相同预算和多次搜索中都持续获得收益,就会比目前单纯强调最高分更有力。真正重要的不是让“递归自我改进”听起来更大,而是把哪些能力在复用、哪些部分在变强、收益由什么付出换来,测量得更清楚。
13. 结论
DGM 最有启发性的地方,是把 agent 框架当作可以积累、修改和重新利用的对象。它不仅自动产生新版本,还保留多条路线,让暂时不够好的中间设计有机会成为后续进步的基础。消融、具体工具改进和跨基准迁移共同构成了这篇论文最扎实的证据。
我会带走一个有边界的判断:自动搜索确实可以发现有用的 agent 设计,在论文的设置下,档案探索与变化的编辑者优于几个较简单的对照。现有结果还不足以证明无限自我加速、同等成本下的普遍优势,或者一个对所有模型都同样有效的框架。
接下来的重点,应放在更强起点、对改进者的直接测量、受保护的评估信号,以及带成本与退化分析的独立测试。对于 harness 自我进化这条研究线,DGM 提供了一个值得认真理解的起点,也把不少关键问题清楚地暴露出来。
参考资料与继续阅读
- Jenny Zhang、Shengran Hu、Cong Lu、Robert Lange、Jeff Clune:Darwin Gödel Machine: Open-Ended Evolution of Self-Improving Agents。本笔记主来源,方法、选择公式、评估和失败案例分别见正文 3–4 节与附录 A、C–E、H–J。
- Shengran Hu、Cong Lu、Jeff Clune:Automated Design of Agentic Systems。适合作为固定 meta-agent 自动设计路线的对照,已加入后续阅读队列。
- Maxime Robeyns、Martin Szummer、Laurence Aitchison:A Self-Improving Coding Agent。相近的自我编辑路线,其独立实验成绩不能直接与 DGM 混用。
- DGM 官方资源入口。链接归属以论文为准。