Agentic Rollout

后训练 agent RL工程

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 理论基础