【踩坑】Demo 里 RAG 满分,上线一周用户却在骂「胡说八道」?2026 评估清单
你的 RAG 在 Demo 里满分,上线一周用户却在骂「胡说八道」
上周产品演示:问「退货政策」,助手引用了官网 FAQ,回答工整、带来源链接,全场鼓掌。
同一套索引上线七天后,客服工单里开始出现:
- 「它说 30 天无理由,我们明明是 7 天」
- 「问库存,它编了一个 SKU」
- 「英文文档更新了,中文回答还是旧版」
问题 rarely 是「模型不够聪明」,而是:你没有在生产环境里度量 RAG,只在 PyCharm 里手动问了三个问题。
2026 年,RAG 已是默认架构;竞争点从「能不能接向量库」变成 「检索质量 + 生成忠实度能否被持续量化」。下面是一套可落地的评估清单(不绑特定厂商)。
先分清:你在评什么?
| 维度 | 问的问题 | 典型失败信号 |
|---|---|---|
| Context Precision | 召回来的 chunk 里,噪声占比多少? | Top-5 里 3 条无关,模型仍「认真总结」 |
| Context Recall | 正确答案需要的证据,检索到了吗? | 政策在第 8 段,只进了第 20 名 chunk |
| Faithfulness | 回答是否被上下文支撑? | 数字、日期、条款与原文不一致 |
| Answer Relevance | 答的是用户问的那件事吗? | 问价格,答了一屏公司介绍 |
Demo 往往只 eyeball Answer Relevance;线上事故多来自 Recall + Faithfulness 同时崩盘。
黄金集:别从「我觉得」开始
最小可行黄金集(Golden Set):
- 50~200 条真实用户问法(脱敏),每条标注:
-question
-expected_doc_ids或expected_snippets(允许多个合法证据)
-must_not_contain(禁止出现的幻觉短语,可选) - 分层抽样:简单 FAQ / 多跳 / 表格数字 / 多语言 / 时效政策
- 版本号:索引或 embedding 模型变更时,同一套集必须可回归
{
"id": "refund-014",
"question": "跨境订单退货运费谁承担?",
"expected_doc_ids": ["policy/refund-v3#intl"],
"tags": ["policy", "multilingual", "table"]
}
没有黄金集,所谓「准确率 92%」只是 在训练集上自嗨。
自动化:检索与生成拆开评
1. 检索离线指标(不调用 LLM)
def recall_at_k(expected_ids: set[str], retrieved_ids: list[str], k: int = 5) -> float:
hit = any(rid in expected_ids for rid in retrieved_ids[:k])
return 1.0 if hit else 0.0
def mrr(expected_ids: set[str], retrieved_ids: list[str]) -> float:
for rank, rid in enumerate(retrieved_ids, start=1):
if rid in expected_ids:
return 1.0 / rank
return 0.0
在 CI 里对 每次 chunk 策略、embedding 模型、hybrid 权重 变更跑一遍;Recall@5 掉 3 个点就 block merge。
2. 生成侧:LLM-as-Judge 要「校准」
2026 年常见做法:用更强模型当裁判,评 Faithfulness / Relevance(1~5 分或二元)。
踩坑:裁判模型与线上模型同源 → 分数虚高。
实践:
- 裁判与线上模型 不同族 或不同规模
- 每季度用 人工标注 100 条 校准裁判(算 Cohen's κ 或 Pearson)
- 对 数字、日期、金额 优先规则校验(regex + 与 chunk 字面比对),别全交给 judge
# 伪配置:CI nightly RAG eval
pipeline:
- ingest: golden_set_v4.jsonl
- retrieve: top_k=8, hybrid_alpha=0.35
- metrics: [recall@5, mrr, faithfulness_judge, citation_hit_rate]
- gates:
recall_at_5_min: 0.82
faithfulness_min: 0.88
线上:不是只有离线分
| 信号 | 用途 |
|---|---|
| 无答案率 / 拒答率 | 检索空或置信低时是否诚实说「不知道」 |
| Citation 点击率 | 用户是否点开来源(低点击 + 高投诉 = 假引用) |
| 👎 + 自由文本 | 抽样进每周黄金集增补 |
| Embedding 漂移监控 | 新文档 cosine 分布突变 → 重索引或重训 reranker |
把 离线 gate + 线上反馈闭环 写进 Definition of Done:新 corpus 上线没有 eval report,不算发布完成。
选型速查:什么时候加 rerank / 微调?
| 现象 | 优先动作 |
|---|---|
| Recall@K 低,MRR 也低 | 改 chunk、metadata、hybrid 检索、换 embedding |
| Recall 高,Faithfulness 低 | 压缩 context、强制 cite、调 prompt / 小模型微调 |
| 多语言混用乱答 | 语言路由 + 分语言索引,别一个池子硬搜 |
| 时效内容错 | 文档 valid_until 进 metadata filter |
Fine-tune embedding 适合 domain 术语极偏(医疗编码、内部 SKU);Fine-tune LLM 适合固定输出格式与语气,不能替代 烂检索。
团队可执行的 RAG 评估守则(精简版)
- 任何索引变更必须跑黄金集,结果归档(artifact),可对比两次 diff
- Page 级事故:Faithfulness 失败样例 24h 内进黄金集
- Judge 分数每月人工抽检 5%,偏差大就换裁判或加规则
- Demo 问题禁止进黄金集;只用真实问法
- 「向量库换了就完事」 — 2026 年最贵的错觉之一
结语
RAG 不是「LangChain 五连调 + Chroma 默认参数」就交差。它和 SLO 一样:没有度量,就没有改进;只有 demo,就没有信任。
你们黄金集是挂在 Git 里版本化,还是还在同事笔记本里?检索 Recall@5 最近一次变更是升还是降?欢迎在楼下晒数字(可打码),一起把「看起来能用」变成「数据证明能用」。