日期:2026-07-16
我们当时给某头部制造企业做了一套智能核单 Agent,部署在我们采用的 AI 私有化部署底座上,春节后上线时效果相当好,核单准确率内部评测约 95%。但大概上线第六周,业务侧开始零星反映"有些单据判错了"。等到我们介入排查时,错误已经累积了一阵子,最终是客户投诉倒逼我们才发现——模型效果在悄悄退化,而我们手里没有任何量化证据。
复盘下来,根因不是模型本身坏了,而是业务侧的单据格式、字段口径在迭代,输入分布已经悄悄漂移,模型在它没见过的分布上持续走低。这件事给我们最大的教训是:模型上线才是开始,监控和漂移检测必须和模型一起交付,而不是等出问题再补。这篇文章复盘的就是我们怎么把"效果可观测"从零搭起来的。
在这个项目里,监控体系覆盖三个场景:
第一个是效果指标看板。我们给核单 Agent 定义了几个核心指标——核单准确率、拒识率、平均置信度,希望运营同学打开看板就能一眼看到健康度,而不是靠客诉。
第二个是输入/输出分布漂移检测。当业务侧单据格式变化、新增字段、季节波动导致输入分布偏移时,系统要能自动感知并量化"偏了多少",而不是等效果掉下来才知道。
第三个是退化自动告警与回滚。一旦确认效果退化或漂移越界,要能触发告警并自动回滚到上一个稳定版本,或拉起重训流程,把 MTTR 从"人工发现好几天"压缩到小时级。
挑战一:效果指标埋点与基线
效果指标最大的难点是"线上没有真值"。核单结果是否正确,得等人工复核或后续环节反馈才知道,存在天然滞后。我们当时没去等全量真值,而是用"代理标签"近似:把高置信度且后续没有人工纠偏的样本当作弱真值,在线持续估算准确率。
埋点配置示意:
effect_monitor:
metrics:
- name: accuracy_est
method: proxy_label
confidence_threshold: 0.92
feedback_window_days: 7
- name: reject_rate
method: direct_count
baseline_window: 14d
alert_rule: "accuracy_est < baseline_mean - 2*std"我们用上线首 14 天的指标做基线窗口,告警规则不是写死阈值,而是用"基线均值减两倍标准差"的动态基线。这样避免旺季业务量波动误触发,也避免模型缓慢退化被固定阈值放过。
挑战二:输入/输出分布漂移检测
漂移检测我们分了两类:输入侧用 PSI(总体稳定性指数)监控关键字段分布,输出侧用预测置信度分布和拒识率分布偏移来交叉验证。PSI 超过我们设定的约 0.2 阈值就判定显著漂移。
检测脚本核心逻辑:
def psi(expected, actual, bins=10):
e_perc, a_perc = bucketize(expected, actual, bins)
psi = sum((a_perc - e_perc) * np.log(a_perc / e_perc))
return psi
for col in ["amount", "category_code", "channel"]:
p = psi(baseline[col], today[col])
if p > 0.2:
drift_alerts.append((col, round(p, 3)))工程上一个关键细节:bins 必须基于基线分布而不是实时分布划分,否则漂移会被自己的分箱方式稀释掉。我们曾踩过这个坑,导致一次真实的字段口径变更延迟了三天才被发现。修正后,漂移检出率从约 58% 提升到约 91%。
挑战三:退化自动告警与回滚
告警不是终点,得接处置动作。我们接入了模型版本管理,网关计量层记录每个版本的效果与流量。一旦连续两小时 accuracy_est 低于动态基线且 PSI 越界,就触发两级动作:先自动回滚到上一个稳定版本(通过切换网关路由指向旧版本实例),同时推送重训工单给算法同学。
案例片段(已脱敏): 某头部制造企业上线第 7 周,category_code 字段的 PSI 从 0.04 升至 0.31,触发漂移告警。同时 accuracy_est 由 95% 跌至约 88%。系统在 11 分钟内自动回滚至 v3 稳定版,置信度恢复;算法侧据此定位到新增的一类促销单据未被覆盖,发起重训,v5 版上线后准确率回升至约 94%。
回滚耗时从原先人工介入的平均约 6 小时,压缩到约 12 分钟。告警误报率通过"双指标交叉 + 持续时间门槛"压到了约 5% 以内。
改造前后的核心指标对比如下(数据为脱敏示意值,基于网关计量层与监控底座统计):
| 指标 | 改造前 | 改造后 | 提升幅度 |
|---|---|---|---|
| 效果退化发现时延 | 约 5–7 天 | 约 30 分钟 | 降至约 1/200 |
| 漂移检出率 | 约 58% | 约 91% | 提升约 33 个百分点 |
| 告警误报率 | 约 23% | 约 5% | 降至约 1/5 |
| 回滚耗时(MTTR) | 约 6 小时 | 约 12 分钟 | 降至约 1/30 |
| 月度客诉相关工单数 | 约 14 件 | 约 3 件 | 降至约 1/5 |
案例片段(已脱敏): 接入监控后一个季度内,系统共自动捕获 4 次显著漂移,全部在效果明显退化前完成回滚或重训。其中一次某股份制银行的对接渠道字段变更,PSI 达 0.27,系统在 8 分钟内回滚,避免了一次可能影响约 2 万笔日终核对的事故。
第一,模型上线才是开始,监控必须和模型一起交付。我们吃过"先上线后补监控"的亏,代价是客户投诉。
第二,漂移要先看见再处置。没有量化检测,一切"感觉效果变差了"都是事后诸葛。PSI 加动态基线组合,是性价比最高的起步方案。
第三,告警要接动作。只告警不回滚,MTTR 还是长;把回滚做成自动、把重训做成工单,闭环才算真正闭合。
第四,别写死阈值。用动态基线(均值减标准差)能扛住业务自然波动,又不会放过缓慢退化,比拍脑袋的固定阈值稳得多。
效果监控和漂移检测,不是给模型加装饰,而是把"模型会变差"这个必然事实变成可控的工程问题。这套体系现在是我们所有生产模型的标配,它让我们从"等客诉"变成了"先于客诉动手"。