本页目录
Lesson 08 — RAG 评估:怎么知道好不好
本课目标:学会用数据客观衡量 RAG 质量,不再凭感觉。RAG 链路这么长,光看"答案对不对"无法定位是检索还是生成的锅——你需要分维度打分。
前 7 课的优化都是凭直觉判断"好像变好了"。这课给你一把尺子。
1. 为什么需要评估?
你调了 chunk_size、换了 reranker、改了 prompt……怎么知道是变好了还是变差了?
凭感觉的问题: - 🚫 主观偏差:你觉得"变好"了,可能只是这道题碰巧对了 - 🚫 无法定位:答案错了,是检索没召回?还是召回对了但生成跑偏?分不清 - 🚫 无法迭代:没有量化指标,就不知道下次该优化哪里
评估的价值:把"感觉"变成"数字",让 RAG 优化从玄学变成工程。
🎯 核心认知:生产级 RAG 必须有评估体系。没有评估的优化,就是没有仪表盘开车。
2. RAG 的三个评估维度
RAG 链路可以拆成两段:检索 和 生成。评估也要分维度:
用户问题 → [检索] → 召回文档 → [生成] → 最终答案
│ │
评估检索质量 评估生成质量
业界主流的 RAGAS 框架(RAG Assessment)定义了几个核心指标,我们聚焦最实用的三个:
① 检索相关性 (Context Relevance)
检索回来的文档,和问题相关吗?有没有召回垃圾?
衡量"检索"这一段。理想情况:召回的每条都和问题高度相关。如果召回了一堆无关内容,说明检索该优化了。
② 答案忠实度 (Faithfulness)
生成的答案,有没有撒谎?是不是都基于召回的文档?
衡量"生成"这一段有没有幻觉。理想情况:答案每一句话都能在召回文档里找到依据。如果答案编了文档里没有的内容,说明 prompt 防幻觉没做好。
这个指标最能区分检索和生成的锅:如果检索对了但答案编了,是生成的问题;如果检索就错了,那答案错也不怪生成。
③ 答案相关性 (Answer Relevance)
生成的答案,有没有回答用户的问题?
衡量"生成"这一段有没有跑题。理想情况:答案直击问题。如果答非所问(问年假答病假),说明理解或生成有问题。
三者的关系
| 指标 | 评估哪段 | 高分意味着 |
|---|---|---|
| 检索相关性 | 检索 | 召回的文档都对题 |
| 忠实度 | 生成 | 答案没撒谎,都基于文档 |
| 答案相关性 | 生成 | 答案切题,没跑题 |
💡 定位问题的逻辑: - 检索相关性低 → 优化检索(chunking/embedding/混合检索) - 忠实度低 → 优化生成(prompt 防幻觉约束) - 答案相关性低 → 优化生成(prompt 要求切题)或 query 改写
3. 怎么构造评估集?
评估需要"标准答案"来对比。一个评估集长这样:
EVAL_SET = [
{
"question": "年假有几天?", # 问题
"reference_answer": "入职满1年5天,满3年10天,满5年15天。", # 人工标注的标准答案
"reference_docs": ["年假:入职满1年..."], # 这题正确答案应来自哪条文档
},
...
]
构造评估集的思路: 1. 从真实用户问题里采样 20~50 个有代表性的 2. 人工写出标准答案(Ground Truth) 3. 标注每个问题对应哪条参考文档 4. 用这个集子反复跑、对比不同配置的分数
⚠️ 评估集质量决定评估可信度。问题要覆盖各种类型(简单/复杂/刁钻/无关),不能只挑容易的。
4. LLM-as-a-Judge:让大模型当裁判
三个指标怎么算?传统方法是人工标注(贵、慢)。现代方法:让 LLM 自己当裁判打分。
比如算"忠实度":
给裁判 LLM 看:
- 召回的文档(证据)
- 生成的答案(被评估对象)
让它判断:
答案里的每句话,是不是都能在文档里找到依据?
能找到的句子数 / 总句子数 = 忠实度分数
这个方法叫 LLM-as-a-Judge,优点是自动化、可大规模;缺点是有成本、裁判模型本身可能误判。但对教学和迭代来说足够好。
5. 本课代码会做什么
code.py 会自己实现一套简化版 RAGAS(不依赖 RAGAS 库),让你看清每个指标怎么算:
① 构造小型评估集
5 道题(含标准答案 + 参考文档),覆盖不同难度。
② 跑完整 RAG + 收集结果
对每道题:检索 → 生成答案,记录召回文档和答案。
③ 用 LLM 当裁判打三个分
- 检索相关性:召回文档和问题相关吗?
- 忠实度:答案有没有基于文档撒谎?
- 答案相关性:答案切题吗?
④ 汇总分数 + 诊断
打印每题三维分数,并给出"该优化哪个环节"的诊断。
💡 为什么不直接用 RAGAS 库?因为先看懂原理,用框架才有意义。本课的实现是 RAGAS 的简化版,逻辑一致。学完你完全可以换成真正的 RAGAS(只需
pip install ragas)。
6. 跑起来
python lessons/08_evaluation/code.py
终端会打印每道题的三维分数 + 整体诊断。重点看:分数低的题,对应哪个环节该优化。
下一课 Lesson 09 — 工程化 是最后一课,把前面学的拼成一个接近生产可用的小系统。