Recursive Agent Optimization
Apurva Gandhi, Satyaki Chakraborty, Xiangjun Wang, Aviral Kumar, Graham Neubig
cs.LG, cs.AI, cs.CL, cs.MA
2026-05-08
用强化学习训练能递归派生子任务的 agent。8K 上下文训出的递归 agent 把硬任务成功率从单 agent 的 0% 提到 88%,还能处理超出上下文窗口的任务。
单 agent 跑长程任务有三个麻烦:历史越来越长、每步把整段历史重新塞进上下文(token 随步数二次膨胀)、还得分头探索。常见做法是套一层多 agent 脚手架,但模型本身从没被训过该什么时候拆、怎么拆、拆完怎么合。CMU 加 Amazon AGI Labs 这篇的判断是:脚手架不该只是绕着模型搭,模型得被训练去用好脚手架。
递归 agent 就是让 agent 在推理时调一个 launchsubagent,派生出自己的一个新实例去解子任务,子任务还能再派生,形成一棵执行树。每个子 agent 拿到的是全新上下文窗口,等于把有效工作记忆撑开了。难点在于:rollout 不再是平的轨迹而是一棵动态长出来的树,跨树做信用分配很难;同一个策略在每个节点既要会解题、又要会拆任务。
推理侧,递归 agent 基于 CodeAct 风格的 Python REPL,递归原语是个异步函数 launchsubagent。异步意味着多个子任务能并发,也有先后依赖时串行;返回值不限类型,父 agent 用普通 Python 控制流收子任务结果。递归深度和每实例步数都有上限。
训练侧,RAO 给每个节点一个局部奖励:节点自己任务的成功率,加上它直接子节点成功率的均值乘 λ。用均值而不是子节点成功数量,是不想让策略靠狂派子任务刷分。λ=0 退化成纯局部奖励;策略初始就够会拆时用 0,初始不太会拆时(比如 Oolong)用 0.4 给点信号。信号可以是精确校验、LLM judge,或者拿根任务成功当代理。
优化目标按深度求和,根任务采 G 棵 rollout 树,优势用根奖励的留一基线(同一棵树所有节点共享这个基线),并用按深度逆频率加权,防止深层的海量轨迹淹没浅层。这套是 GRPO 式留一基线加 CISPO 变体,异步 RL,staleness 到 3。作者强调递归执行天然生成一层自我诱导的课程:每层派生的子任务往往是父任务的更简单版本,所以训练效率的提升不只在推理时。
TextCraft-Synth(合成版 Minecraft 合成,按深度分档):
| 设置 | 方法 | 总成功率 | 硬任务 |
| 8K 训、8K 评 | 单 agent | 0.24 | 0% |
| 8K 训、8K 评 | 递归 | 0.95 | 88% |
| 40K 训、256K 评 | 单 agent | 0.73 | 20% |
| 40K 训、256K 评 | 递归 | 0.96 | 88% |
8K 训出的递归 agent 基本追平 40K 训的递归模型,硬任务从单 agent 的 0% 干到 88%,这就是「超出上下文窗口也能做」。
长上下文 Oolong-Real(30B 模型,32K 训):递归平均分 0.320,单 agent 0.203,每个上下文桶都领先;0.320 已经接近 Claude-Sonnet-4、o3、GPT-5-mini 的 0.35 到 0.37(别人论文的数)。DeepDive 深度研究 50 个留出任务:0.24 到 0.40。
墙钟时间是诚实的,能并行的任务才快。TextCraft 83.9% 的派生是并发的,硬任务比单 agent 快 2.5 倍(虽然步数多 2.8 倍);DeepDive 只有 1.6% 能并发,串行依赖重,反而慢 18 倍。token 上出现反转:TextCraft 硬任务递归用 1.2M,单 agent 用 8.6M(约 7 倍少),因为单 agent 的历史二次膨胀;但 Oolong 和 DeepDive 上递归 token 用量是单 agent 的 20 到 30 倍,因为它在干更多真活、也够到更难的题。
递归 agent 当推理时算力扩展原语:同一个模型既解题又决定拆分,深度随难度自适应(DeepDive 独立解出的任务平均深度 4,共同解出的 2.9)。对工程上想用小模型够长上下文或难任务的人,30B 递归能逼近前沿模型长上下文表现这件事很有吸引力。它也给了训练递归和多 agent 系统一个具体的 RL 配方(局部奖励加子成功率均值加深度加权)。
作者承认:每个域单独训,没做跨域泛化;子任务异质(检索、校验、实现、调试)的真实任务没测;评测只看最终成功率没看算力效率;异构递归(大模型带小专家)没碰;RL 里跑满 rollout 太贵、替代采样怎么设计是开放问题。另外几点: