研究者构建了TOOLCALL-300基准测试集,发现将模型输出直接透传给工具处理器时,80%会产生schema校验错误;在模型输出前加一层标准化shim后错误率降为0。这意味着AI Agent工程化必须重视参数归一化环节。
如果你的 Agent 解析了模型输出的 tool call,直接把参数转发给 handler 而没有先做规范化,那么 300 个带标签的畸形调用中,仍有 240 个返回的结果会被所声明的 schema 拒绝。适配器本身会对其中 51 个抛出异常。在规范化垫片(normalising shim)先运行之后,这个数字变成了 0。
这不是一份生产流量的调研报告。这是 TOOLCALL-300——300 个合成 tool call,分为 12 个类别(每类 25 个),每个都配有一个固定声明 schema 的真值(ground truth),外加一个评分器,可以对你插入的任意适配器打分。
直接把模型输出透传,不做任何修复。
TOOLCALL-300 adapter: naive
cases 300
exact match 10 / 300 (3.3%)
refused correctly 10 / 50
invented calls 40
false refusals 50
schema-invalid returns 240
对照组得的每一分都来自本身就已经损坏到无法解析的输出。在 250 个存在正确调用可以挽回的 case 上,它得了 0 分。在 50 个诚实答案是"这里没有调用"的 case 上,它有 40 次向服务器提交了一个调用,其中甚至包括了全部 25 次对从未声明过的工具的调用。
两个适配器在全部 300 个 case 上各跑了一遍:透传(naive)vs 规范化垫片。评分是比较最终调用的精确匹配,不是"它跑起来了没"。
args as string —— 参数以 JSON 字符串的形式出现在 arguments 字段里,于是每个带类型的字段都变成了字符串,后续所有数值比较都会出错。
type coercion —— schema 要求 integer 的地方来了 "3",要求 boolean 的地方来了 "true"。验证器会拒绝它;而那些不拒绝的验证器问题更大。
array vs scalar —— schema 声明的是列表却只传了单个值,或者反过来。这种情况半能工作,直到某个调用方把字符串按字符逐个迭代。
完整分类说明及评分规范见:Why LLM tool-call arguments fail schema validation。
评分器、参考规范化器、以及 12 个公开 case 均为公共领域(CC0)发布。全部 300 个 case 在免费套件里跑,答案密封。
python3 score.py --corpus open12.jsonl --adapter yourmodule:normalise
python3 score.py --corpus open12.jsonl --adapter naive # the control
剩余 270 个 case(附每个 case 的标签依据——为什么那个 ground truth 而非其他)是付费产品。€29 单开发者,€99 团队/CI 许可证。付款后即时下载。
TOOLCALL-300 on Toolkit Labs
评分器、生成器、toolshim.py 和 30 个免费 case 无论你是否购买均永久保持 CC0。