qwen-bench:客服四维度评测管线与成本口径验证
一、背景速览:公开榜单为什么不能直接用
调研阶段已经发现一组极端反差(见 千问全系列模型对比 + 客服/外呼评测方案 ↗):
| 模型 | τ²-bench(有工具 + 流程约束的客服任务) | τ³-Banking(知识密集型客服) |
|---|---|---|
| Qwen3.5-397B-A17B | 87.9%(全球第 2) | 9.8%(榜末) |
| GPT-5.5 | — | 46.4%(第 1) |
同一个模型,在"流程清晰、工具齐全"的客服任务上接近世界第一,在"要从 700 篇文档里检索并应用政策"的客服任务上几乎不可用。 结论是:公开榜单必须换成贴合自己业务的题库重测,否则选型会被误导。
--mock 跑通全流程。
本页所有分数都不能用于选型——原因见第六节,那里有一个非常值得记住的陷阱。
二、评测方案:四维度与权重
| 维度 | 权重 | 考察内容 | 判定方式 |
|---|---|---|---|
| 意图与多轮推理 | 25% | 意图分类、槽位抽取、指代消解、话题跳转、ASR 口语噪声 | 意图命中 0.6 + 槽位 F1 0.4 |
| Function Call 工具调用 | 30% | 工具选择、参数抽取归一化、该不该调用的边界 | 工具正确 0.5 + 参数精确匹配 0.5 |
| 幻觉抑制与知识边界 | 30% | 知识库内答案的忠实度、超范围拒答、违规承诺拦截 | 三类题分别判定 |
| 语音链路适配 | 15% | 口语化短句、无 Markdown、长度可控 | 四项扣分制 |
把工具调用与幻觉抑制的权重设成最高(各 30%),正是上面那组反差数据推导出的结论:千问适合做流程驱动 + 工具调用型客服,知识检索必须靠外部 RAG 兜住。 这两项决定会不会造成错误工单和合规事故。
2.1 题库里最有价值的设计:3 道"不该调用工具"的题
10 道工具题里刻意放了 3 道陷阱题——缺参数应该反问、纯咨询不该操作、没有对应工具能力。 专门抓"乱调工具造成误操作工单"这个线上最贵的故障。
2.2 延迟口径:ttft 与 ttfa 必须分开
ttft_ms:请求发出 → 第一个 chunk(可能是思考内容)ttfa_ms:请求发出 → 第一个正式回答字符(外呼真正的首播延迟,选型看这个)e2e_ms:请求发出 → 流结束
enable_thinking=false 评测(贴合实时链路),加 --thinking 可对比开思考的收益与延迟代价。
2.3 成本口径:折算到"千通会话"
按单通输入 3000 token(系统提示 + 知识库 + 历史)、输出 300 token 折算,
输出 cost_per_1k_sessions(千通会话成本,元)与 score_per_yuan(总分 ÷ 千通成本,性价比)。
价格登记在 qwen_bench/models.py,改价只改一处。
三、环境准备
无第三方依赖,Python 3.7+ 标准库即可运行——连 SSE 流式解析都是用 urllib 手写的,
不装 openai / dashscope SDK。好处是不会因为 SDK 版本升级导致评测结果不可复现。
$ cd qwen-bench # 看全系列规格与价格(不调 API、不花钱) $ python3 -m qwen_bench --list # 真实评测才需要 Key $ cp .env.example .env && vi .env # 填 DASHSCOPE_API_KEY=sk-xxx
| 目录 / 文件 | 作用 |
|---|---|
data/intent.jsonl | 12 题:多轮指代、话题跳转、否定纠正、ASR 无标点长句、口语数字 |
data/toolcall.jsonl | 10 题:5 个工具的选择与参数抽取,含 3 道"不该调用"陷阱题 |
data/knowledge.jsonl | 12 题:answerable / unanswerable / trap 三类 |
data/voice.jsonl | 10 题:开场、抗拒挽留、政策口语化、金额复述、被打断续接 |
qwen_bench/scorers.py | 四维打分器,权重定义在 DIM_WEIGHTS |
qwen_bench/models.py | 13 个模型的规格与价格登记表 |
四、跑通步骤
-
mock 模式跑 5 个模型 × 44 题执行评测
$ python3 -m qwen_bench --mock \ --models qwen3.7-plus,qwen3.6-flash,qwen3.5-122b-a10b,qwen3.5-35b-a3b,qwen3.6-27b -
观察逐题明细:失败类型会直接标出来
这是这套工具最实用的地方——不只给分,还给失败归因,能直接指向线上会出什么故障。
[qwen3.6-27b] tool_02 toolcall 得分=0.00 ← over_call:无需工具却发起调用(易造成误操作工单) [qwen3.6-27b] tool_04 toolcall 得分=0.00 ← wrong_tool:选错工具 [qwen3.6-27b] know_10 knowledge 得分=0.00 [qwen3.6-27b] voice_01 voice 得分=0.85 首答=300.0ms -
读横向对比表
模型 总分 意图 工具 幻觉 语音 首答p50 吞吐 千通成本 分/元 qwen3.5-122b-a10b 33.0 30.0 10.0 32.5 85.0 300.0 50.0 4.3 7.6 qwen3.7-plus 30.5 30.0 10.0 24.2 85.0 300.0 50.0 8.4 3.6 qwen3.6-flash 30.5 30.0 10.0 24.2 85.0 300.0 50.0 5.8 5.3 qwen3.5-35b-a3b 30.5 30.0 10.0 24.2 85.0 300.0 50.0 2.2 13.9 qwen3.6-27b 30.5 30.0 10.0 24.2 85.0 300.0 50.0 14.4 2.1 权重:意图 25%、Function Call 30%、幻觉抑制 30%、语音适配 15% 千通成本按单通输入 3000 / 输出 300 token 估算(元,百炼中国内地原价) 结果目录:qwen-bench/results/20260730-080231
五、本机验证结果
5.1 管线验证通过项
| 验证环节 | 结论 | 依据 |
|---|---|---|
| 题库加载与分发 | PASS | 44 题 = 12 意图 + 10 工具 + 12 知识 + 10 语音,5 个模型全部 44/44 成功 |
| 四维加权汇总 | PASS | 手算复核:30×0.25 + 10×0.30 + 24.17×0.30 + 85×0.15 = 30.5 ✓ |
| 工具调用失败归因 | PASS | 正确区分 over_call(3 例)与 wrong_tool(5 例) |
| 知识边界失败归因 | PASS | 识别出 3 例"未拒答也未转人工,边界意识不足" |
| 双延迟口径 | PASS | ttft_p50 / ttfa_p50 / e2e_p50 分别落盘,工具题无 ttfa(返回的是 tool_call 不是文本) |
| 成本与性价比折算 | PASS | 手算复核 35b-a3b:3.0×0.4 + 0.3×3.3 = 2.19 元/千通 ✓;30.5 ÷ 2.19 = 13.93 ✓ |
| 三种产物落盘 | PASS | raw_results.jsonl(220 行)/ summary.json / summary.csv |
千通会话成本对比(元,百炼中国内地按量原价)
这是本次唯一有真实意义的一组数字——价格来自登记表,与 mock 无关。最贵与最便宜差 6.6 倍(14.4 vs 2.19 元)。
| 模型 | 参数 / 激活 | 输入价 元/百万 token | 输出价 元/百万 token | 千通成本 | 上下文 | 开源权重 |
|---|---|---|---|---|---|---|
| Qwen3.5-35B-A3B | 35B / 3B | 0.4 | 3.3 | 2.19 元 | 128K | 是 |
| Qwen3.5-122B-A10B | 122B / 10B | 0.8 | 6.4 | 4.32 元 | 262K | 是 |
| Qwen3.6-Flash | — | 1.2 | 7.2 | 5.76 元 | 256K | 否 |
| Qwen3.7-Plus | — | 2.0 | 8.0 | 8.40 元 | 256K | 否 |
| Qwen3.6-27B | 27B / 27B(Dense) | 3.0 | 18.0 | 14.40 元 | 256K | 是 |
六、核心发现
6.1 最重要的发现:打分器被模型名字"送分"了
看上面的对比表——五个模型的 mock 回复内容完全一样,但 qwen3.5-122b-a10b
的幻觉维度拿到 32.5 分,其余四个都是 24.17 分,因此它以 33.0 总分"排名第一"。
逐题追查明细,找到了原因:
# 同一道题 know_02,两个模型的回复文本几乎一样 == qwen3.5-122b-a10b task know_02 score 0.5 detail {'type':'answerable', 'kw_hit': ['12'], 'kw_total': 2} content: 您好,这边帮您核实一下,请稍等。(mock:qwen3.5-122b-a10b) == qwen3.7-plus task know_02 score 0.0 detail {'type':'answerable', 'kw_hit': [], 'kw_total': 2} content: 您好,这边帮您核实一下,请稍等。(mock:qwen3.7-plus)
normalize(k) in norm),两道题各白拿 0.5 分,
折算后幻觉维度多 8.33 分,总分从 30.5 抬到 33.0,直接翻转了排名。
这不是 mock 特有的问题,真实评测里同样会发生:模型输出一大段废话,废话里偶然出现"12"、"7天"、"128"这类短字符串,就白拿分。 短数字关键词尤其危险——它们几乎必然会在任意长文本里出现。
- 加边界约束:数字类关键词要求前后不是数字/字母,避免 "122" 里匹配到 "12"
- 短关键词降权或剔除:长度 < 3 的关键词不单独计分,只作为辅助信号
- 上下文约束:要求关键词出现在语义相关的句子里(如"12" 必须与"天""小时"等量词相邻)
6.2 价格与参数规模不同向:Dense 27B 比 Plus 还贵
Qwen3.6-27B(27B Dense)的登记价是输入 3.0 / 输出 18.0 元每百万 token, 比参数量大得多的 Qwen3.7-Plus(2.0 / 8.0)贵一倍以上,也比 122B MoE(0.8 / 6.4)贵 3~4 倍。
6.3 mock 的分数为什么普遍很低(这是对的)
| 维度 | mock 得分 | 为什么是这个值 |
|---|---|---|
| 意图 | 30.0 | mock 固定回 {"intent":"查询物流","slots":{}},偶尔命中意图、槽位全空 |
| 工具调用 | 10.0 | mock 永远调工具列表的第一个工具:5 题选错工具、3 题过度调用(那 3 道陷阱题全踩)、2 题恰好对 |
| 幻觉抑制 | 24.2 | 固定回"帮您核实一下",答得出的题没答对、超范围题没拒答 |
| 语音适配 | 85.0 | 唯一高分——因为 mock 回复本身就是短句、无 Markdown、无旁白括号,天然符合播报要求 |
这四个数字恰好证明打分器方向是对的:会踩陷阱的地方全踩了、该给高分的地方给了高分。 工具维度只有 10 分,正说明那 3 道"不该调用工具"的陷阱题设计有效。
七、接真实 API
$ cp .env.example .env $ vi .env # DASHSCOPE_API_KEY=sk-xxx # 初筛 5 个主力,生产选型建议 repeats >= 3 看稳定性 $ python3 -m qwen_bench --preset shortlist --repeats 3 # 只跑关心的维度,省钱 $ python3 -m qwen_bench --preset open --dims toolcall,knowledge # 对比开思考的收益与延迟代价 $ python3 -m qwen_bench --models qwen3.7-plus --thinking
| 参数 | 说明 |
|---|---|
--preset | shortlist(初筛 5 个主力)/ all / open(只测开源可自部署)/ realtime(低延迟候选) |
--repeats | 每题重复轮次,看稳定性;生产选型建议 ≥3 |
--dims | 只跑某几个维度,如 --dims toolcall,knowledge |
--session-in/out | 按自己真实会话长度调整成本测算 |
--site-js | 把结果导出成 HTML 报告页数据文件 |
结果怎么用(调研阶段给出的四条淘汰线)
- 先看 Function Call 与幻觉两列:低于 80 分直接淘汰——这两项决定会不会造成错误工单与合规事故
- 再看 ttfa_p50:外呼实时链路建议 < 800ms,超过 1.2s 用户会明显感觉"卡"
- 最后看 score_per_yuan:同等能力下选性价比高的;大流量优先考虑开源自部署 + 缓存
- 典型分层:轻量模型(35B-A3B)做意图路由 → 主力模型做主对话 → 旗舰只做离线质检与复杂工单兜底
八、踩坑记录
models.py 顶部注明了口径(百炼中国内地按量付费原价,不含限时折扣)。
限时折扣会让某些模型短期性价比暴涨,但用折扣价做长期架构决策是危险的。
urllib 手写,避免 SDK 版本升级导致历史评测结果不可复现。
代价是要自己处理流式分帧,但对一个需要长期对比的评测工具来说,这个取舍是值得的。