论文
自我修改代码
Gödel Agent: A Self-Referential Agent Framework for Recursively Self-Improvement
Gödel Agent:用 monkey patching 在运行时改写自身全部逻辑的自指 agent
Xunjian Yin, Xinyi Wang, Liangming Pan, Xiaojun Wan, William Yang Wang, et al. · 北京大学 · ACL 2025 · 2024-10 · 被引 21
一句话 北大 + UCSB 把 Gödel machine 的思想搬到 LLM agent 上:agent 在 Python 运行时内存里读取并改写自己的全部代码(包括改进机制本身),在 DROP/MGSM/MMLU/GPQA 上超过 Meta Agent Search(MGSM 64.2% vs 53.4%),一轮完整进化成本约 $15(对比 Meta Agent Search 的 $300)。
这是什么 现有 agent 优化范式有一个共同天花板:改进流程本身是人写死的。手工设计的 agent 策略完全固定;ADAS(Meta Agent Search)这类 meta-learning 方法虽然让 meta agent 搜索 agent 设计,但搜索算法本身不可变,搜不出人为框架之外的设计。Gödel Agent 的主张是把这最后一层也放开:agent 不仅能改自己解题的 policy,还能改'如何改自己'的 meta-learning 算法,形式化为 π_{t+1}, I_{t+1} = I_t(π_t, I_t, r_t, g),即 I 自己更新自己。
名字来自 Schmidhuber 的 Gödel machine,但做了关键替换:原版要求形式化证明'改动能提升期望效用'才执行自我修改(实践中不可行),这里直接用 LLM 的推理判断代替 proof search,用环境反馈(验证集分数)代替效用证明。代价是失去理论保证,换来可以真的跑起来。论文发表于 ACL 2025,arXiv 2024-10,是 STOP(只改 scaffold 的固定改进循环)到 Darwin Gödel Machine 之间的关键一环,S2 引用 21 次。
三种 agent 范式对比:手工设计 agent(policy 固定)、meta-learning 优化 agent(如 ADAS,policy 可搜但搜索算法固定)、自指 agent(policy 和改进机制都可学)。从左到右自由度递增、人工设计递减——这张图是理解本文在 RSI 谱系中位置的关键。 机制与做法 自指的实现:运行时内存 + monkey patching
整个 agent 就是一个 Python 进程。自我感知靠 inspect 运行时内存:action_environment_aware 枚举 globals 里的函数/类/模块/变量,action_read_logic 用 inspect.getsource 读任意函数或类的源码(包括 agent_module 自己)。自我修改靠 action_adjust_logic:LLM 生成新代码字符串,exec 后热替换到目标模块的属性上(monkey patching),支持 modify/add/delete 函数或类。下一轮迭代直接跑替换后的新逻辑,不需要重启进程。
决策循环很薄:一个 goal_prompt 告诉 LLM'你有权限修改自己的一切逻辑',LLM 每步输出动作序列(读代码、改代码、跑评测、继续递归),循环本身(SELF_IMPROVE / EXECUTE)也在可修改范围内。理论上 agent 连'如何自我改进'的代码都能重写——这是它与 ADAS 的本质区别。
实现机制:上层是应用视角的自我改进循环(prompt 驱动、thinking、error handling),下层是运行时内存视角——agent 每轮 read 自己的局部/全局变量(即自身代码),生成修改后 monkey patch 回内存,下一轮直接以新逻辑运行。 工程上的辅助设计
纯自指循环在当前 LLM 上跑不稳,作者加了四个初始工具:thinking before acting(先输出分析再行动)、error handling(代码报错不崩溃,把 traceback 带入下一步决策)、执行 Python/Bash、调 LLM API。Ablation 显示前两个是命门:去掉 thinking,MGSM 从 64.2 掉到 50.8;去掉 error handling 掉到 49.4;后两个影响不大(agent 可以自己重新实现)。
实验设置:优化器用 gpt-4o-2024-05-13,被优化的 policy 和所有 baseline 统一用 gpt-3.5-turbo-0125 评测。每个任务跑 6 个独立进化周期,每周期最多 30 次迭代,在验证集(128 题,GPQA 32 题)上拿反馈,最后在测试集(800 题,GPQA 166 题)上报分。初始 policy 一律是最朴素的 CoT。
MGSM 上 30 轮迭代的准确率曲线:Gödel Agent(橙)从 0.28 爬到 0.63,但两次跌到 0(把自己改崩后靠 error handling 恢复);随机采样 prompt(蓝)始终在 0.3 附近。说明自我改进有效但过程非单调、有自毁风险。 自我改进出了什么
Game of 24 案例最能说明'自由度'的价值:初始 LLM 直接解题失败 6 次后,agent 干脆放弃 LLM 路线,把 solver 重写成穷举搜索算法,准确率直接 100%。另一些 run 里它坚持 LLM 路线,但自己加了代码验证答案(+10%)和失败重试(+15%),还顺手给自己的优化循环加了 error-trace 分析和并行评测。不同初始 policy 的实验显示:起点越弱,改得越多、涨得越多,但最终都没超过人类设计的 ToT——作者承认当前 LLM 还创新不出超越 SOTA 的算法。
关键结果 受限设定(闭卷、任务模型固定 GPT-3.5)下,Gödel Agent 在四个基准上全面持平或超过 Meta Agent Search:DROP 80.9 vs 79.4、MGSM 64.2 vs 53.4(+10.8)、MMLU 70.9 vs 69.6、GPQA 34.9 vs 34.6;数学推理任务提升最大。 去掉所有限制后(Gödel-free),分数跳到 DROP 90.5 / MGSM 90.6 / MMLU 87.9 / GPQA 55.7——但作者自己分析,主要原因是 agent 自发去调用更强的 GPT-4o 干活,不是优化算法更聪明了。 成本:30 轮完整自我改进约 $15,对比 Meta Agent Search 的约 $300;成本大头是不断增长的历史记忆。 鲁棒性(MGSM 上 100 次优化 trial):92% 的 run 出现过程中性能暂跌,4% 意外终止(通常是 agent 把自己的递归改进模块改坏了),14% 最终没超过初始 policy。 Ablation:thinking before acting(-13.4)和 error handling(-14.8)是撑住自我改进的两根柱子;code running(-7.1)和 LLM calling(-3.8)可有可无。 对照实验:同样 30 次迭代,随机采样 prompt 在 MGSM 上一直徘徊在 0.3 左右,Gödel Agent 爬到 0.63,但曲线上有两次跌到 0(改崩了再恢复),自我改进不是单调的。 实证核查
扎实 核心声称(运行时自读自改全部逻辑)与开源代码完全对得上,论文对自己的局限也写得诚实;但注意无限制版的高分主要靠换强模型,且尚无第三方复现报告。
论文声称 agent 通过 monkey patching 实现自我感知与自我修改,连改进机制本身都可以改。
代码属实:src/agent_module.py 里 action_environment_aware 枚举运行时 globals,action_read_logic 用 inspect 读任意模块/类的源码,action_adjust_logic 接收 LLM 生成的代码字符串后热替换模块属性,目标可以是 agent_module 自身,即改进循环确实在可修改范围内(GitHub Arvid-pku/Godel_Agent,MIT,214 stars)。README 的项目结构与论文描述一致,task_*.py 明确标注改编自 ADAS。
Gödel-free(无限制)版本大幅超过所有 baseline(MGSM 90.6%)。
论文 4.3 节自己承认,这主要是 agent 自发调用 GPT-4o 等更强模型完成任务的结果——对比基准全是 GPT-3.5 跑的,所以这组斜体数字衡量的是'开放环境下会薅资源',不是优化算法本身的能力。受限版(80.9/64.2/70.9/34.9)才是公平对比,而这组里 GPQA 只比 Meta Agent Search 高 0.3(置信区间 ±3.3,统计上打平)。
实现了 recursive self-improvement,agent 可以改进自己的改进机制。
机制上成立但实践中'递归'的深度有限:5.2 节统计显示 agent 改自己递归改进模块的典型后果是把自己改死(4% 意外终止的主要原因);Game of 24 案例里对优化循环的改动限于加 error-trace、并行评测、清理日志这类小修。真正的性能来源是改 solver(任务 policy)。另外 baseline 数字直接引自 ADAS 论文而非重跑(实验节脚注),测试集是 ADAS 的采样子集(800 题/GPQA 166 题)。
开源可复现。
仓库结构完整(datasets/、results/ 存了每轮自改代码、src/),持续维护到 2025-09;但 issues 只有 4 个,全是使用提问(如 #1 换 GROQ 模型、#3 怎么输入问题),没有任何第三方复现成功/失败的报告,复现状态实际未知。自我改进过程随机性大(6 个独立 cycle、92% 中途跌落),单次跑出论文数字不应期待。
与我们方向的关系 在 RSI 谱系里,这篇是'自由度'维度的极点实验:STOP 固定改进循环只改 scaffold,ADAS 固定搜索算法只搜 agent 设计,Gödel Agent 把整个运行时全部开放。它验证了两件对课题组有用的事:一是'全开放自我修改'在 2024 年的 LLM 上就能跑通且不会立刻失控(4% 自毁率),二是撑住它的不是什么精巧机制,而是 error handling + 先想后做这两个朴素设计——做自改代码类实验时这两项应当默认标配。
它也清楚暴露了天花板:agent 改不出超越 ToT 的新算法,'改进改进机制'基本只会把自己改坏,性能提升几乎都来自改任务 policy。这解释了为什么后续 Darwin Gödel Machine 退回到'冻结外层循环 + 种群存档'的保守设计——纯自指在当前模型能力下收益低于风险。对比阅读这两篇可以很好地界定'哪一层开放是值得的'。
阅读笔记 monkey patching 方案的一个隐含代价:所有状态在进程内存里,agent 改崩(exec 出错或把循环改死)只能靠 error handling 兜底,没有 DGM 那样的 archive 可回滚——论文说 agent 会'revert to a previous optimal algorithm',靠的是历史记忆里存的旧代码。另外 repo 的 key.env 直接进了版本库(占位 OpenAI key),工程规范一般。
材料清单 TeX 源码 已存档:Raw/g-del-agent/source/
同类条目