战

实战中心

大模型评测

← 返回实战列表
🧠 大模型评测

qwen-bench:客服四维度评测管线与成本口径验证

2026-07-30 · 220 次调用(5 模型 × 44 题)· 工具目录 qwen-bench/ · mock 管线验证

机型 Apple Silicon macOS Python 3.9.6(零第三方依赖) 题库 44 题 / 四维度 模式 --mock(不消耗 Token)
本页导航: 背景速览 评测方案 环境准备 跑通步骤 验证结果 核心发现 接真实 API 踩坑记录

一、背景速览:公开榜单为什么不能直接用

调研阶段已经发现一组极端反差(见 千问全系列模型对比 + 客服/外呼评测方案 ↗):

模型τ²-bench(有工具 + 流程约束的客服任务)τ³-Banking(知识密集型客服)
Qwen3.5-397B-A17B87.9%(全球第 2)9.8%(榜末)
GPT-5.5—46.4%(第 1)

同一个模型,在"流程清晰、工具齐全"的客服任务上接近世界第一,在"要从 700 篇文档里检索并应用政策"的客服任务上几乎不可用。 结论是:公开榜单必须换成贴合自己业务的题库重测,否则选型会被误导。

本次实战定位:不出模型排名,只验证"这套评测管线的四维打分、双延迟口径、成本折算三块逻辑,在本机跑起来对不对"。 真实评测需要 DashScope Key(会产生费用),所以用 --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 必须分开

思考型模型会先输出一大段 reasoning,此时"首 token 到达"很早,但用户听到第一个字很晚。 语音外呼只关心后者,所以工具分开打点:
  • 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.jsonl12 题:多轮指代、话题跳转、否定纠正、ASR 无标点长句、口语数字
data/toolcall.jsonl10 题:5 个工具的选择与参数抽取,含 3 道"不该调用"陷阱题
data/knowledge.jsonl12 题:answerable / unanswerable / trap 三类
data/voice.jsonl10 题:开场、抗拒挽留、政策口语化、金额复述、被打断续接
qwen_bench/scorers.py四维打分器,权重定义在 DIM_WEIGHTS
qwen_bench/models.py13 个模型的规格与价格登记表

四、跑通步骤

  1. 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
  2. 观察逐题明细:失败类型会直接标出来

    这是这套工具最实用的地方——不只给分,还给失败归因,能直接指向线上会出什么故障。

    [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
  3. 读横向对比表
    模型                    总分   意图   工具   幻觉   语音   首答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 管线验证通过项

验证环节结论依据
题库加载与分发PASS44 题 = 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 例"未拒答也未转人工,边界意识不足"
双延迟口径PASSttft_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 ✓
三种产物落盘PASSraw_results.jsonl(220 行)/ summary.json / summary.csv

千通会话成本对比(元,百炼中国内地按量原价)

这是本次唯一有真实意义的一组数字——价格来自登记表,与 mock 无关。最贵与最便宜差 6.6 倍(14.4 vs 2.19 元)。

模型参数 / 激活输入价
元/百万 token
输出价
元/百万 token
千通成本上下文开源权重
Qwen3.5-35B-A3B35B / 3B0.43.32.19 元128K是
Qwen3.5-122B-A10B122B / 10B0.86.44.32 元262K是
Qwen3.6-Flash—1.27.25.76 元256K否
Qwen3.7-Plus—2.08.08.40 元256K否
Qwen3.6-27B27B / 27B(Dense)3.018.014.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)
模型名 "qwen3.5-122b-a10b" 里的 "12",被当成命中了答案关键词 "12"。 打分器用的是子串匹配(normalize(k) in norm),两道题各白拿 0.5 分, 折算后幻觉维度多 8.33 分,总分从 30.5 抬到 33.0,直接翻转了排名。

这不是 mock 特有的问题,真实评测里同样会发生:模型输出一大段废话,废话里偶然出现"12"、"7天"、"128"这类短字符串,就白拿分。 短数字关键词尤其危险——它们几乎必然会在任意长文本里出现。

修法(三条,按推荐顺序):
  • 加边界约束:数字类关键词要求前后不是数字/字母,避免 "122" 里匹配到 "12"
  • 短关键词降权或剔除:长度 < 3 的关键词不单独计分,只作为辅助信号
  • 上下文约束:要求关键词出现在语义相关的句子里(如"12" 必须与"天""小时"等量词相邻)
更根本的做法是把 answerable 类改成 LLM-as-judge 判忠实度,但那会引入判官模型的成本与不确定性, 在自动化回归里仍然需要关键词法兜底——所以边界约束是必须加的。
方法论层面的收获:这就是"先跑 mock"的价值。mock 让所有模型的回复完全相同, 构成了一个天然的对照实验——只要出现分数差异,就一定是打分器的问题,不可能是模型的问题。 如果一上手就调真实 API,这 8.33 分的差异会被当成"122B 的知识能力确实更强", 然后写进选型报告,最后变成一个错误的架构决策。

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 倍。

原因是架构而非规模:MoE 模型(如 122B-A10B)虽然总参数 122B,但每 token 只激活 10B, 推理成本按激活参数算;而 27B Dense 每 token 全参数激活。 选型不能看参数量估成本,必须看激活参数。

6.3 mock 的分数为什么普遍很低(这是对的)

维度mock 得分为什么是这个值
意图30.0mock 固定回 {"intent":"查询物流","slots":{}},偶尔命中意图、槽位全空
工具调用10.0mock 永远调工具列表的第一个工具: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
参数说明
--presetshortlist(初筛 5 个主力)/ all / open(只测开源可自部署)/ realtime(低延迟候选)
--repeats每题重复轮次,看稳定性;生产选型建议 ≥3
--dims只跑某几个维度,如 --dims toolcall,knowledge
--session-in/out按自己真实会话长度调整成本测算
--site-js把结果导出成 HTML 报告页数据文件

结果怎么用(调研阶段给出的四条淘汰线)

  1. 先看 Function Call 与幻觉两列:低于 80 分直接淘汰——这两项决定会不会造成错误工单与合规事故
  2. 再看 ttfa_p50:外呼实时链路建议 < 800ms,超过 1.2s 用户会明显感觉"卡"
  3. 最后看 score_per_yuan:同等能力下选性价比高的;大流量优先考虑开源自部署 + 缓存
  4. 典型分层:轻量模型(35B-A3B)做意图路由 → 主力模型做主对话 → 旗舰只做离线质检与复杂工单兜底

八、踩坑记录

坑 1:关键词子串匹配会被无关文本送分(本次最大发现)。 详见 6.1。核心教训:任何基于关键词匹配的自动打分,都必须先用"所有被测对象输出完全相同"的对照组验证一遍, 如果对照组之间出现分差,打分器一定有 bug。
坑 2:mock 的分数绝对不能拿去做选型。 mock 的回复是固定假文本,分数只反映"打分器对固定输入的反应",与模型能力零相关。 本页的表格里 122b-a10b "排第一"完全是打分器 bug 的产物。 报告里出现 mock 数据,必须显著标注"仅验证管线",否则一定会被误读。
坑 3:延迟必须看 ttfa 不是 ttft。 mock 里两者都是 300ms 所以看不出差别,但真实思考型模型上这两个数能差好几百毫秒。 工具调用题的 ttfa 是空的(返回 tool_call 不是文本),聚合时要注意别把空值当 0 参与统计。
提醒 4:价格随时变,每季度校对一次。 models.py 顶部注明了口径(百炼中国内地按量付费原价,不含限时折扣)。 限时折扣会让某些模型短期性价比暴涨,但用折扣价做长期架构决策是危险的。
提醒 5:不装 SDK 是刻意的。 SSE 流式用 urllib 手写,避免 SDK 版本升级导致历史评测结果不可复现。 代价是要自己处理流式分帧,但对一个需要长期对比的评测工具来说,这个取舍是值得的。
← 返回实战列表 相关调研:千问全系列对比与评测方案 ↗ 相关调研:东南亚 + 南美可用大模型 ↗