AgentRL: Scaling Agentic Reinforcement Learning with a Multi-Turn, Multi-Task Framework

Tsinghua & Z.AI · Hanchen Zhang, Xiao Liu et al. · 2025-10-05 · arXiv:2510.04206
关键词: agentic RL · multi-turn · multi-task · async pipeline · cross-policy sampling · task advantage normalization · GRPO · AgentBench

速读卡片 (TL;DR)

一句话:把 multi-turn agentic RL 从「单任务、同步、单 policy 采样」推到「多任务、全异步、跨 policy 采样 + 按任务做 advantage normalization」, 一个 32B 模型同时训 5 个 agentic 任务, 平均 success rate 达到 70.4%, 反超 GPT-5 / Claude-Sonnet-4 Thinking / DeepSeek-R1。

70.4%
5 任务平均 SR (32B)
+13–18 pt
vs GPT-5 / Claude-4
≈3.3×
14B 在 64 GPU 上 throughput vs 同步

立场:这篇是系统 + 算法的双轨论文。算法上的两个 trick (cross-policy sampling, task advantage norm) 都很轻;真正吃饭的是 fully-async pipeline + heterogeneous environment infra,使得「一个 model 同时学 5 个 agentic task」从 demo 变得可工程化。

See also (sibling notes,平行阅读): agents/notes/01_DR-Venus, 02_LiteResearcher, 03_AgentWorld, 04_MemPalace, 05_Rethinking, 06_AgentGymRL;以及 models/notes/08_INTELLECT3(prime-rl, 类似的 async agentic RL 设计)。


1. 动机:multi-turn × multi-task 撞上的三堵墙

从 RLHF (单步、单任务、reward model) 到 RLVR (单步、单任务、verifier),社区已经把「单步 RL」基本打通。但只要把场景换成 agentic—— LLM 要跟 OS / DB / KG / 网页 / 模拟家庭 这种环境做多回合交互, 同一套 RL 训练栈立刻处处漏水。论文 Table 2 里把痛点拆成三堵墙,我把它进一步展开成 1.1–1.3。

1.1 历史脉络:从 single-turn 到 multi-turn,bottleneck 漂移

之前以 GRPO 为代表的 RLVR 训练栈 (VeRL / OpenRLHF / EasyR1 / NeMo-Aligner) 都默认同步 (synchronous) interleaved pipeline:每个 step 内,先用 actor 把整 batch 的 trajectory 全 rollout 完,再统一做一次 forward + backward 更新。在 single-turn (math/code) 里这套是最优的 —— 所有 trajectory 长度方差小、生成时间几乎一样,GPU 几乎不会闲。

到了 agentic 场景,trajectory 由若干 (state, action, reward) 组成,每一步要等环境返回 observation 才能进下一步。WebShop 一条 trace 可能 6 步、ALFWorld 可能 30 步;OS 任务里每步还要等 docker 里 bash 跑完。结果是同 batch 内 trajectory长度方差极大,同步 pipeline 等于全队等最慢的那个,GPU 利用率从 80%+ 掉到很难看。AReaL (2505.24298) 已经指出这点,但它只解决了「reasoning task 多步思考」,环境管理还是单一的。

1.2 别的方案为什么不够 — 谁占了哪个坑、各让了什么

方案multi-turnmulti-taskfull-async异构环境主要让步
VeRL / OpenRLHF / NeMo-Aligner纯 single-turn,长尾 rollout 直接拖死
AReaLasync 但只支持单任务、不接环境
AgentTuning / AgentLM用 SFT 不是 RL,没有 online 反馈
RAGEN / DigiRL / GiGPO / ARPO✓ (单一)每个工作只面对一个环境家族 (GUI / 长 horizon)
AgentRL—— 同时打满四格

1.3 为什么这事不平凡

三堵墙叠加形成的工程 + 算法复杂度:

关键观察:三堵墙不是独立的, 它们是「scaling 多任务 multi-turn agent」必然会撞到的。这也是为什么 AgentRL 一次性给出 infra + algo 两条腿 —— 缺一不可。

2. 背景速查

术语定义 / 在本文里的用法
Agentic MDP(S^env, A, P, r, ρ);但 LLM-policy 看到的 state 是 composite s_t = (s_t^env, s_t^ctx),后者是到目前为止整段 token 历史。
High-level action a_t一整段 LLM 输出 token: a_t = (y_{t,1}, …, y_{t,L_t})。一个 turn = 一个 high-level action。
Trajectory τ(s_0, a_0, r_1, …, s_T)。论文里 T 一般 5–30。
GRPO采样一组 K 个 trajectory 共享同一 prompt, advantage = (R_g − μ_R) / σ_R。本文是 GRPO 上做 multi-task 改造。
RLVRreward 由 deterministic verifier 给(SQL 跑通?ALFWorld 任务完成?WebShop 买对商品?)。
Rollout engine独立的推理 worker (本文用 SGLang),不参与 backward。
Stale engine本文为实现 cross-policy 而引入: 一个 rollout engine 故意让 weight 几步才更新一次,用来当「另一个 policy」。
AgentBench-FC本文把 AgentBench 5 个任务改成 OpenAI function-call 格式后的版本。
GRPO 一行回忆
LGRPO = Ei,j [ (1/K) Σg min(ρg Âg, clip(ρg, 1±ε) Âg) ],  Âg = (Rg − meanj(R)) / stdj(R)

本文修改的是 Â 的算法 (per-task standardize) 和 采样分布 (cross-policy),objective 形式不变。


3. Fully-Asynchronous Generation–Training Pipeline

3.1 它和 「同步」 / 「半同步」 长什么不一样

论文 Figure 3 把 sync vs async 画了一张 Gantt 图。我把三种典型结构合并成一张更密的对照:

GPU time Sync (VeRL) Rollout (long-tail) Train Rollout (long-tail) Train ↑ huge bubbles Half-async (AReaL) Rollout group A (continuous) Train wait full batch Train Train Fully async (AgentRL) Rollout pool: coroutines per env, dynamic batch (no global barrier) Train tick Train Train Train Train Train
三层 pipeline 的 Gantt 对比。Sync (VeRL/OpenRLHF):每个 train step 都要等整 batch rollout 完。Half-async (AReaL):rollout 持续跑,但训练仍要等一个完整 batch 才能 fire。Fully-async (AgentRL):训练不再等任何 batch,从 dynamic queue 里抽到什么算什么;rollout pool 用 coroutine 调度,每个 env 一根。

3.2 实现要点

这里和 AReaL / prime-rl 的真正差别:AReaL 的 async 主要是「reasoning trajectory 内部分块吐 token」,本质还是按 query 分组训练;AgentRL 把异步颗粒度拉到 per-environment coroutine,真正让长 trace 和短 trace 不互相阻塞。INTELLECT-3 的 prime-rl 也走这条路, 但 prime-rl 是为了 distributed (跨地理位置) 而异步,AgentRL 是为了 environment 阻塞而异步。

3.3 Worked Example: 一条 30 步的 ALFWorld trace 撞上一条 5 步的 DB trace

假设 batch 里有 64 条 trace。同步模式下:1 条 ALFWorld 30 步、平均每步 1.5 s = 45 s;63 条 DB 平均 5 步 × 1.5 s = 7.5 s。Sync trainer 的 wall clock = max(45, 7.5) = 45 s,即 GPU 在 [7.5, 45] 这 37.5 s 内空转 87.5%。

Async 下:DB trace 7.5 s 完成 → 进 queue → trainer 攒到 Bmin=16 立刻 fire 第一次 train,然后第二次,然后… 在那 45 s 内 trainer 已经做了 5–6 次 update; ALFWorld trace 在 step 22 时 trainer 已经更新了好几代,这里就出现 staleness 1–6 step,这就是为什么需要队列上限 + drain 强制策略。


4. Cross-Policy Sampling — 在 multi-turn 里抢回 exploration

4.1 它要解决什么

GRPO 的 group 里 K=8 个 trajectory 是同一个 πθ 采样的。在 single-turn 里,K 条只要起始 token 不同,整体 distinguishable;multi-turn 下,K 条往往在第 1–2 个 action 就已经因为 KV cache 趋同陷入同一种策略错误(模式坍塌)。结果是 advantage 全部接近 0 (group 内 reward 方差 → 0),GRPO 梯度直接消失。

4.2 方法 — 一棵 cross-policy 树

引入一个 model pool M = {πθ(0), πθ(−1), πθ(−2), …}(实际就是 fresh 模型 + 几个 stale 模型 —— 不更新参数的早期 snapshot)。每一个 environment step,从 M 里均匀随机抽一个 π 来生成这一步的 action:

ac,(t) ~ random(M) (· | s(t))
Single (GRPO 默认) Mix (拼 K/2 + K/2) Cross-policy (本文) s₀ s₀ s₀ 3 trace 都收敛到 同一种错误 同一 trace 内 policy 不切换 每步随机抽 model trace 不再收敛同一错 π fresh π stale
三种 rollout 的差异。Single 模式下 K 条 trace 都从同一个 π 采,multi-turn 下高度相关;Mix 模式下两个 model 各采一半 trace 但单条 trace 不混;Cross-policy 把混合粒度细到 每个 environment step —— 因此一条 trace 的 sctx 可以同时具有 πfresh 的语言风格和 πstale 的探索倾向。

4.3 直觉 — 为什么这事保留了 validity

论文给了一个 grounding-function 的论证(Appendix C):每个 LLM 的输出空间 L 都覆盖到「合法语言空间」 Lvalid,而 Lvalid 通过 grounding function Γ 投影到环境 state space Senv。Cross-policy 的 supp(τc) ⊋ ∪m supp(τm) 但 supp(τc) ⊂ Lvalid —— 因为每一步都还是某个 valid LLM 给的,不会跳出 Lvalid 进入「乱码区」。这就是为什么换成 random token sampling 不行 —— 那会把你打到 L \ Lvalid

4.4 实现:fresh + stale engines

多 model 的 architecture 异构会让 KV cache 不能共享,所以本文用了一个工程 trick:让 fresh engine (每 step 同步参数) 和 stale engine (每 N step 才同步) 都跑同一个 architecture,只是权重版本不同。这样 stale 就充当「另一个 policy」, 同时兼容 SGLang 的 tensor parallel 和 cache reuse。

4.5 反向论证:不做会怎样

Figure 8a 的 Webshop 实验:K=128 时 cross-policy pass rate ≈ 0.78 vs 单 model ≈ 0.68 (Qwen2.5-14B) / ≈ 0.65 (Llama-3.1-8B)。Mix 模式 K=128 ≈ 0.72。也就是说 cross-policy 的 +10pt 提升一半来自「双 model」,另一半来自「per-step 切换」,这是 mix 拿不到的。从训练 curve (Figure 8b) 看,有 cross-policy 的 model 在 pass@k 大 k 时持续高 ~5pt,说明它保留了 diversity。


5. Task Advantage Normalization

5.1 公式

对 task i 的当前 batch,把所有 (sample, group, step, token) 四元 index 下的 token-level advantage 收到一个集合 Aitok,然后:

Ãi,s,g,t,k = (Âi,s,g,t,k − μi) / σi,   μi = mean(Aitok), σi = std(Aitok)

注意三个细节:

  1. 这是第二次 normalize。GRPO 本身已经在 group 内做了 (R−μ_R)/σ_R 一次;这里在整个 task batch 范围再做一次。
  2. Normalize 的对象是 token-level advantage,不是 trajectory-level reward。
  3. 每个 task 独立做,所以 ALFWorld 的 σ_AF 和 DB 的 σ_DB 不会互相干扰。
w/o task-norm — 整个 batch 一起 standardize ALF DB KG ALF 信号被强势任务踩平 (σ_global ≫ σ_ALF) w/ task-norm — 每个 task 各自 0/1 ALF DB KG 每个 task 都拿到 ±1 σ 的均匀梯度 → ALFWorld training pass rate (示意,Fig 7b) w/o task-norm: 卡在 0.4 抖动 w/ task-norm: 平滑爬到 0.93
左:不做 task-wise norm 时,弱任务 ALF 的 token advantage 在全局尺度下被压扁,梯度近 0。右:per-task standardize 后每个任务都有 ±1σ 的有效信号。下方为 Figure 7b 示意。

5.2 Worked Example

设定:同一 batch 里有两个 task。ALF 的 group reward 是 {0,0,0,0,1} (5 trajectory),DB 是 {1,1,0,1,1}。GRPO 第一次 normalize 后,每条 trace 的 trajectory advantage:

TaskRewardμσTrajectory Â
ALF0,0,0,0,10.20.4−0.5,−0.5,−0.5,−0.5,+2.0
DB1,1,0,1,10.80.4+0.5,+0.5,−2.0,+0.5,+0.5

 broadcast 到每个 token 上(同一 trace 内每个 token 共享)。ALF 平均 trace 长度 = 30 token, DB 平均 = 5 token。

不做 task-norm: 全 batch token-level  集合中, ALF 占了 5×30 = 150 个 token, DB 占了 5×5 = 25 个 token。ALF 的 ±0.5 / ±2.0 主导了 σ_global。最终 DB 的 ±2.0 在 σ_global 下变成 ~±1.6,可用;但 DB 那条 −2.0 的 trace 只有 5 个 token,贡献的 raw signal 总量(Σ |Â|) ≈ 25 × 0.8 = 20,而 ALF 的总量 ≈ 150 × 0.7 ≈ 105。梯度被 ALF 长尾任务主导, DB 等于没在学。

做 task-norm: ALF 内部和 DB 内部各自 standardize;两个 task 都拿到 mean=0, std=1 的 token advantage。每个 task 都贡献 ~ 任务规模成正比的稳定梯度,interference 大幅下降。

反向论证:这其实就是 multi-task SGD 里经典的 GradNorm / loss balancing,只是这里在 RL advantage 维度做。如果 advantage scale 已经齐(reward 都是 0/1 + sequence 长度差不多), task-norm 应当无效;论文实验里 KG/OS/ALF 长度方差大,所以 +5.6 pt (Table 6: 65.0 vs 59.4)。


6. 环境框架: Controller / Worker / Container

Multi-task 不仅是算法挑战,本质先是 异构环境管理 挑战 —— 5 个 task 需要 5 种依赖 (Ubuntu docker、MySQL、Freebase KG、ALFWorld textworld、WebShop simulator)。AgentRL 给了一个三层结构:

Training Framework Trainer (FSDP) Megatron / FSDP Rollout Pool SGLang × N unified API AgentRL Controller start_sample() interact() list_workers() Containerized Worker Layer Task A: OS Ubuntu docker bash exec tools: run_cmd Task B: DB MySQL SQL exec tools: execute_sql Task C: KG Freebase API 7 tools get_relations… Task D: ALF TextWorld action: take/go Task E: WS WebShop sim click/search ↓ 暴露给 Trainer 的是同一组接口: step / reset / submit / finish
三层结构:Trainer 不知道环境是 Ubuntu 还是 MySQL,它只看到 Controller 提供的统一 function-call 接口;Controller 把请求路由到不同 Worker container。Worker 内部封装具体 task,共享同一组 lifecycle API (start_sample / interact / list_sessions)。

关键 insight:把所有 task 改造成OpenAI function-call format是「统一接口」的真正承载点。例如 KG 的 7 个 query 操作 (get_relations, get_neighbors, count, …)、DB 的 (execute_sql, commit_final_answer)、OS 的 bash —— 都被统一成 tool definition + JSON 参数。模型只需要学「调对哪个 tool,填对参数」这一种行为模板。这也就是为什么 BFCL-v3 上做 OOD 评测会有显著 +3.0 pt 提升 (Table 5)—— 训练分布天然就是 function-call。


7. 端到端 Worked Example

跟踪一条 KG 任务 trajectory,问题:「Find the founder of the company that owns Freebase」。

step 0  [fresh π@v=237]  → tool_call: get_relations(entity="Freebase")
step 1  [stale π@v=230]  → tool_call: get_neighbors(rel="owned_by")
step 2  [fresh π@v=237]  → tool_call: get_relations(entity="#1")
step 3  [stale π@v=230]  → tool_call: get_neighbors(rel="founder")
step 4  [fresh π@v=237]  → "Final Answer: #3"
                           reward = 1.0  (verifier matches)

Async pipeline 视角:这条 trace 共 5 步,每步 LLM 1.2 s + env 0.3 s ≈ 7.5 s。trace 在 t=7.5 进 queue。同 batch 还有 7 条 ALFWorld 30 步 trace (~45 s) 和 56 条 DB 5 步 trace (~7.5 s)。Trainer 不等 ALFWorld,直接攒到 16 条就 fire 第一次 update —— 第一批 update 时这条 KG trace 已用上 fresh π@v=237 的 grad。

Cross-policy 视角:这条 trace 的 step 0/2/4 来自 fresh,step 1/3 来自 stale。Importance ratio 计算时,GRPO 的 ρ = πθ(a|s) / πold(a|s),分子全用 fresh πθ;分母原本是 πold,现在等于「实际 sampling 时用的那个 π」。论文没显式给 importance correction (按 GRPO 默认就当作 single π_old),实务上靠 stale engine 滞后步数小 + clip 范围控制。

Task-norm 视角:这条 trace reward = 1.0,group 内 5 条 reward 是 {0,0,1,0,0},GRPO  给该 trace = (1−0.2)/0.4 = 2.0,broadcast 到 ~80 个 token。然后取 KG 整 batch (假设 200 trace × ~80 token = 16k token),做 ( − μ_KG) / σ_KG → 最终 token-level à ≈ +1.5 σ。这才是塞进 GRPO loss 里的有效 advantage。


8. 实验关键结果

8.1 主结果:32B 反超 GPT-5 / Claude-Sonnet-4

ModelALFDBKGOSWSAVG
GPT-5 (2025-08)65.463.264.134.533.752.2
Claude-Sonnet-4 Thinking69.068.464.451.038.358.2
DeepSeek-R151.460.450.253.631.049.3
Qwen2.5-32B-Instruct (base)32.155.833.837.027.537.2
AgentRL w/ Qwen2.5-32B94.570.477.051.758.670.4
AgentRL w/ Qwen2.5-3B92.460.055.040.552.160.0
0 50 100 ALF DB KG OS WS GPT-5 Claude-4-Th DeepSeek-R1 AgentRL-32B (ours)
5 任务上 success rate bar chart。AgentRL 在 ALF / DB / KG / WS 四个任务上单调最高,差距最大的是 ALF 和 KG;OS 上和 Claude-4-Thinking 持平,这是 AgentRL 唯一没有压倒性胜出的任务 —— 大概率因为 OS 任务 bash 输出 long-tail 严重,Verifier 很难给到稠密的 reward。

8.2 Multi-task 不输 best-of-five 单任务专家 (Table 4)

这个对比最锋利:对每个 task 单独训一个 14B model,各自 SR 是 89.7 / 73.9 / 72.2 / 43.1 / 60.3 (avg 67.8);一个 multi-task 14B SR 是 91.5 / 72.2 / 72.8 / 43.6 / 58.5 (avg 67.7)。差距 −0.1 pt 几乎可以忽略。但 multi-task model 多出来一个 BFCL-v3 OOD +3.0 pt 的 generalization 提升 (Table 5),说明它没有过拟合到 5 个 task。

8.3 Ablation

MethodALFDBKGOSWSAVG
AgentRL-14B (full)93.164.067.745.155.065.0
− cross-policy sampling91.961.655.739.754.560.7 (−4.3)
− task adv. norm91.162.654.738.050.659.4 (−5.6)

两个 trick 各贡献 4–6 pt,在 KG 和 OS 上效应最大(都是 long-horizon、open-state 的任务,正符合理论预期)。

8.4 Throughput

14B 在 Webshop 上:同步 16/32/64 GPU = 9K / 16K / 29K tok/s;async = 17K / 33K / 56K tok/s。倍率从 16 GPU 的 1.9× 涨到 64 GPU 的 1.93×, 接近 perfect scaling 直线 —— 也就是说 async 不仅降低绝对开销,也让scaling 不饱和。这是同步 implementation 给不出来的。

8.5 Failure mode (Table 7)

"Task Limit Reached" 比例,base → AgentRL:ALF 0.68 → 0.07,WS 0.275 → 0.020。也就是 RL 主要修了「没 budget 在限定回合内交答案」这个 failure mode,不是单纯的「答错了」。这个观察呼应 §8.1: AgentRL 大胜 ALF/WS 的本质是「学会了高效 act」,不只是「学会了 reasoning」。


9. 与同类工作对比

系统异步颗粒度多 task多 turn采样策略定位
OpenRLHF / VeRL / NeMo-Aligner / EasyR1无 (sync interleave)group-of-K, fixed πRLHF / 单步 RLVR baseline
AReaLper-query async是 (long CoT)fixed πreasoning long-CoT
prime-rl (INTELLECT-3)distributed async有限 (single env family)fixed π跨地理位置异步训练
AgentGym-RL (sibling)per-env asyncfixed π统一 agent 评测 + 训练
RAGEN / DigiRL / GiGPO / ARPOfixed π,有的加 group-in-group单一环境家族 (GUI/long-horizon)
AgentRLper-env coroutine + dynamic batch是 (5 task)cross-policy, per-task adv-normmulti-turn × multi-task generalist agent

核心差异点:


10. 局限 / 个人 take / 待验证问题

5 个想验证的点

  1. 不做 importance correction 时, stale lag 从 1 步加到 50 步, advantage 偏差和最终 SR 怎么变?
  2. Cross-policy pool 大小从 2 → 8 个 model, exploration 收益是否单调?
  3. Per-task norm 改成 「per-task running avg + 小窗口 std」(streaming 版),会不会更稳?
  4. 把 reward 换成 RM-based dense reward,task-norm 是否还成立?(soft reward 可能 σ_i 变化巨大)
  5. 用 32B AgentRL 替换 stale engine 里的 model 为更早的 14B snapshot,跨 size 的 cross-policy 是否仍 work?

11. Memory points (冷回忆用)

立场 系统 + 算法双轨:async pipeline 是 enabler,cross-policy + task-norm 是各 +5pt 的双 trick。
核心 trick 1 Cross-policy sampling: 每个 environment step 从 fresh / stale snapshot 池里随机抽 π,保 validity 同时扩 coverage。
核心 trick 2 Task advantage normalization: GRPO 第二次 standardize, 每个 task batch 内独立 (Â − μi) / σi, 解决多任务 reward scale 不均。
异步颗粒度 per-env coroutine + dynamic batch + bounded staleness, 不等 batch 满, queue 上限强制 drain。
数字 32B 5 任务平均 70.4% (vs Claude-4-Th 58.2 / GPT-5 52.2 / DeepSeek-R1 49.3);async 让 14B@64GPU throughput 9K → 56K tok/s 接近 6×。
multi vs single 单 multi-task 14B AVG 67.7 ≈ best-of-five 单任务 67.8, 但 multi 还能在 BFCL-v3 OOD +3.0 pt。
瓶颈 OS 任务上和 Claude-4-Thinking 持平,reasoning 优势没全吃到;cross-policy 没有 importance correction,stale lag 敏感性未量化。
实现 基于 Verl 改造,SGLang 推理,FSDP 训练,16+ H800 起。
和邻居 AReaL = per-query async, prime-rl = 跨地理 async, AgentRL = per-env async + multi-task; AgentGym-RL 同期 sibling 偏 SDK/benchmark。