项目主页 GitHub

Agent-R1 文档

这里围绕 Agent-R1 最值得优先阅读的内容展开说明: 从安装环境、第一次跑通训练,到 Step-level MDP、分层抽象、Agent 任务开发与常见排错, 帮助你更快建立整体理解。

总览

页面定位

Agent-R1 围绕 Getting Started、Core Concepts 和 Tutorials 三条主线组织内容。 这份页面优先聚焦最关键的阅读内容,方便第一次接触的人按顺序建立整体理解。

版本定位

当前主线对应 Agent-R1 v0.1.0。这一版以 Step-level MDPLayered Abstractions 为核心重构了整体架构;旧实现保留在 legacy 分支中,便于回溯参考。

适合谁读

第一次准备跑 Agent-R1 的使用者,或者想快速理解其训练抽象的研究者。

内容边界

优先讲清最核心结构和上手路径;更长的 API 细节和完整章节仍然保留在正式站点里作为补充。

阅读路线

目标 建议顺序
只想先跑起来 环境准备 → 第一次跑通 → 排错建议
想理解方法设计 Step-level MDP → 分层抽象 → 交互闭环
想迁移到新任务 任务结构 → 训练工作流 → 迁移新任务 → 脚本与配置

快速开始

环境准备

第一次使用 Agent-R1,不建议直接把注意力放在复杂 Agent 任务上,先把当前主线的 AgentEnvLoop + ToolEnv 训练闭环跑通更重要。你真正需要确认的是四件事: 兼容的 verl 源码环境、模型路径、数据路径,以及 GPU/显存条件。

  • 先按 verl 官方安装方式准备环境,但使用包含 AgentFlow、async rollout、reward-loop 与 verl.trainer.config package-data API 的近期源码版本。
  • Agent-R1 本身不需要作为独立包额外安装;在同一个环境里 clone 仓库后,从仓库根目录直接运行脚本即可。
  • 基础模型路径需要先能被训练脚本读到。默认示例使用 Qwen/Qwen3-4B-Instruct-2507,也可以通过 Hydra override 换成本地路径。
  • 数据集路径、输出目录和缓存目录最好一开始就设成绝对路径,减少路径歧义。
  • 如果你用的是已有环境,先跑 GSM8K-tool sanity check,而不是一上来跑 HotpotQA、ALFWorld 或 WebShop。
推荐策略

当前推荐路径是先用工具增强的 GSM8K 跑通主线 Agent 训练闭环,再切到 StepPO 或更大的任务 recipe。

第一次跑通

Agent-R1 的第一次成功,不是指“最终模型效果很好”,而是指训练入口、模型路径、数据路径和 rollout 逻辑已经能形成完整闭环。一个常见做法是先跑最小任务,确认日志能正常前进、loss 有更新、输出目录生成。

推荐的两阶段路径

第一阶段用 GSM8K-tool 检查环境、模型、数据、rollout engine 和工具循环是否接通; 第二阶段切到 StepPO 或多数据集 recipe,验证完整 Agent-R1 训练路径。

# Stage 1: 准备工具增强 GSM8K 数据
python3 examples/data_preprocess/gsm8k_tool.py --local_save_dir ~/data/gsm8k_tool

# Stage 2: 跑通 AgentEnvLoop + ToolEnv 主线训练脚本
bash examples/run_qwen3-4b_gsm8k_tool.sh

# 可选:切换到 StepPO recipe
bash examples/run_qwen3-4b_gsm8k_tool_steppo.sh

examples/run_qwen3-4b_gsm8k_tool.sh 的入口是 python3 -m agent_r1.trainer.main_agent_ppo,默认设置 algorithm.adv_estimator=grpoactor_rollout_ref.rollout.agent.default_agent_flow=agent_env_loopactor_rollout_ref.rollout.agent.max_steps=5。 脚本末尾保留 $@,因此可以直接追加 Hydra overrides。

# 常见 override:换模型路径或 GPU 数
bash examples/run_qwen3-4b_gsm8k_tool.sh \
  actor_rollout_ref.model.path=/path/to/Qwen3-4B \
  trainer.n_gpus_per_node=4

看到这些通常说明已经接通

  • 训练脚本正常启动,没有卡在依赖或导包阶段。
  • 模型与 tokenizer 都能成功加载。
  • 样本能被读入,rollout 能至少走到一轮。
  • 输出目录里开始出现日志或 checkpoint。

第一次不要追求的事

  • 不要一开始就调整很多超参。
  • 不要一开始就切到最复杂的工具任务。
  • 不要把“环境没配好”和“算法设计问题”混在一起看。

排错建议

Agent-R1 初次失败时,大多数问题并不来自 Step-level MDP 本身,而是来自环境、路径或脚本参数。 建议把排查顺序固定下来,不要同时改很多东西。

现象 先检查什么
脚本刚启动就失败 Python 环境、依赖版本、导入路径和 shell 脚本参数
模型加载失败 模型路径、权限、tokenizer 配置是否完整
rollout 进行到中途卡住 环境终止条件、工具返回格式、max_steps 是否合理
训练能跑但行为异常 样本中的 env_kwargs、环境 observation 拼接和奖励逻辑

核心概念

Step-level MDP

Agent-R1 的核心判断是:多步 Agent 任务不应该只被看成“一个越来越长的 prompt”,而应该被视为真正的 step-level reinforcement learning 过程。每一轮交互都包含状态、动作、环境反馈和终止判断。

为什么不是单纯 token continuation

因为工具调用、环境变化、外部返回结果都会改变后续决策上下文,这些变化不是语言模型自己凭空生成出来的。

Step-level 的直接好处

环境可以在每一步显式控制 observation,插入工具反馈、摘要、裁剪或特殊终止规则。

一句话理解

Agent-R1 把“模型输出之后发生了什么”正式纳入了训练对象,而不只是把它留给 prompt engineering。

轨迹表示的演进路线

在 Step-level MDP 之下,轨迹表示不只是“怎么存历史”,更决定了 rollout 回放时训练信号是否仍然忠实于原始交互。 因此更准确的理解方式,是把它看成一条从 text-spacetoken-space, 再到 structured step-level 的演进路线。

1. Text-Space: 先有 messages

最早的多轮 Agent 系统通常把历史存成一组 messages。它的优点是直观、兼容 chat API, 但问题在于 rollout 实际是在 token 空间里生成的:如果先把原始 token 解码成文本,再在训练时重新 tokenize, 回放得到的 token 序列就可能和 rollout 时并不一致。

2. Flat Token-Space: 再到 token in, token out

引入 token in, token out 的核心目的,是避免这种 retokenization drift。 直接保存 token id 后,训练回放可以和 rollout 时的 token 边界、mask、log-prob 与 reward 对齐, 从而保证 replay 的数学一致性。

对 Agent-R1 来说,这个问题其实在比较早期就已经以 bug 的形式暴露出来了。最初大家并不是先从抽象概念出发讨论 token in, token out,而是在多轮轨迹拼接与回放过程中先碰到了 token 对齐错误,并优先把它修掉。 之后社区才逐渐把这类做法总结为更统一的 token in, token out 视角。相关讨论可见 Issue #30

Flat Token-Space 为什么还不够

它虽然解决了“训练回放不忠实”的问题,但仍把整条多步交互看成一条 append-only 的扁平 token 序列。 一旦你想对中间上下文做截断、摘要、重组或插入环境反馈,就会破坏原始序列的一体性; 同时,这种严格的 token 控制也和真实部署里常见的 chat API 形态存在落差。

3. Structured Step-Level: 最终到 step-based sequence

Agent-R1 进一步把轨迹拆成按 step 组织的结构化转移。每一步都保留自己的状态 s_t、动作 a_t 和反馈 r_t,而环境返回则进入下一步 s_{t+1} 的构造。这样既保持了 step 内部的 token 一致性,也让上下文管理终于能在 step 边界上被显式控制。

展示 Messages、Token in Token out 与 Step-based Sequence 三种轨迹表示差异的示意图
这条演进路线的关键不是“表示越来越复杂”,而是先解决 replay fidelity,再进一步解决多步 Agent 场景里的上下文管理与训练部署错位问题。
一个值得记住的历史点

Agent-R1 对这类问题的识别并不是后见之明。早期实现里,团队已经在 Issue #30 中遇到并修复了由解码再编码带来的轨迹错位问题;后来,“直接在 token 空间里保持 rollout 与 replay 一致”才逐渐被更系统地抽象为 token in, token out

这件事后续也对社区产生了实际影响。比如 veRL 的 Issue #2188 就把 Agent-R1 Issue #30 作为多轮 Agentic RL 调试问题的公开案例之一来引用。这也说明,Agent-R1 对这类轨迹一致性问题的发现与修复,确实较早为社区提供了可参考的经验。

这一版本的关键变化

PPO 的优势估计已经不再把整条多步交互简单当成 token-level 递推来处理,而是先在 step 维度上聚合奖励与价值, 再回写到每个 step 对应的 response token。核心实现位于 agent_r1/core_algos.pycompute_gae_advantage_return: 它先把 token_level_rewards * response_mask 在每一步内求和,再按 trajectory_uidsstep_indices 做 step-level GAE, 并在优势标准化时明确采用 step-level 而不是 token-level 的处理方式。

训练侧的接线位于 agent_r1/ray_agent_trainer.pycompute_advantage, 这里会把一条完整轨迹拆成多行 step 数据,再调用上述 step-level GAE 实现。

分层抽象

Agent-R1 把任务组织拆成多层抽象,这样做的目的是让你在迁移新任务时,只替换真正需要替换的那一层, 而不是把整个训练流程重写一遍。

层级 职责
AgentFlowBase 定义更高层的 Agent 行为组织方式,承接具体任务流程。
AgentEnvLoop 驱动多步交互循环,负责把模型输出、环境反馈和终止判断串起来。
ToolEnv 处理工具型任务中的环境状态与工具执行反馈。
BaseTool 封装单个工具调用逻辑,让工具可以被标准化接入环境。

交互闭环

理解 Agent-R1 最稳的方法,是把它想成“模型 + 环境 + 工具”的闭环。模型每一步的输出不是终点, 而是下一轮环境更新的输入。

1

模型生成动作

当前 observation 进入模型,模型输出文本、行动或工具调用意图。

2

环境解析输出

环境判断这一步是继续对话、执行工具,还是达到终止条件。

3

工具执行并反馈

如果需要工具,环境会执行工具并把结果组织成新的 observation。

4

进入下一步或结束

更新后的 observation 再送回模型,直到 done 或达到步数上限。

上下文管理方式的变化

上下文管理现在由环境显式接管,而不是被固定成“把所有 token 永远往后拼接”。在 docs/core-concepts/step-level-mdp.md 对应的设计里,上下文可以按任务需要被 truncatesummarizerestructure,也可以直接替换。

在代码实现上,agent_r1/agent_flow/agent_env_loop.py_obs_to_prompt 支持 Observation.token_idsmessagestext 三种输入形态, 说明“下一轮给模型什么上下文”是由环境决定的;而 agent_r1/env/envs/tool.pyToolEnv 直接维护 self._messages,在每一步把 assistant 回复和 tool observation 重新组织后再喂回下一轮。 这意味着用户可以围绕环境逻辑自由管理上下文,而不是被 append-only 的历史拼接方式限制住。

任务开发

任务结构

在 Agent-R1 里,一个样本通常不只是 prompt。它还可以带上 agent_nameenv_kwargs 等字段,让环境在样本级别获得上下文与控制参数。GSM8K-tool 是最小完整例子: 每条样本指定 agent_env_loop,并通过 env_kwargs 创建一个带 calc_gsm8k_reward 工具的 ToolEnv

{
  "data_source": "openai/gsm8k",
  "agent_name": "agent_env_loop",
  "prompt": [{"role": "system", "content": "..."}],
  "reward_model": {"style": "rule", "ground_truth": "..."},
  "env_kwargs": {
    "env_type": "tool",
    "tools": ["calc_gsm8k_reward"],
    "tool_format": "hermes",
    "tools_kwargs": {"ground_truth": "<answer>"}
  }
}

输入层

决定用户问题、system prompt、chat template 和初始上下文是什么。

环境层

决定 env_type、工具清单、工具格式、终止条件和每轮反馈内容。

训练层

决定 rollout flow、最大步数、奖励回传、advantage estimator 和批量组织方式。

训练工作流

如果把 Agent-R1 的真实训练过程压缩成一条路径,可以概括为“样本准备 → 环境实例化 → 多步交互 → 奖励/终止 → 训练更新”。这个顺序在理解源码时很重要。

1

准备样本

运行 examples/data_preprocess/gsm8k_tool.py 或任务 recipe,把原始数据转成带 agent_nameenv_kwargs 的 parquet。

2

创建环境

AgentEnvLoop 读取样本里的 env_kwargs,通过 AgentEnv.from_config 创建 ToolEnv 或任务环境。

3

执行多步 rollout

模型生成、环境解析工具调用、执行 BaseTool、注入工具反馈,持续循环直到 done=True 或达到 max_steps

4

记录回报并更新

将多步过程中的结果组织成训练信号,再交给 RL 训练部分做参数更新。

迁移新任务

把 Agent-R1 从现有案例迁移到你的新任务时,最有效的方法不是大范围改源码,而是沿着三层结构逐步改: 数据、环境/工具、训练脚本。

recipe/<task>/
  base.yaml
  prepare_<task>_agent_r1.py
  <task>_agent_flow.py
  reward_fn.py
  prompts.py
  utils.py
层面 你通常要改什么
数据 样本字段、prompt 组织方式、env_kwargs 的注入方式
环境与工具 状态更新逻辑、工具执行结果的封装、终止条件与异常处理
训练脚本 数据路径、模型路径、步数、batch 规模与奖励相关参数
容易踩的坑

很多新任务的问题并不是“模型不够强”,而是 observation 组织得不稳定,导致环境反馈无法被模型一致利用。

脚本与资源

支持的数据集与算法

Agent-R1 不是绑定在单个 benchmark 上的训练脚本,而是一套可复用的 Agentic RL 训练框架。 当前本地仓库已经包含从数学推理、检索问答到具身环境和网页购物的多类任务 recipe; 同一个任务也可以通过不同 algorithm.adv_estimator 与 policy loss 组合切换算法。

支持的数据集 / 环境

数据集 / 环境 任务类型 关键入口 适合验证什么
GSM8K Tool 工具增强数学推理 examples/data_preprocess/gsm8k_tool.py
examples/run_qwen3-4b_gsm8k_tool.sh
最小可运行闭环:dataset、ToolEnv、tool call、reward 与 trainer 是否接通。
HotpotQA 多跳检索问答 recipe/hotpotqa/
examples/run_hotpotqa_steppo.sh
检索工具、multi-hop reasoning、长上下文和证据选择。
Paper Search 学术论文搜索 recipe/paper_search/
examples/run_papersearch_steppo.sh
真实搜索式 agent workflow、查询展开、文献证据收集。
ALFWorld 文本具身 household interaction recipe/alfworld/
examples/run_alfworld_steppo.sh
长程交互、环境状态变化、成功率型奖励。
WebShop 模拟在线购物 recipe/webshop/
examples/run_webshop_steppo.sh
网页式导航、商品检索、决策路径和 score / success rate。

支持的算法 / 优势估计

方法 配置入口 粒度 说明
StepPO adv_estimator=gae
loss_mode=gspo
Step-level + sequence-level policy loss Agent-R1 主推 recipe:用 step-level GAE 做信用分配,再用 GSPO 计算完整 action 的 policy update。
GRPO algorithm.adv_estimator=grpo Trajectory / group-relative 默认 GSM8K-tool 脚本使用的 sanity check 算法,不依赖 critic。
PPO / GAE algorithm.adv_estimator=gae Step-level actor-critic 适合显式 value learning 与 step timeline 上的优势估计。
Token GAE algorithm.adv_estimator=token_gae Token-level actor-critic 作为 token 级信用分配 baseline,便于和 step-level 方法对照。
RLOO algorithm.adv_estimator=rloo Trajectory outcome 使用 leave-one-out baseline,对多 rollout 采样的任务很自然。
REINFORCE++ algorithm.adv_estimator=reinforce_plus_plus Token return 轻量、无需 critic,常用于和 GRPO / PPO 类方法比较。
REINFORCE++ Baseline algorithm.adv_estimator=reinforce_plus_plus_baseline Prompt / trajectory baseline 在 REINFORCE++ 基础上加入 prompt-level mean baseline。
GiGPO algorithm.adv_estimator=gigpo Trajectory + step group 需要 agent flow 提供 anchor_obs,用于 step grouping 相关实验。
怎么选

只想先跑通环境,用 GSM8K Tool + GRPO;想复现实验主线,优先看 StepPO 脚本; 想做算法对比,再切换 grporlooreinforce_plus_plustoken_gae 等 estimator。

脚本与配置

实际使用中,脚本通常承担三类信息:模型与数据路径、训练资源参数、任务相关超参。 第一次修改脚本时,优先改“路径和资源”,最后再改“任务逻辑”。Agent-R1 的示例脚本都支持在命令末尾追加 Hydra overrides,因此常见实验不需要复制一份新脚本。

model_path data_path agent_flow max_steps rollout adv_estimator loss_mode

数据准备入口

# GSM8K Tool
python3 examples/data_preprocess/gsm8k_tool.py --local_save_dir ~/data/gsm8k_tool

# HotpotQA + retrieval corpus
python3 recipe/hotpotqa/prepare_hotpotqa_agent_r1.py \
  --output_dir data/corpus/hotpotqa \
  --corpus_output_path data/corpus/hotpotqa_corpus/hpqa_corpus.jsonl

# Paper Search
python3 recipe/paper_search/prepare_paper_search_agent_r1.py \
  --input_dir recipe/paper_search/inference/datasets/AutoScholarQuery \
  --output_dir data/pasa

# ALFWorld / WebShop
python3 recipe/alfworld/prepare_alfworld_agent_r1.py \
  --input_dir alfworld_data/json_2.1.1 \
  --output_dir data/alfworld
python3 recipe/webshop/prepare_webshop_agent_r1.py \
  --dataset_mode small \
  --input_dir webshop_data \
  --output_dir data/webshop

常用训练脚本

任务 主线脚本 补充说明
GSM8K Tool examples/run_qwen3-4b_gsm8k_tool.sh
examples/run_qwen3-4b_gsm8k_tool_steppo.sh
最小 sanity check;StepPO 脚本会设置 algorithm.adv_estimator=gaeloss_mode=gspo
HotpotQA examples/run_hotpotqa_steppo.sh 多跳检索问答;baseline 位于 examples/hotpotqa/
Paper Search examples/run_papersearch_steppo.sh 学术搜索任务;包含 AutoScholarQuery / RealScholarQuery JSONL 数据入口。
ALFWorld examples/run_alfworld_steppo.sh 文本具身环境;需要本地 ALFWorld 原始数据。
WebShop examples/run_webshop_steppo.sh 购物导航任务;准备阶段需要 WebShop 数据和环境资产。

算法切换

Agent-R1 将 advantage estimator 与 policy loss 解耦。常用 algorithm.adv_estimator 包括 gaetoken_gaegrporlooreinforce_plus_plusreinforce_plus_plus_baselinegigpo。 StepPO 组合可理解为 step-level GAE 加 GSPO policy loss。

最先确认的配置

模型路径、数据路径、agent_env_loop 是否启用、可用 GPU 与 verl 兼容版本。

后面再调的配置

步数上限、rollout 数量、advantage estimator、policy loss、奖励细节和任务特定超参。

常见问题

Q: Agent-R1 和普通单轮 RL 训练最大的不同是什么?

A: 它把多步环境交互显式建模成 step-level 过程,环境和工具反馈是训练闭环的一部分。

Q: 为什么我应该先跑最小任务,而不是直接上复杂 Agent 场景?

A: 因为环境、路径、依赖和模型加载问题会先把你挡住。GSM8K-tool 最小闭环能同时检查数据、工具环境、rollout engine 和训练入口。

Q: 迁移新任务时最值得先读哪部分?

A: 先看 Step-level MDP,再看分层抽象和任务结构;然后对照 recipe/hotpotqarecipe/alfworldrecipe/webshop 的目录模式。

Q: 如何临时换模型或缩小资源?

A: 直接在脚本末尾追加 Hydra override,例如 actor_rollout_ref.model.path=/path/to/modeltrainer.n_gpus_per_node=1 或调小 batch size。

补充资源

下面这些链接适合继续查看更完整的章节、源码和技术报告,作为延伸阅读入口使用。

类型 入口
完整文档站 https://agentr1.github.io/Agent-R1/
GitHub 仓库 https://github.com/AgentR1/Agent-R1
Technical Report https://arxiv.org/abs/2511.14460
项目主页 agent-r1/
DeepWiki https://deepwiki.com/AgentR1/Agent-R1
Awesome-Agent-RL https://github.com/0russwest0/Awesome-Agent-RL

基于 Agent-R1 的代表项目

TableMindPaperScout 是两类很有代表性的延展: 前者面向工具增强的表格推理,后者面向学术文献搜索,都是 Agent-R1 在真实多步任务上的代表性延展。

继续延伸时值得看什么

如果你想继续向外扩展,一条自然路径是先读技术报告,再看完整文档站和相关项目, 最后回到源码里对照 AgentEnvLoopToolEnv 和训练脚本理解实现细节。