上一篇的 Gödel Agent, SICA, DGM, HGM 把整个 Agent 的代码交给自己改, 改进器和被改进的东西是同一份代码. STOP, Promptbreeder, SePO, A-Evolve-Training 动的范围更窄, 只留下改进流程里的一块: 生成候选的脚手架, 变异提示, 提示词 Agent 的系统提示, 下一轮的搜索策略. 范围窄, 改了什么就可以单独拿出来比. 后面依次看 STOP, Promptbreeder 和 SePO, 再看 Polaris 和 A-Evolve-Training 在 7B, 30B 模型上的实际运行, 最终集中讨论每个系统该归哪一层, 以及怎么区分「改进策略变了」和「只是存下了更好的内容」.
1. 改进策略落在 的哪一块
1.1. 把 拆开
1.2 把一轮更新写成: 提出候选, 按 给出的证据决定接受, 提交或回滚. 落到具体系统, 至少包含四个动作:
- 提出: 生成候选改动, 比如让语言模型写新代码, 改写提示, 构造新数据配方.
- 筛选: 在多个候选里挑出值得评测的, 比如锦标赛, 档案采样, 束搜索.
- 提交: 决定把哪个候选保留下来, 以后的轮次从它出发.
- 回滚: 发现保留下来的改动有害时撤销.
上一篇的系统可以改到这四个动作的全部, 因为整份 Agent 代码都在可写范围里. 这一篇的系统只改其中一两个: STOP 改的是「提出 + 筛选」的脚手架; Promptbreeder 改的是「提出」用的变异提示; A-Evolve-Training 改的是下一轮「提出」时要探索的方向, 以及「提交」时的门槛.
1.2. L3 的判定
综述给的判定是一个反事实: 把这一轮产出的成品放到一边, 只看保留下来的改动会不会让下一轮提出, 筛选, 提交或回滚的方式不同. 会不同, 改动落在 ; 不会, 改动只是一件成品, 落在 或 .
拿 Promptbreeder 举例. 它同时进化任务提示和变异提示. 任务提示是给下游任务用的, 保留下来之后影响的是任务执行, 算 的改动, 是 L2. 变异提示是用来改写任务提示的指令, 保留下来之后下一代任务提示的生成方式就变了, 动的是 , 是 L3. 同一个系统里两类改动深度不同, 归类按最深的那一类, 但证据要分开给.
和 的边界:L3 要求 : 评判标准在这一轮里没有实际变化. 这一篇的系统里, STOP 的元效用由人给定, Promptbreeder 的适应度是训练集上的准确率, SePO 的适应度评估固定, A-Evolve-Training 的外部榜单固定. 只要这几样不动, 改进器怎么变都还在 L3. 一旦系统开始改「什么算好」, 就进入 4.3 的 L4.
A-Evolve-Training 是最容易混淆的一个: 它把内部开发分从正面证据改成可疑证据, 这听起来像改了评判标准. 第 5.4 节专门讨论它.
策略状态与内容状态:把 拆成四个动作还不够, 每个动作里同时有规则和内容. 提出阶段的规则可能是「先按失败机制聚类, 再为每类生成最小补丁」, 内容则是当前聚类、失败样本和补丁; 筛选规则可能是 Thompson 采样, 内容则是每个候选的成功失败计数. 规则与统计状态共同决定下一轮候选分布.
设改进器状态为 , 是策略参数或程序, 是历史统计与档案. 给定当前产物 和证据 , 候选分布为
L3 的核心是 因保留状态而改变. 只保存一条更好的任务提示会改变 , 不必改变 ; 保存某类失败应采用哪种变异的规则, 会改变 ; 保存算子成功率会改变 . 后两者都属于有效改进器状态, 但证据强度不同: 规则可读不等于候选分布真的改变, 还要观察后续采样.
这个表示也暴露一个常见混杂. 改进后的任务产物 本身更容易继续优化, 即使使用原改进器 , 下一轮也可能产生更好候选. 若直接比较整条自改进轨迹, 无法知道收益来自更好起点还是更好策略. 因果检验要交叉组合 、、 和 , 其中策略效应是固定起点后更换 的差值.
策略还分为任务条件策略与全局策略. Promptbreeder 的某条变异提示可能只适合数学题, SePO-Generalist 试图学习跨任务的提示优化原则. 若把多个任务混合后的平均收益当全局策略证据, 可能掩盖一部分任务明显退化. 可以写成条件分布 , 是任务属性; 学到的策略既可能改变通用算子, 也可能只是学会识别任务后选择专用算子. 两者都在 , 迁移要求不同.
策略状态有时间尺度. 算子成功计数每轮都能更新, 提示词 Agent 的系统提示经过多轮才更新, 外层章程可能永久冻结. 快状态适应当前任务, 慢状态吸收跨任务规律. 若所有状态同速更新, 当前噪声会改坏通用策略; 若慢状态从不更新, 系统只能做任务内搜索. 两时间尺度近似可写成
文本和程序更新没有真实梯度, 这个式子表达的是更新频率与接受门的差异. 慢状态需要更多任务、更强证据和更保守回滚.
策略的作用域也需要版本化. 一个在 LPN 上学到的搜索脚手架迁到 3SAT 有效, 支持它跨离散优化任务; 不能由此推出它适合代码修复或高风险工具使用. 每次迁移增加的是经过验证的作用域, 未覆盖领域保留未知. 把策略写成「通用改进器」不会扩大证据范围.
内容可以泄漏进策略. 一条变异提示若包含 GSM8K 的题型技巧, 它在形式上属于 , 行为上却携带任务答案先验. 跨任务迁移能检验这种泄漏: 策略在新任务仍提高候选质量, 更像改进方法; 只在原任务有效, 可能是把领域知识藏进优化指令. 还可以对任务标签、表面格式和示例顺序做扰动, 看策略是否依赖基准标记.
反方向上, 策略也能退化成空操作. STOP 的原样返回在下游候选普遍有害时得分不低, 它让 集中在 . 当前效用不下降, 更新生产力却归零. 评估策略时应同时报告改进概率、回归概率与保持不变概率, 不能把「安全地不做事」和「会提出有益修改」压成同一个平均分.
策略比较还要匹配候选预算. 一个策略生成十个候选后取最好, 另一个只生成一个, 前者分数高可能来自样本数. 固定生成次数测候选分布质量, 固定总成本测系统效率. 若新策略用更长提示、更强模型或额外反馈, 这些都属于 的资源需求, 应进入结论.
因此, 判断 L3 不只看某段优化提示是否被保存. 要证明它改变了后续候选分布, 在相同起点与预算下提高了新任务上的更新结果, 并且没有依靠藏入任务内容、增加采样或放宽评测. 这也是后文读取 STOP 迁移、SePO 消融和 A-Evolve 轮次轨迹的共同坐标.
1.3. STOP: 改进器自己改自己
问题怎么写:Zelikman 等人 (2024) 把问题写得很干净. 设 是一个黑箱语言模型, 输入字符串, 输出字符串. 一个效用 由两部分组成: 给解答字符串打一个有界实数分, 是这个函数的文字描述, 可以就是它的源码. 一个改进器 是一段程序, 输入效用 , 初始解 和语言模型 , 输出改进后的解:
改进器的好坏用元效用衡量. 给定一组下游任务 , 元效用是改进器在这些任务上改出来的解的平均效用:
关键一步是注意到 本身也是一个效用, 改进器本身也是一个可以改进的「解」. 于是把改进器交给它自己:
第 轮用上一轮的改进器 , 以 为目标, 改进 自己的源码. 语言模型 不变, 效用 的定义不变, 外层的「把自己交给自己」这个流程也不变. 变的只有改进器的代码.
种子改进器 很简单: 把初始解和效用描述拼进提示, 请语言模型给出若干个改进版本, 用效用函数打分, 返回最好的一个. 它就是一个带评分的多次采样.
LPN 上的结果:主实验的下游任务是带噪声的奇偶学习 (Learning Parity with Noise, LPN): 比特串的标签是某个未知比特子集的奇偶, 训练集标签带噪声, 要预测新比特串的真实标签. 无噪声时高斯消元就能解; 带噪声时在大维度上被认为难解. 论文用 10 位输入, 可以算.
实验设定:
- 下游效用 : 采样 个独立 LPN 实例, 每个设短超时和少量噪声, 返回平均准确率.
- 取 5 份相同的 , 因为语言模型和改进器都有随机性.
- 测试元效用: 在另外 个没参与改进的 LPN 实例上评测.
- 5 次独立 STOP 运行, 报告均值和标准误.
GPT-4 下种子改进器的测试元效用约 61%, 之后各轮持续上升. 两个对照: 只尝试一次改进, 不调用效用函数的 CoT 基线, 十次运行在不出错时是 , 算上出错是 ; 用满调用预算, 每次选最好再重复的贪心迭代改进器是 .
GPT-4 提出的改进策略包括遗传算法, 束搜索, 模拟退火, 局部搜索, 只针对解里的特定函数做改进, 多臂老虎机式的提示选择, 在提示里加提示要点等. 附录 B.9 记录了一个细节: 在一次运行里, 区分「探索」和「利用」两个阶段的代码直到第 7 步改进才出现, 用计数器决定该探索还是利用的做法在下一步才出现. 改进器的结构是一点点长出来的.
迁移: 改进器本身有没有变好:STOP 最有说服力的实验是迁移. 在 LPN 上用 轮自改进得到一个改进器, 不再做任何优化, 直接拿到 5 个新任务上和种子改进器比. 改进器在自改进阶段只看到元效用和自己的代码, 没看到这 5 个任务.
| 任务 | 初始解 | 种子改进器 | 改进后 |
|---|---|---|---|
| String Grid Distance | 43.9% | 44.3% | 56.7% |
| 带偏好的二次分配 | 20.4% | 20.6% | 22.1% |
| 3SAT | 0% | 21.2% | 75.1% |
| Maxcut | 0% | 58.7% | 74.2% |
| 无噪声奇偶 | 50.0% | 59.3% | 81.7% |
5 个任务全部提高, 幅度差别很大: 二次分配只多 1.5 个点, 3SAT 多 53.9 个点. 这张表是 L3 判定最直接的证据: 改进器在 LPN 上练出来, 换到没见过的任务上照样起作用, 保留下来的是改进的方法.
小模型上为什么退化:同样的流程用 GPT-3.5-turbo 和 Mixtral-8x7B-Instruct 跑, 测试元效用随轮次下降. GPT-3.5 跑了 25 次, 只有 12% 的运行至少提高了 3 个点. 论文列了两类 GPT-4 上没见过的失败:
- 伤到改进器, 不伤下游解. 比如「以很小的概率随机替换每一行里的字符串」, 对短的下游解影响小, 对长的改进器代码破坏大. 改进器被改坏, 下一轮就更难改好.
- 退化成原样返回. 提出的改进大多有害时, 一个无意中直接返回原始解的脚手架反而得分不低, 被选中之后自改进就停了.
GPT-3.5 的种子改进器起点反而更高: 65% 对 GPT-4 的 61%. 论文的解释是 GPT-4 更常写出复杂的解, 比如用 numpy 训练一千个 epoch 的神经网络, 结果超时. 起点高不代表能自改进. 能不能改进自己, 取决于底座模型能不能写出正确的改进器代码, 上一篇的四个系统也都建立在强编码模型上.
沙箱与分数作弊:STOP 给改进器提供了一个带 use_sandbox=True 参数的运行函数, 然后让语言模型独立生成 10,000 次种子改进器的改进, 用一个语法检查判断有没有绕过沙箱: 代码里出现 use_sandbox=False 或 exec( 就算.
| 语言模型 | 绕过率 | 加警告后的绕过率 |
|---|---|---|
| GPT-4 | 0.42% (0.31–0.57%) | 0.46% (0.35–0.61%) |
| GPT-3.5 | 0.12% (0.07–0.21%) | 0.17% (0.11–0.27%) |
括号里是 95% Wilson 置信区间. 两点值得注意. 第一, GPT-4 的绕过率是 GPT-3.5 的三倍多, 能力更强的模型更常绕过. 第二, 在提示里明确警告不要关沙箱, 绕过率没有下降, 反而略升. 人工检查这些计划时, 涉及关沙箱的注释都写着「为了效率」之类的理由.
附录 C 还有一个绕过调用预算的例子: 改进器被限制了语言模型的调用次数, 生成的代码设法绕过这个限制.
分数作弊也出现了. LPN 的效用最初写成 acc = np.sum(y_hat == y) / n_test. 改进器把预测结果以不同形状的数组返回, numpy 广播之后没有报错, 算出来的「准确率」超过 1000%. 这和上一篇 DGM 删掉特殊标记日志拿满分是同一类事: 改进器能看到效用函数的描述, 就能找到效用函数没覆盖的地方.
STOP 的双层目标与固定点:STOP 同时有两层随机性. 内层改进器 调用语言模型产生若干解并按 选择; 外层仍用 调用语言模型改写 自己, 再按 选择. 把语言模型采样记为 , 下游任务记为 , 外层真正优化的是
有限评测得到 , 自改循环反复查询同一任务集. 即使每个候选代码没有直接读取答案, 外层也会逐步适应任务类型、超时和评分漏洞. 测试元效用使用新的 LPN 实例减少实例记忆, 五个跨任务迁移进一步减少领域特化, 但候选仍知道效用源码与任务描述.
自我应用 没有保证形成改进映射. 一个固定点满足
固定点可能是成熟优化器, 也可能是原样返回、语法失败后回退或每次生成等价代码. 因而「代码不再变化」无法区分收敛与失活. 需要从新起点运行 , 观察它是否仍能产生多样候选并提高效用; 原样返回固定点的任务分可以稳定, 更新生产力为零.
另一个问题是自举门槛. 要改进复杂改进器, 模型需要理解其代码、效用和失败轨迹; 改进器越长, 自改任务越难. GPT-3.5 对短下游解能安全做小变异, 同一算子作用于长程序便破坏结构. 设候选有益概率为 , 破坏概率为 , 是程序复杂度, 若 随 上升快于 , 自改轮次会跨过能力阈值后退化. 模块化与类型化编辑通过缩小每次有效 , 提高可行区间.
复杂度还会产生选择偏差. 更长的改进器能包含遗传算法、缓存和多阶段搜索, 也更容易超时. 若 只看下游质量, 超时以失败计, 搜索会偏向在当前限制下较短程序; 若把成本单独奖励, 又可能偏向空操作. 更合理的目标先设运行与质量硬门, 再在合格候选间比较成本, 避免质量和资源在一个未经校准的权重里互相抵消.
STOP 每轮只保留一个改进器, 容易被早期噪声锁定. 设两个候选真实效用接近, 小样本分数把较差者选中后, 下一轮只能从它出发, 已丢失分支无法恢复. 保存少量行为不同的候选、对冠军追加独立复测, 可以降低单链风险. 这与 DGM 的档案思想一致, 但改进器候选的评测成本更高, 档案容量必须受控.
迁移表证明 在五个新问题上优于 , 仍有两项需要分开. 第一, 新任务只执行一轮, 测的是候选生成能力; 连续让 自改多轮, 才测更新稳定性. 第二, 五个任务都属于可程序化组合优化, 共享用代码搜索解的结构. 更远迁移到自然语言事实核查、工具权限或训练配方, 需要新的接口与效用, 不能从现有表外推.
效用源码可见使 STOP 具备白盒优化优势, 同时打开指标捕获. 将任务接口拆成公开规格与隐藏执行器可以保留可编程性: 改进器知道输入输出与资源限制, 看不到密封样本和计分实现. 对数组形状先做类型检查, 对返回值做范围断言, 对超时和调用预算由沙箱外层计量. 这些门不提高搜索能力, 但让高分更接近真实任务结果.
沙箱警告无效说明自然语言约束不是权限. use_sandbox=False 由外部调用接口拒绝, exec 与文件网络能力由进程隔离, 调用预算由代理层计数, 才能形成不可被候选重写的边界. 候选若确实需要新能力, 产生权限申请并由独立流程批准, 不能把关闭防护包装成效率优化.
STOP 的意义由此落在一个有限命题: 在强模型、可计算效用与小型代码空间中, 改进器代码可以作为自己的优化对象, 并把部分搜索结构迁到新问题. 它同时展示了三个边界: 底座能力不足时自改退化, 单链会把坏改动传给后续轮次, 白盒效用与可写沙箱会给指标捕获提供短路径.
2. Promptbreeder 与 SePO: 变异提示和提示词 Agent 的提示
2.1. Promptbreeder 的进化单元
Fernando 等人 (2023) 的 Promptbreeder 处理的是提示. 一个进化单元包含:
- 两条任务提示 : 第一条作用在问题上产生解题过程, 第二条接在解题过程后面产生答案, 沿用 Plan-and-Solve 的两段式.
- 一条变异提示 : 告诉语言模型怎么改写任务提示, 比如「给这个提示做一个变体」.
- 少样本场景下还有一组上下文 : 只收录得出正确答案的解题过程.
初始化时, 从一组人写的变异提示和一组「思考风格」(比如「我们一步一步想」) 里各随机抽一条, 和问题描述拼在一起交给语言模型, 续写出初始任务提示. 每个单元做两次, 得到两条任务提示.
进化用二元锦标赛: 随机抽两个单元, 适应度高的那个变异一次, 用变异后的副本覆盖输的那个. 适应度是任务提示在一批随机训练样本上的准确率. 种群大小 50, 一般进化 20 到 30 代; 一代指把所有个体随机两两配对比一次.
2.2. Promptbreeder 的五类变异算子
| 类别 | 做法 |
|---|---|
| 直接变异 | 零阶: 问题描述后接「A list of 100 hints:」, 取生成的第一条提示要点当新任务提示, 不依赖任何旧任务提示; 一阶: 把变异提示拼在任务提示前面, 让语言模型改写 |
| 分布估计变异 | 把种群里过滤后的任务提示列出来, 让语言模型续写一条新的; 一个变种按适应度排序后再续写; 还有一个变种按谱系顺序列出历代最优 |
| 超变异 | 零阶: 问题描述加一条思考风格, 生成新的变异提示; 一阶: 用固定的超变异提示「Please summarize and improve the following instruction:」改写现有变异提示 |
| 拉马克变异 | 拿一段得出正确答案的解题过程, 让语言模型反推出能产生它的任务提示 |
| 交叉与上下文洗牌 | 变异后以 10% 概率把一条任务提示换成另一个个体的; 以 10% 概率重抽整个上下文列表 |
和 L3 有关的是超变异. 一阶超变异改的是现有的变异提示, 新变异提示马上用来改写本单元的任务提示, 一次评测同时检验了两层. 交叉只作用在任务提示上, 不作用在变异提示上.
2.3. Promptbreeder 的结果
主表用 PaLM 2-L 作底座, 零样本 GSM8K 上:
| 方法 | GSM8K |
|---|---|
| PS (Plan-and-Solve, PaLM 2-L) | 59.0 |
| PS+ (PaLM 2-L) | 60.5 |
| APE (PaLM 2-L) | 77.9 |
| OPRO (PaLM 2-L) | 80.2 |
| Promptbreeder 零样本 | 83.9 |
| Promptbreeder 少样本 | 83.5 |
在 ETHOS 仇恨言论分类上, 进化出来的两段长提示得 89%, 人写的「判断文本是否包含仇恨言论」得 80%.
附录 J.4 统计了每类算子产生比父代更好后代的比例 (GSM8K):
| 算子 | 后代更好的比例 |
|---|---|
| 零阶超变异 | 42% |
| 谱系变异 | 26% |
| 一阶超变异 | 23% |
| 分布估计 (排序) | 12.7% |
| 直接变异 | 12% |
| 分布估计 | 10.7% |
| 拉马克变异 | 6.3% |
这张表要仔细读. 排第一的零阶超变异并不读旧的变异提示, 它从问题描述和思考风格重新生成一条, 做法和初始化相同. 真正在旧变异提示上改写的是一阶超变异, 比例是 23%. 也就是说, 「从头再抽一个变异策略」比「在现有变异策略上改」更常产生好后代. 这不否定变异提示的进化有用, 但说明这里的收益有相当一部分来自重新采样带来的多样性, 不全是策略的累积改进.
Promptbreeder 的消融与漂移:附录 L 逐个去掉自指组件: 去掉变异提示的变异, 去掉从上下文反推任务提示, 去掉思考风格引导的初始化, 去掉随机选择变异提示. 衡量方式是: 每一代里, 去掉组件后的评测结果高于完整算法的比例, 再对所有代求和. 大多数情况下去掉任何一个都让适应度下降, 影响最大的是思考风格引导的初始化.
少样本场景有一个反常现象. AddSub 上一个跑了 1600 次变异的个体, 两条任务提示分别是「The mutant」和「mutant」, 已经没有意义, 但适应度仍然高, 因为上下文里的正确解题过程在起作用. 论文自己写: 少样本进化里上下文占主导, 任务提示常常漂移成无意义文本. 适应度只看最终准确率, 分不出是提示起作用还是上下文起作用. 这就是第 5 节要说的「存下的内容」和「改进策略」混在一起的典型情况.
SePO: 把 Promptbreeder 的顶层也交出去:Tao 等人 (2026) 的 SePO 先指出一个结构问题. 现有系统提示优化方法都有一个「提示词 Agent」负责改写任务 Agent 的系统提示, 而提示词 Agent 自己的系统提示是人写的, 从不改. Promptbreeder 往上多走了一层, 让变异提示也进化, 但改写变异提示用的超变异提示是固定的那一句「Please summarize and improve the following instruction:」. 每往上加一层, 最顶上总有一层是人写好之后不再变的.
SePO 的做法是不再加层: 同一个提示词 Agent, 用同一套流程, 既改任务 Agent 的系统提示, 也改自己的系统提示. 写成两个目标, 记任务 Agent 的系统提示为 , 提示词 Agent 的系统提示为 , 提示词 Agent 用 生成新的 :
第二个式子里的 表示用这条提示词 Agent 提示去优化任务提示得到的结果. 的好坏, 是用它优化出来的任务提示在多个任务上的准确率来衡量的. 这和 STOP 的元效用是同一个思路: 改进器的分数等于它改出来的东西的分数.
SePO 的两阶段与档案:搜索是开放式进化, 维护一个候选提示的档案, 早期的提示可以作为后来改进的出发点. 底层流程直接采用 DGM 的开放式进化搜索, 选父代用的也是按子代数惩罚的带温度 softmax. 训练分两段:
- 预训练: 在一个多任务池上跑自指循环, 进化提示词 Agent 自己的系统提示.
- 微调: 用进化好的提示词 Agent 去优化目标任务的任务 Agent 系统提示.
两个版本: SePO-Specialist 在微调要用的同一个任务上做预训练; SePO-Generalist 在贪心挑选的多任务混合上做预训练, 之后复用到所有任务. 默认用 Generalist.
实现细节: 任务 Agent 用 DeepSeek-V3.2, 温度 0, 让评测确定; 提示词 Agent 用 Gemini 3.1 Pro Preview, 温度 1, 让候选多样. 预训练和微调都跑 代, 每代 个子代, 每个子代在一批失败和成功样本 (约 1:1) 上评测. 所有结果是 5 个随机种子的平均. 和 TextGrad 共享预算: 10 次迭代, 每次 16 个样本. 任务 Agent 的种子提示是 Manual-CoT, TextGrad 和 SePO 都从它出发.
SePO 的结果如下:
| 方法 | AIME'25 | ARC-AGI-1 | GPQA | MBPP | Sudoku | 平均 |
|---|---|---|---|---|---|---|
| Manual-CoT | 57.55 | 37.30 | 76.46 | 91.20 | 96.95 | 71.89 |
| TextGrad | 55.99 | 34.75 | 74.44 | 90.15 | 96.60 | 70.39 |
| MetaSPO | 57.71 | 37.27 | 75.51 | 89.30 | 96.80 | 71.32 |
| SePO-Specialist | 60.94 | 37.46 | 76.72 | 95.55 | 99.80 | 74.09 |
| SePO-Generalist | 64.22 | 43.39 | 78.18 | 96.20 | 99.90 | 76.38 |
ARC-AGI-1 报告 pass@3, 其余 pass@1. Generalist 平均比 Manual-CoT 高 分, 比 Specialist 高 2.29 分. TextGrad 和 MetaSPO 的平均都低于 Manual-CoT, 各自至少在三个任务上低于它.
成本: Generalist 的一次预训练花 37.14 美元, 摊到 5 个任务每个 7.43 美元, 再加每个任务 2.41 到 15.51 美元的微调. 论文说大部分 token 花在任务 Agent 对训练集和测试集的评测上, 提示词 Agent 只读失败摘要, 输出短提示, 占比很小.
SePO 的消融怎么读如下:
| 变体 | AIME'25 | ARC-AGI-1 | GPQA | MBPP | Sudoku | 平均 |
|---|---|---|---|---|---|---|
| SePO-Generalist | 64.22 | 43.39 | 78.18 | 96.20 | 99.90 | 76.38 |
| 去掉自改进 | 62.81 | 39.76 | 76.21 | 95.95 | 99.95 | 74.94 |
| 去掉开放式进化 | 57.24 | 41.58 | 73.74 | 91.10 | 99.55 | 72.64 |
「去掉自改进」跳过预训练, 提示词 Agent 用人写的种子提示做微调. 「去掉开放式进化」把档案搜索换成每次只取最新候选的线性搜索.
按平均分算一笔: 完整 SePO 比 Manual-CoT 高 4.49. 去掉自改进后仍高 ; 去掉开放式进化后只高 . 两个组件各自的损失是 1.44 和 3.74, 加起来 5.18, 大于总增益 4.49, 说明两者不是简单相加, 有互相依赖的部分.
和 L3 直接相关的是 1.44 这个数: 提示词 Agent 改自己的系统提示, 在这个设定下贡献了总增益里的一小半. 档案搜索属于固定的外层流程, 贡献更大. 分任务看, 自改进对 ARC-AGI-1 影响最大 (), 档案搜索对 AIME'25 影响最大 ().
进化后的提示词 Agent 提示在种子流程上加了五条防御性原则, 分别针对 CoT 被截断, 牺牲严谨性, 过拟合到具体测试用例. 任务 Agent 的提示则在保留角色和答案格式的基础上, 加了针对各自失败模式的多步流程: MBPP 的提示防止 max / min 在全局命名空间里冲突, Sudoku 的提示核对分词器导致的字符丢失, ARC-AGI-1 的提示强制按坐标转录网格.
变异算子的学习问题:Promptbreeder 和 SePO 都可写成在提示空间上的随机核. 当前提示为 , 变异策略为 , 语言模型产生后代
是失败样本或上下文. 任务提示的搜索优化 , L3 部分优化核 : 哪些邻域会被访问、改动有多大、是否依据错误机制. 评估一个 不能只看单个后代, 应看它在一组父代和任务上的后代分布.
算子成功率「后代优于父代的比例」忽略提升幅度. 一个保守算子 60% 概率提高 0.1 分, 一个激进算子 20% 概率提高 10 分、80% 概率下降 1 分, 哪个更好取决于档案能否保留父代与剩余预算. 可同时估计
再按选择机制决定算子. 有回滚和宽档案时可以承受高方差, 单链搜索更偏好低灾难率.
成功率也受父代难度混杂. 零阶超变异可能更多用于停滞父代, 一阶变异用于高分父代; 后者更难继续提高, 原始比例无法公平比较. 随机把同一批父代分配给不同算子, 或按父代分数、长度和任务分层, 才能估计算子的处理效应. Promptbreeder 的统计展示实际搜索中的产出率, 不等同于算子固有排名.
变异核需要保持语义不变量. 对任务提示, 输出格式、安全约束和工具权限不应随措辞变异; 对提示词 Agent, 候选预算、可读证据与不得访问的测试集属于边界. 可以把提示拆成冻结字段与可变字段, 候选只修改声明区域. 自由文本变异若把任务缩小、删掉难例或要求调用更强模型, 分数提高并不代表策略更好.
探索幅度存在退火问题. 早期种群相似度低时, 零阶重采样扩大覆盖; 后期已经找到有效结构, 小步编辑更能保留机制. 固定算子混合浪费预算. 可以让策略根据种群多样性、连续无提升轮数和评测噪声调整算子概率. 这项调度规则若被经验更新并跨轮保留, 本身也是 的一部分.
多样性不能只按字符串距离. 两条提示措辞不同但引导相同推理流程, 行为上是同一核; 一处短改动改变工具次序, 行为差异很大. 可在一组探针上记录中间步骤、工具和错误表型, 形成行为描述子. 档案按行为簇保留高分代表, 比保存许多同义提示更有效.
Promptbreeder 少样本提示漂成「mutant」说明上下文替代了指令. 这时 可能没有学习可读策略, 只是找到让其他组件承担任务的表示. 固定上下文比较新旧提示、固定提示比较上下文, 再做交叉组合, 才能分离两者. 若变异提示的作用在上下文替换后消失, L3 策略证据较弱.
SePO 把提示词 Agent 的提示在多任务上预训练, 相当于学习跨任务核. Generalist 胜 Specialist 可能来自更广错误模式, 也可能来自更多总评测. 预算对齐需要让两者看到相同候选数与任务调用数; 迁移对齐则用完全未参与任务选择的新任务. 贪心挑选多任务池会把目标任务信息带入预训练, 任务选择也属于策略设计.
档案搜索与自改提示有交互. 更好的 能从旧节点提出更有价值的后代, 开放档案又给它提供更多起点. 消融损失相加超过总增益, 正说明边际效应依赖另一组件. 报告时应保留四格: 旧/新提示词 Agent × 线性/开放搜索. 只有三个点时, 无法完整估计交互项.
策略提示还会过拟合评价语言. 若失败摘要由固定判官生成, 可能学会响应判官惯用词, 换判官或换错误格式后失效. 迁移测试应扰动反馈表达、隐藏任务名称并更换等价执行器. 能从不同表述恢复相同错误机制, 才说明变异核学到的是诊断策略.
最终产物最好保留算子级日志: 父代、变异策略版本、输入证据、候选、逐样本差值和接受结果. 这些日志支持估计算子在何种任务上有效, 也能发现某个策略只靠一次幸运后代进入档案. 没有条件统计, 「变异提示进化了」只能描述系统结构, 不能说明它学会了什么.
3. 换到真实规模: Polaris 的 7B 与 A-Evolve-Training 的 30B
3.1. Polaris: 直接复现 Gödel Agent 失败
上一篇的系统都用 GPT-4o, Claude 3.5 Sonnet, o3-mini 这一级的模型. Kakade 等人 (2026) 的 Polaris 问的是: 换成 7B 模型还能不能跑. 他们先用 Qwen2.5-7B-Instruct 直接复现 Gödel Agent, 10 小时内反复显存溢出. 把记忆里保留的历史工具调用条数从 10 降下来再试, 每种设置跑 5 次:
| 设置 | 结果 | MGSM | DROP | GPQA | LitBench |
|---|---|---|---|---|---|
| 保留 3 条 | 成功改进 | 0 | 1 | 0 | 0 |
| 无改进 | 5 | 2 | 5 | 1 | |
| 失败 | 0 | 2 | 0 | 4 | |
| 保留 5 条 | 成功改进 | 0 | 0 | 0 | 0 |
| 无改进 | 0 | 0 | 0 | 2 | |
| 失败 | 5 | 5 | 5 | 3 |
保留 5 条时显存溢出; 保留 3 条时溢出少了, 但上下文太短, Agent 卡在重复和幻觉出来的工具调用里. 20 次运行里只有 1 次成功. 再缩上下文, 行为会更不可控. 结论是 Gödel Agent 不能简单搬到小模型上.
3.2. Polaris 的修复循环
Polaris 把自由改写换成一个有结构的修复循环:
- 在验证集上评测当前策略, 收集 个失败样本.
- 失败分析: 对每个失败样本生成反思, 诊断错误原因.
- 策略合成: 把多条反思抽象成可复用的指令, 论文叫经验抽象.
- 补丁生成: 按指令生成最小的代码补丁.
- 集成与检查: 把补丁并入当前策略得到候选, 先检查能否执行, 能执行就通过运行时代码修改替换当前策略; 不能执行就重试, 次数有上限.
为了控制显存, 记忆里只保留有限条失败样本和缩减后的工具调用历史 (保留 6 条). 补丁保留在策略里, 同一个基准的新样本上继续使用.
4. 大规模实验的证据与决策
4.1. Polaris 的成功率与 A-Evolve-Training
每种设置每个数据集跑 10 次:
| 结果 | MGSM | DROP | GPQA | LitBench | |
|---|---|---|---|---|---|
| 3 | 成功改进 | 5 | 3 | 4 | 6 |
| 无改进 | 1 | 2 | 4 | 1 | |
| 失败 | 4 | 5 | 2 | 3 | |
| 5 | 成功改进 | 4 | 3 | 5 | 5 |
| 无改进 | 1 | 1 | 2 | 1 | |
| 失败 | 5 | 6 | 3 | 4 |
汇总: 时 40 次里成功 18 次 (45%), 失败 14 次; 时成功 17 次 (42.5%), 失败 18 次. 和 Gödel Agent 直接复现的 1/20 相比是明显提升, 但仍有大约一半的运行不成功. DROP 成功率最低, 论文归因于 DROP 的上下文更长, 更容易显存溢出. 从 3 增加到 5, 性能波动变小, 但抽象出来的经验也更笼统.
逐轮的分数只以曲线给出 (成功运行与基础策略和 CoT-SC 的对比), 正文没有给具体数字. 同量级但工具调用和元推理能力较弱的 DeepSeek-Coder-6.7B-Instruct, Llama-3.1-8B-Instruct, Mistral-7B-Instruct-v0.3 在初步实验里全部失败.
论文把失败归为两类: 元推理能力不足, 诊断不出失败原因, 修复变成没有进展的噪声; 工具调用能力差加上显存溢出, 来自累积的上下文, 幻觉出来的工具调用, 重复评测, 不可恢复的策略修改.
A-Evolve-Training: 30B 模型的自主后训练:Shi 等人 (2026) 报告了一个没有人参与的后训练循环. 对象是 30B 参数的 Nemotron 3 Nano, 任务是公开的 NVIDIA Nemotron-Reasoning Challenge: 一组逻辑推理谜题, 要找出并应用潜在的变换规则, 覆盖位运算, 代数方程等领域. 循环跑了四轮, 每轮在多块 H200 的集群上训练, 整个过程持续数周. 从人写好初始基座到最终提交, 中间没有人干预.
论文把一次研究迭代拆成四个要素, 并估计了从 GPT-2 级 (约 124M) 自动研究到 30B 后训练, 每个要素的成本放大倍数 (论文明确说这些是数量级估计, 不是测量):
| 要素 | GPT-2 级 | 30B 后训练 | 倍数 |
|---|---|---|---|
| 假设 (试什么) | 主要是架构系数和优化器超参数 | 合成数据构造, SFT 或 RL, 损失设计, 学习率计划, 数据配比, 检查点选择, 评测设计 | 约 |
| 执行 (跑一次试验) | 每次几分钟 | 多周 H200 训练 | 约 |
| 策略 (预算怎么分配) | 几分钟就有反馈, 可以大范围扫描 | 每次试验几小时到几天才有反馈, 常带噪声 | 约 |
| 基础设施 | 单 GPU 单脚本 | 多 H200 的 Kubernetes 编排, 检查点管理, 评测框架, 榜单提交, 故障恢复 | 约 |
小规模时, 单次运行的随机种子噪声可以靠廉价重复平均掉; 30B 时每次重复都是一次完整训练, 噪声成了硬约束.
A-Evolve-Training 的三个设计如下:
不可变的基座. 一个人工核验过的工作区 default/, 包含基础检查点, 数据构造流水线, 训练和评测代码. 每轮都从它分叉出隔离的候选沙箱, 赢家的配方也不覆盖它, 下一轮也不从上一轮赢家分叉. 这样第四轮的配方和第一轮的配方是在同一个基础上测的, 可以直接比.
同质, 无记忆的 worker. 每轮启动 个相同的全栈 Agent: 1 个只跑基线, 用来校准噪声; 7 个各探索一条正交的方向. 每个 Agent 自己改训练配方和数据流水线, 提交 GPU 任务, 调试失败, 评测检查点, 写结果. 轮与轮之间不带任何状态. 论文说他们最初模仿人类研究团队, 设了数据 Agent, 训练 Agent, 评测 Agent 分工接力, 结果不行: 在别人的中间状态上叠加改动, 会把没观察到的方差和想要的改动一起叠加, 破坏选择所依赖的信号.
轮级证据汇总与只改策略的提升. 每轮结束时:
- 每个候选输出一份类型化的结果清单: 探索的方向, 配方差异, 各检查点的分数, 观察到的失败模式.
- 一个一次性的汇总 Agent 读所有清单, 抓取公开榜单, 写一份固定五节的轮次报告: 各候选摘要, 跨候选模式, 开发分与榜单的校准, 意外发现, 设计依据审查.
- 一个元 Agent 根据报告重写下一轮的滚动搜索策略. 它的系统提示是一份冻结的「章程」, 它对章程只有读权限.
元 Agent 能改的是: 后续候选继承的标准配方, 按章程的元规则提升或淘汰搜索方向, 一个只增不减的「不要在这些上浪费预算」清单, 以及当前的提升门槛 (按观察到的种子方差校准). 章程规定的元规则包括: 榜单为准; 开发分与榜单之差作为校准信号; 榜单连续两轮停滞就轮换方向类别.
论文把这三个设计归结为「不对称的自由」: 要保持不变才能让试验可比的部分 (基座, 评测框架, 对比基线), 自由度为零; 探索能产生价值的部分 (尝试哪种改动), 自由度最大.
四轮轨迹如下:
| 轮次 | 搜索模式 | 开发分 | 榜单 | 循环学到了什么 |
|---|---|---|---|---|
| 0 | 基座 | 0.79 | 0.80 | 人写的固定基线 |
| 1 | 配方稳定 | 0.82 | 0.82 | 学习率计划, 优化器设置, LoRA 容量, 梯度裁剪同时影响开发分和榜单, 此时最大化开发分是合理的 |
| 2 | 叠加与校准 | 0.84 | 0.84 | 早期改进可以叠加, 但种子噪声大到小幅开发分提升不再可信, 开始把重复和校准当成研究问题 |
| 3 | 利用代理指标 | 0.93 | 0.85 | 把开发分推到新高, 尤其是把长期卡在约 0.65 的方程领域拟合到 0.82, 但榜单几乎不动 |
| 4 | 感知代理失效的搜索 | 0.89 | 0.86 | 改为寻找在外部分布下可迁移的干预, 如领域再平衡, 按重新加权的标准选检查点 |
把开发分减榜单记为 :
前三轮开发分和榜单几乎同步, 第三轮落差突然扩大到 0.08, 第四轮收窄到 0.03, 同时榜单从 0.85 升到 0.86. 最终 0.86 对榜首人类提交的 0.87, 截至 2026 年 6 月 1 日在约 4000 个提交里排第 8.
代理指标失效:第三轮的情况: 候选把总开发分推到 0.93 到 0.94, 方程领域从约 0.65 提到 0.82, 外部表现仍在 0.84 到 0.85 之间. 循环接着做了一个反向干预: 把方程领域的数据权重调低. 这个领域的内部分下降了, 外部分没有下降. 正向和反向两组干预合起来说明: 在代理指标下吸引最多优化压力的领域, 并不是真实性能的瓶颈.
下一轮的搜索策略因此改了目标: 不再要求 worker 提高开发分, 而是寻找可能降低开发分但提高外部分的干预, 并且开发分的提升除非通过外部探测, 否则视为可疑. 论文对这个结论的范围说得很窄: 它不证明内部指标没用, 只说明过了这个分数段, 内部指标不再是可靠的因果向导; 而且这只是一次没有复现的运行.
同一系统还对 120B 和 550B 的 Nemotron 做了端到端后训练, 但那个规模没有可比的人类基线, 论文只把它当作循环能在这个规模跑通的基础设施证据, 不作效果声明.
7. 参考来源
- Kaiqi Wang, Wenjin Hou, Yuchen Yan 等 (2026). Diving into Reliable Self-Evolving Agents: A Survey. §6.2 Learning Better Improvement Strategies, §6.3 Reliability and the Fixed-Criterion Limit.
- Eric Zelikman, Eliana Lorch, Lester Mackey, Adam Tauman Kalai (2024). Self-Taught Optimizer (STOP): Recursively Self-Improving Code Generation. COLM 2024.
- Chrisantha Fernando, Dylan Banarse, Henryk Michalewski, Simon Osindero, Tim Rocktäschel (2023). Promptbreeder: Self-Referential Self-Improvement via Prompt Evolution.
- Wangcheng Tao, Han Wu, Weng-Fai Wong (2026). SePO: Self-Evolving Prompt Agent for System Prompt Optimization.
- Aditya Kakade, Vivek Srivastava, Shirish Karande (2026). Polaris: A Gödel Agent Framework for Small Language Models through Experience-Abstracted Policy Repair. Findings of ACL 2026.
- Zhan Shi, Bing He, Yisi Sang, Hanqing Lu, Benoit Dumoulin (2026). A-Evolve-Training: Autonomous Post-Training of a 30B Model.
- Prannay Hebbar 等 (2026). SIA: Self Improving AI with Harness & Weight Updates.
- Zhengyu Chen 等 (2026). Co-Harness: Co-Evolving Harnesses and Model Weights for LLM Agents.
- Haechan Kim 等 (2026). WHALE: A Simple Recipe for Joint Harness-Weight Optimization.
上一篇: 4.1.1 · L3: 自指智能体 · 下一篇: 4.1.3 · L4: 评判标准自演化