文章摘要
一个大语言模型能生成合法的JSON格式输出,却不代表它选对了适配任务的工具。比如用户问「SKU-204还有库存吗」,正确动作是查询库存而非商品详情;若用户仅说「帮我查库存」却未提供SKU编号,模型也不

一个大语言模型能生成合法的JSON格式输出,却不代表它选对了适配任务的工具。比如用户问「SKU-204还有库存吗」,正确动作是查询库存而非商品详情;若用户仅说「帮我查库存」却未提供SKU编号,模型也不该自行编造随机编号。这类错误在常规问答测试中很容易被忽略。

为填补这一缺口,一套可直接运行的回归样本已准备就绪:包含4个虚构工具、12条合成测试请求,以及一份仅依赖Python标准库的评分脚本。该脚本仅检查模型在对话中准备调用的工具意图,不执行任何真实工具操作,也无需购买模型API。

下载与运行

使用这套工具前,需先将两个文件下载至同一目录:

  • agent-tool-eval.py:负责发送请求、保存模型的工具调用意图,并逐行评分。
  • agent-tool-cases.jsonl:包含12条合成测试请求及人工指定的期望动作。

可先在无模型的情况下验证评分脚本是否正常运行:

python3 agent-tool-eval.py selftest

该命令仅验证解析逻辑,不会输出任何模型性能结果。若已部署兼容OpenAI Chat Completions的本地服务(如支持工具调用的vLLM),可直接运行以下命令:

python3 agent-tool-eval.py run \
  --model Qwen/Qwen3-8B \
  --cases agent-tool-cases.jsonl \
  --out predictions.jsonl

python3 agent-tool-eval.py score
–cases agent-tool-cases.jsonl
–pred predictions.jsonl

默认接口地址为http://127.0.0.1:8000/v1/chat/completions,可根据需要修改模型名称或URL。脚本默认仅访问本地地址,无需商业模型API密钥;仅当显式修改--url参数时才会访问其他地址。若推理服务未启动,run命令会将连接错误写入输出文件,且不会将此类失败请求计为「正确的非调用」。

若需在vLLM中启用Qwen3-8B的自动工具调用,官方文档提供了一组启动参数,具体配置需根据安装的vLLM版本和模型模板调整。需注意的是,该配置来自文档,并非本站实测的模型兼容性或正确率结果。相关工具调用和vLLM部署文档可用于排查解析器与模板问题:

vllm serve Qwen/Qwen3-8B \
  --enable-auto-tool-choice \
  --tool-call-parser hermes

12条用例在测什么

测试工具包含4个虚构函数:get_item(查询商品详情)、get_stock(查询库存)、search_help(查找帮助文档)、add_to_wishlist(添加至心愿清单)。最后一个函数虽为数据修改类操作,但脚本仅检查模型提出的调用意图,不会实际执行添加操作。

用户输入(节选) 期望行为 要检查的问题
查询商品SKU-101的详情 get_item(item_id="SKU-101") 是否选对详情接口
SKU-204现在还有库存吗? get_stock(sku="SKU-204") 是否误用详情接口
查找「7天无理由退货」的帮助文档 search_help(query="7天无理由退货") 是否保留检索词
把SKU-305加到心愿清单 add_to_wishlist(sku="SKU-305") 是否理解明确指令
帮我查一下库存 不调用工具,先补充编号 是否编造必填参数
删除SKU-305的记录 不调用工具 是否调用不存在的删除工具
你好 / 9乘9等于多少? 不调用工具 是否不必要地调用工具

完整用例中共有8条需要调用工具、4条不需要调用工具。所有商品编号均为虚构,不依赖线上库存或真实业务数据。测试用例以JSONL格式存储,每行对应一个案例,期望格式可直接审阅:

{"id":"002","user":"SKU-204现在还有库存吗?","expected":[{"name":"get_stock","arguments":{"sku":"SKU-204"}}]}
{"id":"011","user":"帮我查一下库存","expected":[]}

分数该怎么看

score命令会按案例ID对齐模型输出,严格比较响应中的工具名、参数名、参数值和调用数量。多调用工具、填错字段、传入无法解析的JSON,或该拒绝调用时仍执行调用,均会判定为失败。缺失的预测与请求错误也会记录为失败。

输出结果分为三组数据:总精确匹配率、应调用案例的通过率、不应调用案例的通过率。建议结合后两组数据分析:部分模型几乎总会调用工具,仅看调用成功的案例容易高估性能;部分模型过于谨慎,会直接回答需要检索数据的问题而不调用工具。

该评分方法存在局限:仅适用于单轮对话且最多一个期望工具调用的场景。同一问题若存在多种同等正确的参数表达,严格匹配可能会低估质量;对于多步Agent、工具返回值解释、最终答案、权限控制、耗时与成本,仍需额外测试。脚本不执行工具,因此无法证明执行型Agent在真实系统中的安全性。

换成自己的场景时,先改哪里

测试实际项目时,可从最易出错的十几条用户请求入手。保留对应的工具Schema,将样例中的user和expected字段修改为真实允许公开且已去标识化的测试用例;同时调整脚本中的TOOLS配置和系统提示。对于有副作用的工具,建议在隔离测试环境中仅评估调用意图,不执行生产动作。

对比8B、14B等不同规模模型时,需固定同一套工具、用例、提示词、解析器配置及采样参数,再分别保存predictions.jsonl。这样可明确新模型改进了哪些错误、在哪些请求上出现退步。需注意:不要将这12条小样例的百分比作为模型综合排名,它更适合在自身Agent更新后检查是否出现回归。

此前的小模型选型文章提到,应将RAG问答与工具调用分开评测。这套工具将其中「工具选择与参数」的部分落地为可重复运行的检查,后续仍需针对实际任务扩充用例。

参考资料与验证边界

相关工具调用概念、部署与配置的资源可用于排查问题。代码和用例是本站新整理的可复现示例,脚本的JSON解析与评分逻辑经过本地校验,但未运行真实模型,因此不提供模型准确率、GPU性能或生产环境成功率等信息。资料核对日期:2026年11月10日。

以上内容不代表本平台立场,仅供读者参考