智能体任务教程¶
本教程展示 Agent-R1 中最简单的多步工具调用路径:基于通用 AgentEnvLoop、recipe-local ToolEnv 和 recipe-local BaseTool 实现的 GSM8K + Tool。
示例使用 GSM8K,但重点不是这个 benchmark 本身,而是展示 Agent-R1 如何把一行数据变成环境驱动的多步 rollout。
你将运行什么¶
本教程使用两个已有文件:
1. 准备工具数据集¶
生成工具增强的 GSM8K 数据:
相比单步 sanity-check 数据,这个预处理脚本会为 tool path 保留结构化任务字段:
agent_name: "gsm8k_tool"question和ground_truth,以及保存在prompt中的工具调用提示env_kwargs,用于保存每个样本的工具元数据,例如 ground-truth answer
概念上,每个样本会表达:
- 使用配置中的
gsm8k_tool入口,这个入口指向通用AgentEnvLoop - 实例化内置 tool environment
- 在环境中暴露
calc_gsm8k_reward工具
2. 启动智能体训练脚本¶
运行:
这个脚本会把 rollout 从单步生成切换到通用 agent-environment loop:
actor_rollout_ref.rollout.agent.default_agent_flow=gsm8k_tool \
actor_rollout_ref.rollout.agent.max_steps=5 \
同时,它会把 trainer 指向 tool 数据集:
data.train_files=$HOME/data/gsm8k_tool/train.parquet \
data.val_files=$HOME/data/gsm8k_tool/test.parquet \
3. 一条轨迹中会发生什么¶
从高层看,一个样本会经过以下路径:
graph TD
datasetRow["Dataset row"] --> agentFlow["AgentEnvLoop"]
agentFlow --> toolEnv["ToolEnv"]
toolEnv --> llmStep["LLM response"]
llmStep --> toolCall["Tool call parsing"]
toolCall --> toolExec["BaseTool execution"]
toolExec --> nextObs["Next observation"]
nextObs --> agentFlow
更具体地说:
AgentEnvLoop读取 recipe defaults 和每个样本的env_kwargs。AgentEnv.from_config(env_type="tool", ...)创建内置ToolEnv。ToolEnv.reset()使用数据行中保存的 chat prompt。- LLM 生成回复。
ToolEnv.step()从回复中解析工具调用,并执行注册工具。- 工具输出会作为下一步 observation 加入对话。
- 循环持续到环境返回
done=True或达到max_steps。
4. 奖励来自哪里¶
GSM8K 工具在 recipes/gsm8k/tool.py 中注册为 calc_gsm8k_reward。
它在这个示例中的作用是:
- 接收模型提出的答案
- 与样本 ground truth 比较
- 将工具文本返回到对话中
这正是本教程对 Agent-R1 有价值的地方:模型不只是生成一个最终答案,而是在可以评估并反馈信息的环境中进行多步交互。
5. 为什么这个教程与单步脚本分开¶
单步 GSM8K 脚本仍然有用,但它主要是 setup check。本教程不同:它是最低抽象层的最小示例,用户只需要定义工具,标准多轮工具调用由 ToolEnv + BaseTool 承担。它展示了:
- step-level 环境转移
- 多步 agent loop
- 工具增强交互
- 与环境调解行为绑定的奖励信号
6. 接下来阅读¶
- 阅读
Step-level MDP,将本教程与核心 RL formulation 对齐。 - 阅读
分层抽象,理解这个示例为什么自然对应ToolEnv + BaseTool。 - 阅读
Recipes 与算法,查看其他任务 recipe 和启动脚本。