RAG 进阶
基础
- icon: result
name: RAG 基础
desc: RAG LangChain
link: ./langchain/rag.html评估指标
RAG 系统的评估需要覆盖 检索 和 生成 两个核心环节,形成完整的评估体系。
评估体系总览
| 评估维度 | 核心问题 | 关键指标 |
|---|---|---|
| 检索质量 | 检索到的内容是否正确、是否全面? | Precision、Recall、Relevance |
| 生成质量 | 生成的答案是否忠于上下文、是否回答了问题? | Faithfulness、Answer Relevance |
| 端到端质量 | 最终答案是否正确? | Correctness、Similarity |
检索质量评估
Context Precision(上下文精确率)
衡量检索到的上下文中,与问题相关的比例。即"检索到的内容里有多少是真正有用的"。
实际计算中,考虑排名位置的加权版本:
其中 表示第 个文档是否相关(0 或 1), 表示前 个文档中的精确率。
指标低的原因:Embedding 模型语义理解不足、检索策略不当(如纯向量检索缺少关键词匹配)、Chunk 切分导致语义断裂。
优化方向:使用混合检索(向量 + BM25)、优化 Embedding 模型、调整 Top-K 参数、改进 Chunk 策略。
Context Recall(上下文召回率)
衡量所有相关文档中,被检索到的比例。即"该找到的内容是否都找到了"。
指标低的原因:知识库覆盖不全、查询改写(Query Rewriting)缺失、Embedding 模型对某些领域语义不敏感、Top-K 设置过小。
优化方向:增加知识库覆盖、使用查询扩展(HyDE、Multi-Query)、增大 Top-K、使用多路召回。
Context Relevance(上下文相关性)
衡量检索到的上下文与用户问题的 整体相关程度,通常由 LLM 进行打分评判。
指标低的原因:用户查询意图模糊、Chunk 切分过大(包含大量无关信息)、缺乏查询意图理解。
优化方向:加入查询意图分类、优化 Chunk 大小与重叠、使用 Reranker 对结果重排序。
生成质量评估
Faithfulness(忠实度)
衡量生成的答案是否 忠于检索到的上下文,不包含上下文之外的"幻觉"信息。这是 RAG 最核心的指标。
评估流程:
- 将答案拆分为若干独立声明(Claims)
- 逐一检查每个声明是否能从上下文中找到支撑
- 计算有支撑的声明占比
示例:
- 上下文:「公司成立于 2020 年,注册资本 500 万」
- 答案:「公司成立于 2020 年,注册资本 500 万,位于北京」
- 声明 1:公司成立于 2020 年 → ✅ 有支撑
- 声明 2:注册资本 500 万 → ✅ 有支撑
- 声明 3:位于北京 → ❌ 无支撑(幻觉)
- Faithfulness = 2/3 ≈ 0.67
指标低的原因:LLM 幻觉严重、Prompt 未约束"仅基于上下文回答"、上下文信息不足导致模型自行补充。
优化方向:在 Prompt 中明确要求"仅基于提供的上下文回答,若信息不足则回答不知道"、使用更强的模型、增加上下文信息量。
Answer Relevance(答案相关性)
衡量生成的答案是否 真正回答了用户的问题,而非答非所问。
评估方法:让 LLM 根据答案反向生成若干可能的问题,计算这些问题与原始问题的语义相似度。相似度越高,说明答案越切题。
指标低的原因:查询理解不足、答案过于笼统或偏离主题、Prompt 模板设计不当。
优化方向:优化 Prompt 模板、加入查询意图识别、对答案进行相关性后处理。
端到端评估
Answer Correctness(答案正确性)
衡量最终答案与标准答案(Ground Truth)的 正确程度,需要标注数据支撑。
通常结合 LLM 评判和 F1 分数计算。
Answer Similarity(答案相似度)
衡量生成答案与标准答案的 语义相似度。
指标速查表
| 指标 | 评估对象 | 计算方式 | 取值范围 | 越高越好 |
|---|---|---|---|---|
| Context Precision | 检索结果 | 相关文档 / 检索文档 | [0, 1] | ✅ |
| Context Recall | 检索结果 | 检索到的相关 / 全部相关 | [0, 1] | ✅ |
| Context Relevance | 检索结果 | LLM 打分 | [0, 1] | ✅ |
| Faithfulness | 生成答案 | 有支撑的声明 / 全部声明 | [0, 1] | ✅ |
| Answer Relevance | 生成答案 | 反向问题相似度 | [0, 1] | ✅ |
| Answer Correctness | 端到端 | F1 / LLM 评判 | [0, 1] | ✅ |
| Answer Similarity | 端到端 | 语义余弦相似度 | [0, 1] | ✅ |
综合优化策略
当各项指标偏低时,可按以下方向逐步优化:
优化优先级建议:
- 先调检索,再调生成 — 检索是基础,检索不到正确信息,生成再好也无用
- 先调 Prompt,再换模型 — Prompt 优化成本最低,效果立竿见影
- 先加 Reranker,再改检索策略 — Reranker 是性价比最高的检索优化手段
- 建立评估-优化闭环 — 定期评估 → 发现瓶颈 → 针对优化 → 再次评估
评估框架
| 框架 | 语言 | 核心特点 | 适用场景 |
|---|---|---|---|
| RAGAS | Python | 业界标准,指标全面,支持 LLM-as-Judge | 通用 RAG 评估 |
| TruLens | Python | 可观测性强,支持实时监控和反馈 | 生产环境监控 |
| DeepEval | Python | 类 Pytest 风格,易于集成 CI/CD | 自动化测试 |
| LangSmith | Python/TS | LangChain 官方平台,可视化强 | LangChain 生态 |
| Phoenix (Arize) | Python | 可观测性 + 追踪,支持 OpenTelemetry | 调试与分析 |
| rag-eval | Python | NVIDIA 出品,支持多种检索器 | 大规模评估 |
RAGAS 快速上手
pip install ragasfrom ragas import evaluate
from ragas.metrics import (
context_precision,
context_recall,
faithfulness,
answer_relevancy,
)
from datasets import Dataset
# 准备评估数据
eval_data = Dataset.from_dict({
"question": ["公司的退货政策是什么?"],
"answer": ["7天无理由退货,需保持商品完好。"],
"contexts": [["本公司支持7天无理由退货政策..."]],
"ground_truth": ["7天无理由退货,商品需保持完好。"],
})
# 运行评估
result = evaluate(
eval_data,
metrics=[context_precision, context_recall, faithfulness, answer_relevancy],
)
print(result)
# {'context_precision': 0.95, 'context_recall': 0.90, 'faithfulness': 1.0, 'answer_relevancy': 0.92}DeepEval 快速上手
pip install deepevalfrom deepeval import assert_test
from deepeval.metrics import FaithfulnessMetric, AnswerRelevancyMetric
from deepeval.test_case import LLMTestCase
test_case = LLMTestCase(
input="公司的退货政策是什么?",
actual_output="7天无理由退货,需保持商品完好。",
retrieval_context=["本公司支持7天无理由退货政策..."],
)
# 类 Pytest 风格断言
assert_test(test_case, [FaithfulnessMetric(threshold=0.8)])自动化评估流程
将评估集成到 RAG 系统的开发和运维流程中:
评估数据集构建要点:
- 数量:至少 50-100 条覆盖典型场景的 QA 对
- 多样性:覆盖简单事实、复杂推理、多文档聚合、无答案场景
- 标注:每条需有
question、ground_truth、reference_contexts - 维护:随知识库更新定期补充新样本