Tool-R1
Agentic Tool Use · arXiv 2025 · v1

Tool-R1:把工具调用写成 Python,再用样本队列把 RL 训练砍半

多步工具调用的两个瓶颈很具体:JSON 形式的调用只能填预定义参数,跨步骤的变量和中间结果传不下去;RL 又要在训练中反复真实调用搜索、网页、文件解析等工具,采样成本高。 Tool-R1 让模型直接生成可执行 Python,中间变量留在同一个命名空间里;训练用 LLM-as-Judge 判最终答案,再加代码解析/执行奖励,并用 难度筛选 + 动态样本队列 复用轨迹。

Yabo Zhang 等 · 哈尔滨工业大学 / 华为诺亚方舟实验室 arXiv 2509.12867v1 ↗ 代码(论文称将开放)↗
TL;DR · 30 秒抓住核心

用代码替代 JSON,不是为了好看,而是为了状态。 模型每一步写一段 Python:可以 import 标准库、调用用户自定义工具、把上一步结果存进变量。执行器返回 observation,下一步继续写代码,形成 Thought → Code → Observation 循环(§3.1、Figure 2)。

奖励全部自动化:最终答案 + 代码能不能跑。 轻量 Qwen2.5-3B-Instruct 当裁判,把答案判成 Correct / Partially Correct / Wrong(1 / 0.5 / 0);代码解析率与执行成功率各乘 0.3 加进奖励(§3.3、Eq.2–4)。没有人工轨迹标注,也没有 cold-start。

样本效率靠两件事:先筛中等难度,再复用旧轨迹。 先用初始策略对每题采样 10 次,只保留通过率在 0.2–0.8 的题;训练时每个问题维护 G=16 的队列,每步只生成 g=8 条新轨迹,替换最旧的一半(§3.2、§4.1)。

收益真实,但口径要拆开。 7B 的 AnsAcc 从 10.30 到 19.39,绝对 +9.09 个百分点,相对 +88.3%;14B 从 15.15 到 26.67,绝对 +11.52 个百分点,相对 +76.0%。摘要说的 “about 10% gain” 没有在同一句交代是绝对百分点还是相对提升;页面并列两个口径,不替作者选。

19.39%
Tool-R1 + Qwen2.5-7B-Instruct 的 GAIA AnsAcc
未 RL 的同一提示基线为 10.30%
26.67%
Tool-R1 + Qwen2.5-14B-Instruct
开源模型中最高;MAT Agent 为 16.97%
22.3h
7B 消融完整配置的训练时间
Vanilla GRPO 为 41.5 h;少 19.2 h,相对少 46.3%
01

工具调用的两个瓶颈:参数传不下去,轨迹又太贵

先把「表达能力」和「采样成本」分开看;Tool-R1 的两个设计正好一一对应。

LLM 的参数化知识有边界:实时天气、私有数据库、精确计算、复杂文件解析都不在权重里。接外部工具是直接解法,但现有做法各有问题。提示工程(如 ReAct)靠上下文里的示例和指令决定何时调用工具,遇到 API 报错、空结果或页面结构变化时,模型没有从反馈中学习的机制,鲁棒性差(§1)。

RL 路线能从环境反馈里学,但论文指出两个可扩展性瓶颈。第一,调用格式太窄:JSON 形式的工具调用只能填预定义函数和参数,难以跨步骤共享变量,也不方便组合多个工具。第二,在线采样太贵:每一步都要真实调用搜索、网页访问、文件解析或视觉模型,延迟、限流和网络波动都会拖慢训练,成本把研究限制在少数领域(§1)。

瓶颈 1

JSON 调用的表达力上限

一个 JSON 调用通常只描述「调用哪个函数、传什么参数」。如果第二步要用第一步的返回值,第三步要用前两步的中间结果,调用之间缺少自然的变量空间;复杂控制流(循环、条件、组合)也很难写进固定 schema(§1、§3.1)。

瓶颈 2

RL 需要反复真实执行

GRPO 对每个问题要一组轨迹;每条轨迹都可能触发多次外部调用。训练步数一多,采样开销会超过模型更新本身。论文的消融显示,不做优化的 Vanilla GRPO 训练时间达到 41.5 小时(Table 2)。

论文没有把问题定义成「让模型更会写工具调用格式」,而是定义成「让工具使用成为推理过程的一部分」。这决定了后面的三个设计:代码作为动作、结果驱动奖励、轨迹复用。评测放在 GAIA:446 个任务、109 个真实文件,覆盖 PDF、PPTX、XLSX 等格式与网页导航、文档理解、逻辑推理等能力(§4.1)。

02

三条现成路线:提示、JSON 式 RL、监督轨迹

论文的对照不是「有没有工具」,而是「工具调用在训练里占什么位置」。

路线 A

提示工程 / ReAct

用 few-shot 或系统提示规定「思考—行动—观察」格式,模型按提示调用工具。优点是无需训练;缺点是不会从失败中更新策略,遇到非预期反馈只能靠上下文里再解释一遍(§1)。

路线 B

JSON 式 RL

把工具调用写成 JSON,用 PPO/GRPO 训练。代表工作如 Search-R1 把搜索调用放进 rollout。Tool-R1 认为这类方法受限于预定义工具与参数 schema,跨步骤组合能力弱(§1、§2)。

路线 C

监督轨迹 / Agent 框架

SFT 或 MAT Agent 用人工/GPT-4o 生成的高质量轨迹训练。效果可以很强,但标注成本高、难以规模化;论文特别对比了 MAT Agent 的 20k QA + 轨迹标注(Table 1)。

Tool-R1 的切入点是把「动作」从 JSON 换成可执行代码,同时保留 RL 的试错学习。这样既能调用用户自定义工具与标准库,又能把中间结果留在 Python 命名空间里;训练仍然只需要最终答案与代码执行结果,不需要过程标注(§3.1、§3.3)。

但「代码动作」本身不解决采样成本。论文的第二个贡献是训练效率:难度筛选减少无效题,动态队列减少重复生成。两者都不是模型结构改动,而是 GRPO 外层的数据与采样流程改动(§3.2)。

03

动作是 Python 代码,奖励是答案对错加代码能不能跑

方法有三层:交互协议、样本复用、奖励函数。交互与奖励决定「学什么」,样本复用决定「学得多快」。

3.1 交互协议:Thought → Code → Observation

每一步,模型先写一段 Thought:,再写一个 Code: 块;执行器运行代码,把标准输出或工具返回值作为 Observation: 追加回上下文。下一步模型可以看到之前所有代码与观察,也可以继续使用之前定义的变量(§3.1、Figure 2)。

τ = (Thought1, Code1, Obs1, …, ThoughtT, CodeT, ObsT, FinalAnswer)
Codet = πθ(· | Question, Thought<t, Code<t, Obs<t)
示意(据 §3.1 整理,原文未给出该轨迹公式)· 最多 10 个交互步(§4.1);代码在同一个 Python 解释器里顺序执行,变量状态保留

论文给的工具包括:inspect_file_as_text(把 PDF/PPTX/XLSX/音频/网页转成可读文本)、wikipedia_qa、web_qa、visit_qa、find_archived_url、local_visualizer,以及提交答案的 final_answer(Appendix A)。系统提示还限制可 import 的模块,排除 os、pip 等高风险库,并保护变量命名空间(Appendix A)。

为什么是代码

跨步骤变量共享,是 JSON 最难补的能力

论文 Figure 1 的例子:模型先意识到要比较重量就需要密度,于是调用 wikipedia_qa 查密度;第一次没查到,改用 web_qa;拿到密度后,再用前面定义的变量算一加仑蜂蜜和蛋黄酱的质量,并算出需要移走多少杯。整个过程的数据流留在 Python 变量里,而不是每步重新把 JSON 参数抄一遍(§3.1、Figure 1)。

3.2 样本复用(论文 §3.2):先筛中等难度,再用队列缓存

难度筛选发生在训练前:用初始策略对每题采样 10 次,算通过率,只保留 0.2–0.8 的题。太简单的题几乎全对,组内奖励没有方差;太难的题几乎全错,也没有可学的信号(§3.2)。

动态队列发生在训练中:每题一个固定大小 G=16 的轨迹队列;每步只生成 g=8 条新轨迹,插入队尾,移除最旧的 8 条;再按通过率 0.2–0.8 过滤缓存轨迹,不合格的替换成同题的其他合格轨迹(§3.2、§4.1)。这样 GRPO 的组内比较仍然有 16 条轨迹,但其中一半来自缓存。

收益

采样次数减半,训练时间接近减半

Table 2 的完整配置把训练时间从 41.5 h 降到 22.3 h,少 19.2 h,相对少 46.3%;AnsAcc 从 Vanilla GRPO 的 9.09 升到 19.39(Table 2)。

代价

缓存轨迹会过期

队列里的轨迹来自旧策略;策略更新后,旧轨迹的分布会偏移。论文用「只保留通过率 0.2–0.8 的轨迹」来限制这个偏移,但没有做 G 与 g 的完整扫描,只比较了「w/o resample」与「w/ resample」两种设置(Table 2、§3.2)。

3.3 奖励(论文 §3.3):答案 0/0.5/1,代码解析与执行各 0.3

最终答案由 Qwen2.5-3B-Instruct 裁判按 accuracy、completeness、relevance、precision 四项评分,输出三档:Correct 得 1,Partially Correct 得 0.5,Wrong 得 0(§3.3、Eq.2、Figure 3)。代码质量另给两个辅助奖励:

Rparse = Nparsed / Ntotal     Rexec = Nexecuted / Nparsed
R = Ranswer + 0.3 · Rparse + 0.3 · Rexec
§3.3 · Eq.3–4;λparse = λexec = 0.3

这三个分量覆盖不同失败模式:答案对但代码不可运行,仍能拿到答案分,但会被辅助奖励拉开差距;代码能跑但答案错,也拿不到主要奖励。论文没有设置额外的答案格式奖励,也没有训练神经奖励模型;Rparse 只检查代码块能否被解析,裁判是固定的轻量 LLM,不参与策略更新(§3.3)。

04

1,300 条训练数据、8 张 A100,7B 完整配置 22.3 小时

这套方法的「便宜」是相对在线 RL 的采样开销,不是相对一次 SFT;硬件与时长都要按变体看。

数据与模型

没有 cold-start,没有轨迹标注

训练集 1,300 条高质量问答对;底座是 Qwen2.5-7B-Instruct 与 Qwen2.5-14B-Instruct;不做 cold-start 初始化,也不需要人工轨迹(§4.1)。

优化

AdamW,lr 1e-6,有效 batch 256

学习率 1e-6,梯度累积后有效 batch 256,训练 2 个 epoch,最大序列长度 2,048 token,每题最多 10 个交互步;KL 惩罚权重 0.001(§4.1)。

采样队列

G=16,每步新增 g=8

每题轨迹队列大小 G=16,每步生成 g=8 条新轨迹,FIFO 替换最旧条目;训练时推理温度 0.6(§4.1)。

硬件

8×A100,训练/采样各 4 张

全部实验在 8 张 A100 上完成:4 张训练、4 张在线采样;裁判与 Web QA 工具都用 Qwen2.5-3B-Instruct(§4.1)。

论文报告的训练时间是 Table 2 中 7B 消融的 41.5 h 与 22.3 h,不是 14B 的时长;14B 只给评测结果(Level 1/2/3 与 AnsAcc),没有给训练小时(Table 1)。论文也没有报告每个变体的 GPU 小时、API 费用或多次运行的方差。页面因此不把 22.3 h 当成「14B 也能这个成本」的证据。

05

一条轨迹:写代码 → 执行 → 看 observation → 再写,直到提交答案

右侧是训练侧:答案裁判与代码奖励合成标量,GRPO 更新策略,动态队列把缓存轨迹送回 GRPO。

问题 / 文件 GAIA task 策略 πθ Qwen2.5 + GRPO Thought + Code 可执行 Python 代码执行器 / 工具链 搜索 · 网页 · 文件 · 视觉 Final Answer final_answer() Observation stdout / 工具返回值 答案裁判 1 / 0.5 / 0 代码奖励 parse · exec × 0.3 GRPO 更新 组内优势 + KL 动态样本队列 G=16 · 每步换入 g=8 任务完成时 final_answer() 下一轮上下文 R_answer 合成标量奖励 更新策略 缓存轨迹

这张图有三条回边:Observation 回到策略,形成下一轮上下文;Final Answer 进入答案裁判,与代码奖励合成标量奖励后交给 GRPO;动态样本队列把缓存轨迹送回 GRPO 组。前一条是交互,后两条是奖励与样本复用;它们都不是模型参数的一部分。

06

7B 19.39%,14B 26.67%;训练时间 41.5 → 22.3 小时

先看 GAIA 主表,再看消融;所有指标都是 Answer Accuracy,不是 F1,也不是 pass@k。

Table 1 的 GAIA validation 结果里,Tool-R1 7B 的 AnsAcc 是 19.39,比未 RL 的同一提示基线 10.30 高 9.09 个百分点,相对 88.3%;14B 从 15.15 到 26.67,高 11.52 个百分点,相对 76.0%。两个规模都提升,但 14B 的绝对增益更大、相对增益更小。

方法底座训练数据Level 1Level 2Level 3AnsAcc
闭源模型
Warm-up ActGPT-4-turboNone30.2015.100.0017.60
Sibyl AgentGPT-4-turboNone43.4027.907.7029.70
HF AgentGPT-4oNone47.1731.4011.5433.40
HF AgentGPT-4o miniNone33.9627.913.8426.06
开源模型 · 不做微调
HF AgentLLaVA-NeXT-8BNone9.431.160.003.64
HF AgentInternVL2-8BNone7.554.650.004.85
HF AgentMiniCPM-V-8.5BNone13.215.810.007.27
HF AgentQwen2-VL-7BNone16.988.140.009.70
Tool-R1(未 RL)Qwen2.5-7B-InstructNone16.989.300.0010.30
Tool-R1(未 RL)Qwen2.5-14B-InstructNone24.5311.633.8415.15
开源模型 · 微调
MAT AgentMiniCPM-V-8.5B20k QA + Trajectories26.4211.633.8415.15
MAT AgentQwen2-VL-7B20k QA + Trajectories26.4215.123.8416.97
Tool-R1Qwen2.5-7B-Instruct1.3k QA pairs30.1917.443.8419.39
Tool-R1Qwen2.5-14B-Instruct1.3k QA pairs33.9627.917.6926.67
Table 1 · GAIA validation set;原文只加粗 14B 行,页面照此复刻。Level 3 的 7B 行与 MAT Agent 同为 3.84,是并列,不是超过。

和最强的开源微调基线 MAT Agent(16.97)比,Tool-R1 7B 高 2.42 个百分点(相对 14.3%),14B 高 9.70 个百分点(相对 57.2%)。数据量上,Tool-R1 用 1,300 条,MAT Agent 用 20k 条;论文说前者不到后者的 7%,按表内数字复算为 6.5%。这个对比同时混着「数据量」与「是否使用 GPT-4o 轨迹」两个变量,不能单独归因于数据量。

14B 相对 7B 的增益也要拆开:AnsAcc 从 19.39 到 26.67,高 7.28 个百分点,相对 37.5%。分难度看,Level 2 的绝对差最大(27.91 vs 17.44,高 10.47 个百分点),Level 1 差 3.77 个百分点,Level 3 差 3.85 个百分点。这不是受控的缩放实验,只是 7B 与 14B 两个点的比较。

消融:难度筛选贡献最大,队列主要省时间

Table 2 从 7B 的 10.30 基线出发,逐项加组件。Vanilla GRPO 反而降到 9.09(低 1.21 个百分点);加难度筛选后到 16.36,比 Vanilla 高 7.27 个百分点(比原始基线高 6.06 个百分点);再加辅助奖励到 18.79,比上一步高 2.43 个百分点;最后加动态队列(带重采样)到 19.39,比不带重采样的 18.18 高 1.21 个百分点,训练时间保持 22.3 h。

切换指标,查看每个组件对 AnsAcc 与训练时间的影响。
手算对账 难度筛选与队列复用

难度筛选:Vanilla GRPO 9.09 → 加筛选 16.36,绝对差 16.36 − 9.09 = 7.27 个百分点;若以 10.30 为基准,则 16.36 − 10.30 = 6.06。论文 Table 2 的括号列用的是后者。

队列复用:w/o resample 18.18 → w/ resample 19.39,绝对差 19.39 − 18.18 = 1.21 个百分点;训练时间 41.5 − 22.3 = 19.2 小时,相对 19.2 / 41.5 × 100 = 46.3%。

方法(Qwen2.5-7B-Instruct)Level 1Level 2Level 3AnsAcc训练时间 (h)
Qwen2.5-7B-Instruct16.989.300.0010.30—
Vanilla GRPO15.09 (-1.89)8.14 (-1.16)0.009.09 (-1.21)41.5
+ 难度筛选26.41 (+9.43)15.12 (+5.82)0.0016.36 (+6.06)41.5
+ 辅助奖励30.19 (+13.21)16.28 (+6.98)3.84 (+3.84)18.79 (+8.49)41.5
+ 动态队列(w/o resample)28.30 (+11.32)16.28 (+6.98)3.84 (+3.84)18.18 (+7.88)22.3
+ 动态队列(w/ resample)30.19 (+13.21)17.44 (+8.14)3.84 (+3.84)19.39 (+9.09)22.3
Table 2 · 括号内为相对 Qwen2.5-7B-Instruct 基线的绝对百分点差;训练时间只覆盖 7B 消融,论文未给 14B 时长。

分难度:7B 与 14B 的提升不在同一层

7B 的 Level 1 从 16.98 到 30.19(高 13.21 个百分点),Level 2 从 9.30 到 17.44(高 8.14 个百分点),Level 3 从 0.00 到 3.84(高 3.84 个百分点)。14B 的 Level 1 从 24.53 到 33.96(高 9.43 个百分点),Level 2 从 11.63 到 27.91(高 16.28 个百分点),Level 3 从 3.84 到 7.69(高 3.85 个百分点)。

选择模型,查看三个难度层级的未 RL 基线与 Tool-R1。
手算对账 两个难度层级的增益

7B Level 1:16.98 → 30.19,绝对差 30.19 − 16.98 = 13.21 个百分点;相对 13.21 / 16.98 × 100 = 77.8%。

14B Level 2:11.63 → 27.91,绝对差 27.91 − 11.63 = 16.28 个百分点;相对 16.28 / 11.63 × 100 = 140.0%。这两个百分比的分母都是未 RL 的同一底座,不是跨模型比较。

「about 10% gain」这句话需要口径。7B 的绝对提升是 9.09 个百分点,14B 是 11.52 个百分点,都接近 10 个百分点;相对提升则是 88.3% 与 76.0%,远高于 10%。论文摘要写的是 “about 10% gain”,没有在同一句说明绝对还是相对;页面并列两个口径,不替作者选。

07

边界:单 benchmark、单裁判、单组阈值,成本只报了 7B

这些条件决定了哪些数字可以迁移,哪些只能当成论文设定下的结果。

评测

只有 GAIA

主结果全部在 GAIA validation 上,没有第二个 agent benchmark。GAIA 覆盖 PDF/PPTX/XLSX、网页与多步推理,但仍是单一评测环境;论文没有报告跨 benchmark 的迁移(§4.1、Table 1)。

裁判

奖励依赖 3B 裁判

最终答案由 Qwen2.5-3B-Instruct 按四项标准判 0/0.5/1;论文没有报告裁判与人工评分的一致率,也没有做裁判替换实验。裁判偏差会直接进入策略梯度(§3.3、Appendix A)。

阈值

0.2–0.8 只给了一组

难度筛选与缓存过滤都用 0.2–0.8 的通过率窗口,论文没有扫这个区间,也没有比较更宽/更窄的阈值。队列只比较 w/o 与 w/ resample,没有 G、g 的完整消融(§3.2、Table 2)。

成本

22.3 h 是 7B 的数

41.5/22.3 h 只来自 7B 消融;14B 没有训练时长。论文也没有报告 API 费用、工具调用次数或多次运行方差。不能把 22.3 h 直接外推到 14B 或其他工具集(Table 2)。

结果层面的边界还有三条。第一,Level 3 存在并列:7B 的 Level 3 是 3.84,MAT Agent 也是 3.84;14B 的 Level 3 是 7.69,才真正高于 3.84。第二,样本效率的对照不纯:1.3k vs 20k 的对比同时改变了数据量和是否需要 GPT-4o 轨迹,不能把全部差异归给数据量。第三,没有统计检验:论文没有报告置信区间、种子方差或显著性检验,页面也不把任何差值写成「显著」。

方法层面的边界是代码执行环境。Tool-R1 依赖一个能顺序执行 Python、保留变量状态、限制 import 的执行器;换到不允许任意代码、或工具调用必须走固定 API 的环境,核心的变量共享优势会削弱。论文的系统提示排除了 os、pip 等库,但没有给出完整的沙箱安全评估(Appendix A)。

笔记勘误(只记录,不修改原笔记)
  • 「about 10% gain」没有拆分口径:论文摘要的 about 10% gain 没有在同一句交代口径;页面并列 9.09/11.52 个百分点与 88.3%/76.0% 相对值,不替作者选。
  • 难度筛选的 +7.27% 与论文表内 +6.06 不是同一个分母:笔记写 9.09→16.36(+7.27),这是相对 Vanilla GRPO;论文 Table 2 的括号列以 10.30 为基准,写 +6.06。两者都成立,但引用时必须带分母。
  • 「for the first time」与 Table 1 并列冲突:论文 §4.2 写 “for the first time (3.84% success rate)”,但 Table 1 的 MAT Agent 两行 Level 3 也都是 3.84;3.84 与 MAT Agent 并列,不能据此主张 “first time”;14B 的 Level 3 7.69 才高于 3.84。
  • 「训练时间几乎减半」只对 7B 消融成立:41.5→22.3 h 是 Table 2 的 7B 数据,减少 19.2 h、相对 46.3%;论文没有给 14B 的训练时间,也没有给 14B 的队列消融。
  • 「1,300 条 vs 20k 条」不是纯数据量对照:MAT Agent 的 20k 还包含 GPT-4o 生成的高质量轨迹,Tool-R1 不需要轨迹标注;Tool-R1 的数据量只有 MAT Agent 的 6.5%,这只是其中一个变量。
  • 「效果显著」没有统计依据:论文没有报告显著性检验或置信区间;笔记里的「效果显著」是修辞,不是统计结论。
  • 「课程学习」不是论文的术语:笔记开头写「本文也引入了课程学习」,论文 §3.2 的说法是 difficulty-aware data filtering——按初始策略的通过率 0.2–0.8 筛题,没有课程式的分阶段训练安排。