RAG 系统上线后会安静地退化,而且没有报错。这节是我们摸索出来的监控方案。
可复现前提: 依赖 Prometheus + Grafana,面板 JSON 在 ops/dashboards。没有这套栈的话,指标定义部分仍然通用。
一、退化从哪来
三个真实发生过的:
- 文档更新后索引没跟上。 有个文档同步任务挂了 9 天,没人发现,因为服务照常返回结果——只是返回的是旧内容。
- 用户问法漂移。 新功能上线后,用户开始问一批我们标注集里完全没有的问题。
- 上游模型变更。 嵌入服务升级了小版本,向量分布轻微变化,召回慢慢变差。
二、四个必须监控的指标
1. 索引新鲜度:最新文档写入时间 > 2 小时 → 告警
2. 空召回率:检索返回 0 条的比例 > 3% → 告警
3. 低分召回率:top-1 相似度 < 阈值的比例 > 15% → 观察
4. 人工反馈踩率:连续 1 小时 > 8% → 告警第 3 条最有价值:它是唯一能在用户投诉之前发现质量退化的指标。相似度分数整体下移,意味着用户开始问库里没有的东西,或者索引出问题了。
三、影子评测:每天自动跑一遍标注集
#!/usr/bin/env bash
set -euo pipefail
python bench/eval.py --set golden-150 --endpoint "$PROD_ENDPOINT" --out "results/$(date +%F).json"
python bench/compare.py --base "results/$(date -v-7d +%F).json" \
--head "results/$(date +%F).json" --alert-on -0.03每天凌晨对生产环境跑一次标注集,和一周前对比。这个任务发现过两次退化,都在用户投诉之前。
四、把用户反馈接回标注集
答案下面放一个"有帮助 / 没帮助"。每周把"没帮助"的 query 捞出来人工看一遍,补进标注集。半年下来标注集从 150 条长到了 410 条,而且全是真实痛点。
这是整套方案里长期收益最高的一件事。