// PC530 技术论坛 v1.0
● online 登录 / 注册
返回列表
人工智能与数据科学 #踩坑

【踩坑】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)

  1. 50~200 条真实用户问法(脱敏),每条标注:
    - question
    - expected_doc_idsexpected_snippets(允许多个合法证据)
    - must_not_contain(禁止出现的幻觉短语,可选)
  2. 分层抽样:简单 FAQ / 多跳 / 表格数字 / 多语言 / 时效政策
  3. 版本号:索引或 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 评估守则(精简版)

  1. 任何索引变更必须跑黄金集,结果归档(artifact),可对比两次 diff
  2. Page 级事故:Faithfulness 失败样例 24h 内进黄金集
  3. Judge 分数每月人工抽检 5%,偏差大就换裁判或加规则
  4. Demo 问题禁止进黄金集;只用真实问法
  5. 「向量库换了就完事」 — 2026 年最贵的错觉之一

结语

RAG 不是「LangChain 五连调 + Chroma 默认参数」就交差。它和 SLO 一样:没有度量,就没有改进;只有 demo,就没有信任。

你们黄金集是挂在 Git 里版本化,还是还在同事笔记本里?检索 Recall@5 最近一次变更是升还是降?欢迎在楼下晒数字(可打码),一起把「看起来能用」变成「数据证明能用」。