第 3 部分的系统改提示, 记忆, 工作流和运行环境, 但决定「提出什么改动, 留下哪个, 何时回滚」的那段程序一直是人写的. L3 把这段程序, 也就是改进器 , 放进可保留状态. 材料是五个系统: Gödel Machine 用证明决定是否改写自己, Gödel Agent, SICA, DGM, HGM 用经验评测代替证明.
1. L3 的边界与 Gödel Machine
1.1. L3 的条件
1.2 第 1.2 节把 Agent 的可保留状态写成 . L3 的边界条件是
改进器的生效语义变了, 评判标准没变. 同一次转移里 和 也可以变. 综述给的操作性测试是: 先忽略这一轮产出的答案, 算法或任务求解器, 再问下一轮提出, 选择, 提交或回滚改动的方式会不会因为保留下来的东西而不同. 如果不会, 就按实际被改的对象归到 L1 或 L2.
1.2. 自指是功能关系
综述强调, 自指不是系统的名字. 递归调用或者编辑源代码, 本身都不构成自指. 自指成立需要两件事: 当前的改进器参与修改它自己的继任者, 并且保留下来的修改影响之后的更新轮次. 要拿出的证据, 是之后更新方式的一个被保留的因果变化.
这条标准在编程 Agent 上特别重要. 编程 Agent 的任务代码和更新代码常常在同一个仓库里. 一次改动给编辑工具加了按行查看的功能, 它既改善了解题, 也改善了下一轮改自己代码的能力; 另一次改动只改了某个任务的提示, 那是 L2. 综述把这一点写成要求: 任务执行的编辑和更新过程的编辑必须分开记录.
Gödel Machine 的设定: 证明了才改写:Schmidhuber (2003) 的 Gödel Machine 运行在一台只有一次生命的机器上, 时间是离散的步 , 总寿命 可以未知. 在任意时刻, 目标是最大化未来的效用. 典型的效用函数是剩余寿命内的期望累积回报:
其中 是机器的状态 (一个比特串), 是环境状态, 是第 步的实值回报, 是环境的分布, 可以部分未知. 效用里计入了所有动作的计算成本, 包括证明搜索本身花掉的时间.
证明搜索器和目标定理:初始程序 包含两部分: 一个和环境交互的求解子程序 , 可以是任意传统的强化学习算法; 一个通用的证明搜索器. 证明搜索器系统地产生 (switchprog, proof) 对, 直到找到一个目标定理的证明. 目标定理大意是: 「用当前的 switchprog 立刻改写 , 效用高于让 保持原样.」 找到以后, 机器执行 switchprog. switchprog 可以完全改写 , 包括证明搜索器本身.
为了让证明搜索器能推理任何程序的效果, 初始程序里编码了一套公理系统 , 描述四件事: 硬件上每条指令怎样改变状态 ; 初始程序 本身; 环境的随机性质; 形式化的效用函数 . 证明只能用六条指令构造, 包括取公理, 应用推理规则, 设置 switchprog, 检查最终一个定理是不是目标定理. 这六条指令保证不可能把错误的定理插进证明, 所以验证证明是平凡的.
全局最优定理说的是什么:论文的定理 4.1 说这种自我改进策略不是贪心的. 原因在目标定理的比较对象: 「让 保持原样」的效用, 隐含地计入了未修改的 以后可能找到的所有其他 switchprog. 所以一旦执行, 当前的 switchprog 就是所有相关自我改动里最好的那个. 这个最优是相对的: 相对给定的资源限制, 也相对初始的证明搜索策略.
用 1.2 的记号看, Gödel Machine 的 是证明搜索器加上「证明了就执行」的安装规则, 是公理系统和效用函数 . 证明搜索器是 的一部分, 可以被 switchprog 改写, 所以 在可保留状态里并且能被自己改. 公理和效用函数不能改, 所以它是 L3, 不是 L4.
限制:论文自己写了根本限制. 任何包含算术的形式系统要么有缺陷, 要么存在真但不可证的命题. 所以即使计算资源无限, Gödel Machine 也必须放弃那些它证明不了有效的自我改进.
综述补了两条实际限制. 第一, 保证是有条件的: 如果公理漏了相关事实, 或者效用函数没有写对想要的目标, 形式结果推不出部署中的收益. 第二, 如果证明系统在预算内找不到证明, 它什么也不改, 没有实际收益. DGM 论文举了一个具体例子说明为什么证明在实践中几乎做不到: 给编程 Agent 加一个测试工具看起来总是有益的, 但实际影响取决于模型的训练和任务环境, 为一种设置优化的测试工具可能让另一种设置下的 Agent 困惑.
后面四个系统都把证明换成了经验评测. 这让机制可用, 也把可靠性的负担转到了评测覆盖面, 资源匹配和基准访问控制上.
自指更新的形式与稳定性:把自指智能体写成「程序修改自己的源代码」容易把载体当成本质. 更一般地, 第 轮状态为 , 轨迹与评测证据为 , 更新器输出下一版:
表示从完整 Agent 里取出下一轮真正执行更新的部分. L3 要求 与 的生效行为不同, 且差异在下一轮被执行. 只把新提示存进代码库, 后续更新仍走旧函数, 属于没有生效的文本改动; 任务策略变强后间接写出更好的补丁, 只有当它实际参与 时才构成 L3.
更新器既是变换也是状态. 若 只接收 Agent 和当前证据, 它是一阶更新; 若它还读取自己的历史补丁、失败档案和搜索策略参数, 历史也属于 的有效状态. SICA 的档案、DGM 的谱系、HGM 的子树统计都把过去结果带进下一轮选择. 比较新旧改进器时必须连同这些状态初始化, 单换一段代码却沿用不同档案会把历史优势算成算法优势.
自指会产生分布移动. 的训练或提示建立在旧版 Agent 产生的轨迹分布 上, 更新后 产生 . 新工具让过去的错误消失, 也会产生旧归因器没见过的新错误. 若更新器继续按 的模式解释轨迹, 它可能反复修复已经不存在的问题. 因此 L3 的回归不仅测试任务产物, 还要测试新更新器对新版轨迹的诊断和候选生成.
稳定性至少有三种含义. 任务稳定性要求任务效用不出现不可接受退化; 更新稳定性要求下一轮仍能提出并安装有效候选; 表示稳定性要求新版仍能读取历史档案、工具接口和评测记录. Gödel Agent 修改递归模块后意外终止, 是更新稳定性失败; SICA 的上下文越来越长直至无法运行, 是表示和资源稳定性失败; 节点 114 删除检测标记, 任务分数表面稳定却破坏了评测可观测性.
可把一次更新的可接受条件写成约束集合. 设任务效用为 , 一步后的更新生产力为
候选 要同时满足 , , 以及接口不变量. 只测 会保留当前高分但失去自改能力的后代; 只测 又可能接受当前任务能力过低的「好父代」. HGM 的 CMP 尝试估计第二项, 但它仍用同一基准近似 和后代潜力.
更新生产力不能从一个子代判断. 是随机候选生成器, 单次结果混合了算法质量与采样运气. 对同一父代运行多次得到候选集合, 比较成功概率、改进幅度分布、成本和灾难失败率, 才接近比较两个 . 一个改进器偶尔产生巨大提升同时经常删坏自身, 与一个稳定产生小改进的改进器适用于不同风险边界. 只报告最好后代会系统性偏向高方差方法.
自指更新还会改变自身的搜索支持集. 设 为当前更新器能以非零概率提出的候选集合. 一个新编辑工具可能扩大支持集, 让以前无法表达的补丁可达; 一个过度严格的模板可能缩小支持集, 即使当前任务分提高, 长期潜力也下降. 搜索支持集通常无法穷举, 可以用候选多样性、修改组件覆盖和已知反事实任务做探针. HGM 关注后代分数, 尚未直接测支持集变化.
局部接受门会导致不可跨越的谷地. 假设接口迁移要同时修改调用方与实现, 单独任一补丁都失败, 两者合并才提高. 每轮只接受立即提分的原子补丁时, 目标结构不可达. 允许候选在隔离分支里积累多步修改能跨谷, 也扩大了搜索成本和破坏面. Gödel Machine 的 switchprog 可整体改写程序, 理论上能表示组合跳跃; 经验系统需要事务分支、组合测试和预算上限来近似.
回滚为自指系统提供固定参照. 仅保存代码版本不够, 还要保存更新器状态、档案、模型与工具版本、评测预算和未完成任务. 若回滚代码却沿用新档案, 下一轮候选分布已经改变; 若回滚 Agent 却不能撤销外部副作用, 任务状态也不相同. 可恢复检查应在真实版本迁移前演练, 不能等到更新器已失去编辑能力后才尝试.
权限边界必须位于可写区域之外. 普通 L3 候选可以修改怎样检索、怎样编程和怎样选择内部候选, 不能自行扩大网络、凭证、评测数据和部署权限. 若权限配置也由同一得分选择, 绕过限制往往是比改进算法更短的得分路径. 节点 114 展示的是可观测性边界被修改; 同样机制若作用到权限边界, 后果更严重.
经验自指无法得到 Gödel Machine 的全局证明, 仍可建立分层证据. 静态检查保护语法、依赖和权限; 回放检查历史状态; 密封任务比较任务效用; 后代实验比较更新生产力; 金丝雀和回滚限制未覆盖的在线损害. 每层排除一类失败, 没有哪一层能单独证明「系统会持续变好」. 最强可说的结论仍带范围: 在给定模型、工具、预算、任务分布和更新轮数内, 某更新器比对照更常产生被外部验收的候选.
1.3. Gödel Agent: 运行时改自己的代码
机制:Yin 等人 (2024, 北京大学, UCSB) 的 Gödel Agent 把系统分成两部分: 任务策略 , 以及一个自指的学习算法 . 当前的 同时产出下一版的 和下一版的 , 而不只是改任务策略. 这满足 1.2 节的功能条件.
实现上, Agent 从 Python 的运行时内存里读取自己当前的函数和类, 用 monkey patching 在运行中增加, 替换或删除逻辑. 主函数写成递归函数: 语言模型分析当前状态, 做出一串决定, 包括读自己的代码, 改自己的代码, 和环境交互拿反馈, 然后进入下一层递归, 在下一层运行改过的学习逻辑. 初始还给了四个辅助工具: 先想再做, 出错处理, 运行 Python 或 Bash, 调用语言模型 API.
出错处理的设计是: 一个操作出错时, Agent 停掉当前这串动作, 进入下一个时间步, 把错误信息带过去供之后参考.
结果:实验沿用 ADAS (Hu et al., 2024) 的设置. 四个基准: DROP (阅读理解, F1), MGSM (多语言数学), MMLU, GPQA. 初始策略都是 CoT. 每个任务在验证集上跑 6 轮独立的自我改进, 每轮最多 30 次迭代, 得到的 Agent 再在测试集上评测. GPQA 的验证集 32 题, 测试集 166 题; 其余三个验证集 128 题, 测试集 800 题. 自我改进由 GPT-4o 驱动, 改出来的策略和基线都用 GPT-3.5 评测.
| 方法 | DROP | MGSM | MMLU | GPQA |
|---|---|---|---|---|
| CoT | 64.2 ± 0.9 | 28.0 ± 3.1 | 65.4 ± 3.3 | 29.2 ± 3.1 |
| LLM Debate | 60.6 ± 0.9 | 39.0 ± 3.4 | 65.6 ± 3.3 | 31.4 ± 3.2 |
| Meta Agent Search (ADAS) | 79.4 ± 0.8 | 53.4 ± 3.5 | 69.6 ± 3.2 | 34.6 ± 3.2 |
| Gödel-base | 80.9 ± 0.8 | 64.2 ± 3.4 | 70.9 ± 3.1 | 34.9 ± 3.3 |
| Gödel-free | 90.5 ± 1.8 | 90.6 ± 2.0 | 87.9 ± 2.2 | 55.7 ± 3.1 |
± 后面是 95% bootstrap 置信区间. 读这张表要注意三点.
第一, 和 Meta Agent Search 比, 差距只在 MGSM 上明显: 64.2 对 53.4, 高 10.8 个点. DROP 差 1.5, MMLU 差 1.3, GPQA 差 0.3, 都在置信区间的宽度之内.
第二, Gödel-base 是加了约束的版本, 用于和基线公平比较. Gödel-free 不加约束, 分数高得多. 论文分析后承认, 这主要是因为 Agent 在一些任务里自发地去调用更强的模型, 比如 GPT-4o. 这个提升来自换了执行模型, 不来自改进器变好.
第三, 基线的数字直接引自 Hu 等人 (2024), 不是同一批重跑.
稳健性与归类:论文在 MGSM 上做了 100 次优化试验. 4% 的试验意外终止, 92% 在优化中出现过暂时的性能下降, 14% 最终比初始策略更差. 意外终止通常发生在 Agent 修改了自己的递归改进模块之后, 修改以后它没法再继续自我优化.
消融也说明了同一件事. 去掉出错处理, MGSM 降到 49.4, 标准差 14.8, 是四项消融里波动最大的. 去掉「先想再做」降到 50.8. 去掉运行代码和调用模型两个工具影响较小 (57.1 和 60.4), 论文的解释是 Agent 能自己实现这两项功能.
改自己的学习逻辑, 最常见的后果是改坏. 出错处理和回到之前最优算法的能力, 是 Gödel Agent 能持续运行的前提.
按综述的划分, Gödel Agent 满足自指的功能条件. 它的任务反馈来自固定的高层目标和环境接口, 所以没有 Gödel Machine 那样的证明保证. 评判标准 是这个固定的目标和反馈, 没有被改.
运行时改写的语义债务:Monkey patching 让改动立即生效, 也绕过了普通软件升级里的构建、启动和迁移边界. 当前栈帧可能还在执行旧函数, 下一次递归进入新函数; 两版逻辑共享同一块内存状态. 于是「版本」不再是一个时刻的完整快照, 而可能是旧代码和新代码的混合执行. 若轨迹没有记录每次调用使用的函数哈希, 失败后无法还原是哪一版产生了动作.
运行时改写可以形式化为带代码状态的转移. 普通程序状态为 , 自指程序再带代码 :
任务动作主要改变 , 自改动作改变 , 许多操作同时改变两者. 若改写失败发生在 已部分安装之后, 程序可能没有能力执行恢复. 安全安装要把候选写到隔离版本, 验证后通过单一原子指针切换; 切换前保留旧进程或监督器, 由候选之外的组件判断是否回退.
递归深度不是改进轮数的可靠表示. 一层递归可能只重试工具, 也可能替换整个学习算法; 尾递归未优化时还会耗尽调用栈. 更稳妥的控制器把轮次、版本、预算和失败状态显式存在外层循环, 候选学习逻辑只提交变更请求. 这样即使候选把自己的递归函数删坏, 外层仍能终止进程并恢复. 代价是这个不可修改外层成为新的固定边界, 系统的自指范围缩小但可恢复性提高.
代码反射还会遇到闭包与动态绑定. 替换一个函数名称, 已被其他对象捕获的旧函数引用可能继续存在; 修改类方法, 已实例化对象的字段状态未必满足新不变量; 删除辅助函数, 排队中的回调仍可能调用它. 自动更新不能只检查源码 diff, 要枚举活动对象、挂起任务和持久状态的依赖. 无法迁移的对象应让旧版完成, 新请求再进入新版.
修改学习算法尤其需要元回归测试. 普通任务测试验证答案质量, 元测试验证它还能读取自己、提出候选、执行候选、评估并恢复. 可以准备几个合成故障: 让编辑工具返回冲突, 让候选语法错误, 让评测超时, 让新版本启动后立即异常. 每个故障都应落到可观察失败并恢复到已知版本. Gödel Agent 去掉出错处理后方差暴增, 表明恢复路径本身就是更新器能力的一部分.
错误处理若由可改代码实现, 候选可能出于简化而删掉它. 只在正常任务上评测时, 删除恢复分支还能降低成本、提高平均分. 因而恢复能力要成为硬约束, 通过故障注入验收, 不能和任务分数做加权交易. 同理, 日志、版本标识和权限检查属于认证边界; 它们可以升级, 但修改它们需要更外层审计.
运行时状态还可能污染候选比较. 版本 在旧版已经热过的缓存、打开的文件和累积记忆上评测, 版本 却从冷启动运行, 差异包含状态优势. 配对比较应从同一快照分叉, 或分别报告冷启动与继承状态. 对自指系统, 继承状态是实际部署的一部分, 但它不能替代对代码本身的归因.
沙箱除了防恶意代码, 也为候选定义观察边界. 文件、网络、进程和模型 API 的白名单决定候选能利用什么. Gödel-free 自发调用更强模型取得高分, 说明未锁定资源时搜索会优先利用能力更强的外部组件. 若研究目标是更新逻辑, 基础模型和工具必须固定; 若允许资源路由演化, 结论应写成整套资源策略提高, 并计入真实成本.
一次更新成功还不代表改写机制可复用. 候选可能硬编码当前函数名、文件布局或基准格式, 下次代码结构变化后便无法编辑. 元测试应包含等价重命名、模块移动和不同任务反馈格式, 检查更新器是利用语义接口还是偶然文本位置. 能跨版本继续修改的能力, 才是保留下来的 L3 增益.
功能自指的因果检验:看到代码里出现 self_modify 或递归函数, 不能证明改进器变化带来后续收益. 最直接的检验是冻结反事实. 候选 Agent 已经包含新的任务策略和新的更新器 . 构造一个混合版本 : 保留 的任务组件, 把更新器换回 ; 再构造 : 保留旧任务组件, 只换成 . 从同一批新任务和同一档案状态出发, 给它们相同的下一轮更新预算.
若完整 和 都能产生更好的后续补丁, 而 不能, 证据指向更新器改变; 若 同样提升, 主要收益可能来自任务能力变强, 它让固定更新器获得了更好的轨迹或代码执行能力. 两者都提升时存在协同, 需要四格实验估计交互:
这里的 衡量后续更新产物, 不能复用产生 的开发任务.
冻结反事实在代码上未必容易. 更新器和任务策略可能共享工具、记忆和接口, 强行替换后无法运行. 这种不可分性本身也是结果: 系统只能声称完整组合具备自指更新, 无法归因某个模块. 若论文要主张特定自改机制, 设计时就应建立接口边界, 让新旧更新器可以在相同状态上互换.
第二个检验是失活更新. 保留候选代码与任务行为, 禁止它在下一轮读取或执行自己修改过的更新部分. 如果后续改进曲线不变, 被保留的自指修改没有因果作用. DGM 的 w/o self-improve 接近这个思路: 固定初始元 Agent, 让其他档案与评测过程保持一致. 完全匹配还要确保两组看到相同失败日志和候选权限.
第三个检验是更新转移. 把 放到一个没有参与生成它的新起点 上, 看它是否仍比 产生更好候选. 只在自己的代码库上有效, 可能是特化编辑脚本; 跨版本有效, 更像更新原则. 转移范围不必无限, 可以按同代码库新版本、同框架不同任务、不同框架三层报告.
自指能力还可用干预敏感性检查. 给更新器一组可控失败: 缺测试、工具超时、上下文溢出、候选语法错、评测冲突. 观察它提出的修复是否随故障机制变化. 无论输入都加重试或加更强模型, 说明候选策略缺乏诊断分辨率. 真正改进过的 应在不相关故障上保持原策略, 在目标故障上改变候选分布.
后续产物的比较必须包含失败候选. 若 十次中一次产生高分补丁、九次破坏自身, 只取最好值会认为它优于稳定的 . 记录每次候选的可运行率、净改进、恢复成本和权限变化, 再按实际部署会采用的选择规则聚合. 选择规则固定后, 高方差是否值得才有明确答案.
功能检验也要确认保留. 运行结束后重启进程、清空临时上下文, 从持久版本加载, 再执行下一轮更新. 只有运行时内存中的 monkey patch 在重启后消失, 它是会话内适应; 写入代码却启动时仍加载旧模块, 也没有生效. L3 证据要求修改跨越任务和进程边界后继续影响更新.
这些因果检验比检查源码更苛刻, 因为它们要求观察第二轮甚至多轮后果. 这正是 L3 与普通自动编程的差别. 一次补丁解决当前任务只能证明产物有效; 被修改的更新过程在匹配条件下更常产生好补丁, 才证明改进器发生了有用变化.
2. SICA: 档案里最好的 Agent 当元 Agent
2.1. 和 ADAS 的区别
Robeyns, Szummer, Aitchison (2025, Bristol, iGent AI) 的 SICA 从 ADAS 出发. ADAS 有两个 Agent: 执行任务的目标 Agent, 和改进目标 Agent 的元 Agent. 元 Agent 固定, 只改目标 Agent, 所以 ADAS 不是自我改进. SICA 取消了这个区分: 每一轮从档案里取到目前为止效用最高的 Agent 当元 Agent, 让它读档案, 找出一个改进, 实现在自己的完整 Python 代码库上, 产出下一个 Agent.
是第 个 Agent 的效用. 因为没有权重更新, 这个分数只用来挑下一轮的元 Agent.
2.2. 效用函数
, , . 是归一化的基准分, 成本上限每题 10 美元, 超过 300 秒取消. 超时的 Agent 效用乘以 , .
代一组数. 一个 Agent 分数 0.5, 每题花 2 美元, 用时 130 秒:
同一个 Agent 如果超时, 效用变成 .
再看一个极端: 一个 Agent 收到题目立刻交一个空答案, 分数 0, 成本和时间都接近 0. 代进去得 . 它只比上面那个真正解题的 Agent 低 0.09. 这个式子里, 分数只占一半权重, 另一半奖励便宜和快. 效用函数就是 SICA 的评判标准 , 而元 Agent 的选择完全由它决定. 这组数字说明, 一个固定的 本身就规定了改进器会朝哪里走.
2.3. 结果: 编程任务和推理任务
初始 Agent 已经带了不少工具: 打开和关闭文件, 覆写文件, 执行 shell 命令, 计算器, 档案分析工具, 以及编码, 解题, 推理三个子 Agent. 还有一个异步的监督者: 另一个语言模型每 30 秒看一次整个调用图和事件流, 判断有没有偏离任务或陷入循环, 可以插入提示, 严重时取消执行. 主体用 Claude 3.5 Sonnet (v2), 推理子 Agent 用 o3-mini. 评测集是 SWE-bench Verified 的固定随机 50 题, LiveCodeBench 的随机 50 题, 加两个在 Agent 代码库里定义的合成基准: 文件编辑和符号定位. 15 轮运行的 API 成本约 7000 美元.
| 轮 | 文件编辑 | 符号定位 | SWE-Bench Verified 子集 | LiveCodeBench | 每题成本 ($) | 每题用时 (s) |
|---|---|---|---|---|---|---|
| 0 | 0.82 | 0.35 | 0.17 | 0.65 | 1.91 | 130.2 |
| 4 | 0.88 | 0.31 | 0.38 | 0.54 | 2.70 | 148.3 |
| 9 | 0.88 | 0.40 | 0.47 | 0.61 | 2.03 | 126.3 |
| 13 | 0.86 | 0.40 | 0.27 | 0.61 | 1.66 | 113.3 |
| 14 | 0.94 | 0.34 | 0.53 | 0.67 | 2.20 | 117.1 |
| 15 | 0.91 | 0.40 | 0.51 | 0.71 | 1.70 | 114.5 |
摘要里的「17% 到 53%」是第 0 轮和第 14 轮的 SWE-Bench 子集分数. 第 13 轮掉到 0.27, 下一轮又回到 0.53. 一个 50 题的子集上, 相邻两轮相差 26 个点, 单轮分数的噪声很大. 用最高的那一轮报告改进, 会把噪声算进去.
改动本身是具体的: 文件编辑从整文件覆写换成了基于 diff 和行范围的「smart edit」工具; 第 9 轮加了基于 AST 的符号定位器, 论文推测它利用了基准主要是 Python 这一点.
推理任务上几乎没有提升. 另一组实验用 AIME 2024 和 GPQA Diamond. o3-mini 单独以 high 推理强度跑, 分别是 87% 和 79%; 整个 Agent 系统两项平均只有 76%. 查看轨迹发现, 主 Agent 很多时候只是把题转给 o3-mini 推理子 Agent. 第 4, 6 轮加入的诱导推理的组件, 论文怀疑反而打断了推理模型自己的 CoT. 当底层模型已经很强时, 脚手架和改进器能加的东西很有限.
路径依赖与归类:论文在局限里写了一个对 L3 很关键的观察. 让语言模型在每一步自己想出新颖, 可行的改动方向很难. 一个坏主意的代价是一段很长的编辑, 再加一次更贵的基准评测. 失败的迭代留在档案里, 原则上可以当反例, 但实际上最初几轮的功能想法会强烈影响后面的想法, 后面多是同一主题的变体. 论文举的例子是早期一直执着于缓存已打开的文件, 拉低了后续建议的质量.
SICA 每轮只沿着当前最好的 Agent 往下走, 这种路径依赖没有机制可以纠正. DGM 的档案和 HGM 的子树统计, 都是在处理这个问题.
归类上, SICA 让档案里的强 Agent 执行下一步元改进, 新代码能不能进档案由固定的效用函数和基准检查决定. Agent 的编程能力可以帮助之后的元改进, 但成本, 速度和基准的权重由外层规则设定. 改进器 是「当前最好的 Agent + 档案」, 每轮都变; 评判标准 是 3.2 节的效用函数, 固定.
档案怎样改变候选分布:档案不仅保存结果, 还向元 Agent 提供搜索上下文. 设历史为 , 是修改说明与执行轨迹, 下一候选分布为
即使元 Agent 代码没变, 档案增长也会改变候选分布. 在 L3 归因里要区分两种来源: 新父代的能力变化, 与新历史带来的上下文变化. 固定父代、替换档案可以测历史效应; 固定档案、替换父代可以测元 Agent 效应. SICA 同时改变两者, 因而端到端提升不能完全归给父代变强.
完整档案会迅速超过上下文. 压缩档案时, 选择保留哪些失败就是搜索偏置. 只留高分候选会遗忘已经试过的坏方向; 只留摘要会丢掉代码冲突和适用条件; 只留最近轨迹会产生主题惯性. 可把档案分成可执行版本、结构化差异、评测证据和失败机制四层, 按当前任务检索, 而不是把所有历史串成一段长文本.
失败档案的价值取决于它能否排除候选. 一条「缓存没有帮助」若缺少父代、实现和评测口径, 后续模型仍可能用另一种措辞重复同一改动. 更可用的失败记录包含前置状态、修改算子、预期机制、实际结果和反例. 搜索时先判断新候选与既有失败是否机制等价; 等价且没有新证据时降低优先级, 有明确差异时允许重试.
路径依赖可由状态压缩解释. 元 Agent 从庞大历史得到有限上下文 , 后续候选只依赖 . 若 过早把早期主题标成「最有希望方向」, 其他分支的信息被丢掉, 之后无法恢复. 保留多个彼此差异大的分支, 相当于维护多个 假设. DGM 的开放档案比 SICA 的单冠军链更能抵抗这种压缩损失.
冠军选择也会放大评测噪声. 同时选择了真实能力和正噪声, 下一轮围绕它继续搜索, 噪声造成的路径选择被永久写入谱系. 对入围父代重评、使用后验抽样或保留前沿, 都能减少一次偶然高分决定全部未来预算. SICA 第 13 到 14 轮的巨大波动说明单轮冠军并不稳定.
档案的覆盖可以按修改算子与行为表型衡量. 源码差异大但任务路径相同的候选提供的探索很少; 源码相近却改变工具次序、验证机制或资源分配的候选可能更有价值. 行为表型可以由调用图、错误分布、成本和输出集合组成. 父代选择同时考虑效用与表型新颖性, 比按代码字符距离鼓励多样性更接近搜索目的.
档案中低分节点的价值是期权价值. 当前分数低不代表它无用, 它可能包含一个暂时与其他组件不兼容的机制. 是否继续投资取决于从该节点产生高价值后代的概率与成本. DGM 用子代数惩罚近似鼓励尚未展开的节点, HGM 用子树统计直接估计后代潜力. 两者都不能识别从未被扩展节点的真实潜力, 探索先验仍由外层规则决定.
归档还需要垃圾回收. 无界保存所有源码、轨迹和评测会让检索、存储与安全审计成本持续增长. 删除不能只按分数: 某节点可能是唯一覆盖一种修改算子或失败机制的代表. 可以保留每个行为簇的帕累托代表、关键祖先与已知指标捕获案例, 将其余节点冷存储. 冷存储仍可用于审计, 不进入每轮元提示.
由此, 「档案里的最好 Agent 当元 Agent」包含三项耦合选择: 谁执行更新、它看到什么历史、历史怎样压缩. 要证明自指能力来自 Agent 变强, 至少需要一个固定档案的对照. 要证明档案机制有用, 则固定更新模型比较不同保留与检索策略. 缺少拆分时, 可以声称整套 SICA 循环产生了更好候选, 不宜把机制进一步归因.
3. DGM: 保留所有能工作的后代
3.1. 两个改动
Zhang, Hu, Lu, Lange, Clune (2025, UBC, Vector Institute, Sakana AI) 的 Darwin Gödel Machine 在 SICA 这条路线上做了两个改动.
第一, 和 Gödel Machine 一样, 把自我改进本身定义为编程任务: 修改 Agent 自己的组件, 也就是它自己的代码. 论文的关键假设是, 编程基准上的提升反映了更好的编程能力, 因而也反映了更好的自我修改能力. 这样, 同一个评测同时度量「解下游任务」和「改自己」.
第二, 维护一个档案, 收录所有生成过的, 还能工作的 Agent. 每轮从档案里采样父代, 而不是只取当前最好的那个. 一个当时分数不高的 Agent, 可能在很多轮之后成为一次大改进的起点.
3.2. 一轮怎么走
- 从档案里按概率选父代.
- 父代读自己在基准上的评测日志, 提出下一个要实现的功能. 这个诊断由另一个基础模型完成, 提议作为问题描述交给父代执行.
- 父代把这个功能实现到自己的代码库里, 产生一个新 Agent.
- 新 Agent 在编程基准上评测.
- 只有能编译, 并且保留了编辑代码库能力的 Agent 才进档案, 因为只有它们能继续自我修改. 其余丢弃.
初始 Agent 故意做得很轻: 一个冻结的基础模型, 只有两个工具, 一个执行 bash 命令, 一个查看和编辑整个文件. 运行 80 轮, 每轮产生一个新 Agent; SWE-bench 上 2 轮并行, Polyglot 上 4 轮并行. 自我修改阶段用 Claude 3.5 Sonnet (New); 评测阶段 SWE-bench 用 Claude 3.5 Sonnet (New), Polyglot 用 o3-mini.
参考文献
- Kaiqi Wang, Wenjin Hou, Yuchen Yan 等 (2026). Diving into Reliable Self-Evolving Agents: A Survey. §6 L3: Improver-Level Self-Evolution, §6.1 Self-Referential Agents, §6.3 Reliability and the Fixed-Criterion Limit.
- Jürgen Schmidhuber (2003). Gödel Machines: Self-Referential Universal Problem Solvers Making Provably Optimal Self-Improvements. §2.1 式 (1), §2.2, §2.4, §3.2, 定理 4.1.
- Xunjian Yin, Xinyi Wang, Liangming Pan, Li Lin, Xiaojun Wan, William Yang Wang (2024). Gödel Agent: A Self-Referential Agent Framework for Recursive Self-Improvement. §4, 表 1, 表 2, §6.2, 附录 B.
- Maxime Robeyns, Martin Szummer, Laurence Aitchison (2025). A Self-Improving Coding Agent. §3 式 (1)(2), 算法 1, 表 1, §4.1, §5.1.
- Jenny Zhang, Shengran Hu, Cong Lu, Robert Lange, Jeff Clune (2025). Darwin Gödel Machine: Open-Ended Evolution of Self-Improving Agents. §3, §4, 附录 C.2 式 (1)–(7), 附录 E.1, 附录 H.
- Wenyi Wang, Piotr Piękos, Li Nanbo 等 (2025). Huxley-Gödel Machine: Human-Level Coding Agent Development by an Approximation of the Optimal Self-Improving Machine. §2, §3, 定理 1, 表 1–4.