日期:2026-09-03
本文为工程实践复盘,客户信息已脱敏,文中数据均为项目复盘口径的脱敏示意值。
网关上线后,背后几十个模型的时延、错误率、超时比例天天在变,但我们只有事后看板,运营周一才看上周报告。用户周三投诉某个模型变慢了,我们翻看板才发现它周二就劣化了。问题是没有实时的调用质量度量和劣化预警,全靠人肉盯,等于蒙着眼睛开飞机。
这件事最难受的是被动。每次都是业务先发现、先投诉,我们才去查,客户关系很受伤。模型侧一次回滚、一次新版本上线,都可能悄悄拉高时延,而我们毫无感知,等看到报告时影响已经持续了一天。
还有一层更深的代价是信任损耗。业务方一旦发现网关的时效数据总是滞后于他们的体感,就不会再信我们的质量报告,后面真有问题时他们也懒得看我们的看板,直接走投诉渠道。我们意识到,质量度量如果做不到近实时,它就没有预警价值,只能当事故后的佐证,而我们要的是在事故成型前就按住它。
我们对每次调用记时延分位、错误率、超时率,按模型和时间窗算健康分。健康分持续下滑就触发劣化预警,自动把流量降级或切到备用模型,同步出质量日报。质量归因能指出是模型端还是网关端的问题,避免两边互相甩锅。
落地后我们把预警接到了值班群和自动化工单,健康分跌破阈值自动开单,不再依赖人盯看板。降级切流走小流量探针,确认改善再放大,而不是一上来就全切,留给模型方介入的时间窗。
为了让模型方配合,我们把质量报告做成了模型方也能看懂的视角:每个模型一张健康卡,劣化时直接标出是它自己的问题还是网关链路问题,并附上对应时间窗的证据链。这样预警不再是网关单方面喊狼来了,而是带着证据请模型方一起看,沟通成本降了一大半,配合度也上来了。
多维度质量度量本身不难,难在劣化误报抑制。一条瞬时网络抖动会让时延瞬间飙高,如果直接告警,半夜会被叫醒无数次。我们用滑动窗口加环比做趋势判定,要连续若干个窗口劣化才告警,单点毛刺忽略。这里我后来觉得,除了环比还要看绝对阈值,光环比会把本来就慢但稳定的模型误判为正常,所以两者结合更稳,这部分还在调。
降级切流决策要保守,先切小部分流量观察,确认改善再全切,避免误切把好模型切挂。质量归因靠在调用链上打标,区分模型侧耗时和网关侧耗时,否则一次模型慢会被误读成网关故障,折腾一圈白忙。
我们后来还加了一个容量联动的维度。单纯看时延百分比会漏掉一种情况:模型没变慢,但因为突发流量把队列打满,超时率悄悄爬升。我们在健康分里并入了队列深度和并发饱和度,这样容量问题也能被同一套预警捕捉,而不是等超时率爆了才反应。质量度量这东西,维度少了就会留盲区,而盲区迟早会变成事故。
案例片段(已脱敏):质量度量与劣化判定配置。
yaml quality: metrics: [p99, error_rate, timeout_rate, queue_depth] alert: window: sliding consecutive: 5 ratio_drop: 0.15 cutover: canary_first
一段真实预警:某模型 P99 在二十分钟内从 800 毫秒爬到 2 秒,连续五个窗口超阈,系统自动开单并切了三成流量到备用模型,模型方介入后发现是显存碎片化,重启后恢复,业务侧只感知到短暂抖动。
劣化预警平均提前量约 20 分钟,P99 时延异常的平均发现时间从小时级降到分钟级。误报率从约 30% 压到 5% 以内。切流准确率达到九成以上。这些数字为示意口径。
劣化预警别只看瞬时值,那会养成狼来了的坏习惯,真出问题反而没人信。我们用滑动窗口加连续窗口判定后,告警量掉了大半,可信度反而高了,值班同学才愿意真的起夜处理。我们实测过,纯瞬时阈值那版每天误报告警上百条,值班同学直接把群设成免打扰,结果真劣化也被静音了,反而是双判之后告警降到日均个位数才重新被当回事。
降级切流一定要先小流量试切,网关侧的一个误判可能把好模型也带崩,保守一点没错。质量分这个东西,能让模型方和网关方各背各的锅,扯皮少了一大半,我们以前为到底谁慢吵过的会,现在看一张归因图就结束了。
质量度量这套东西,最大的改变是让我们从救火变成防病。以前模型一慢,业务先炸锅我们再查;现在健康分提前报警,很多时候模型方还没感知我们就已经切流了。误报这关必须过,否则告警会变成背景噪音,真出问题反而没人理。我们靠滑动窗口加绝对阈值双判,才把误报压到能接受的范围内。往后还想把质量分和容量调度打通,劣化时不仅切流,还能反向驱动底座扩容,形成一条完整的自愈链路。