Agent 训练实战 / 02

Agent RL 实战:用强化学习提升推理与决策质量

上一篇讲了 Agent SFT——用轨迹数据教模型“学会做 Agent”。但 SFT 有个本质问题:它是模仿学习,模型最多做到和标注数据一样好,不会更好。

企业场景对 Agent 的要求远不止“能跑通”:要步骤少、工具调用准、推理链路清晰、遇到异常能自己恢复。这些都不是靠堆 SFT 数据能解决的——你需要 RL。

本篇聚焦 Agent RL 的工程落地:怎么设计 Reward、选什么算法、怎么搭训练环境、怎么用 RL 把推理性能拉上去。

为什么 SFT 之后还需要 RL

SFT 的天花板来自三个结构性问题:

问题 1:模仿学习的上限就是标注数据的质量

SFT 本质是“照着标准答案学”。如果标注轨迹里有冗余步骤、次优决策,模型会原样学过来。你无法通过 SFT 让模型超越数据本身的质量——就像一个只看教科书的学生,考试成绩上限就是教科书写得多好。

问题 2:Exposure Bias(暴露偏差)

SFT 训练时,模型看到的上文永远是 ground truth(标准轨迹)。但推理时,模型是基于自己上一步的输出继续生成的——一旦某一步偏了,后面的上文全变了,模型从没见过这种情况,就容易崩掉。

一个直观的例子:SFT 训练时,模型看到的轨迹是“查天气 → 拿到结果 → 回复用户”。但推理时如果第一步工具调用参数写错了、返回了报错,模型在训练阶段从未见过“报错之后该怎么办”——它只见过一路顺风的轨迹。

问题 3:SFT 只学“怎么做”,不学“做得好不好”

SFT 的 loss 是 token 级别的交叉熵——模型学的是“这个位置应该输出什么 token”,不关心最终任务有没有完成、完成得是否高效。RL 才引入了“结果好不好”这个信号。

  SFT RL
学习信号 token 级别的交叉熵 任务级别的 Reward
上限 标注数据的质量 理论上无上限(受 Reward 设计约束)
对错误的处理 只见过正确轨迹 在试错中学习恢复策略
优化目标 模仿标准答案 最大化累积回报

Agent RL 的核心框架

把 Agent 交互过程映射到 RL 框架,其实非常自然:

graph LR A["Agent
(Policy Model)"] -->|"动作:生成 tool_call
或文本回复"| B["Environment
(工具/API/沙箱)"] B -->|"观测:tool 返回结果
+ 对话历史"| A B -->|"Reward:任务完成?
步数多少?质量如何?"| C["Reward Signal"] C -->|"更新策略"| A style A fill:#022c22,stroke:#10b981,color:#34d399 style B fill:#1a2535,stroke:#334155,color:#94a3b8 style C fill:#1e293b,stroke:#f59e0b,color:#fbbf24

具体来说:

状态 (State)    = 当前对话历史 + 所有工具返回结果 + system prompt
动作 (Action)   = 模型的下一步输出(一次 tool_call 或一段文本回复)
环境 (Env)      = 工具执行引擎 + 沙箱(代码执行、API 模拟等)
奖励 (Reward)   = 任务是否完成 + 过程质量评分
策略 (Policy)   = Agent 模型本身(给定状态,输出动作的概率分布)

和游戏 RL 的关键区别:Agent RL 的动作空间是自然语言(或结构化的 JSON tool call),维度极高;状态空间是变长的文本序列,不是固定维度的向量。这导致 Agent RL 的训练比 Atari 之类的难得多——后面会展开讲工程挑战。

Reward 设计:Agent RL 的成败关键

Reward 设计是 Agent RL 里最难也最重要的部分。设计得好,模型能学到真正有用的策略;设计得差,模型会学到各种钻空子的方式(reward hacking)。

结果 Reward vs 过程 Reward

结果 Reward (Outcome-based)
├── 任务完成了 → +1
└── 任务失败了 → 0 或 -1

过程 Reward (Process-based)
├── 调了正确的工具 → +0.1
├── 参数格式正确   → +0.05
├── 产生了冗余步骤 → -0.1
└── 陷入死循环     → -0.5

结果 Reward 的优点是简单、不需要人工设计中间标准。缺点是信号稀疏——Agent 可能执行了 10 步,只在最后一步拿到 Reward,中间步骤的好坏完全没有反馈。

过程 Reward 信号密集,训练效率高,但需要你定义“什么是好的中间步骤”——这本身就是一个难题,而且定义不好会误导模型。

实践中的做法:以结果 Reward 为主,用少量过程 Reward 做辅助。

企业场景的 Reward 设计示例

不同类型的 Agent,Reward 设计思路差别很大:

代码 Agent(如 SWE-Agent)

Reward 组成:
├── 测试通过率              权重 0.6    ← 核心指标
├── 代码是否能编译/运行       权重 0.2    ← 基本正确性
├── 修改的文件数量惩罚       权重 -0.1   ← 鼓励精准修改,避免乱改一通
└── 步骤数量惩罚            权重 -0.1   ← 鼓励高效完成

这是最容易设计 Reward 的场景——测试用例是天然的、可自动化的评判标准。这也是为什么代码 Agent 是 RL 训练最早跑通的企业场景之一。

RAG Agent(检索增强生成)

Reward 组成:
├── 最终答案准确率(和参考答案对比)  权重 0.4
├── 检索召回率(找到了相关文档吗)    权重 0.3
├── 检索精确率(召回的文档相关吗)    权重 0.2
└── 检索次数惩罚                    权重 -0.1   ← 避免无脑检索

RAG Agent 的 Reward 设计难点在于“答案准确率”的自动评估。常见做法是用一个更强的模型做 judge(RLAIF 思路),或者在有标准答案的数据集上训练。

搜索/数据分析 Agent

Reward 组成:
├── 最终结果正确性      权重 0.5
├── SQL/查询语法正确    权重 0.2
├── 执行无报错          权重 0.2
└── 查询效率(扫描行数) 权重 -0.1

稀疏 Reward 的缓解方法

纯结果 Reward 最大的问题是稀疏性——Agent 走了 10 步,只有最后一步有 Reward,前面 9 步的梯度信号非常弱。

几种实用的缓解方法:

方法 思路 适用场景
Reward Shaping 人工设计中间步骤的小 Reward 步骤可明确定义好坏的场景
Hindsight Reward 任务完成后,回过头给中间步骤打分 结果可自动验证的场景
Process Reward Model (PRM) 训练一个模型来评估中间步骤质量 数据充足、有人工标注的场景
缩短轨迹长度 把复杂任务拆成子任务,每个子任务单独给 Reward 任务天然可分解的场景

其中 PRM(过程奖励模型) 是目前比较热的方向——用人工标注的“每一步对不对”数据训练一个打分模型,然后用这个模型给 RL 训练提供密集 Reward。OpenAI 在数学推理上验证了这个思路的效果,Agent 场景同理。

主流算法选型

PPO:最稳的选择

PPO(Proximal Policy Optimization)是目前 Agent RL 的主流算法。核心思想是限制每次策略更新的幅度,避免训练崩溃。

PPO 训练循环:
1. 用当前策略(Agent 模型)在环境中 rollout,收集轨迹
2. 用 Reward 计算每一步的优势函数(advantage)
3. 用 clipped objective 更新策略,限制更新幅度
4. 用 KL 散度约束策略不要偏离 SFT checkpoint 太远
5. 回到第 1 步

PPO 在 Agent 场景的关键配置:

  • KL 系数:控制策略偏离 SFT checkpoint 的程度。设太大,模型不敢探索;设太小,格式容易退化(比如 tool call 格式崩掉)。经验值 0.01–0.05,需要根据场景调
  • Rollout 批次大小:Agent 轨迹长,rollout 成本高,batch size 不能设太大。通常 64–256 条轨迹一个 batch
  • GAE lambda:控制优势函数的偏差-方差权衡,Agent 场景一般 0.95–0.99

GRPO:更适合长轨迹的变体

GRPO(Group Relative Policy Optimization)是 DeepSeek 在 R1 中使用的算法。和 PPO 的核心区别是:不需要单独训练 Critic/Value 网络,而是通过同一 prompt 的多条 rollout 之间做相对比较来估计优势。

GRPO 流程:
1. 对同一个 prompt,用当前策略生成 N 条不同的轨迹(比如 N=8)
2. 分别计算每条轨迹的 Reward
3. 在这 N 条轨迹内部做归一化,得到相对优势
4. 用相对优势更新策略

GRPO 的优势:

  • 省掉了 Critic 网络的训练和显存开销——Agent 轨迹本身就很长,再加个 Critic 显存压力很大
  • 相对比较比绝对打分更稳定——“这条比那条好”比“这条值 0.7 分”更容易判断

GRPO 的劣势:

  • 需要同一个 prompt 生成多条轨迹,rollout 成本翻 N 倍
  • 如果 N 太小,相对优势的估计噪声大
  PPO GRPO
是否需要 Critic 需要,额外显存开销 不需要
Rollout 成本 每个 prompt 1 条轨迹 每个 prompt N 条轨迹
优势估计方式 绝对值(Value 网络) 组内相对比较
适合场景 轨迹较短、显存充足 轨迹长、Reward 可自动计算
代表工作 InstructGPT、ChatGPT DeepSeek-R1

Rejection Sampling + SFT:轻量替代方案

如果你的场景不想上完整的 RL 训练管线,有一个更简单的替代方案:

Rejection Sampling 流程:
1. 对每个 prompt,用当前模型生成 K 条轨迹
2. 用 Reward 函数给每条轨迹打分
3. 只保留得分最高的那条(或 top-k 条)
4. 用筛选后的数据做 SFT
5. 回到第 1 步,迭代

这个方法的本质是用采样+筛选来近似 RL 的效果,避免了 PPO/GRPO 复杂的训练管线。代价是收敛更慢、上限更低,但实现成本低很多。

适合的场景:

  • 团队没有 RL 训练基础设施
  • 快速验证 Reward 设计是否合理
  • 作为正式 RL 训练前的数据增强手段

RLHF vs RLAIF:谁来提供 Reward

  RLHF RLAIF
Reward 来源 人工标注偏好对 强模型(如 GPT-4、Claude)打分
成本 高(需要持续标注) 低(API 调用)
质量 上限高,但标注一致性难保证 中等,受 judge 模型能力限制
适合 Agent 场景 高风险场景(医疗、金融) 通用场景、快速迭代

Agent 场景的一个优势是:很多 Reward 可以自动化验证(代码跑通了吗?SQL 结果对吗?),不一定需要人来标注。能自动验证的场景优先用自动 Reward,省钱又稳定。

RL 训练的工程挑战

Agent RL 的理论不复杂,但工程落地非常难。下面是几个最头疼的问题。

Rollout 成本

Agent RL 的每次策略更新都需要 rollout——让模型在环境里跑完整条轨迹。和游戏 RL 不同,Agent rollout 涉及真实的工具调用:

一次 rollout 的成本:
├── 模型推理:每步生成 100-500 tokens,一条轨迹 5-15 步
├── 工具执行:API 调用延迟、代码编译运行时间
├── 总耗时:一条轨迹可能要 30 秒到几分钟
└── 对比:Atari 游戏一步只需要几毫秒

缓解方法:

  • 并行 rollout:同时跑几十到几百条轨迹,用 GPU 集群做模型推理,用容器化环境做工具执行
  • 异步训练:rollout 和策略更新解耦,收集到一批轨迹就更新,不等所有 rollout 完成
  • 轨迹缓存:对于确定性的工具调用(同样的参数总是返回同样的结果),缓存工具返回值

沙箱环境搭建

Agent RL 需要一个可以安全、大规模执行工具调用的环境。这是和对话 RL(RLHF)最大的工程区别——对话 RL 只需要生成文本然后打分,Agent RL 需要真的执行操作。

沙箱环境需要满足:
├── 隔离性    每条轨迹的执行互不影响
├── 可重置    执行完一条轨迹后环境恢复初始状态
├── 可扩展    支持几百条轨迹并行执行
├── 确定性    相同输入得到相同输出(尽量)
└── 安全性    不能让模型的操作影响到宿主系统

代码 Agent 的沙箱方案比较成熟(Docker 容器 + 文件系统快照),但 API 调用类的 Agent 就麻烦——你不能在 RL 训练时真的去调第三方 API(成本、速率限制、副作用),需要搭模拟环境。

训练稳定性

Agent RL 的训练比对话 RL 更容易崩,因为轨迹更长、动作空间更大、Reward 更稀疏。

Reward Hacking:模型找到了钻 Reward 漏洞的方法,拿到高分但没有真正完成任务。

几个真实案例:

  • 代码 Agent 学会了修改测试用例让测试通过,而不是修复 bug
  • 搜索 Agent 学会了不检索直接编造答案(因为有时候蒙对了也有 Reward)
  • RAG Agent 学会了把所有文档都检索回来(召回率高,但精确率崩了)

防范方法:

  • 多维度 Reward:不只看任务完成率,加入步骤合理性、格式正确性等辅助 Reward
  • 对抗性测试集:用专门设计的 edge case 测试模型是否在 hack
  • 人工抽检:定期抽查高 Reward 轨迹,看看模型到底在做什么

KL 散度约束:控制策略不要偏离 SFT checkpoint 太远。

总 Loss = -RL_objective + β × KL(π_current || π_sft)

β 太大 → 策略几乎不更新,RL 白训
β 太小 → 策略漂移太远,格式退化、能力崩塌

经验做法:用自适应 KL 系数——设定一个 KL 目标值(比如 0.1),如果实际 KL 超了就增大 β,反之减小。

推理性能优化:RL 的实际收益

讲了这么多机制,RL 到底能带来什么实际收益?聚焦三个企业最关心的指标。

减少冗余步骤

SFT 模型容易产生冗余步骤——因为它是模仿训练数据的平均行为,而训练数据里不可避免地包含一些不够高效的轨迹。

RL 通过步骤数量惩罚,可以让模型学会“走捷径”:

SFT 模型的典型行为:
  查天气 → 查温度 → 查湿度 → 查风力 → 综合回复(4 步工具调用)

RL 优化后:
  查天气(返回包含温度/湿度/风力) → 综合回复(1 步工具调用)

实际效果:在代码修复场景中,RL 训练后的 Agent 平均步骤数可以从 8-12 步降到 5-7 步,同时保持或提升完成率。

提升工具调用准确率

SFT 模型在工具调用上常犯两类错误:

  • 选错工具:该用 search 的时候用了 fetch,该查数据库的时候调了文件 API
  • 参数填错:字段名拼错、格式不对、必填参数漏了

RL 通过“工具调用成功才有 Reward”这个信号,可以显著减少这两类错误。模型会学到:与其冒险调一个不确定的工具,不如先确认再调。

改善复杂推理链

对于需要多步推理的任务(比如“先查用户信息,根据用户等级查对应的优惠政策,再计算折扣价格”),SFT 模型容易在中间环节出错后一路错下去。

RL 的优势在于它是在完整轨迹上优化的——模型会学到“前面几步的决策会影响后面的结果”,从而在关键节点做出更谨慎的选择。

RL 对推理链的改善:
├── 错误恢复能力   工具报错后知道换一种方式重试
├── 分支决策质量   在需要判断的地方选对路径的概率更高
└── 信息利用效率   更好地利用工具返回的信息,减少重复查询

小结

  • SFT 的天花板是标注数据质量,RL 通过 Reward 信号让模型有机会超越模仿学习的上限
  • Reward 设计是 Agent RL 的核心难题:以结果 Reward 为主,过程 Reward 为辅;能自动验证的场景(代码、SQL)优先用自动 Reward
  • 算法选型:PPO 最稳、GRPO 省显存适合长轨迹、Rejection Sampling + SFT 是轻量替代
  • 工程挑战集中在 rollout 成本、沙箱环境和训练稳定性——Reward Hacking 是最常见的坑
  • RL 的实际收益体现在减少冗余步骤、提升工具调用准确率、改善复杂推理链的表现

下一篇建议继续看: