多步工具调用的两个瓶颈很具体:JSON 形式的调用只能填预定义参数,跨步骤的变量和中间结果传不下去;RL 又要在训练中反复真实调用搜索、网页、文件解析等工具,采样成本高。 Tool-R1 让模型直接生成可执行 Python,中间变量留在同一个命名空间里;训练用 LLM-as-Judge 判最终答案,再加代码解析/执行奖励,并用 难度筛选 + 动态样本队列 复用轨迹。
用代码替代 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” 没有在同一句交代是绝对百分点还是相对提升;页面并列两个口径,不替作者选。
先把「表达能力」和「采样成本」分开看;Tool-R1 的两个设计正好一一对应。
LLM 的参数化知识有边界:实时天气、私有数据库、精确计算、复杂文件解析都不在权重里。接外部工具是直接解法,但现有做法各有问题。提示工程(如 ReAct)靠上下文里的示例和指令决定何时调用工具,遇到 API 报错、空结果或页面结构变化时,模型没有从反馈中学习的机制,鲁棒性差(§1)。
RL 路线能从环境反馈里学,但论文指出两个可扩展性瓶颈。第一,调用格式太窄:JSON 形式的工具调用只能填预定义函数和参数,难以跨步骤共享变量,也不方便组合多个工具。第二,在线采样太贵:每一步都要真实调用搜索、网页访问、文件解析或视觉模型,延迟、限流和网络波动都会拖慢训练,成本把研究限制在少数领域(§1)。
一个 JSON 调用通常只描述「调用哪个函数、传什么参数」。如果第二步要用第一步的返回值,第三步要用前两步的中间结果,调用之间缺少自然的变量空间;复杂控制流(循环、条件、组合)也很难写进固定 schema(§1、§3.1)。
GRPO 对每个问题要一组轨迹;每条轨迹都可能触发多次外部调用。训练步数一多,采样开销会超过模型更新本身。论文的消融显示,不做优化的 Vanilla GRPO 训练时间达到 41.5 小时(Table 2)。
论文没有把问题定义成「让模型更会写工具调用格式」,而是定义成「让工具使用成为推理过程的一部分」。这决定了后面的三个设计:代码作为动作、结果驱动奖励、轨迹复用。评测放在 GAIA:446 个任务、109 个真实文件,覆盖 PDF、PPTX、XLSX 等格式与网页导航、文档理解、逻辑推理等能力(§4.1)。
论文的对照不是「有没有工具」,而是「工具调用在训练里占什么位置」。
用 few-shot 或系统提示规定「思考—行动—观察」格式,模型按提示调用工具。优点是无需训练;缺点是不会从失败中更新策略,遇到非预期反馈只能靠上下文里再解释一遍(§1)。
把工具调用写成 JSON,用 PPO/GRPO 训练。代表工作如 Search-R1 把搜索调用放进 rollout。Tool-R1 认为这类方法受限于预定义工具与参数 schema,跨步骤组合能力弱(§1、§2)。
SFT 或 MAT Agent 用人工/GPT-4o 生成的高质量轨迹训练。效果可以很强,但标注成本高、难以规模化;论文特别对比了 MAT Agent 的 20k QA + 轨迹标注(Table 1)。
Tool-R1 的切入点是把「动作」从 JSON 换成可执行代码,同时保留 RL 的试错学习。这样既能调用用户自定义工具与标准库,又能把中间结果留在 Python 命名空间里;训练仍然只需要最终答案与代码执行结果,不需要过程标注(§3.1、§3.3)。
但「代码动作」本身不解决采样成本。论文的第二个贡献是训练效率:难度筛选减少无效题,动态队列减少重复生成。两者都不是模型结构改动,而是 GRPO 外层的数据与采样流程改动(§3.2)。
方法有三层:交互协议、样本复用、奖励函数。交互与奖励决定「学什么」,样本复用决定「学得多快」。
每一步,模型先写一段 Thought:,再写一个 Code: 块;执行器运行代码,把标准输出或工具返回值作为 Observation: 追加回上下文。下一步模型可以看到之前所有代码与观察,也可以继续使用之前定义的变量(§3.1、Figure 2)。
论文给的工具包括: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)。
论文 Figure 1 的例子:模型先意识到要比较重量就需要密度,于是调用 wikipedia_qa 查密度;第一次没查到,改用 web_qa;拿到密度后,再用前面定义的变量算一加仑蜂蜜和蛋黄酱的质量,并算出需要移走多少杯。整个过程的数据流留在 Python 变量里,而不是每步重新把 JSON 参数抄一遍(§3.1、Figure 1)。
难度筛选发生在训练前:用初始策略对每题采样 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)。
最终答案由 Qwen2.5-3B-Instruct 裁判按 accuracy、completeness、relevance、precision 四项评分,输出三档:Correct 得 1,Partially Correct 得 0.5,Wrong 得 0(§3.3、Eq.2、Figure 3)。代码质量另给两个辅助奖励:
这三个分量覆盖不同失败模式:答案对但代码不可运行,仍能拿到答案分,但会被辅助奖励拉开差距;代码能跑但答案错,也拿不到主要奖励。论文没有设置额外的答案格式奖励,也没有训练神经奖励模型;Rparse 只检查代码块能否被解析,裁判是固定的轻量 LLM,不参与策略更新(§3.3)。
这套方法的「便宜」是相对在线 RL 的采样开销,不是相对一次 SFT;硬件与时长都要按变体看。
训练集 1,300 条高质量问答对;底座是 Qwen2.5-7B-Instruct 与 Qwen2.5-14B-Instruct;不做 cold-start 初始化,也不需要人工轨迹(§4.1)。
学习率 1e-6,梯度累积后有效 batch 256,训练 2 个 epoch,最大序列长度 2,048 token,每题最多 10 个交互步;KL 惩罚权重 0.001(§4.1)。
每题轨迹队列大小 G=16,每步生成 g=8 条新轨迹,FIFO 替换最旧条目;训练时推理温度 0.6(§4.1)。
全部实验在 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 也能这个成本」的证据。
右侧是训练侧:答案裁判与代码奖励合成标量,GRPO 更新策略,动态队列把缓存轨迹送回 GRPO。
这张图有三条回边:Observation 回到策略,形成下一轮上下文;Final Answer 进入答案裁判,与代码奖励合成标量奖励后交给 GRPO;动态样本队列把缓存轨迹送回 GRPO 组。前一条是交互,后两条是奖励与样本复用;它们都不是模型参数的一部分。
先看 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 1 | Level 2 | Level 3 | AnsAcc |
|---|---|---|---|---|---|---|
| 闭源模型 | ||||||
| Warm-up Act | GPT-4-turbo | None | 30.20 | 15.10 | 0.00 | 17.60 |
| Sibyl Agent | GPT-4-turbo | None | 43.40 | 27.90 | 7.70 | 29.70 |
| HF Agent | GPT-4o | None | 47.17 | 31.40 | 11.54 | 33.40 |
| HF Agent | GPT-4o mini | None | 33.96 | 27.91 | 3.84 | 26.06 |
| 开源模型 · 不做微调 | ||||||
| HF Agent | LLaVA-NeXT-8B | None | 9.43 | 1.16 | 0.00 | 3.64 |
| HF Agent | InternVL2-8B | None | 7.55 | 4.65 | 0.00 | 4.85 |
| HF Agent | MiniCPM-V-8.5B | None | 13.21 | 5.81 | 0.00 | 7.27 |
| HF Agent | Qwen2-VL-7B | None | 16.98 | 8.14 | 0.00 | 9.70 |
| Tool-R1(未 RL) | Qwen2.5-7B-Instruct | None | 16.98 | 9.30 | 0.00 | 10.30 |
| Tool-R1(未 RL) | Qwen2.5-14B-Instruct | None | 24.53 | 11.63 | 3.84 | 15.15 |
| 开源模型 · 微调 | ||||||
| MAT Agent | MiniCPM-V-8.5B | 20k QA + Trajectories | 26.42 | 11.63 | 3.84 | 15.15 |
| MAT Agent | Qwen2-VL-7B | 20k QA + Trajectories | 26.42 | 15.12 | 3.84 | 16.97 |
| Tool-R1 | Qwen2.5-7B-Instruct | 1.3k QA pairs | 30.19 | 17.44 | 3.84 | 19.39 |
| Tool-R1 | Qwen2.5-14B-Instruct | 1.3k QA pairs | 33.96 | 27.91 | 7.69 | 26.67 |
和最强的开源微调基线 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。
难度筛选: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 1 | Level 2 | Level 3 | AnsAcc | 训练时间 (h) |
|---|---|---|---|---|---|
| Qwen2.5-7B-Instruct | 16.98 | 9.30 | 0.00 | 10.30 | — |
| Vanilla GRPO | 15.09 (-1.89) | 8.14 (-1.16) | 0.00 | 9.09 (-1.21) | 41.5 |
| + 难度筛选 | 26.41 (+9.43) | 15.12 (+5.82) | 0.00 | 16.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 |
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 个百分点)。
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”,没有在同一句说明绝对还是相对;页面并列两个口径,不替作者选。
这些条件决定了哪些数字可以迁移,哪些只能当成论文设定下的结果。
主结果全部在 GAIA validation 上,没有第二个 agent benchmark。GAIA 覆盖 PDF/PPTX/XLSX、网页与多步推理,但仍是单一评测环境;论文没有报告跨 benchmark 的迁移(§4.1、Table 1)。
最终答案由 Qwen2.5-3B-Instruct 按四项标准判 0/0.5/1;论文没有报告裁判与人工评分的一致率,也没有做裁判替换实验。裁判偏差会直接进入策略梯度(§3.3、Appendix A)。
难度筛选与缓存过滤都用 0.2–0.8 的通过率窗口,论文没有扫这个区间,也没有比较更宽/更窄的阈值。队列只比较 w/o 与 w/ resample,没有 G、g 的完整消融(§3.2、Table 2)。
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)。