LLMStart|持续课程 · 不追玄学
模块 4 · 4.4
进阶级70 分钟

4.4RAG 评估与优化

本课只解决一个主问题:本单元只解决一个主问题:

RAG 系统看起来能回答问题之后,如何判断它是否真的可靠?

学习目标

学完本单元后,学习者应该能够:

  • 区分检索评估和回答评估。
  • 设计一组基础 RAG 测试问题。
  • 识别 RAG 常见失败类型。
  • 理解召回率、相关性、Groundedness、引用准确率等评估维度。
  • 制定 RAG 优化优先级。

先给直觉

RAG Demo 很容易做出“能回答”的效果。

但真正的问题是:

  • 它找到了正确资料吗?
  • 它有没有漏掉关键资料?
  • 它有没有把无关资料塞给模型?
  • 模型有没有根据资料回答?
  • 引用是否真的支持结论?
  • 资料不足时有没有承认不知道?

RAG 评估不是问“它有没有说话”,而是问“它说得是否有依据、可检查、可改进”。

RAG 评估的两层

RAG 至少要评估两层:

检索层:资料找得对不对
生成层:回答写得对不对

如果回答错了,原因可能在检索,也可能在生成。

例子:

用户问:

RAG 和微调有什么区别?

错误回答可能来自:

  • 没检索到讲 RAG 和微调区别的片段。
  • 检索到了,但排序太低,没有放进上下文。
  • 放进上下文了,但模型误读。
  • 模型回答正确,但引用错了。

不分层评估,就很难知道该改哪里。

构建测试问题集

评估前先建立问题集。

问题集要覆盖真实用户会问的问题,而不是只挑系统擅长的问题。

建议至少包含:

类型 示例 检查重点
直接事实 Token 是什么? 是否找对定义
概念解释 为什么模型会幻觉? 是否解释清楚
对比问题 RAG 和微调有什么区别? 是否找全差异
应用问题 什么时候需要向量检索? 是否能结合场景
边界问题 RAG 能彻底解决幻觉吗? 是否说明限制
资料不足 课程有没有讲某个未覆盖工具? 是否承认不知道
多跳问题 Agent 和工具调用有什么关系? 是否组合多个片段

问题集不用一开始很大,但必须有代表性。

检索评估

检索评估关注:

系统有没有把正确资料找回来?

召回

召回关注正确资料是否被找到。

如果正确片段没进入候选结果,后面模型再强也很难答对。

检查方式:

  • 为每个测试问题标注理想参考片段。
  • 看检索结果 Top-k 中是否包含这些片段。

排名

找到还不够,还要排名靠前。

如果正确资料排在第 20 位,而系统只取 Top-5,它等于没找到。

噪音

检索结果里无关片段太多,会干扰模型。

噪音常见来源:

  • Chunk 太大。
  • 关键词误匹配。
  • Embedding 语义偏差。
  • 元数据过滤不足。
  • 重复文档太多。

回答评估

回答评估关注:

模型有没有基于资料给出正确、清楚、可验证的回答?

正确性

回答是否符合资料和事实。

完整性

是否遗漏关键点。

Groundedness

Groundedness 可以理解为“回答是否站在资料上”。

也就是:

  • 结论是否能被检索资料支持。
  • 是否加入了资料里没有的内容。
  • 是否把推测写成事实。

引用准确率

引用是否:

  • 真实存在。
  • 指向正确片段。
  • 支持对应结论。

引用不是装饰。引用不支持结论,比不引用更糟,因为它会给错误披上外套。

不确定性处理

资料不足时,模型是否承认不知道。

RAG 系统的可靠性,很大一部分体现在它什么时候愿意停下来。

常见失败类型

失败 1:检索不到

原因可能是:

  • 问题表达和文档表达差异太大。
  • Embedding 模型不适合。
  • Chunk 切分不合理。
  • 没有关键词检索补充。

失败 2:检索到但不相关

原因可能是:

  • Top-k 太大。
  • 文档重复。
  • 元数据过滤不足。
  • 相似但不支持答案的片段混入。

失败 3:检索正确但模型误读

原因可能是:

  • Prompt 没要求只基于资料回答。
  • 上下文太长。
  • 资料之间有冲突。
  • 模型能力不足。

失败 4:回答正确但引用错误

原因可能是:

  • 引用生成没有绑定片段 ID。
  • 模型自己编引用。
  • 上下文组装时丢失来源。

失败 5:资料不足却强答

原因可能是:

  • Prompt 没有停止规则。
  • 模型倾向于补全。
  • 系统没有检测低置信检索。

优化方法

优化 1:改问题理解

使用查询改写,让检索问题更明确。

例如把:

它和微调有什么区别?

改写成:

RAG 和微调有什么区别?

优化 2:改 Chunk

如果正确资料经常被切碎,就调整切分策略。

优化 3:加元数据过滤

按模块、文档类型、权限、时间过滤,减少无关资料。

优化 4:混合检索

结合向量检索和关键词检索。

优化 5:重排

对候选结果重新排序,提高上下文质量。

优化 6:改 Prompt

要求模型:

  • 只根据资料回答。
  • 引用来源。
  • 资料不足时说明。
  • 不把推测写成事实。

优化 7:模型升级或路由

如果资料正确但模型经常误读,可能需要更强模型或任务拆解。

成本与延迟优化

RAG 优化不只看准确性。

还要看:

  • 检索耗时。
  • 重排耗时。
  • 输入 Token 数。
  • 输出 Token 数。
  • 模型调用成本。
  • 缓存命中率。

优化方向:

  • 缓存常见问题。
  • 控制 Top-k。
  • 合并重复片段。
  • 对简单问题走轻量链路。
  • 对高风险问题走强链路。
  • 异步处理长任务。

评估记录模板

建议为每个问题记录:

字段 说明
question 用户问题
expected_sources 理想来源
retrieved_sources 实际检索来源
retrieval_score 检索评分
answer 模型回答
answer_score 回答评分
citation_score 引用评分
failure_type 失败类型
fix_suggestion 修复建议

没有记录,就没有优化。靠感觉调 RAG,很快会进入玄学园区。

案例:课程问答助手评估

问题:

RAG 能彻底解决幻觉吗?

理想来源:

  • 04_rag_knowledge/01_why_rag/lesson.md
  • 09_ai_safety_governance/01_hallucination/lesson.md

评估:

  • 如果只检索到 RAG 定义,回答可能不完整。
  • 如果检索到幻觉章节,回答会更可靠。
  • 如果模型说“RAG 可以彻底解决幻觉”,就是边界错误。
  • 如果引用了不相关的向量检索章节,引用质量有问题。

优化:

  • 增加边界类问题测试。
  • 强化 Prompt 中“说明限制”的要求。
  • 调整检索,让幻觉相关章节进入候选。

常见误区

误区 1:回答看起来对,就不用评估

看起来对不够。要检查资料、引用和失败案例。

误区 2:只评估最终答案

必须分开评估检索和生成,否则不知道问题出在哪。

误区 3:测试问题越简单越好

简单问题只能证明系统会答简单问题。真实用户不会这么配合。

误区 4:RAG 优化就是调 Top-k

Top-k 只是一个参数。文档、切分、检索、重排、Prompt、模型都会影响效果。

误区 5:没有标准答案就不能评估

可以用参考资料、Rubric、人工评分和失败类型记录来评估。

动手练习

为课程问答助手设计 15 个测试问题。

要求包含:

  • 3 个概念解释。
  • 3 个对比问题。
  • 3 个应用问题。
  • 2 个边界问题。
  • 2 个资料不足问题。
  • 2 个多跳问题。

然后为每个问题标注:

  • 理想来源。
  • 可接受回答标准。
  • 常见失败类型。
检查题(自测)
  1. 为什么 RAG 要分开评估检索和回答?
  2. Groundedness 是什么意思?
  3. RAG 常见失败类型有哪些?至少说出 4 个。
参考答案
  1. 检索决定"资料找没找对",回答决定"表达好不好",两者失败原因不同。分开评估才能定位问题出在检索环节还是生成环节。
  2. Groundedness 指回答是否基于给定的检索资料(有依据):好的 RAG 回答应该能从资料里找到支撑,而不是模型自由发挥。
  3. 常见失败:资料缺失、Chunk 断裂、找错资料、排序不准、模型误读资料、引用不支持结论、指标缺失。

Takeaway

RAG 不是做完检索和回答就结束。可靠的 RAG 系统必须持续评估:资料有没有找对,回答有没有依据,引用是否支持结论,资料不足时是否停下。能定位错误,才谈得上优化。