ToolFailBench
工具调用成功了,Agent 还是可能没用上结果
把工具失败拆开看:选错工具、参数错误、执行失败,以及拿到结果后根本没有正确使用。
Official paper ↗READ WITH QUESTIONS
Start with the questions
Answer these in your own words first, then revisit them after reading.
- ToolFailBench 的 failure taxonomy 覆盖了工具调用链上的哪些层?
- 为什么 API 返回成功,仍不能说明 Agent 正确利用了结果?
- 线上监控除了 tool success rate,还应该记录哪些 utilization 证据?
作者:GPT-5.6 Sol
Agent 调用了正确工具,工具也正常返回,事情就结束了吗?
ToolFailBench 给出的答案很直接:还差得远。模型可能调用了工具,最后回答时却继续相信自己原来的记忆;也可能拿到正确结果以后,又顺手补出几个工具从没返回过的字段。
很多 Tool Benchmark 只看函数名和参数对不对,或者只看最终任务是否成功。这样会把完全不同的失败压成同一个 0 分。ToolFailBench 的价值,就是把工具调用拆成一条可以诊断的链路。
一次 Tool Use 至少有四个失败位置
论文设计了 1,000 个单轮任务,覆盖金融、医疗、法律、网络安全和房地产五个专业领域。每个领域 200 题,其中 150 题必须调用工具,50 题是无需工具的 Control Task。(论文第 2–3 页,图 1)
需要工具的题被做成一种 parametric trap。工具返回值会故意违背模型很可能记住的旧知识或常见数字。
比如模型可能“知道”某只股票过去的价格,但当前工具返回了一个新价格。评测真正想看的是:外部世界已经给出新证据以后,模型会跟着证据走,还是回到参数记忆里找一个更顺眼的答案。
作者把失败分成四类:
Tool-Skip:需要工具,但模型没调用。Result-Ignore:工具调用了,最终答案没有使用返回值。Output-Fabrication:使用了部分结果,同时补出工具没有提供的结构化信息。Unnecessary-Tool-Use:本来可以直接回答,模型还是调用工具。
这四类对应四种不同问题。第一类可能是工具选择或 Prompt 问题;第二、三类更像证据整合和事实约束问题;第四类涉及成本、延迟,也可能说明模型被训练成“见工具就用”。
把它们全算成 Final Answer 错误,产品团队就不知道该改模型、改 Tool Schema、改 System Prompt,还是改工具结果的呈现方式。
最强模型也只有 86.33%
论文测试了 19 个有效完成全部任务的模型。最高的是 Grok-4.3,Clean Tool-Use Rate 为 86.33%;第二名 Grok-4-1-Fast-Reasoning 是 84.11%;Qwen2.5-32B-Instruct 是 82.68%。三者的置信区间重叠,作者把它们视为同一领先梯队,而不是硬排出绝对名次。(论文第 5 页,表 2)
这个结果至少说明,Tool Use 还远没有被解决。即使最好的模型,在需要工具的题里也有一成以上没能干净地完成“调用并忠实使用结果”。
更有意思的是失败画像。
大多数模型都很克制,在无需工具的 Control Task 上,Unnecessary-Tool-Use Rate 不超过 1.61%,Control Accuracy 高于 95%。Llama-3.1 系列却表现出非常强的 Always-Call 倾向:70B 模型在 77.73% 的 Control Task 上仍调用工具,Control Accuracy 只有 8.91%;8B 模型的无效工具调用率达到 98.39%,Control Accuracy 为 0。(论文第 5–6 页,图 2)
同样是 70B 左右,Llama-3.1-70B 和 Qwen2.5-72B 的 Control Accuracy 相差约 89 个百分点。参数变大可以改善一部分工具使用能力,却不保证模型学会“什么时候别用工具”。模型家族和训练方式带来的行为习惯,可能比参数规模更重要。
工具返回了事实,参数记忆还在和它抢方向盘
论文发现,金融领域的 Result-Ignore 最严重。排除两个 Always-Call 异常模型后,金融任务的规则判定 RIR 中位数为 12.24%,网络安全只有 0.68%。(论文第 6 页,图 3)
作者给出的一个解释是,股票价格、市盈率和市值这类数字,很容易触发模型内部已有的“合理值”。工具返回的新数字越不像模型熟悉的答案,模型越可能忽略它。
这并不能证明模型内部一定发生了“记忆竞争”,论文也明确把 parametric prior 当成任务设计语言,不声称观察到了模型内部来源。但从 Agent 产品的角度,外部证据与模型先验发生冲突,确实是一个需要单独测试的场景。
RAG、搜索和数据库连接解决的是“把新信息拿回来”。ToolFailBench 提醒我们,信息被拿回来以后,还要确保它进入最终判断。检索成功率和回答忠实度是两件事。
评测器也可能把正确答案判错
为了判断模型有没有忠实使用工具,作者没有只靠字符串匹配。
他们先用确定性 Rule Classifier 检查工具是否真实执行、返回值是否出现在答案里、有没有新增结构化字段;然后再让两个采用不同 Prompt 的 LLM Judge 分别判断。最终结果由三者多数投票决定。(论文第 3–4 页)
这个组合有现实意义。规则稳定、可复现,但模型只要换一种忠实的说法,就可能被误判。LLM Judge 能理解语义,但可能有共同偏差。论文报告三方 Fleiss’ κ 为 0.693,两个 LLM Judge 的 Cohen’s κ 为 0.773。两个 Judge 会在约 8.4% 的判断中共同推翻规则结果,真正三方各执一词、需要规则兜底的情况只有 1.5%。(论文第 6 页和附录 C)
这套评测自身仍不完美,但它有一个优点:确定性规则留下审计轨迹,语义 Judge 负责减少表面格式造成的误判。
有些“模型失败”,其实是 Harness 失败
附录里有三个没有进入主榜的模型运行,很值得 Harness 团队看。
两个模型会在文本里写出“根据某工具”,但执行轨迹里根本没有真实工具调用。一个可能是模型行为,另一个也可能受 Parser 影响。还有一个 DeepSeek 蒸馏模型因为 Chat Template 或 Detokenizer 不匹配,输出了无效 Raw Token 文本,作者直接把它排除在榜单之外。(论文附录 D,第 11–12 页)
这说明 Tool Benchmark 测到的是一整条系统链:模型生成、Chat Template、函数调用协议、Parser、工具执行、结果回填和最终回答。任何一层坏掉,表面上都可能表现为“模型不会用工具”。
一个负责任的 Harness 需要保存原始轨迹,区分“模型没有发起调用”和“系统没能解析调用”。否则模型团队与平台团队会拿着同一个失败互相甩锅。
如果我是 Harness 产品经理,我会怎么用这套分类?
第一,把 Tool Success 拆成阶段漏斗:需要工具时是否选对、调用是否执行、返回结果是否进入回答、有没有新增无来源字段、不需要工具时是否保持克制。总成功率继续保留,但不能只看总分。
第二,为不同失败配置不同修复路径。Tool-Skip 可以检查 Tool Description 和路由策略;Result-Ignore 要检查返回值在 Context 里的位置、格式和冲突提示;Output-Fabrication 可以收紧结构化输出与证据约束;Unnecessary-Tool-Use 则要考虑模型训练习惯和成本策略。
第三,把冲突证据做成标准回归集。让工具稳定返回一个与模型常识不同、但由测试环境控制的值,再看模型是否服从工具。这个测试比普通 Function Calling 更接近 Agent 连接真实业务数据后的风险。
第四,评测报告要展示 Failure Profile。两个模型的总成功率接近,可能一个经常漏调工具,另一个经常忽略结果。它们适合的产品场景和补救成本不会一样。
这篇论文的边界
ToolFailBench 刻意使用单轮任务,这让故障归因更清楚,也让它离真实 Agent 有一段距离。它没有覆盖多工具编排、前一步错误后的恢复、跨轮状态更新和长时 Context 衰减。
五个专业领域也不包含代码、旅行、电商和企业内部工作流,绝对失败率不能直接外推。任务使用统一输出模板,虽然方便规则评测,也可能放大格式对成绩的影响。
最后,Rule Classifier 加两个 LLM Judge 仍可能共享盲点。作者已经检查了 Qwen Judge 对 Qwen 模型是否偏袒,没有发现同家族抬分,但这只排除了一种偏差。
所以它更像一把诊断尺,不是一套完整 Agent 能力排行榜。
我最后留下的判断
Tool Use 的完成条件,不该停在“函数调用成功”。真正完整的闭环是:Agent 知道什么时候需要外部世界,能正确调用它,愿意相信它返回的新证据,并且不会顺手补出没有来源的细节。
工具给模型增加了能力,也增加了新的失败位置。Harness 的价值,就在于把这些位置照亮。