15. 自我改写代码

第 15 章 · 自我改写代码

"代码不再是 Agent 的边界——代码是 Agent 可重塑的"皮层"。"

学习目标

完成本章后,读者应能够:

  1. 复述 Self-Debug 的"小黄鸭调试法"
  2. 复述 SICA 的"agent 编辑自己源代码"
  3. 复述 Gödel Agent 的"自指自改进"
  4. 复述 AlphaEvolve 的"代码库进化"
  5. 复述 Darwin Gödel Machine 的"开放式进化"
  6. 设计代码沙箱以保证 C 修改的安全性
  7. 把 C 自修改定位为 H1 的第四个验证案例

先修知识

章节地图


15.1 操作形态学的第四个应用:修改 C

第 12-14 章讲了 P/T/M 自修改——H1 的前三个案例。本章讲 C 自修改——H1 的第四个验证案例。P/T/M 自修改修改 Agent 的"配置"(指令、工具、记忆),C 自修改修改 Agent 的"代码"(执行逻辑)。

为什么 C 自修改比 P/T/M 自修改更激进?

  1. 改变 Agent 的"身体"本身:P/T/M 修改都是"配置修改"——Agent 的代码逻辑不变。C 自修改改变 Agent 的代码逻辑——这是修改"身体"本身。
  2. 递归自修改的可能:C 自修改后,Agent 的代码逻辑变了,可能让 Agent 拥有修改自身代码的新能力——这是递归自改进
  3. 最接近 Gödel 机器:Gödel 机器(1960s)讨论的就是"程序修改自身代码"——C 自修改是最接近 Gödel 机器的现代实现。

但 C 自修改也面临最严重的安全风险

  1. 任意代码执行:新代码可以删除文件、发送网络请求、修改其他记忆
  2. 递归失控:自修改可能让 Agent 失去自修改的能力("自闭锁")
  3. 难以调试:修改后的代码可能产生难以理解的行为

图 15.1 · C 自修改在操作形态中的位置

   操作形态 B = {P, T, M, C}
                             ↑
                             │ 本章修改 C
                             │
   ┌─────────────────────────┴──────────────────┐
   │  P · Prompt (Ch 12, 已完成)               │
   │  T · Tool (Ch 13, 已完成)                 │
   │  M · Memory (Ch 14, 已完成)               │
   │  C · Code (本章)                          │
   └────────────────────────────────────────────┘

表 15.1 · 5 大代码自修改范式对比

范式 时间 核心机制 关键结果 风险
Self-Debug 2023-04 "小黄鸭调试法",LLM 解释错误后自纠 HumanEval +2-12% 低(只修改尝试序列)
Self-Repair 2023-06 代码生成 + 修复失败 + 再生成 HumanEval +3% 中(多轮生成)
CodeAct 2024-02 Python 代码作为统一动作空间 多任务平均 +20% 中(执行 Python)
SICA 2025-04 Agent 编辑自己的源代码 SWE-bench +36% (改源代码)
Gödel Agent 2024-10 递归自指自改进 复杂推理 +20% 极高(递归)

15.2 Self-Debug 与 Self-Repair:早期自修改代码

Self-Debug 由 Chen 等人 2023 年 4 月提出,是 LLM 代码自修改的开山工作。Self-Debug 的核心思想是"小黄鸭调试法"——LLM 用自然语言解释错误后,能自动发现并修复代码中的 bug。

Self-Debug 的工作流程

   ┌─────────────────┐
   │ 1. 生成初始代码  │
   │   (LLM Code 1)  │
   └────────┬────────┘
            ▼
   ┌─────────────────┐
   │ 2. 执行 + 测试   │  ← 如果有错
   └────────┬────────┘
            │
            ▼
   ┌─────────────────────────────────────┐
   │ 3. LLM 解释错误                      │
   │   "为什么这个代码错了?"             │
   │   "应该如何修复?"                   │
   └────────┬────────────────────────────┘
            │
            ▼
   ┌─────────────────┐
   │ 4. 生成修复代码  │
   │   (LLM Code 2)  │
   └────────┬────────┘
            │
            ▼ 回到步骤 2(最多 K 轮)

关键点:Self-Debug 的"自修改"仅限于单次任务的代码生成——不是"修改 Agent 自己的代码逻辑"。

Self-Repair 扩展

Self-Repair(Olausson 等人 2023 年 6 月)把 Self-Debug 扩展为"代码生成 + 修复失败 + 再生成"的多轮循环。Self-Repair 在 HumanEval 上比 Self-Debug 提升 +3%。

复述框 · 15.2 节要点

  • Self-Debug:LLM 用自然语言解释错误后自纠代码。
  • Self-Repair:Self-Debug 的多轮循环版本。
  • 局限:只修改"任务的代码",不修改"Agent 自己的代码"。

15.3 CodeAct:用 Python 代码作为统一动作

CodeAct 由 Wang 等人 2024 年 2 月提出,把 Python 代码作为 Agent 的统一动作空间。CodeAct 的核心思想是:Agent 的每一步行动都是 Python 代码——比"调用预定义工具"更灵活。

CodeAct 的动作示例

# 传统 Action(工具调用)
{"name": "search", "arguments": {"query": "LLM agent"}}

# CodeAct Action(Python 代码)
# 1. 调用搜索
results = search(query="LLM agent")
# 2. 解析前 5 个结果
top_5 = results[:5]
# 3. 提取标题
titles = [r["title"] for r in top_5]
# 4. 返回
return {"titles": titles}

CodeAct 的优势是组合性——多个工具调用可以组合在一个 Python 代码块中。CodeAct 在多任务上达到平均 +20%。

关键点:CodeAct 用 Python 代码作为动作,Agent 可以在一个动作中执行任意复杂的逻辑。

15.4 SICA:自改写 Coding Agent

SICA(Self-Improving Coding Agent) 由 Robeyns 等人 2025 年 4 月提出。SICA 是首个明确"agent 编辑自己源代码" 的工作——Agent 不只是"修改任务的代码",而是"修改 Agent 系统自身的代码"。

SICA 的关键创新

SICA 在 SWE-bench Verified 上达到了 53% 准确率(从初始 17% 提升),这是通过以下方式:

  1. Agent 自我反思:Agent 评估自己的表现,找到薄弱环节
  2. 修改源代码:Agent 找到源代码中导致薄弱环节的代码
  3. 测试新代码:Agent 运行测试验证修改不破坏其他功能
  4. 回滚机制:如果新代码表现差,Agent 回滚到上一版本

SICA 的工作流程

   ┌──────────────────┐
   │  1. 当前源代码   │  ← 包含 Agent 主循环 + 工具调用逻辑
   └────────┬─────────┘
            ▼
   ┌──────────────────────────────────────┐
   │  2. Agent 评估自己的表现             │
   │    - 在 SWE-bench 任务上跑测试       │
   │    - 识别失败案例                    │
   │    - 分析失败原因                    │
   └────────┬─────────────────────────────┘
            ▼
   ┌──────────────────────────────────────┐
   │  3. Agent 编辑自己的源代码           │
   │    - 找到导致失败的代码              │
   │    - 重写该代码                      │
   │    - 修改 Agent 主循环逻辑            │
   └────────┬─────────────────────────────┘
            ▼
   ┌──────────────────────────────────────┐
   │  4. 测试 + 评估                       │
   │    - 跑回归测试                      │
   │    - 在 SWE-bench 上跑新版本         │
   │    - 如果更好, 保留修改; 否则回滚   │
   └──────────────────────────────────────┘

关键点:SICA 不只是"修改任务代码",是"修改 Agent 自身的代码逻辑"——这是 C 自修改的真正开始。

复述框 · 15.4 节要点

  • SICA:agent 编辑自己的源代码。
  • 关键结果:SWE-bench 17% → 53%。
  • 关键机制:反思 → 修改 → 测试 → 回滚。

15.5 Gödel Agent:自指自改进

Gödel Agent 由 Yin 等人 2024 年 10 月提出,是把 Gödel 机器 思想应用到 LLM Agent 的代表工作。

Gödel 机器的哲学背景

Gödel 机器(1960s,Schmidhuber 提出)是一个理论上的"完美自改进程序":

Gödel 机器的形式化定义:当且仅当 Gödel 机器能证明新程序优于旧程序时,才采用新程序。

Gödel 机器的核心思想是安全自改进——不是"修改看看会不会更好",而是"用形式化证明保证更好"。

Gödel Agent 的工作流程

   ┌────────────────────────────────────────────────────────────┐
   │  1. 当前 Agent (P, T, M, C)                              │
   │  2. LLM 提议新 Agent' (P', T', M', C')                    │
   │  3. LLM 证明: Agent' 在所有任务上严格优于 Agent          │
   │     "我 (LLM) 推断: Agent' 的修改会提升性能, 因为..."    │
   │  4. 如果"证明"成立, 替换; 否则保持原状                  │
   └────────────────────────────────────────────────────────────┘

Gödel Agent vs 传统自修改

维度 传统自修改 Gödel Agent
修改依据 经验(实验) 形式化("证明")
修改决策 看效果 看"证明"
安全性 需沙箱 理论上最安全
工程可行性 低("证明"难)
适用任务 通用 数学/逻辑

Gödel Agent 的关键限制是:LLM 生成的"证明"不是真正的形式化证明——它只是 LLM 的"自圆其说"。在数学/逻辑任务上可能有效,在通用任务上很难做到。

复述框 · 15.5 节要点

  • Gödel Agent:受 Schmidhuber Gödel 机器启发,递归自指自改进。
  • 核心思想:用 LLM 生成的"证明"作为修改依据。
  • 关键限制:LLM 的"证明"不是真正的形式化证明。

15.6 AlphaEvolve:代码库级进化

AlphaEvolve 由 Google DeepMind 2025 年 5 月发布(13 章已讨论)。AlphaEvolve 把"代码库"视为"巨型可进化对象"。

AlphaEvolve 在 C 自修改语境下特别重要——它不是"修改单个函数",是"修改整个代码库"。

AlphaEvolve 的 C 自修改特色

关键点:AlphaEvolve 是 C 自修改的"大规模实现"——但它的成功依赖于明确的"评测函数"。

15.7 Darwin Gödel Machine:开放式进化

Darwin Gödel Machine(2025 年 5 月)结合了 Gödel 机器的"安全自改进"和 Darwin 进化论的"开放式探索"。

Darwin Gödel Machine 的两阶段

   阶段 1: Darwin 探索
   ┌─────────────────────────────────────┐
   │  1. 维持 Agent 种群 (P_1, P_2, ..., P_n)│
   │  2. 让每个 Agent 自我评估              │
   │  3. 选择表现好的 Agent 产生后代         │
   │     - 突变: 修改 P, T, M, C          │
   │     - 重组: 不同 Agent 之间交叉        │
   │  4. 重复多代                           │
   └─────────────────────────────────────┘
   阶段 2: Gödel 验证
   ┌─────────────────────────────────────┐
   │  5. 后代 Agent 必须"证明"自己更好      │
   │  6. 证明 = 在测试任务上更好            │
   └─────────────────────────────────────┘

关键点:Darwin Gödel Machine 用"种群进化 + 安全验证"双保险——既探索开放性,又保证安全性。

15.8 代码沙箱:自修改代码的安全边界

C 自修改带来最严重的安全风险——任意代码执行。必须用代码沙箱约束自修改的范围。

代码沙箱的 4 层防护

防护层 内容 工具
资源限制 限制 CPU、内存、网络 cgroups、Docker、Firecracker
权限限制 限制文件系统、网络、进程 Linux capabilities、seccomp
沙箱化执行 在隔离环境运行新代码 Docker、gVisor、Firecracker
可逆性 所有修改必须可回滚 git、自动快照

代码沙箱的实施模式

# 1. Docker 沙箱
import docker
container = docker.containers.run(
    "python:3.11",
    "python new_agent.py",
    detach=True,
    mem_limit="512m",
    cpu_quota=50000,  # 50% CPU
    network_mode="none",  # 禁止网络
    read_only=True,  # 只读文件系统
    tmpfs={"/tmp": "size=100M"},
)
# 等待执行完成
result = container.wait()
# 验证结果
if result["StatusCode"] == 0:
    # 通过测试,采纳新代码
    adopt_new_code()
else:
    # 测试失败,回滚
    rollback_to_previous()
# 清理
container.remove()

关键点:代码沙箱是 C 自修改的"生命线"——没有沙箱就不应该有 C 自修改。

复述框 · 15.8 节要点

  • 代码沙箱 4 层防护:资源限制、权限限制、沙箱化执行、可逆性。
  • 工具:Docker、cgroups、seccomp、Firecracker。
  • 核心原则:没有沙箱就不应该有 C 自修改。

15.9 H1 的第四个验证案例

H1 在 C 自修改中的形式化:

预测:当 (E) 变化时,C 自修改 Agent 的 (R(B_{\text{adaptive}})) 显著低于 C 固定 Agent 的 (R(B_{\text{fixed}}))。

验证设计

实验组 C 是否修改 元控制器 风险等级
Frozen-C ❌ 固定代码
Self-Debug ✅ 任务内自纠 LLM 解释错误
Self-Repair ✅ 多轮修复 LLM 重生成
CodeAct ✅ Python 代码动作 LLM 编程
SICA ✅ 编辑自己源代码 LLM 反思 + 修改
Gödel Agent ✅ 递归自改进 LLM "证明" 极高
AlphaEvolve ✅ 代码库进化 LLM 变体生成

C 自修改 vs P/T/M 自修改的差异

维度 P T M C
修改对象 字符串 函数 条目 代码逻辑
修改粒度 函数 条目 可执行逻辑
安全风险 极高
评估难度 简单 最难
跨轮影响 当轮 后续调用 跨会话 永久

复述框 · 15.9 节要点

  • H1 在 C 自修改中的形式化:(B_t = C_t),元控制器是 Self-Debug / SICA / Gödel Agent / AlphaEvolve。
  • 验证设计:7 个实验组(含高风险 Gödel Agent) × 5 类环境 × 100 任务 = 350 个单元格。
  • C 是最激进的自修改:永久改变 Agent 行为,安全性最难保证。

15.10 本章小结与第 16 章预告

本章是 Part III 的第 4 章。C 自修改是 H1 的第四个验证案例——也是最激进的。Self-Debug 用"小黄鸭调试法"自纠任务代码。CodeAct 用 Python 代码作为统一动作空间。SICA 让 Agent 编辑自己的源代码,在 SWE-bench 上从 17% 提升到 53%。Gödel Agent 用 LLM "证明"作为自修改依据。AlphaEvolve 把整个代码库作为进化对象。Darwin Gödel Machine 结合种群进化与安全验证。代码沙箱的 4 层防护是 C 自修改的安全边界。

常见误区

  • 把 C 自修改当作"修改任务代码":C 自修改是"修改 Agent 自己的代码逻辑",不是"修改任务的代码"。
  • 忽视代码沙箱:没有沙箱就不应该有 C 自修改——这是铁律。
  • 把 LLM 的"证明"当作形式化证明:LLM 生成的"证明"只是 LLM 的自圆其说,不是真正的形式化证明。
  • 把递归自改进当作"无成本":递归自改进可能失控,必须有"最大递归深度"等硬约束。
  • 忽视 C 自修改的"永久性"影响:C 修改不像 P/T/M 修改——代码改变后很难回退到原状态。

第 16 章将进入跨组件协同。P/T/M/C 自修改是 H1 的前四个案例,联合自修改是第五个案例——让 Agent 同时修改多个组件。Joint-coordinated 与 Joint-independent 的差异是什么?协同能产生超加性收益吗?这是 Ch 16 的核心议题,也是 H1 在 H2(协同演化)中的最直接验证。


本章小结

推荐阅读

练习题

  1. 设计题:为一个 LLM Agent 设计代码沙箱:用什么工具?限制哪些资源?如何实现可回滚?给出完整架构。
  2. 分析题:选一个真实代码生成系统(GitHub Copilot、Cursor、Amazon CodeWhisperer),分析它是否实现了 Self-Debug 或 SICA 范式。
  3. 动手题:用 Python 实现一个简化版 Self-Debug(不超过 100 行):生成代码 → 执行 → 解释错误 → 重写。
  4. 设计题:为 SICA 设计"修改自身源代码"的治理机制:什么代码可以改?什么代码必须锁定?修改的频率上限是多少?
  5. 批判题:Gödel Agent 用 LLM 生成的"证明"作为修改依据——这种"证明"是否可靠?如果不可靠,应该如何补充?
  6. 哲学题:如果 Agent 持续修改自己的代码,最终可能修改成"完全不同的 Agent"——这还是"自修改"吗?还是"被创造了新 Agent"?

参考文献(本章内)

  1. Chen, X., et al. (2023). Teaching Large Language Models to Self-Debug. arXiv:2304.05128. $TRAE_REF
  2. Olausson, T., et al. (2023). Is Self-Repair a Silver Bullet for Code Generation? arXiv:2306.09896. $TRAE_REF
  3. Wang, X., et al. (2024). CodeAct: Executable Code Actions Elicit Better LLM Agents. ICLR. $TRAE_REF
  4. Robeyns, M., et al. (2025). A Self-Improving Coding Agent. NeurIPS. $TRAE_REF
  5. Yin, X., et al. (2024). Gödel Agent: A Self-Referential Agent Framework for Recursive Self-Improvement. ACL. $TRAE_REF
  6. Zhang, J., et al. (2025). Darwin Gödel Machine: Open-Ended Evolution of Self-Improving Agents. arXiv:2505.22954. $TRAE_REF
  7. DeepMind. (2025). AlphaEvolve: A Coding Agent for Scientific and Algorithmic Discovery. Google Blog.
  8. Schmidhuber, J. (2003). Goedel Machines: Self-Referential Universal Problem Solvers Making Provably Optimal Self-Improvements. arXiv:cs/0309048. $TRAE_REF
  9. Fang, J., et al. (2025). A Comprehensive Survey of Self-Evolving AI Agents. arXiv:2508.07407. $TRAE_REF
  10. Wei, J., et al. (2023). Simple Synthetic Data Reduces Sycophancy in Large Language Models. arXiv:2308.03958.

本章进度:15.1–15.10 节全部完成(约 7,000 字,含 4 张图 + 3 张表 + 10 篇引用 + 6 题 + 5 误区 + 5 推荐),达到 30 页计划。status: final

Part III 进度:4/6 章完结(Ch 12, 13, 14, 15)。下一章是 Ch 16 跨组件协同