Agent Engineering 课程阅读
首页/课程一 · RAG 手写/RAG 评估:怎么知道好不好

在 GitHub 查看原文

本页目录

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 — 工程化 是最后一课,把前面学的拼成一个接近生产可用的小系统。