Agentic RL最详细入门:基础·项目实战·进阶
Agentic RL 可以理解为:把大模型从一次性答题器,训练成会在环境中多轮行动的 policy。它优化的不再是单段回答,而是下图这样一整条 trajectory。
这里的 action 可以是搜索 query、网页点击、代码执行、工具调用参数,也可以是“继续探索”或“停止回答”;observation 则是环境返回的网页、JSON、报错或状态变化。
为什么要做 Agentic RL
Prompt / SFT 能教模型模仿 ReAct 格式,但很难保证它学会最优策略:什么时候搜索、搜什么、搜几次、何时停止,往往只有执行后才知道。所以 Agentic RL 的核心是让模型在 rollout 中试错,并根据任务结果优化行动策略。
Agentic RL 训练流程
工程上,训练 agent 的 trajectory 时要保存完整 history:模型每一步做了什么、环境返回了什么、哪里报错、最终为什么得分高或低。
task q
history = []
while not done:
action = policy(history)
observation = env.step(action)
history += [action, observation]
reward = evaluate(history, env_state)
update(policy, history, reward)
这个循环里有四个组件:
Reward:从答案匹配到任务验收
一次性解题通常只看最终答案;Agentic RL 还可能检查工具调用、环境状态和副作用。比如订票 agent 不是说“订好了”就成功,而是数据库里真的多了一张符合约束的订单,且没有误改其他字段。入门时可以先把 reward 分成四类:
入门案例一:RAGEN
RAGEN 更像一篇 Agentic RL 系统论文,适合帮助新人建立整体框架。它研究 multi-turn LLM agents 怎么通过 RL 自我演化,并提出 StarPO 作为 trajectory-level agent RL 框架。
RAGEN 的价值在于它把几个现实问题讲得比较清楚。
第一,Agent RL 会遇到长程决策,而不是单步回答。
RAGEN 强调的不是“轨迹变长”这个表面现象,而是早期 action 会改变后续状态分布。比如搜索任务里,第一个 query 会决定模型看到哪些网页;打开哪篇网页会决定后面读到什么证据;是否继续搜索会决定信息是否足够。
一个早期小错误可能在后面被放大;一个早期好决策也可能因为后续步骤失误而没有转化成最终成功。这就是长程决策的难点:训练信号往往很晚才出现,但真正影响结果的决策可能发生在很早的位置。
第二,环境反馈可能随机,reward variance 会很大。
Agent 和环境交互时,环境不是一个完全稳定的文本函数。搜索引擎的结果可能变化,网页内容可能更新,工具调用可能失败,模拟环境可能有随机性;即使环境固定,模型采样本身也会让同一个任务产生多条不同轨迹。
这会带来一个训练问题:同一个 prompt 下,不同 rollout 的最终 reward 可能差异很大。有的轨迹刚好搜到关键证据,有的轨迹走到无关页面;有的轨迹早早答对,有的轨迹多绕几步后失败。于是 reward variance 会变高,advantage 估计会更噪,policy gradient 也更容易不稳定。
这种波动不一定说明模型突然变强或变弱,可能只是采样和环境反馈造成的方差。RAGEN 这类系统工作提醒我们,Agentic RL 不能只看单次 reward 曲线,还要关注 reward variance、梯度尖峰、轨迹分布是否塌缩,以及模型是不是陷入某种重复行为模式。
第三,rollout 设计很重要,例如初始状态多样性、交互粒度、采样频率。
在 Agentic RL 里,rollout 不是简单的“让模型多生成几条答案”。它决定了模型能探索到什么状态、能比较哪些行为、以及 reward 信号是否足够有信息量。
初始状态多样性很重要。如果训练任务过于相似,模型可能学会固定套路,而不是学会通用的决策能力。比如搜索 agent 如果总是在同一种问法、同一种网站结构上训练,就可能只学会某种模板化 query,而不是学会真正根据信息缺口设计搜索策略。
交互粒度也很重要。粒度太粗时,一次 action 包含太多决策,出了问题很难知道是哪一部分错了;粒度太细时,轨迹会变得很长,训练成本上升,reward 更稀疏,模型也可能在无意义的小动作上浪费预算。
采样频率也会影响学习。每个任务只采一条 rollout,模型很难知道“同一个状态下其他动作会怎样”;每个任务采太多 rollout,成本又会迅速变高。实际训练时,rollout 数量、最大交互轮数、采样温度、是否复用环境缓存,都会直接影响训练稳定性和样本效率。
第四,如果 reward 只看最终结果,模型可能学到浅层策略。
最终答案 reward 很有用,因为它简单、便宜、可验证。但如果 reward 只有最终结果,模型可能会学到一些“看起来有效”的捷径,而不一定学到我们想要的 agent reasoning。
比如搜索问答里,模型可能学会优先生成高频答案,或者学会在证据不足时也提前作答;网页任务里,模型可能学会某些固定点击模式;工具任务里,模型可能学会调用工具的形式,却没有真正利用 observation 修正自己的计划。
这也是为什么 RAGEN 强调:如果没有更细粒度、reasoning-aware 的反馈,multi-turn RL 不一定自然涌现出可靠推理。模型可能优化到了 reward 的表面相关特征,而不是任务真正需要的能力。后续的信用分配、process reward、progress reward、information gain 等方法,本质上都是在尝试让训练信号更接近“哪一步真的推动了任务完成”。
因此,RAGEN 更适合作为“系统视角”的第一篇:Agentic RL 不只是把 GRPO 套到 tool call 上,而是要同时设计环境、采样、奖励、稳定训练和评估。
入门案例二:Search-R1:最小可跑案例
Search-R1 适合作为第一个动手案例,因为它把任务限制在一个很小的 agent 环境里:模型只需要学会“什么时候搜索、搜什么、什么时候回答”。代码仓库是 github.com/PeterGriffinJin/Search-R1。
它和传统 RAG 的差别不是“有没有检索”,而是“谁来决定检索”。传统 RAG 往往由系统先检索,再把文档交给模型;Search-R1 让模型在推理过程中自己发起 search action。
代码里用四类标签把这个闭环写出来:
<think>…</think><search>query</search><information>docs</information><answer>final answer</answer>一次 rollout 的核心逻辑很短:模型生成到 </search> 时暂停,系统解析 query,调用检索器,把返回文档包进 <information> 后拼回上下文;模型读到这些 observation 后继续生成,直到输出 <answer> 或达到最大轮数。
这里最重要的训练细节是 mask。<search>、<think>、<answer> 是模型生成的 token,可以被优化;<information> 是检索器返回的文本,只能作为上下文,不应该让模型学习“生成搜索结果”。Search-R1 里的 state_masking=true 对应的就是这件事。
看代码时抓三条主线就够了:
search_r1/llm_agent/generation.py:多轮 rollout 怎么暂停、检索、拼回 observation、继续生成。train_ppo.sh/train_grpo.sh:训练时的max_turns、topk、state_masking怎么配置。verl/utils/reward_score/qa_em.py:最终如何从<answer>抽取答案并计算 reward。
因此,读 Search-R1 时不需要先陷进复杂工具系统。它要表达的核心很清楚:当搜索 query 变成模型 action,检索结果变成环境 observation,RL 训练就不再只是优化一段 answer,而是在优化一条会调用工具的轨迹。
入门案例三:Reinforcement Learning for Long-Horizon Interactive LLM Agents
Reinforcement Learning for Long-Horizon Interactive LLM Agents 可以看成 Search-R1 的下一层难度。Search-R1 里,工具主要是 search:模型发 query,环境返回文本,模型读完再决定是否继续搜。Long-Horizon Interactive LLM Agents 里,环境变成 stateful digital environment:数据库、REPL、应用 API 都会被 agent 的 action 改变。
论文使用 AppWorld 作为实验环境。AppWorld 有 9 个应用、457 个 API endpoint,单个 endpoint 最多有 17 个参数。它像一个小型数字世界:有数据库,有 Python REPL,有应用 API,有会被读写的状态。reward 不是靠模型自评,而是靠任务单元测试:正确状态修改了吗?有没有多余副作用?如果需要最终答案,答案是否匹配 ground truth?
比如一个任务是:查看明天下午有没有会;如果没有,就给 Alex 发邮件确认晚餐,并在日历里创建提醒。它不是“搜到答案并回答”就结束,而是一条会改变环境状态的轨迹:
这个例子也说明了它和 Search-R1 的关键差别:Search-R1 的 observation 通常只是信息,网页返回错了可以继续搜;AppWorld 里的 action 可能真的发邮件、改日历、写数据库。于是 reward 不再只是答案匹配,而是最终环境状态是否符合用户意图,且没有多余副作用。
把这类轨迹写成 POMDP 时,一次性回答训练里的“状态”大致就是 prompt 加已经生成的 tokens;interactive agent 还要把隐藏环境状态也放进去。状态可以写成:
这里的三个部分分别是:
- $s_0$:隐藏的初始环境状态,例如 AppWorld 的数据库和 Python REPL 状态。
- $c$:任务上下文,也就是用户请求。
- $x_{1:t}$:到当前为止的完整 token 历史,里面既有 LLM 生成的 action token,也有环境返回的 observation token。
之所以叫 partially observable,是因为模型只能看到上下文里的文本历史,看不到完整数据库和所有应用内部状态。比如模型可以调用 API 查日历,但它不能直接“读取整个世界状态”。
在数学上,action 被写成 LLM 生成下一个 token:
如果这个 token 只是普通文本,比如 thought 或代码片段的一部分,它只会追加到历史里:
但当 agent 结束一个代码块或触发执行时,环境会运行代码/API,并把返回结果也追加进上下文:
这里多出来的 $k$ 个 token 是环境 observation,不是 policy action。比如 API 返回一段 JSON,它会影响模型下一步怎么做,但不是模型自己采样出来的。记 $a(x)$ 为轨迹 $x$ 中由 LLM 生成的 token 位置,那么轨迹分布只对这些位置连乘:
这里的 $\mathbb{I}(s_0,x)$ 只是把环境动力学记进公式:给定初始数据库、REPL 状态和前面的 API 调用,环境返回什么 observation 是确定的或由环境分布决定的,不是模型自由生成的。实际读这条公式时,抓住主干即可:轨迹概率只对模型生成的 action token 连乘;环境 observation 会进入后续上下文,但不作为 policy action 计算梯度。
优化目标是最大化给定初始状态和任务上下文下的期望回报:
如果训练集是 $\mathcal D$,整体目标就是:
训练算法上,论文提出 LOOP,可以粗略理解为一个更轻量的 PPO 变体:不使用 value network,只在内存里保留一份底层 LLM,并用同一任务下多条 rollout 的相对回报来估计 advantage。这里不需要展开算法细节,抓住它的工程动机即可:long-horizon agent rollout 已经很贵,训练方法要尽量少引入额外模型副本和复杂 critic。
实验结论也有信息量:32B agent 用 LOOP 在 AppWorld 上超过更大的 OpenAI o1 agent 9 个百分点;行为分析显示 RL 后 agent 更常查 API 文档,减少无根据假设和 placeholder,失败 API 调用后的放弃行为也下降。这说明长程交互 RL 学到的不只是输出格式,而是更稳的环境探索、文档使用、错误恢复和状态控制策略。
进阶:信用分配为什么重要
信用分配可以放在文章后半段作为进阶章节,而不是主线。
当 agent 轨迹变长后,最终 reward 很难告诉我们每一步 action 的好坏。比如一条轨迹最后答错,不代表每一步都错;一条轨迹最后答对,也不代表每一步都好。
这时就需要 credit assignment:
把最终 outcome reward 合理分配给中间每一步 action。
这类方法包括:
- 同 state 下比较不同 action,例如 GiGPO / HGPO。
- 学 step-level progress reward,例如 SPA-RL。
- 学 process reward model 或 Q(s,a),例如 AgentPRM。
- 用模型自身信号做 dense reward,例如 entropy、information gain。
这部分适合作为读者掌握基本 Agentic RL 之后的下一步,因为它解决的是“怎么让长程 agent 学得更精细”。
总结
Agentic RL 的核心目标,是把 LLM 从一个静态回答器训练成能和环境交互的决策者。它的基本范式是:模型生成 action,环境返回 observation,模型继续决策,最后根据任务完成情况更新 policy。
入门时不要一开始就被复杂算法淹没。先抓住四件事:环境怎么定义,action 怎么表示,reward 怎么打,哪些 token 应该被训练。等这些跑通之后,再进入信用分配、process reward、PRM、长程稳定训练这些进阶问题。