Agent 自进化为什么难:约束系统比自我反思更重要
Agent 自进化的难点不是生成建议,而是用约束、验证和拒绝机制提高有效改进候选占比。
导语
一个 Agent 系统如果已经能记录 trace、执行验证、定位失败,下一步很自然会走向自我改进。
但真正难的不是“让模型提出修改建议”。这件事反而太容易了。给 LLM 一段失败日志,它可以立刻写出十条改进方向,语气合理、结构完整、看起来每条都能试。
问题也在这里:看起来合理,不等于真的有效。
Agent 自进化的核心难题,不是生成候选,而是让有价值的候选在所有候选中占比足够高。自由生成越强,搜索空间越大,噪声越多。系统不是在进化,而是在把资源消耗到一堆“像建议的建议”上。
所以,自进化的工程重点不该是“让 LLM 自己改自己”,而是设计一套约束系统,让好的改进方向更容易浮出来。

图:约束、验证和拒绝机制让有效改进方向更容易浮现
k/n 困境
可以用一个很粗糙但好用的比率描述自进化效率:
$$
\frac{k}{n}
$$
其中,k 是真正指向正确改进方向的候选数量,n 是总迭代次数。
k/n 越高,系统越快收敛;k/n 越低,系统越像在随机试错。最糟糕的情况是,候选很多、反馈很慢、验证很贵,Agent 看起来一直在“自我反思”,结果只是把错误换了几种写法。

图:自由生成与约束优化对收敛效率的影响
通用 Agent 自进化之所以难,也可以从这里解释。通用意味着不预设任务域,不预设反馈形式,不限制修改范围。约束少,k/n 就低。系统不是不能跑,而是不划算。
真正能工作的自进化系统,通常都不是“通用魔法”。它们会在某个任务域里设置强约束:只允许改某类策略,只接受验证集上严格变好的候选,只保留可解释 trace,只在有自动 verifier 的任务上迭代。
六篇工作背后的主线
从早期开放式探索,到后来的 prompt 优化、skill 优化和有界编辑,自进化研究的主线其实很清楚:约束越来越多,候选越来越窄,验证越来越硬。
| 工作 | 核心机制 | 约束强度 | 对 k/n 的影响 |
|---|---|---|---|
| Voyager | 自动课程、可执行技能库、环境反馈 | 较弱 | 靠环境和技能积累弥补噪声 |
| TextGrad | 把语言反馈类比成文本梯度 | 较弱 | 有方向,但缺少强验证门 |
| GEPA | 通过反思理解失败原因,再进化 prompt | 中等 | 比单纯打分更有方向性 |
| Agent Lightning APO | 文本梯度加 beam search,多候选并行评估 | 中强 | 用搜索和评估收窄候选 |
| Hermes Self-Evolution | 进化 skill、prompt、代码,并加测试和审查 | 强 | 用测试与人工门禁过滤风险 |
| SkillOpt | 有界编辑、验证门、慢更新、拒绝缓冲 | 最强 | 候选最窄,接受条件最硬 |
这条谱系说明一件事:Agent 自进化不是从“更会反思”走向“更会写建议”,而是从“自由生成”走向“受控优化”。
越靠后的系统,越像一个训练过程:有训练集、有验证集、有候选生成、有更新步长、有拒绝样本、有慢速记忆,还有明确的接受条件。
SkillOpt 的关键转向
SkillOpt 最有意思的地方,是把 skill 文档看成一种可训练的外部状态。
模型本身不更新,目标模型被冻结。系统优化的是一段自然语言策略,也就是 skill。这个 skill 会进入 harness,影响模型在任务上的行为。如果改写后的 skill 能让任务得分提高,它就像一次有效的参数更新。
形式化地看,可以写成:
$$
s^* = \arg\max_s ; \mathbb{E}{x \sim D{test}}[r(M(x, s, h))]
$$
这里的 s 是 skill,M 是冻结模型,h 是 harness,r 是 verifier 分数。重点不是公式,而是这个分工:模型不动,运行时不动,外部策略文档被持续优化。
SkillOpt 的训练过程可以拆成三步:

图:SkillOpt 将执行反馈转化为有界更新
这套流程最重要的不是“让模型反思”,而是每一步都在限制候选。
| 设计 | 做法 | 作用 |
|---|---|---|
| 完整 rollout | 记录任务、消息、工具调用、观察、答案和评分 | 让改进来自证据,不来自空想 |
| 成功/失败分离 | 失败样本提纠正规则,成功样本保留有效行为 | 避免只盯着错误导致行为漂移 |
| 有界文本编辑 | 限制每轮最多改几处,只允许增删改替 | 收窄候选空间 |
| 验证门 | 只有验证集严格提升才接受 | 防止“看起来更好”的改写进入主线 |
| 拒绝缓冲 | 保存被拒编辑和失败模式 | 避免重复踩坑 |
| 慢更新 | 每个 epoch 总结纵向经验 | 让优化器跨轮积累判断力 |
这里有一个很工程化的细节:慢更新和普通编辑不在同一个时间尺度上。
普通编辑解决当前这一轮的局部问题,步长小、范围窄。慢更新在 epoch 结束后发生,负责总结更长期的编辑经验。它像是在告诉优化器:哪些方向反复有效,哪些改法反复失败,哪些表述容易造成漂移。
这比单轮“自我反思”更接近真正的优化。
六道护栏
把 SkillOpt 和其他自进化工作放在一起看,可以抽出六道护栏。它们分别提高方向性、收敛性和长期稳定性。
| 护栏 | 解决的问题 | 典型做法 |
|---|---|---|
| Domain-pack | 让系统知道当前域的目标、约束和先验 | 固定任务域、任务背景、验证标准、专用策略 |
| 完整 trace 与分层消费 | 让改进来自真实执行证据 | 记录 rollout,并区分失败、成功、工具反馈 |
| 可控候选空间 | 降低无效搜索 | 限制修改模块、编辑次数和编辑类型 |
| Judge 信号转正负样本 | 明确什么该接受、什么该拒绝 | verifier、测试集、验证门、人工审查 |
| 编辑历史记忆 | 避免重复和矛盾修改 | rejected buffer、历史候选、失败模式记录 |
| 优化器自进化 | 让改进策略本身积累经验 | 慢更新、meta skill、跨 epoch 总结 |
这六道护栏可以对应到 k/n:

图:自进化系统需要多层护栏过滤风险
前两道护栏帮助系统知道该往哪里改,中间两道护栏减少无效候选,最后两道护栏让系统不要每轮都从零开始。
缺少任何一道,都会漏气。
没有 domain-pack,自进化会变成泛泛建议。没有 trace,改进没有证据。没有候选空间限制,系统会在无限文本空间里游荡。没有验证门,模型会把“更像道理”的修改当成进步。没有历史记忆,错误会反复出现。没有优化器自进化,系统很难跨轮积累经验。
通用性不是现在的重点
很多人会自然地问:能不能做一个通用自进化 Agent?
至少在当前阶段,这不是最值得押注的问题。
更现实的路径是:先选一个有明确 verifier 的任务域,把六道护栏做扎实,在域内做到可迁移。
域内迁移和跨域通用不是一回事。
| 类型 | 约束是否保留 | 难度 |
|---|---|---|
| 跨模型迁移 | 任务域不变,验证标准不变 | 相对可行 |
| 跨 harness 迁移 | 任务域不变,执行环境变化 | 可行但要处理接口差异 |
| 跨 benchmark 迁移 | 同域任务变化 | 取决于任务分布 |
| 跨领域迁移 | domain-pack 失效 | 难度陡增 |
一旦换领域,原来的任务先验、错误模式、验证方式和候选编辑空间都可能失效。约束变少,k/n 会下降。
这就是为什么数学、代码执行、表格操作、结构化抽取这类任务更适合先做自进化:它们天然有较硬的验证信号,trace 也更容易结构化。
开放式创作任务就麻烦得多。文案、对话、创意写作的 Judge 主观性更强,验证信号更弱。不是不能做,而是护栏成本会大幅前置。你得先解决标注、偏好建模、审查流程和质量边界。
明天就要做,先别上全套
如果资源有限,不需要一开始就复刻最复杂的系统。可以按约束强度逐步搭起来。
| 阶段 | 做什么 | 目标 |
|---|---|---|
| 跑通 | 有任务集、有 verifier、有 rollout trace,做单轮 prompt 或 skill 进化 | 证明方向能闭环 |
| 收敛 | 加入有界编辑、beam search 或编辑步长限制,再加 rejected buffer | 提高 k/n,减少重复试错 |
| 长期 | 加入 epoch 级慢更新和 meta skill,让优化器积累跨轮经验 | 让系统持续稳定改进 |
第一阶段最重要的是验证链路,不是追求最终效果。没有可复验的 verifier,自进化就会滑回“模型给模型写建议”。
第二阶段开始控制候选空间。不要让模型自由重写整份 skill,而是限制它只改某几个区块、每轮最多改几处、每处必须绑定证据。
第三阶段再考虑长期记忆。系统要知道哪些编辑被拒绝过,哪些失败模式反复出现,哪些更新在多个 epoch 后仍然有效。
这条路径的好处是,每一步都在提高 k/n,而不是盲目换更强模型。
结语
Agent 自进化不是让 LLM 自己写几条改进建议。
真正的自进化更像一套受控优化系统:任务域提供先验,trace 提供证据,候选空间被限制,verifier 决定是否接受,拒绝样本防止重复踩坑,慢更新让优化器积累经验。
模型越会自由生成文本,越需要这些约束。否则它最擅长的能力,会把系统带进低信噪比搜索。
自进化的关键不是“更会反思”,而是“更会筛选、限制和验证”。约束越清楚,好候选的占比越高,系统越接近真正的改进。


浙公网安备 33010602011771号