Planner-R1: Reward Shaping Enables Efficient Agentic RL with Smaller LLMs
Paper: arXiv:2509.25779 Code: 代码搜索未找到开源实现
1. Motivation(研究动机)
TravelPlanner 这类真实工具调用规划任务的难点,不在于模型能否写出“像样”的行程文本,而在于它能否在多轮检索、约束核对、数值计算、JSON 输出之间保持一致性。论文给出的基线结果很直接地暴露了这一点:GPT-5 虽然已经是强闭源模型,但在官方 1,000 条测试集上的 final pass 也只有 21.2%,GPT-o3 为 11.3%,Qwen3-32B 只有 0.6%,Qwen3-8B 甚至为 0。说明 fluent generation 和真正满足所有 hard / commonsense constraints 的 agentic planning 之间仍有巨大鸿沟。
作者要解决的具体问题是:在只有 180 条训练 query 的极小训练规模下,能否通过 agentic RL 显著提升 TravelPlanner 上的端到端成功率;更细一点,reward shaping 的稠密程度如何影响不同参数规模模型的学习效率与稳定性。这里不是泛泛讨论“RL 是否有用”,而是把问题收缩到一个很具体的工程-算法交叉点:多步工具规划任务中,dense process-level rewards 是否能让小模型比大模型更高效地学会正确的工具使用与约束满足。这个问题值得研究有三个原因。第一,TravelPlanner 的失败模式很接近真实 agent 系统中的错误类型,例如重复调用工具、遗漏必要查询、生成 schema-valid 但语义错误的计划。
第二,如果 reward shaping 真能把 8B 模型推到接近 32B 的水平,就意味着 agentic RL 不一定非要依赖超大模型才能有收益。第三,很多 task-specific RL 工作容易 overfit 到目标 benchmark;如果 Planner-R1 在 NaturalPlan、Multi-IF、τ-Bench 上还能保持或提升性能,那么它对“如何低成本训练泛化更好的工具代理”就有更强的外部意义。
2. Idea(核心思想)
核心 insight 很具体:把 TravelPlanner 这种“最终成功极端稀疏”的规划任务分解成一组与最终目标策略一致的 shaped rewards,可以显著改善 agentic RL 的可学习性,尤其是对 8B 这类小模型。作者并没有发明新的 RL 优化器,而是把问题建模、奖励设计和训练效率放在一起,证明 reward density 本身就是 agentic RL 的关键缩放杠杆。
更准确地说,论文的新意不只是“用了 reward shaping”,而是把 schema validity、commonsense constraints、hard constraints、full pass 组织成一个三阶段 shaping 体系,并系统比较 dense / category-level / sparse rewards 以及 curriculum 对 8B 和 32B 的不同影响。结果显示:32B 在 sparse rewards 下更稳,但 8B 在 dense shaping 下学得更快、更省算力,这与很多默认“大模型更强所以更值得做 RL”的直觉不同。
它和常见 SFT-based planner 的根本区别在于,SFT 主要模仿 teacher 轨迹,面对 distribution shift、次优示范或复杂工具反馈时很脆弱;Planner-R1 直接用任务可验证结果来更新策略,优化目标是“生成真正可执行且满足全部约束的计划”,而不是“生成看起来像专家的回复”。它也不同于引入外部 SAT/SMT verifier 的方法:作者坚持把 planning 保持在 agent 内部,通过 end-to-end RL 学会更好的行动策略,而不是把 correctness 主要外包给外部求解器。
3. Method(方法)
3.1 整体框架
Planner-R1 将 TravelPlanner 重写成一个 tool-augmented episodic MDP。每个 episode 从 system prompt 和 user prompt 开始,agent 在上下文中逐 token 地交替输出自然语言与结构化 tool call,环境执行七个 API(search flights、search accommodations、search restaurants、search attractions、search ground transportation、get cities、calculator),再把 tool response 追加回状态,直到模型输出最终 <answer>...</answer> JSON itinerary。由于环境把 tool response 直接附加到时间顺序上下文,而不是放进单独 memory 槽位,训练目标实际上同时考验了长上下文管理、工具选择和约束对齐。
Figure 1 解读:这张图展示了论文的基本 MDP 视角。x_i 是上下文 token,a_t 是在第 t 步生成的 action token;system prompt、user prompt、tool response 都会增加上下文长度,但只有 agent 的 action 推进时间步。这个表示很关键,因为它说明作者优化的不是一个“先计划后执行”的离线模块,而是一个在 rollout 中边观察边调用工具边修正计划的在线 agent。
作者为什么需要这种统一 MDP 表示?因为 TravelPlanner 的真正难点是多轮交互中的 credit assignment。若只看最终 pass/fail,模型很难知道是“少查了一个餐馆”还是“违反了住宿最少入住天数”。把整段工具交互写成轨迹后,才能再往上叠加 shaped rewards,让 RL 把失败归因到更细粒度的行为模式。
3.2 问题定义与环境改写
论文定义状态为完整历史 ,动作 为当前生成 token,转移是在动作后附加 tool output 或空响应。最终目标是学习策略 来最大化 episodic terminal reward。和原始 TravelPlanner 相比,作者做了两个重要改写。第一,新增 calculator API,用于显式数值推理。第二,关闭 benchmark 的 lightweight semantic memory,让 tool responses 直接暴露在上下文中。
前者减少把算术隐含在 language modeling 中的噪声,后者把上下文管理的困难显式推给 agent,这使 benchmark 更接近真实 agentic RL 场景。最终答案必须是严格 JSON schema,字段包括 days、city、transportation、attraction、accommodation、breakfast、lunch、dinner。其中 city 和 transportation 不是自由文本,而是带类型约束的 object。
作者用 schema gating 先检查结构合法性,再计算 constraint rewards,这使 reward 设计具备可验证性,也解释了为什么训练后模型在外域任务上仍能保持较强的 structured generation 能力。
3.3 多阶段 reward shaping
极稀疏 reward 是本文的根问题,所以作者把终止奖励拆成六个可验证子项: 终止 reward 写成: 三种固定 reward 配置与一个 curriculum 分别是:
- Stage 1: ,最稠密,给 partial credit。
- Stage 2: ,只保留类别级别信号。
- Stage 3: ,只看最终 full pass。
- Curriculum: 训练中从 Stage 1 逐步切到 Stage 2,再切到 Stage 3。
Figure 2 解读:这张主结果图把 base models 与不同 Planner-R1 变体放在同一坐标系里。最重要的信息不是单一最高点,而是 reward density 与 model size 的交互关系:8B 在 dense rewards 下能从 0 拉到接近 40%,但在 sparse rewards 下会直接 collapse;32B 则在四种 reward 设定下都能保持 42% 以上。这说明 reward shaping 不是简单的“锦上添花”,而是小模型进入可学习区间的必要条件。
为什么这种设计有效?直觉上,TravelPlanner 的失败通常不是“完全不会做”,而是“最后差一两个约束没对齐”。micro rewards 允许模型在还没满足所有约束时也得到梯度信号,macro rewards 则迫使它从“局部满足几个条件”迈向“整类条件全部满足”。这种从局部正确到全局正确的桥梁,正是 sparse terminal rewards 无法提供的。
3.4 GRPO 优化目标
优化器使用的是不带 KL regularization 的 clipped PPO-style GRPO。对每个 query ,从旧策略 采样 条轨迹 ,回报为 。目标函数为: 其中 token-level importance ratio 与 trajectory-level advantage 为: 这里有一个容易忽略的点:论文并没有在优化器层面引入复杂新机制,贡献几乎都来自 reward design 与 agent environment setup。因此本文的可复用价值很高,读者若做其他 tool-use benchmark,可以几乎原样迁移这套“可验证 reward 分层 + GRPO”的训练 recipe。
3.5 关键组件伪代码
代码搜索未找到开源实现。以下伪代码基于论文方法描述而非 released code,因此用于帮助理解算法流程,而不是与某个仓库逐行对齐。
def compute_terminal_reward(plan, commonsense_ok, hard_ok):
r_schema = int(validate_json_schema(plan))
if r_schema == 0:
return 0.0
r_cs_micro = sum(commonsense_ok) / len(commonsense_ok)
r_hard_micro = sum(hard_ok) / len(hard_ok)
r_cs_macro = int(r_cs_micro == 1.0)
r_hard_macro = int(r_hard_micro == 1.0)
r_pass = int(r_cs_macro and r_hard_macro)
lambdas = dict(cs_micro=1, hard_micro=1, cs_macro=1, hard_macro=1, final_pass=1)
return (
r_cs_micro * lambdas["cs_micro"]
+ r_hard_micro * lambdas["hard_micro"]
+ r_cs_macro * lambdas["cs_macro"]
+ r_hard_macro * lambdas["hard_macro"]
+ r_pass * lambdas["final_pass"]
)def stage_schedule(global_step, mode, total_steps, size):
if mode == "stage1":
return [1, 1, 1, 1, 1]
if mode == "stage2":
return [0, 0, 1, 1, 1]
if mode == "stage3":
return [0, 0, 0, 0, 1]
if mode == "curriculum" and size == "8B":
if global_step < 100:
return [1, 1, 1, 1, 1]
if global_step < 400:
return [0, 0, 1, 1, 1]
return [0, 0, 0, 0, 1]
if mode == "curriculum" and size == "32B":
if global_step < 50:
return [1, 1, 1, 1, 1]
if global_step < 400:
return [0, 0, 1, 1, 1]
return [0, 0, 0, 0, 1]
raise ValueError("unsupported schedule")def run_agent_episode(policy, system_prompt, user_prompt, tools, max_turns=30):
state = init_history(system_prompt, user_prompt)
for turn in range(max_turns):
action = policy.generate_next_action(state)
state.append(action)
if is_tool_call(action):
tool_name, args = parse_tool_call(action)
tool_result = tools[tool_name](**args)
state.append(tool_result)
if contains_final_answer(action):
break
return extract_final_plan(state), statedef grpo_update(policy, old_policy, queries, rollout_fn, epsilon):
trajectories = []
returns = []
for query in queries:
rollout_group = rollout_fn(old_policy, query, n=8)
trajectories.extend(rollout_group)
returns.extend([traj.reward for traj in rollout_group])
advantages = normalize(returns)
loss = 0.0
for traj, adv in zip(trajectories, advantages):
for token in traj.action_tokens:
ratio = policy.logprob(token, traj.state_prefix(token)) - old_policy.logprob(
token, traj.state_prefix(token)
)
ratio = ratio.exp()
clipped = ratio.clamp(1 - epsilon, 1 + epsilon)
loss += -torch.minimum(ratio * adv, clipped * adv)
return loss / max(len(trajectories), 1)3.6 代码到论文映射表
Code reference: 代码搜索未找到开源实现(已搜索论文页、GitHub 关键词
Planner-R1,TravelPlanner,Reward Shaping Enables Efficient Agentic RL with Smaller LLMs)
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
| TravelPlanner MDP with tool-augmented rollout | N/A | N/A |
| Multi-stage shaped reward | N/A | N/A |
| GRPO objective with grouped rollouts | N/A | N/A |
| Curriculum transition across reward stages | N/A | N/A |
| JSON schema-gated evaluation | N/A | N/A |
4. Experimental Setup(实验设置)
4.1 数据集与任务
- In-domain:TravelPlanner。作者将官方
45/180train-validation split 合并后重新洗牌,得到 180 条训练 query 和 45 条验证 query,同时保持 easy / medium / hard 比例不变;最终测试使用官方 1,000-query test split。 - Out-of-domain:NaturalPlan、Multi-IF、τ-Bench。NaturalPlan 覆盖 Trip Planning、Meeting Planning、Calendar Scheduling;Multi-IF 是 multi-turn instruction-following benchmark;τ-Bench 使用 retail function-calling 环境并报告
pass@1。
4.2 对比基线
论文在主表中比较了以下基线与训练变体:
- Base models:Qwen3-8B、Qwen3-32B、GPT-o3 (high)、GPT-5 (high)。
- Planner-R1-8B:Stage 1、Stage 2、Stage 3、Curriculum。
- Planner-R1-32B:Stage 1、Stage 2、Stage 3、Curriculum。
这里真正有分析价值的不是“拿一个最好模型赢基线”,而是 8B 与 32B 在不同 reward 稠密度下的学习曲线差异。作者还把 8B 延长到 3,000 steps、32B 延长到 2,000 steps,用于分析 FLOPs 效率和跨任务泛化。
4.3 评测指标
- Delivery Rate:模型是否产出可交付的最终计划。
- Commonsense Micro / Macro:隐式常识约束的满足比例,以及是否整类常识约束全部满足。
- Hard Constraint Micro / Macro:用户显式约束的满足比例,以及是否整类 hard constraints 全部满足。
- Final Pass Rate:同时满足 schema、commonsense、hard constraints 的最终通过率,是论文最核心的主指标。
- Out-of-domain metrics:NaturalPlan 用 Exact Match;Multi-IF 报告多轮平均 turn-wise scores;τ-Bench 报告
pass@1。
4.4 训练配置
这些数值来自论文 Appendix B.3 的实际训练配置,而不是泛化默认值。
- 基础模型:
Qwen/Qwen3-{8B|32B}。 - RL 框架:VERL + GRPO,
adv_estimator=grpo。 - 硬件:2 nodes,每个节点 8 张 GPU,总计 16×H200 GPUs。
- 学习率:
1e-6。 - 训练步数:
- 主实验统一看 500 steps。
- 8B curriculum 为
100/300/100steps(Stage1/2/3)。 - 32B curriculum 为
50/350/100steps。 - 扩展实验将 8B 训练到 3,000 steps,32B 训练到 2,000 steps。
- batch / rollout:
train_batch_size=16val_batch_size=64n=8rolloutsppo_mini_batch_size=8ppo_micro_batch_size_per_gpu=1
- GRPO / PPO 关键超参:
clip_ratio=0.2ppo_epochs=1gamma=1.0lam=1.0use_kl_loss=false
- 上下文与生成限制:
prompt_length=2268response_length=30500max_tool_response_length=8192max_assistant_turns=30max_parallel_calls=1
- 推理设置:
- rollout
temperature=1.0,top_p=1,top_k=-1 - validation/test 使用
temperature=0,n=1,do_sample=false
- rollout
- 内存占用:
- 8B 约
~60 GB / GPU - 32B 至少
>=90 GB / GPU
- 8B 约
作者还明确指出没有启用 Qwen3 的 <think>...</think> mode,因为 reasoning tokens 会拉长 context,而 pilot experiments 没带来指标收益。这一点很重要:本文性能提升主要来自 reward shaping,而不是靠更长 hidden reasoning。
5. Experimental Results(实验结果)
5.1 主 benchmark 结果
TravelPlanner 主结果如下:
| Method | Delivery | CS Micro | CS Macro | Hard Micro | Hard Macro | Final Pass |
|---|---|---|---|---|---|---|
| Qwen3-8B | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| Qwen3-32B | 41.9 | 27.5 | 11.4 | 74.2 | 1.7 | 0.6 |
| GPT-o3 (high) | 99.6 | 74.2 | 57.7 | 81.0 | 14.3 | 11.3 |
| GPT-5 (high) | 99.8 | 81.0 | 75.4 | 75.4 | 23.4 | 21.2 |
| Planner-R1-8B Stage1 | 99.5±0.8 | 94.8±1.2 | 69.0±6.9 | 61.0±2.6 | 46.2±2.5 | 39.9±4.3 |
| Planner-R1-8B Stage2 | 99.9±0.2 | 80.6±18.2 | 30.2±51.9 | 63.4±13.8 | 48.6±16.3 | 13.3±23.2 |
| Planner-R1-8B Stage3 | 0.0±0.0 | 0.0±0.0 | 0.0±0.0 | 0.0±0.0 | 0.0±0.0 | 0.0±0.0 |
| Planner-R1-8B Curriculum | 99.7±0.8 | 92.7±3.1 | 57.9±18.6 | 53.9±5.7 | 38.2±4.2 | 27.1±12.6 |
| Planner-R1-32B Stage1 | 99.3±1.6 | 95.2±1.6 | 70.4±13.4 | 74.2±1.4 | 42.3±8.0 | 56.4±2.9 |
| Planner-R1-32B Stage2 | 91.1±0.5 | 87.7±2.2 | 69.1±14.5 | 70.0±5.6 | 44.1±9.4 | 55.0±7.6 |
| Planner-R1-32B Stage3 | 99.4±0.9 | 94.7±2.5 | 71.9±15.2 | 60.8±16.6 | 44.3±14.1 | 48.2±15.1 |
| Planner-R1-32B Curriculum | 99.1±1.7 | 95.9±2.5 | 78.5±7.9 | 72.1±5.0 | 47.0±6.9 | 55.1±6.2 |
最强点是作者在摘要中强调的 Planner-R1-32B 达到 56.9% final pass。这来自更长训练下的 best average result,而不是 Table 1 中 500-step 设定。需要区分这两个数字:56.4±2.9 是 500-step Stage1 的平均,56.9% 是更长训练过程中的峰值结果。
5.2 训练效率与 reward shaping 效果
Figure 3 解读:左图按 training steps 画出了 8B 与 32B 的性能轨迹。两者都能随着训练提升,但 32B 波动更大,8B 在 dense shaping 下的上升更稳定。作者特别指出 32B 在某一 run 中 pass rate 曾从 44% 掉到 26% 再回到 51%,说明大模型虽然更 robust 于 sparse rewards,但训练方差也更显著。
Figure 4 解读:右图把结果重新投影到训练 FLOPs 上后,论文的核心效率结论才真正成立。32B 达到其峰值 90% 性能(52.3%)需要 FLOPs,而 8B 达到同等水平只需 FLOPs,约 3.5× 更高 compute efficiency。也就是说,如果目标是“在有限算力下尽快获得可用的规划 agent”,dense reward shaping 下的 8B 可能比 32B 更划算。
5.3 失败模式与行为演化
Figure 5 解读:8B 模型在训练中最初主要卡在 accommodation 和 cost 约束上,随着训练推进,除了 hallucination 与 cost 之外,大多数 failure category 都会降到 10% 以下。这说明小模型不是完全不会工具规划,而是更依赖 shaped rewards 去学会 constraint bookkeeping。
Figure 6 解读:32B 的 failure profile 与 8B 不同。它 hallucination 更少,但更容易在住宿资格、最少入住天数等更细致的 hard constraints 上出错。图中也能看到更明显的训练波动,这与论文对 32B 高方差的定性描述一致。
作者的 qualitative analysis 还指出,早期 checkpoint 经常出现重复调用 calculator 或 restaurant tools 的循环行为;随着训练推进,失败从“语法级错误”转向“语义级错误”,即输出已经 schema-valid,但仍未进行足够的必要工具调用。这说明 RL 首先修复的是工具使用的基本 protocol,其次才是更深层的 constraint satisfaction。
5.4 泛化与是否过拟合
外域结果表明,Planner-R1 并没有靠对 TravelPlanner 过拟合来换取主指标提升。
| Method | NaturalPlan Trip | Meeting | Calendar | Multi-IF 1st | 2nd | 3rd | τ-Bench Pass@1 |
|---|---|---|---|---|---|---|---|
| Qwen3-8B | 12.9±0.2 | 82.0±0.0 | 22.7±0.3 | 88.9±0.6 | 82.8±0.6 | 75.4±0.5 | 9.5±2.1 |
| Planner-R1-8B (500) | 14.0±0.9 | 83.2±1.1 | 24.3±0.9 | 89.4±0.4 | 83.5±0.7 | 76.9±0.6 | 11.1±0.9 |
| Planner-R1-8B (2000) | 14.0±2.1 | 84.0±0.6 | 23.2±2.1 | 89.8±0.4 | 84.0±0.5 | 77.2±0.4 | 12.1±2.3 |
| Planner-R1-8B (3000) | 10.7±1.8 | 84.5±1.3 | 20.1±2.0 | 89.8±0.1 | 83.9±0.4 | 76.7±0.4 | 15.1±3.1 |
| Qwen3-32B | 11.3±0.0 | 77.0±0.0 | 32.2±0.0 | 89.1±0.3 | 83.1±0.3 | 77.1±0.4 | 28.0±2.2 |
| Planner-R1-32B (500) | 15.7±2.2 | 79.8±1.6 | 33.2±0.5 | 88.7±0.2 | 83.4±0.6 | 77.7±0.6 | 28.7±2.1 |
| Planner-R1-32B (2000) | 19.5±1.2 | 80.2±1.1 | 34.4±1.4 | 89.8±0.3 | 84.1±0.3 | 78.5±0.4 | 33.9±3.8 |
作者的解释是,JSON-gated structured output 一方面帮助 TravelPlanner 中的 schema compliance,另一方面也强化了模型对“结构化、带工具条件的输出形式”的泛化能力。这一点和很多只在单一 benchmark 上冲分的 RL 工作不同。
5.5 消融、限制与结论
消融与关键发现:
- 8B 对 reward density 非常敏感。Stage 2 和 Stage 3 分别出现
3/5与5/5model collapses。 - 32B 在所有 reward 配置下都有
42%+final pass,但稀疏 reward 会显著增加 variance。 - Curriculum 并未带来统计显著优势;真正稳定有效的是 dense shaping 本身。
- 8B 在峰值 final pass 上略低于 32B(
56.4%vs56.9%),但效率优势非常明显。
局限性:
- 论文只在 TravelPlanner 这一特定 planning benchmark 上系统研究 shaping,对更一般的软件代理、网页代理是否同样成立,还需要进一步验证。
- 作者没有启用 thinking mode,因此结论主要适用于“非显式长思维 token”的 agentic RL 设定。
- 8B 和 32B 的最佳策略对 reward density 的依赖不同,说明 reward recipe 可能并非跨模型规模自动迁移。
- 代码未公开,复现实验需要读者自行根据论文附录重建训练环境。
总体结论:
这篇论文最有价值的结论不是“TravelPlanner 上又刷新了一次 leaderboard”,而是证明了在 agentic RL 中,reward shaping 可以把小模型推入一个高效、可学习且不过拟合的 regime。对实践者来说,Planner-R1 给出的启示是:在多轮工具规划任务里,先花精力把 reward 分层设计好,往往比一开始直接堆更大的 backbone 更重要。