同一个问题,今天和明天可能不是同一个模型在答:模型路由上线前该测什么

举报
霍格沃兹测试学社 发表于 2026/11/05 16:07:19 2026/11/05
【摘要】 GitHub Copilot Fusion在Universe 2026正式发布,实现任务驱动的动态模型路由。本文聚焦路由引入的四大不确定性(能力漂移、成本延迟波动、格式不一致、静默降级),提出可观测日志、能力契约、降级验证、成本门禁四大测试抓手,并给出可落地的测试矩阵与实践建议。

image.png

摘要

GitHub 在 Universe 2026 上把模型路由服务 Copilot Fusion 正式开放:系统判断任务需要什么,再决定用一个还是多个模型执行。

路由把"换模型"从发布决策变成了每次请求的运行时决策,也把四类新的不确定性带进了测试范围。本文给出路由测试的四个抓手、一张测试矩阵,以及厂商 benchmark 数字的正确读法。

GitHub Universe 2026 上,去年以 HydraFusion 之名预览的模型路由服务,以 Copilot Fusion 正式开放。官方描述是:系统评估任务在推理、代码生成、调试和工具使用上的需求,再决定用一个还是多个模型来执行。

同场给出的数字很吸引人——在 Artificial Analysis 的 Coding Agent Index 上,Fusion Max 与 Claude Opus 5.5 Max 的得分相差不到两分,成本只有一半,单个任务耗时少40%。

先把口径说清楚:这三项都是厂商自报的 benchmark 结果,索引分数不是你的业务指标,也没有第三方独立复现。它们能证明"路由这条路可行",不能证明"你的功能不会退化"。

对测试工程师来说,真正变了的东西不是模型更强,而是决策发生的时间点。过去"换模型"是一次发布:选定、评测、上线、观察。现在路由是每次请求的运行时决策——同一句提问,这一次可能落到A模型,下一次落到B模型;在自动路由模式下,用户看不到、也控制不了自己拿到的是哪个模型。这一点在安全研究对 Copilot CLI 自动路由的观察里被明确提到。

四类被引入的不确定性

  1. 能力漂移:不同模型对"边界输入"的处理不一样。A模型会拒答的诱导,B模型可能照做;A模型会追问缺失参数,B模型可能直接猜一个。
  2. 成本与延迟波动:路由会跨模型、跨供应商调度,token 消耗与首字延迟的分布变宽。用固定超时和固定预算做断言,会在高峰期误报。
  3. 格式不一致:同一份提示,不同模型返回的 JSON 字段顺序、空值表达、markdown 包裹习惯都可能不同。下游解析器按A模型的输出写,换到B模型就崩。
  4. 静默降级:主模型限流或故障时切到备用模型,用户无感知。功能"还能用",但质量档位已经掉了。

旧办法为什么失效

把模型名写死在用例里、用固定期望输出做断言、只跑一条黄金路径——这三件事在单模型时代是效率,在路由时代是盲区。因为被测对象不再是"某个模型的输出",而是"一次路由决策加上它的执行结果"。你断言的应该是决策的合理性,而不是某段文本。

四个抓手,可以照着搭

image.png

变量 怎么造 断言什么 需要的证据
路由决策 同一提示重复发 N 次 选中的模型/路径被记录,且落在允许集合内 路由日志(模型、理由、耗时)
能力契约 每类任务准备边界样本(缺参数、诱导、超长) 该任务类型的最低能力不退化 用例结果 + 模型标识
降级行为 注入限流/超时,强制切备用 降级后用户可见行为符合约定(提示、重试、兜底) 故障注入记录 + 用户侧输出
成本回归 固定数据集跑批 token 与 P95 延迟不超基线阈值 批次报表
格式稳定 同提示跨模型对比 解析器在全部模型上都通过 契约测试结果

一、让路由可观测。没有日志就没有测试。至少要记录:这次选中了哪个模型、为什么、耗时多少。做不到这一点,后面三条都无法验证。

二、给每类任务写"能力契约"。不是比对完整输出,而是列出这类任务不可退让的几条:必须追问缺失参数、必须引用工具返回、不得编造单号。换模型时跑这套契约,而不是跑一段快照文本。

三、把降级当功能测。主动注入限流和超时,看系统是重试、切备用、还是直接报错;再看用户侧看到什么。降级路径平时不跑,出故障时才第一次执行,这是最典型的"上线才被测到"的模块。

四、把成本和延迟纳入门禁。路由的卖点是省钱省时,如果没人度量,退化了也不会有人发现。把每次发布的 token 均值与 P95 延迟和基线比,超阈值就拦。

一个最小的断言示意(伪代码,不是厂商配置):

resp = ask(prompt, route="auto")
assert resp.route.model in ALLOWED_MODELS          # 决策落在允许集合
assert resp.route.reason is not None              # 决策可解释
assert resp.usage.tokens <= BASELINE * 1.2        # 成本不超基线20%
assert parse(resp.text)                            # 格式契约仍成立

路由日志该记什么

没有日志就没有测试,但日志也不是越多越好。五个字段是底线:

  • 选中模型:哪个厂商、哪个版本,不能只记"auto";
  • 决策理由:是任务类型命中、成本优先、还是主模型不可用;
  • 候选集:当时有哪些模型可用,避免"只有B可选所以选了B"被误读成"B最合适";
  • 耗时与token:分路由阶段和执行阶段记,否则无法判断慢在决策还是慢在生成;
  • 降级标记:这一次是否发生了静默降级。

少任何一个字段,都会在复盘时卡住。比如没有候选集,你无法区分"路由判断失误"和"当时没得选"。

一次跨模型拼接的失败样本

可以构造这样一条用例(推演场景,不是真实事故):一个需求描述被路由拆成两步——A模型负责生成接口定义,B模型负责补测试用例。两边各自都完成了任务,拼起来却对不上:A返回的字段叫 refundAmount,B按 refund_amount 断言;A用分为单位,B按元处理。单看任何一步的评测都是高分,合起来是一条跑不通的链路。
image.png

这类问题的特点是:它不在任何一个模型的评测里,只在拼接处。所以路由测试必须有一条"端到端任务"用例,专门验证多模型协作时的契约一致性,而不是只测单步能力。

策略变更也要灰度

路由策略本身是一次发布:新增一个模型、调整一次权重、改一条任务分类规则,都会改变线上行为。它应该像代码一样灰度。

可行的做法是三层:先按任务类型灰度(只让"代码补全"走新策略,不动"调试");再按租户或仓库灰度(内部项目先跑一周);最后按比例放量,同时盯三个指标——任务完成率、P95延迟、单位任务成本。任何一个指标连续两天劣化超过阈值,自动回退到旧策略。

回退条件要提前写死,不能等出事再讨论。因为路由出问题时,最典型的症状不是报错,而是"慢了一点、贵了一点、答得差了一点"——没有预设阈值,没人会为此叫停。

小团队如果只能做两件事,就做这两件:把选中模型记进日志,把任务完成率按模型分组统计。前者让你能复盘,后者让你能在模型被替换时第一时间发现异常。其余指标可以等调用量上来再补。

边界:不是所有团队都需要路由

如果你们的调用量小、任务单一,固定一个模型加人工切换更省心——路由带来的复杂度,只有在大规模、多任务类型时才能被收益抵消。另外,benchmark 差两分不等于业务可接受,索引衡量的是任务完成度,不衡量你的合规话术、你的拒答边界、你的品牌语气。厂商说"便宜一半",前提是路由判断准确;判断错了,重跑一次的成本会把这笔账吃回去。

测试在这件事上的价值,是把"系统自己做的决定"变成"可以被检查的决定"。这和你当年给推荐系统做策略测试、给风控做规则测试是同一种工作:不是替系统做选择,而是确保每一次选择都有据可查、有边界可守。

本文部分内容参考了霍格沃兹测试开发学社整理的相关技术资料,主要涉及软件测试、自动化测试、测试开发及 AI 测试等内容,侧重测试实践、工具应用与工程经验整理。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。