Agentic Rollout
Agentic Rollout
Agent RL 中的 rollout 不是一次性生成完整回答,而是一条多轮 trajectory:模型生成 → 调用工具 → 观察结果 → 继续生成 → … → 最终答案。每条 trajectory 是一个完整的决策序列,reward 打在最终结果上,梯度回传到所有模型生成的 token。
与普通 GRPO rollout 的区别
| 普通 GRPO | Agentic Rollout | |
|---|---|---|
| 结构 | prompt → 一次性输出 → reward | prompt → (生成 → tool → 观察) × N → reward |
| 长度 | 固定一轮 | 可变多轮(1 到 max_turns) |
| 退出条件 | 生成结束 | 没有 tool call 或达到 max_turns |
| 梯度计算 | 所有输出 token | 仅模型生成的 token(tool 返回不参与) |
Mask 构造(核心设计)
在 response_ids 序列中,模型生成的 token 和 tool 返回的 token 是交替出现的。用 response_mask 区分:
[system+user] [model_turn1] [tool_result1] [model_turn2] [tool_result2] [model_turn3]
├────────────┤├─────────────┤├────────────────┤├─────────────┤├────────────┤
response_mask:
1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1
response_old_logps:
真实logprob 0.0 填充 真实logprob 0.0 填充 真实logprob
- mask=1:模型的决策(要不要调工具、调哪个、传什么参数、最终回答),参与 loss 计算
- mask=0:环境返回的内容(tool 执行结果),对 loss 零贡献
构造方法(minimind rollout_single):用长度差值法算 tool 返回的 token 位置:
observe_ids = tokenizer(observe_context) # 重新编码包含tool结果的完整对话
current_len = len(prompt_ids) + len(response_ids)
obs_delta = observe_ids[current_len:] # 新增的就是tool返回部分
response_mask.extend([0] * len(obs_delta)) # 全部标0
warning: 反直觉 梯度不只回传到"最终回答"的 token,而是回传到整条 trajectory 中所有 mask=1 的 token——包括中间轮次的 tool call 决策。这意味着如果最终答案正确,模型中间选择调用正确工具的决策也会被强化。
串行依赖问题
每轮的输入依赖上一轮的 tool 返回,无法跨轮并行:
turn1 生成 → tool 执行 → turn2 生成 → tool 执行 → turn3 生成
↑ 必须等 ↑ 必须等 ↑ 必须等
不同 trajectory(同一 prompt 的 G 个采样)之间可以并行,但单条 trajectory 内部是严格串行的。这是 agent RL rollout 占训练时间 70-80% 的根本原因。
相关来源
- minimind-agent-rl-2026-04:源码阅读,
rollout_single()的具体实现 - cs336-lecture16-rlvr:GRPO 理论基础