CoEvolve: Training LLM Agents via Agent-Data Mutual Evolution
速读卡片 (TL;DR)
一句话:标准 GRPO 在固定数据分布上训练 agent 早晚撞墙;CoEvolve 让数据分布跟着 agent 一起演化——从训练 rollout 中抽取 forgetting / boundary / rare 三类信号,用 LLM 在真实环境中针对弱点重采,蒸馏成新任务、跑通环境验证、并入训练集,形成agent ↔ data 的闭环。
立场:这不是又一个 "synthetic data" 论文,而是把 data distribution 本身当作可优化变量,与 policy 同时 minimize 一个隐式联合目标。结构上是 AlphaZero self-play 的"环境/数据"侧泛化版,工程上落在 GRPO 之上做一层正交叠加。
1. 动机:为什么固定数据分布的 RL 注定撞墙
1.1 历史脉络:从模仿专家到 RL,但数据始终是个静态快照
训练 LLM agent 走过三个范式。第一代是 expert-supervised:让人类专家在真实环境里(网页、操作系统、应用 API)亲手交互,记录成 trajectory,然后做 SFT。代表如 WebGPT、Voyager 的早期变体、AppWorld 自带的人写训练集。问题清晰:一条轨迹动辄几分钟人力,长尾根本铺不满,agent 一旦碰到按钮文字从 "Book Now" 改成 "Reserve Now" 就懵了。
第二代是 LLM-synthesized:既然人类太贵,就让 GPT-4 / Claude 类大模型扮演专家自己跟环境玩,生成合成轨迹。AgentTrek、AgentBank、Explorer、LAM Simulator 都是这条路。便宜了,但探索是 open-loop 的——LLM 凭世界知识 random 地走,跟"agent 实际上哪里弱"无关。
第三代是 RL: DeepSeek-R1 把 GRPO 推上王座之后,大家把 GRPO 套到 agent 上(Agent-RL Scaling Law、DeepAgent 等)。policy 在变,但数据集 D 是冻结的——每个 epoch 反复采样同一批 prompts/tasks,只是 reward 信号驱动 policy 更新。这就是论文要打的靶:policy 演化、data 不动 → 训到一定步数,signal 信噪比塌方,GRPO 平台期到来。Fig 3(a) 显示 baseline 在 ~step 60 处先升到 0.29 后回落到 0.23,典型的"会的越练越熟、不会的永远碰不到"症状。
1.2 别的方案为什么不够
| 方案 | 数据来源 | 是否 closed-loop | 缺陷 |
|---|---|---|---|
| SFT on expert traces | 人写 | 否 | 贵、覆盖窄、generalization 差 |
| 静态 synthetic (AgentTrek 等) | LLM open-loop 生成 | 否 | 探索浅,与 agent 弱点解耦 |
| Reflexion / 自反思 | 当前 trajectory | 半 | 停留在 inference-time,不修改训练分布 |
| ReST (self-training) | policy 自采 | 半 | 只在已有 prompt上反复采样,没新任务 |
| Curriculum Learning(手工) | 人定难度递增 | 否 | 课程是先验设的,不响应 agent 实际表现 |
| 普通 GRPO | 固定 D | 否 | data distribution 与 policy 的 mismatch 越来越大 |
| CoEvolve | LLM × env × feedback | 是 | —— 本文要论证的方案 —— |
关键 distinction:Reflexion 和 ReST 也"用了反馈",但它们要么停在 inference 不影响训练,要么只在固定 query 池上 resampling。CoEvolve 是把 agent 推回环境去发现新的 executable query——data evolution 不止是改写或筛选,而是开拓。
1.3 为什么这事不平凡(joint optimization 的稳定性问题)
"让数据跟着 agent 演化"听起来是显而易见的好主意,但工程上有三个坑:
- 双向反馈循环可能崩塌。agent 弱点 → 生成更多类似数据 → agent 在该区域过拟合 → 别的能力退化 → 反馈信号噪声化 → 进一步歪曲数据。这是 self-play 体系经典的 mode collapse / runaway dynamics 风险。
- 反馈信号是从当前 policy 派生的,policy 早期能力差时,signal 本身就 noisy(论文 Limitations 自己承认)。一开始就让 noisy signal 主导数据生成会放大错误。
- 合成任务可能不可执行。LLM "幻想"一个 task,但环境里压根没那个 API、那个文件、那个状态——这种垃圾任务掺进训练集,GRPO 的 advantage 估计就废了。
论文给出三剂稳定性药方:(1) signal 是低门槛、易解释的统计量(forgetting / boundary / rare),不是某个学到的 critic,避免"以噪治噪";(2) environment validation 强制每个合成任务跑通真实环境才能入库,过滤幻觉;(3) 数据分布是追加的而非替换(D_t = D_0 ∪ 历次合成),保留旧任务防灾难性遗忘。下文按这条主线展开。
2. 背景速查
| 术语 | 含义 / 与本文关系 |
|---|---|
GRPO | Group Relative Policy Optimization。每个 prompt 采 K 条 trajectory,advantage 用组内 reward z-score。CoEvolve 直接用 GRPO 作底层 RL,不改它。 |
forgetting signal | Toneva 2018 的概念:某样本曾经预测对、现在预测错。CoEvolve 把它从 supervised 推到 RL trajectory 级别。 |
boundary signal | 同任务的 K 条 rollout 既有成功又有失败 → policy 处于决策边界。等价于 high-variance reward 任务。 |
rare signal | action pattern 出现频率 < θ% 但 > 0 → 系统性 underexplored。 |
self-play | AlphaZero 风格:opponent 跟自己一起强。CoEvolve 把"opponent"换成"data",但闭环结构同源。 |
POET (Wang et al. 2019) | Open-ended evolution:同时演化 agent 与 environment。CoEvolve 是其精神 LLM 版。 |
AppWorld | 模拟应用生态(日历、邮件、Spotify 等),agent 通过 Python API 调用完成任务,30 步上限。 |
BFCL-V3 Multi-Turn | Berkeley Function Calling Leaderboard:多轮 tool-use,任一中间步出错即整条失败,长程 strict metric。 |
TGC / SGC | AppWorld 指标:Task / Scenario Goal Completion。SGC 要求 scenario 内所有子任务都成功,更难。 |
GRPO 一句话回顾
其中 r_{k,t} = π_θ(a^k_t|s^k_t) / π_{θ_old}(a^k_t|s^k_t),Â_k 是 group-relative advantage(组内 z-score),CLIP 同 PPO。CoEvolve 在哪里采 prompt 这一步把 D 换成 D_t,其余完全不动。
3. 框架总览:三阶段闭环
这套结构与 AlphaZero 的 self-play 同构:policy ↔ opponent 改成 policy ↔ data distribution。所不同的是 AlphaZero 的 opponent 总是当前 policy 自己,而 CoEvolve 的 data 是由外部 LLM(论文用 Qwen3-Max)在 weakness 信号驱动下生成的——所以严格说更像 POET 的"LLM-as-environment-generator"变体。
4. Stage 1: GRPO 训练 + 三类 weakness signal
4.1 三个信号的精确定义
训练循环里每个 task x ∈ D_t 都跑 K=8 条 trajectory。在更新 policy 的同时,对每条 trajectory 记三种标签:
| 信号 | 触发条件 | 语义 |
|---|---|---|
| forgetting | 近 W 步窗口内存在 s_i ≥ 0.5,但 s_now < 0.5 | policy 退化:之前会做的现在又不会了 |
| boundary | 同 task 的 K 条 rollout 中既有 R̃ > 0.5 又有 R̃ < 0.5 | policy 在决策边界震荡 |
| rare | action pattern p 的 c_p / N < θ/100,θ=5,且 c_p > 0 | 系统性 underexplored 模式 |
三种是 OR 的:同一 trajectory 可同时被多个信号标注,全部保留。Fig 4 显示 boundary 占比最高(AppWorld 51.4%、BFCL 45.5%),forgetting 次之、rare 最少。
4.2 worked example
设 task = "把 Spotify 上 Like 数最高的歌的歌名改成大写发到我的 Twitter"。在 step 60 训练步,K=8 条 rollout 的 reward 是:{1, 1, 1, 0, 1, 0, 0, 1}(5 succ / 3 fail) → boundary 触发。窗口 W=10 内,这个 task 的 score history = [0.6, 0.7, 0.8, 0.9, 0.7, 0.5, 0.3, 0.4, 0.5, 0.625](s_now=0.625 ≥ 0.5,所以 forgetting 不触发,但若 s_now=0.4 则触发)。同时这条 trajectory 用了 spotify.search_by_likes(),在全局 50000 次 action 中只出现 200 次(0.4% < 5%) → rare 触发。该 trajectory 被打上 {boundary, rare} 双标签,送进 Stage 2。
5. Stage 2: signal-guided 环境再探索
5.1 把"为什么失败"翻译成"去哪里探索"
对每条 signal-annotated trajectory,系统把整段交互历史(task 描述、agent 动作序列、env 反馈)喂给一个外部强 LLM(Qwen3-Max),prompt 它做两件事:
- Reflection:诊断失败原因或不稳定来源。例如:"agent 反复调用
spotify.search()但忽略了limit参数,导致返回截断"。 - 构造 exploration context:把诊断结构化成"在哪里、怎样探索"的指令。
然后用这个 context 去驱动同一个 LLM 在真实环境中再跑——两个正交维度的探索:
- multi-round: 同一 context 启动 R 次独立 rollout,鼓励行为多样性
- multi-step: 每条 rollout 在环境里走多步,根据中间观察修正动作
每步记 (a_t, o_t, id) 三元组,id 标记属于哪次 rollout。最终 Stage 2 输出一堆 step-level triplets,按 task context 分组送 Stage 3。
6. Stage 3: task abstraction & environment validation
6.1 从动作流到任务规格
Stage 2 的 triplets 是 低层动作记录,直接拿来训 GRPO 不行——GRPO 需要的是 (task query, executable solution) 对。Stage 3 做两件事:
- Triplet aggregation + LLM abstraction:把同 context 下多次 rollout 的 triplets 聚成一组,prompt LLM 反向推断"这组动作是为了完成什么任务",生成 (task query, solution sequence) pair。例如把 5 次涉及
cp / cat / echo的探索抽象成 "Create a non-empty test file, copy it, verify content identical"。 - Environment validation:把生成的 (query, solution) 重新提交给一个 LLM agent 在真实 env 里执行。三种结局:
- 执行成功 → accept
- 执行失败但 env 给了 positive reward → retain(部分正确也算)
- 执行失败且 reward = 0 → discard
幸存者并入 D_{t+1}。整个 pipeline 一次循环大约消耗 9.7%–12.8% 的相对训练时间(Table 7)。
7. Worked Example: 文件操作任务的三轮演化
用论文 Fig 6 的 BFCL 文件操作家族为例,模拟三轮 CoEvolve 演化:
Round 0 (D_0,初始 unguided 合成,N=100)
Task: "Transfer a duplicate of 'test_document.txt' over to the
archives folder and rename it 'final_document.txt'"
Solution:
cp(source='test_document.txt', destination='archives')
cd(folder='archives')
mv(source='test_document.txt', destination='final_document.txt')
Agent 在 step 0–60 的 GRPO 训练中,这种"线性 3 步"任务全部学会,reward → 1.0。但它从没学过验证拷贝结果。
Round 1 (step 60 触发 stage 2/3)
boundary signal 触发:某些 file 类任务的 K=8 中混了成功和失败,失败的都涉及"目标文件已存在"。LLM reflection: "agent 没有处理 destination 已存在的情况"。Re-exploration 在环境里跑出涉及 touch / echo / cat / cp 的多种序列。Abstraction 给出:
Task: "Create a non-empty test file 'test.txt', copy it to
'test_copy.txt', and verify both files have identical content"
Solution:
touch(file_name='test.txt')
echo(content='This is test content...', file_name='test.txt')
cp(source='test.txt', destination='test_copy.txt')
cat(file_name='test.txt')
cat(file_name='test_copy.txt')
Validation pass → 入 D_61。注意这是结构上更长(5 步)、语义上引入 "verification" 概念的全新任务,与 D_0 中的任何任务都不近邻(论文 Fig 5 显示大部分合成任务的 max cosine 落在 0.4–0.7)。
Round 2 (step 120,训练结束前最后一次)
forgetting signal 触发:部分 round-1 加入的 verification 类任务,在 step 100 之后开始 score 退化(window 内有 0.7,现在 0.3)。Reflection:"agent 在长 task 末尾误用 cat 的输出格式"。Re-exploration 加入 diff / wc / md5sum 等罕见 action(rare signal 协同触发)。新任务:
Task: "Create file A with 100 random bytes, copy to B, then
confirm via byte-count that A and B match"
Solution: ... (含 wc -c 比较步骤)
这条 rare-action 任务再次扩大覆盖。整个轨迹:D_0 → D_61 → D_121,任务结构从 3 步 → 5 步 → 7+ 步,与 Fig 7 观察到的"synthesized 比 original 更长尾、步数更多"完全吻合。
8. 稳定性:为什么联合优化没有崩
这是这篇论文最值得 RL 工程师细看的地方。Joint optimization 听起来美,实际有 4 个隐式机制在防 collapse:
- D_t 是单调追加,不替换。D_t = D_0 ∪ ⋃_{i<t} new_i。即便后期生成偏离了,D_0 的 100 个种子任务一直在,policy 不会失去原始锚点。
- signal 都是低阶统计,不是 learned predictor。forgetting 用滑窗 score、boundary 看 reward 方差、rare 看频率——三者噪声有界、可解释、不会随 policy 演化飘移。对比那些用学到的 reward model 来选 hard examples 的工作,这套设计稳得多。
- environment validation 是硬过滤。合成任务必须真在环境里跑通才进库,LLM 幻觉无法污染 D_t。
- signal-driven pass rate 自然趋稳。论文 Fig 3(d) 显示 0.71 → 0.85 → 0.80 ——agent 越练越能解决 signal 区域,新合成任务的难度就自适应地保持在边缘可学习区(GRPO 的 advantage 才有信号)。这是个隐式 curriculum 自调节:不是手工设的难度递增,而是难度始终贴着能力边界。
9. 实验关键结果与 ablation
9.1 主表数字(Table 1 摘要)
| Backbone | AppWorld TestN TGC | BFCL Multi-turn | 5-bench Avg. |
|---|---|---|---|
| Qwen2.5-7B-Inst | 1.19 → 27.98 | 13.5 → 61.5 | 3.08 → 22.51 (+19.4) |
| Qwen3-4B-Inst | 16.67 → 35.71 | 26.5 → 63.0 | 11.72 → 27.30 (+15.6) |
| Qwen3-30B-A3B | 31.55 → 54.76 | 43.5 → 67.0 | 22.64 → 40.78 (+18.1) |
| 对比 Claude-Sonnet-4.5 | 73.81 | 69.0 | 56.08 |
| 对比 GPT-4 | 30.40 | 54.0 | 25.94 |
读这表的关键不是绝对数(Claude 还是赢),而是纯 GRPO 的提升上限被打破:Table 2 显示在 GRPO 已经收敛之上 CoEvolve 还能再加 +6 (4B AppWorld) / +5 (4B BFCL) / +6 (30B AppWorld)。
9.2 关键 ablation
- Phase ablation(Table 3,Qwen3-4B 平均):zero-shot 21.6 → +synthetic 43.3 → +random expl. 45.4 → +feedback 49.4。最后 4 分纯由 feedback 提供。
- Signal ablation(Table 5):去掉 forgetting -4.2,boundary -2.2,rare -2.2。三者互补。
- Validation ablation(Table 11):AppWorld -8.3,BFCL -4.5。证 validation 不可省。
- Cross-domain(Table 6):训 AppWorld → 测 BFCL,从 26.5 涨到 45.0;训 BFCL → 测 AppWorld 涨幅小(16.7→19.0)。说明 AppWorld 的复杂任务能教出更通用的 tool-use 元技能。
- Hyperparameter(Table 4 / 14):N=100、F=10 是甜点。F=2 更频繁更新略好(BFCL 62)但贵;F=40 太稀疏退化。
- Cost(Table 7):CoEvolve 占总训练时间 9.7%–12.8%,换 +22.92% / +8.62% 相对增益,ROI 显著。
10. 与同类工作对比
| 方法 | 数据演化? | 反馈来源 | 新任务来源 | 与 CoEvolve 关键差异 |
|---|---|---|---|---|
| AgentWorld | 是 (env 演化) | RL reward | 动态生成 env 配置 | 演化的是环境不是任务集;CoEvolve env 固定,任务集滚动 |
| POET (2019) | 是 | 共演化 | 变异 env | CoEvolve 是 LLM-agent 时代的精神继承,但用 LLM 替代 EA 算子 |
| AlphaZero self-play | — | 对手 = 自己 | 新对局自然生成 | 结构同源,但 CoEvolve 不是 zero-sum;data 不是 opponent |
| SEC / SELAUR / Self-Evolving World Knowledge | 半 | self-judge | 改写已有数据 | 停在改写层,不真去环境探索新 executable query |
| PRIME / Process Reward | 否 | process critic | — | 正交工作:PRIME 改 reward,CoEvolve 改 prompt 分布 |
| Reflexion | 否 | verbal reflection | 同 task 重试 | inference-time 自我修复,不进训练 |
| ReST (Gulcehre 2023) | 半 | policy 自采 | 固定 prompt 池 | 不会发现新 query |
| Curriculum Learning(手工) | 否 | — | 人定难度 | 课程是 prior;CoEvolve 是 emergent curriculum |
| Co-evolving Coder & Unit Tester (Wang 2025c) | 是 | coder vs tester | 测试用例 | 对偶任务专用;CoEvolve 是单 agent 通用框架 |
CoEvolve 相对 AgentWorld(同期工作)最 sharpest 的差异:AgentWorld 演化环境本身(生成新场景、新 entity),CoEvolve 在固定环境(AppWorld、BFCL)里演化任务分布。两者其实可叠加——理论上一个能同时演化 env 又演化 task 的系统是更彻底的 POET 复刻。
11. 局限 / 个人 take / 待验证问题
- 外部 LLM 依赖:Stage 2/3 用 Qwen3-Max 做 reflection / abstraction。Table 12 显示用更弱的 LLM 做 explorer 时增益缩水(Qwen3-4B 只到 56.5)。这意味着 CoEvolve 在某种意义上是"用大模型蒸馏小模型 agent"的间接形式,与 pure self-improvement 还有距离。
- signal 在早期 noisy:论文自承 limitation——policy 早期不成熟时,forgetting/boundary 的统计基础就薄。可能需要 warm-up 阶段不加 evolution。
- safety 风险:autonomous reshape 训练分布意味着 agent 可能向危险区域演化。论文提了一句要 human oversight,但没具体方案。
- boundary signal 占比 50%+:是不是说明三个信号其实重复多?但 Table 5 ablation 又说 forgetting 单独贡献最大,而 boundary 占比最大。两者矛盾的可能解释:boundary 数量多但每条 marginal 价值小,forgetting 数量少但每条信息密度高。
- evaluation set 与 D_t 的潜在 leakage:Fig 5 显示部分合成任务对 validation 任务 cosine 高达 0.9。虽然作者说 mixed similarity 最好,但 0.9+ 那一档应该排除以严防 leak。
个人 take:这是一篇结构清晰、工程可复现的论文,不靠新 RL 算法,只靠"把数据当变量"这一招。它的真正价值不是 +18 分,而是给社区提供了一个可叠加的第二条优化轴:大家以前 90% 的精力在改 J(θ) 这个目标函数,本文论证了改 D_t 同样有杠杆。再过一年,我估计 GRPO + data evolution 会变成 agent RL 的默认 recipe,就像 PPO + KL penalty 当年那样。
待验证问题(顺序排列)
- 把 D_t 上限去掉(无限增长)会怎样?会 OOD 还是会更好?
- signal 三选一时,只留 forgetting 是不是已经能恢复 95% 性能?
- 用 GRPO 之外的 RL(GSPO、StepGPO)做底层,evolution 的增益还在吗?
- 把 explorer 也换成被训练的 policy(纯 self-play),不依赖 Qwen-Max,会崩还是稳?
- Cross-domain transfer 不对称(AppWorld→BFCL +18.5,反向 +2.4),为什么?是 task 复杂度不对称还是 signal 类型分布不同?
- 把 AgentWorld 的 env 演化与 CoEvolve 的 task 演化叠加,POET-完整版,能否再上一个台阶?
12. Memory points(冷回忆用)
CoEvolve 精读 · 2026-05 · arxiv:2604.15840 · 与 03 AgentWorld 互参