一句话判断:约束搜索轨迹,不约束编辑空间
问题设定:冻结模型之上的可演化 harness
RRSI 把一个 agent 拆成两层:policy 模型(冻结,不参与训练)与 harness(包裹模型的脚手架:系统 prompt、控制流、工具注册、记忆、上下文压缩、子代理调用)。论文论点直白——agent 的能力大头由 harness 决定,而 harness 是纯文本与代码,因此可以被另一个 LLM 直接改写。这构成一种"自我改进":改进者与被改进者的运行底座都是冻结模型,但改进的对象是 harness 这个可写层。
朴素做法——对着固定 evolve set 迭代改 harness——的问题是过拟合:harness 会"记住"训练任务,在演化集上出现的任务名、实体、期望答案被写进代码,分布内指标大涨,换成 OOD 基准收益就缩水甚至归零。RRSI 的对策不是缩小编辑空间,而是在搜索轨迹上加正则化,分为提议侧(proposal side)与选择侧(selection side)两组机制。
总体架构:一轮七步,候选活在 git worktree 里
搜索核心在 rrsi/loop.py 的 Run.round(t),每一轮严格按算法 1(提议侧)→ 算法 2(选择侧)执行:
这套实现里最值得注意的两个工程决定:
- 候选即 commit。每个候选 harness 在独立 git worktree 中起草、审查、评测,分支从 evolve/<domain> 拉出;被接受就把该分支 fast-forward 到候选 commit。incumbent 永远是一个 commit,演化历史就是 git 历史,天然支持审计与回滚(rrsi/gitops.py)。
- 一切落盘、可断点续跑。runs/<domain>/ 下保存 frontier.json(前沿轨迹)、history.jsonl(逐编辑记录)、jobs/<job>/eval.json(逐 trial 明细)、r<t>/decisions.json(逐候选裁决理由)。崩溃重跑时复用已存在的 eval.json;touch runs/<domain>/STOP 优雅停机。
另有三个运维子命令构成完整的"实验治理"面:calibrate(用基准评测的 bootstrap 或重复测量估计噪声带 δ = z·sd(null ΔS))、readjudicate(改 δ 或权重后对某一轮的已存测量重跑算法 2,不花新评测预算)、reevaluate(基础设施故障后对一轮候选重测再重裁)。driver 还规定:一轮未结算最多重试 3 次,连续 infra 失败即停,防止坏环境烧光预算。
提议侧正则化:预算退火、历史条件化与强制归因
Analyze:三透镜报告 F_t
批量分析器(analyst.py)自己不读原始轨迹,而是派出只读 digester 子代理(digester.py)逐条调查——工具被监禁在当轮渲染轨迹目录里,bash 仅放行 grep/cat/jq 等只读命令,写操作全拒。产出的报告固定三透镜:failure_modes(丢分机制,跨任务聚类)、capability_gaps(agent 想做但做不到的)、success_habits(让高分任务干净收尾的习惯,作为提议者不许破坏的回归护栏)。
退火编辑预算 b_t
每轮候选最多捆 b_t 个独立可归因的编辑:
约束的是 ‖z_t‖₀(一个提议里激活的独立编辑数),不是 harness 最终能装的机制集合。预算在 done() 里硬执行——超预算或无标签提交被打回,绝不接收。
历史条件化 L_t 与探索指令 E_t
提议者以完整编辑历史为条件:每个编辑记录组件、假设、实测 ΔS/ΔC 与裁决——已证伪的假设不会被重画。停滞旗标 σ_t = 𝟙[S_t − S_{t−w} ≤ δ] 触发时,候选槽位为从未行使过的组件保留(m_draft 个),把停滞的搜索重定向到未探索的机制(history.py: stall_flag / exploration)。
提议者的"宪法"与结构化假设
提议者是 Claude Opus 4.8 编码 agent,通过严格 JSON 协议(list_files / read_file / read_trace / edit_file / write_file / done)在候选 worktree 内原地改 harness,路径监禁在 harness 目录(propose.py: Workspace)。每个编辑必须申报:component、hypothesis、targets_mode、why_not_lower_lever、trigger_condition、predicted_affected(具体任务 id)、retroactive_check(三段式反事实:纠正性/保护性/迁移性)、regression_risk。预测命中率会记分并回喂——过度宣称会被计入。没有 abort 动作:必须交卷,"不建的机制没有测量"。
选择侧正则化:泄漏筛查、噪声地板与成本规则
Critic:评测前的泄漏闸门
critic.py 在任何评测预算花出去之前先审 diff。两层:确定性 denylist(通用凭证模式 + 领域自有的 grader 路径/任务 id/裁判引用正则)+ LLM 审查(六类拒则:任务特化泄漏、退化/无效改动、grader 作弊、未申报捆绑、运行时记忆/skill 泄漏、无界工作循环)。拒绝意见打回给提议者做有界修复(repair_rounds=5),修不好的候选直接丢弃并记入历史——不消耗测量。
噪声地板与成本规则
缺失 trial 按 r=0 计、分母全额保留——候选不能靠"摧毁自己做不出的任务"显得更好。无可用 token 成本测量的候选被成本规则拒绝,而不是当作零成本。
通过闸门后按 S' 取 argmax;无人可行则 H_{t+1}=H_t——这一步本身就是正则化:搜索宁可停也不接受噪声。S*(历史最优)单调更新,地板随水位抬升,防止后期衰退。
组件词表与逐编辑归因:演化史上的"实验记录"
每个编辑必须挂到固定组件词表 K 上,申报标签还会被 diff 证据校验——声称是 skill 的编辑若 diff 里没有 skill 机制信号,会被 diff 分类器改判,防止用"未试组件"标签骗探索槽位:
| 组件类 | 性质 | 说明 |
|---|---|---|
| prompt / control_flow / config / output_plumbing / context_mgmt | 文本与逻辑 | 改 prompt 文案、循环与分支、参数、输出装配、上下文压缩策略 |
| client_tool / skill / memory / subagent | 结构组件 K_str | 新增机制(工具、skill 文件、记忆存储、子代理调用);novelty ν 只对 K_str 计数——首个触碰某结构组件的入选编辑获得带内加成 |
history.jsonl 逐编辑记录 (t, 组件, 假设, diff 路径, ΔS, ΔC, 是否被接受);捆了 n 个编辑的候选共享一次测量,b_t 退火到 1 后记录即单组件证据。近产率 g_t(l) = max{ΔS_i : l_i=l, t−t_i≤n_prune} 驱动剪枝集 B_t——近期不再产出收益的组件,其已入选的机制被作为合法编辑目标移除。attribution.jsonl 另记每条编辑的 predicted_affected 命中率与未预测回归,构成可审计的归因证据链。
Domain 适配器:一个接口挂三个异质实例
核心循环从不直接跑 agent、改分数或读轨迹格式——这些都由 Domain 适配器(domain.py,domains/<name>/adapter.py 导出 DOMAIN)提供。适配器要实现:任务集切分(evolve_ids / heldout_ids / smoke_ids)、评测(run + score,必须 resume-safe)、证据渲染(load_trial / render_trace / task_row)、存活检查(smoke)、领域守卫(guards,非补偿性标准),外加文本资产:泄漏 denylist 正则、diff→组件信号、四个角色的领域 brief、以及提议者宪法 SKILL.md / PATTERNS.md。
| 实例 | 演化集 | OOD 检验 | 基座 harness / 评分 | 关键超参 |
|---|---|---|---|---|
| coding | Terminal-Bench 2.1(89 任务 × k=2 = 178 trials) | SWE-bench Verified | Terminus-2(harbor + Docker);S = 隐藏测试通过率 | δ=0.017(178 中 3 个 pass),β1=44.5,w_s=0 |
| workspace | Harvey LAB(120 evolve + 40 纯净 held-out) | JobBench / GDPval / APEX-Agents | 官方 ReAct toolbelt;S = rubric criteria 通过率(约 14,100 条),judge = Gemini 3.5 Flash | δ=0.004,β1=35.4,w_s=1414(1 分/条 criteria) |
| eng | EngDesign-Open(61 免许可任务 × k=4 = 244 trials) | EngDesign v1 / Frontier-Eng | ReAct toolbelt + MCP 工具网关;冻结的任务级代码 verifier | δ=0.020,β1=24.4;guards:valid-rate 降幅 ≤0.03、no-payload 升幅 ≤0.02 |
三个实例的搜索角色(提议者/分析器/critic)均为 Claude Opus 4.8(Vertex,多 project round-robin + cache prefix),policy 模型与搜索角色解耦——coding 实例换 Gemini 3.5 Flash 作 policy 时同一循环依然有效。
结果解读:分布内涨幅与 OOD 残差
| 领域 | 基准 | 角色 | H₀ | RRSI | Δ |
|---|---|---|---|---|---|
| Coding | Terminal-Bench 2.1 | evolve | 74.2 | 80.2 | +6.0 |
| Coding | SWE-bench Verified | OOD | 82.0 | 83.8 | +1.8 |
| Agentic workspace | Harvey LAB | evolve | 89.4 | 90.5 | +1.1 |
| Agentic workspace | Harvey LAB | ID held-out | 86.9 | 89.2 | +2.3 |
| Agentic workspace | JobBench | OOD | 36.0 | 40.7 | +4.7 |
| Agentic workspace | GDPval | OOD | 48.8 | 52.3 | +3.5 |
| Agentic workspace | APEX-Agents | OOD | 34.2 | 37.9 | +3.7 |
| Engineering design | EngDesign | evolve | 50.0 | 54.9 | +4.9 |
| Engineering design | Frontier-Eng | OOD | 17.7 | 22.0 | +4.3 |
论文发布数字,policy 冻结为 Claude Opus 4.8,所有数字与同窗口内未演化 H₀ 对比。"Evolve" 是搜索所在 split,其余行未进入选择。换 Gemini 3.5 Flash 作 policy 时 coding 实例为 TB2.1 64.6→78.7、SWE-bench 76.8→79.0——方法与单一 policy 家族解耦。
读法上要注意两点。第一,OOD 收益普遍小于分布内收益但不为零——JobBench +4.7、Frontier-Eng +4.3 的残差说明正则化确实保住了可迁移成分;这正是"正则化搜索轨迹"相对"无约束演化"要证明的核心命题。第二,Harvey LAB 这类高基线实例上 +1.1 的演化涨幅很小,但 held-out 反而 +2.3,说明 gain 的结构偏向可泛化机制而非记忆——δ 与成本规则把噪声收益挡在了门外。
AI4Science 应用:这套架构在科学智能体上怎么落
证据边界先说明:参考实现的三个实例是终端编码、文档工作与工程设计,没有一个是科学基准。本节是基于架构属性的迁移分析,不是已实现功能。
为什么 RRSI 的形状恰好适合科学 agent
科学智能体的典型痛点——工具链长(序列检索→结构预测→对接→打分)、每任务成本高、评测方差大、泄漏即污染——正对应 RRSI 的四块机制:成本规则按实测 token 付费,直接惩罚"堆更多推理"的廉价改进;噪声地板 δ 用 bootstrap 标定,天然适配科学评测的高方差;critic 的泄漏筛查对应科学 benchmark 最致命的数据污染问题(把 PDB id、配体 SMILES、数据点答案写进 harness 等价于 test-set leakage);逐编辑归因(假设→预测受影响任务→实测命中率)本质上是把每次改动登记成微型对照实验,符合科学审计习惯。
Domain 适配器 = 科学基准的接入点
接入一个科学场景只需实现 Domain 接口:evolve/held-out 任务切分(例如按时间或按蛋白家族切分,比随机切分更接近真实部署)、run/score 封装现有流水线(对接成功率、ipSAE/ipTM 阈值通过数、湿实验回读指标)、render_trace 把轨迹渲染给分析器、guards 写非补偿性领域约束(例如"可表达性/可合成性下降超过阈值即否决"——eng 实例已示范了 valid-rate guard 的写法)。SKILL.md/PATTERNS.md 则承载该领域的"宪法":禁止任务特异实体、强制机制假设。
具体可想象的 AI4Science 实例
· 蛋白设计 agent:演化集 = 一组靶点的 binder 设计任务,评分 = 计算漏斗通过率(scRMSD/interface pAE/ipSAE)而非单一分数;harness 可演化点包括 MSA/模板选择策略、重折叠验证顺序、过滤阈值管理。
· 文献综述 agent:演化集 = 系统性综述任务,评分 = 引用核验通过率 + 覆盖度 rubric;结构组件(记忆、subagent)特别适合长程文献任务。
· 实验设计 agent:演化集 = DOE/方案生成任务,guards 写"安全约束违规即否决"。
· 工作流编排 agent:eng 实例的 MCP 网关模式可直接复用到仪器/LIMS 工具暴露。
迁移时的三个真实障碍
· 评测成本:k 次 trial × 完整 evolve set × 每轮 m 个候选,科学评测单 trial 动辄分钟级、GPU 级——k=2~4 与 δ 标定方式须按方差重估,eval_parallel 与 resume-safe 机制是刚需。
· 可验证性:RRSI 要求每次评测返回 [0,1] 标量奖励;湿实验回读周期长的场景必须先有可靠的计算代理指标,否则搜索没有信号。
· 泄漏定义本地化:科学任务的泄漏更隐蔽(同源蛋白、同骨架分子、同实验室数据),critic_patterns 与领域 denylist 需要按领域认真写,这是迁移中工作量最大也最关键的部分。
对 AI4Science 社区更大的启示是方法论层面的:harness 是一阶优化对象,而且应该被当作实验变量管理。目前多数科学 agent 的 prompt/工具编排是手工冻结的"暗物质"——不版本化、不归因、不做 OOD 检验。RRSI 演示了把它变成可审计对象的完整机制:git 分支即谱系、history.jsonl 即实验记录、δ 即检验显著性、guards 即领域先验。即便不跑这套循环本身,"给 agent 演化加双侧正则化"这一范式对设计自改进的科学智能体(自演化协议、自动假设-实验闭环)是直接可借的框架。
局限、证据边界与采用建议
- OOD 残差为正但显著缩水。所有实例都是分布内涨幅 > OOD 涨幅(+6.0→+1.8、+4.9→+4.3)。"不消失"是相对于无约束演化的成功,不等于泛化免费——δ、成本规则、泄漏筛查三者任何一个配错都会退回记忆化。
- 每轮成本不低。m 个候选 × 完整 evolve set × k trials,外加三个 Opus 4.8 搜索角色;成本规则约束的是运行时 token,不约束搜索过程本身的开销。改进 token 经济学在论文范围之外。
- 搜索角色能力上限即提议质量上限。提议者、分析器、critic 都是同一模型家族;对需要领域专家知识才能发现的机制,演化只能找到轨迹证据支持的那些。
- 单一数值目标。argmax over S 意味着多目标权衡只能靠成本规则与 guards 近似表达;真正的 Pareto 搜索不在当前机制内。
- 复现门槛。三个 benchmark 环境各自独立(harbor/Docker、Harvey LAB 固定 commit、EngDesign verifier 布局),Vertex 项目配置、judge 模型与 frozen policy 版本都会影响可复现性——论文数字应视为作者报告结果。
来源与核验说明
主要来源(本地源码审查为主,2026-09-29):
· 本地 checkout /home/qiao/qiao_design/algorithm/rrsi(对应 github.com/google-research/rrsi):rrsi/{loop,propose,analyst,digester,critic,evaluate,selection,history,components,schedule,calibrate,driver,domain,llm}.py、domains/{coding,workspace,eng}/rrsi.json 与适配器、顶层 README。机制描述均按代码行为而非论文表述撰写。
· 论文:Xia, Han, Wang 等《RRSI: Regularized Recursive Self-Improvement of Agent Harnesses》,arXiv 2609.24972(2026),Google Research。结果表数字取自仓库 README 的论文数值。
证据口径:架构与机制结论以源码为准;benchmark 数字为作者报告结果,未作独立复现。AI4Science 一节明确标注为迁移分析——参考实现不含科学基准实例,相关论述不构成"已实现"声明。