02 RAG 评估与优化
学习理念:RAG 系统上线后好不好用,不能靠"感觉"。评估的作用就是把"感觉"变成可量化的指标——检索准不准、答案忠不忠实、有没有幻觉。这一章讲的就是怎么用 RAGAS 评估 RAG 系统、怎么排查 bad case、怎么优化。
📖 阅读优先级
| 等级 | 章节 | 说明 |
|---|---|---|
| 🟡 理解即可 | RAGAS 评估 | 知道 RAG 评估的思路和指标含义 |
| 🔴 值得实践 | Bad Case 排查 | 实际开发中一定会遇到的调试经验 |
| 🟢 了解即可 | 图谱优化 | 和 Ch19 Neo4J 相关,用到时回来看 |
一、为什么需要评估
Agent(尤其是 RAG Agent)上线后的表现是多因素耦合的结果:
切分策略 → 索引质量 → 检索 TopK → Rerank → 图谱 → Prompt → 模型 → 工具调用只看几个例子很难判断瓶颈在哪。评估的核心价值:
| 价值 | 说明 |
|---|---|
| 质量量化 | 用指标把输出质量数字化(忠实度、相关性、检索精度) |
| 回归保障 | 改了切分/TopK/Prompt 后,快速判断整体是否退化 |
| 发现短板 | 通过细分指标定位是"检索没找到"还是"模型没用好" |
| 自动化 | 减少人工验收的成本和主观偏差 |
二、RAGAS 评估框架
🟡【理解即可】 RAGAS 是目前最主流的 RAG 评估框架。
2.1 基本概念
RAGAS 把一次问答拆成三要素:
Question(问题) → RAG 系统 → Contexts(检索到的文档片段)
↓
Answer(生成的答案)
RAGAS 用一组指标从"检索侧 + 生成侧 + 证据一致性"三个方向打分2.2 核心指标
| 指标 | 衡量什么 | 高低的意义 |
|---|---|---|
| Faithfulness(忠实度) | 答案是否基于检索到的上下文,没有幻觉 | 高→可靠;低→模型在瞎编 |
| Relevance(相关性) | 答案是否回答了问题 | 高→命中要害;低→答非所问 |
| Context Precision(检索精度) | 检索到的文档有多少是真正有用的 | 高→检索精准;低→噪声多 |
| Context Recall(检索召回) | 需要的信息是否都被检索到了 | 高→没有遗漏;低→关键信息没找到 |
2.3 评估流程
Step 1: 准备测试集
构建一批 (question, ground_truth) 黄金数据集
来源:真实用户问题 + 人工标注
Step 2: 跑系统
用当前 RAG 系统对每个 question 跑出 answer 和 contexts
Step 3: LLM 打分
用更强的模型(如 GPT-4)对 (question, answer, contexts) 打分
RAGAS 内置了打分 prompt,不需要自己写
Step 4: 看指标
Faithfulness < 0.7 → 模型幻觉严重,检查 Prompt 或换模型
Context Precision < 0.6 → 检索噪声大,调整 TopK 或 Rerank
Context Recall < 0.6 → 切分策略有问题,信息没被检索到三、LLM-as-a-Judge
🟡【理解即可】 用强模型当裁判,不需要人工逐个打分。
优势:比人工快百倍,比 BLEU/ROUGE 更贴近语义质量。 风险:裁判模型本身有偏差,喜欢长回答、喜欢肯定语气。
常见做法:
python
# RAGAS 内置的 LLM-as-a-Judge 使用方式
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy
result = evaluate(
dataset=test_dataset, # question + answer + contexts
metrics=[faithfulness, answer_relevancy]
)
print(result) # 输出各项指标打分四、Bad Case 排查
🔴【值得实践】 评估发现低分后,怎么定位问题?
4.1 常见问题类型
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 检索不到 | 切分粒度过粗/过细、Qdrant 阈值太高 | 调整切分策略、降阈值 |
| 检索噪声多 | TopK 太大、Rerank 没生效 | 降 TopK、检查 Rerank 服务 |
| 模型瞎编 | Prompt 没强调"只基于给定内容回答" | 加约束 Prompt |
| 答案太短/太啰嗦 | Prompt 风格引导问题 | 优化 system prompt |
| 脏数据 | 知识库里混入了无关文档 | 检查召回内容 |
| 网络问题 | 调用远端模型超时 | 加超时重试 |
4.2 排查思路
拿到一个 bad case → 先看"召回的内容对不对"
召回内容不对 → 检索模块问题(切分/TopK/阈值/Rerank)
召回内容对了但答案不对 → 生成模块问题(Prompt/模型)🔴【值得实践】 这个二分法是排查 RAG 问题的核心思路。每次遇到 bad case,先问"模型看到的内容对不对",而不是直接改 Prompt。
五、图谱优化
🟢【了解即可】 如果 Ch19 用了 Neo4J 知识图谱,这部分涉及图谱查询优化。
常见优化方向:
| 优化方向 | 说明 |
|---|---|
| 实体名模糊匹配 | 用户说的商品名和图中的实体名不完全一致时,加向量匹配 |
| 关系剪枝 | 一跳扩展太多无关节点,限制扩展深度 |
| Cypher 查询优化 | 加索引、限制返回数量 |
| 图谱 vs 向量融合 | 图谱结果和向量检索结果做 RRF 融合 |
六、本阶段文件索引
| 优先级 | 文件 | 路径 |
|---|---|---|
| 🔥 P0 | 尚硅谷人工智能之知识库的评估与优化.md | 评估与优化/课件/ |