4.4 评估方法
RAGAS 四大指标、离线与在线评估、常见故障模式的定位——让 RAG 变成一个可诊断的工程系统
为什么 RAG 评估特别难
和单模型任务不同,RAG 的输出质量受检索与生成两个环节的联合影响。当回答错了,你需要知道:
- 是检索没找到相关文档?(召回问题)
- 是检索找到了但排名靠后被丢弃?(排序问题)
- 是LLM 没用好上下文?(忠实度问题)
- 是LLM 答得偏题?(相关性问题)
没有分解指标,工程师就只能靠经验"拍脑袋调参"。RAGAS 的核心贡献就是把 RAG 质量拆解为四个独立的、可 LLM 自动打分的指标,让每个环节都能被独立归因与改进。
RAGAS 四大指标
RAGAS(Es et al., 2024)定义了四个核心指标,分别刻画检索质量和生成质量:
| 指标 | 评估什么 | 指向哪个环节 |
|---|---|---|
| Faithfulness(忠实度) | 回答中的每个声明是否都有上下文支持? | 生成 |
| Answer Relevancy(回答相关性) | 回答是否切题? | 生成 |
| Context Precision(上下文精确率) | 相关文档是否排在前面? | 检索排序 |
| Context Recall(上下文召回率) | 所需信息是否都被检索到了? | 检索召回 |
Faithfulness:回答是否有凭据
做法:LLM 先从回答中抽取所有独立声明(atomic claims),再对每条声明判断"上下文是否支持"。忠实度低 = 模型在幻觉。
Answer Relevancy:回答是否切题
从回答反向生成 n 个问题,计算这些问题与原问题的平均嵌入相似度:
直觉:如果回答能导回原问题,就说明切题;如果导回了一个不同的问题,说明答非所问。
Context Precision:排名质量
按排名位置加权的相关文档比例(MAP@K 的变体):
其中 是第 个文档是否相关。精确率低 → 检索噪声多 → 需要 reranker。
Context Recall:召回完整性
标准答案(ground truth)中的句子被上下文覆盖的比例:
召回率低 → 漏检了关键信息 → 改进切分 / 增大 Top-K / 换嵌入模型。
RAGAS 最小可运行示例
from ragas import evaluate
from ragas.metrics import (
faithfulness, answer_relevancy,
context_precision, context_recall,
)
from datasets import Dataset
eval_data = {
"question": ["Transformer 的核心创新是什么?", "..."],
"ground_truth": ["核心创新是自注意力机制(Self-Attention)", "..."],
"answer": ["Transformer 引入了自注意力机制...", "..."],
"contexts": [["...Transformer 的核心创新是..."], ["..."]],
}
ds = Dataset.from_dict(eval_data)
results = evaluate(ds, metrics=[
faithfulness, answer_relevancy,
context_precision, context_recall,
])
print(results)
# {'faithfulness': 0.87, 'answer_relevancy': 0.92,
# 'context_precision': 0.78, 'context_recall': 0.85}故障诊断矩阵
把四个指标的"高低"组合成诊断表,你可以直接定位问题:
| Faithfulness | Answer Relevancy | Context Precision | Context Recall | 诊断 | 修复方向 |
|---|---|---|---|---|---|
| 低 | 高 | 高 | 高 | 模型在幻觉 | 强约束 prompt / Self-RAG / 降低 temperature |
| 高 | 低 | 高 | 高 | 答非所问 | 改进提示模板 / 加回答要求约束 |
| 高 | 高 | 低 | 高 | 检索有噪声 | 加 reranker / 换嵌入模型 |
| 高 | 高 | 高 | 低 | 召回不全 | 调整 chunk_size / 增大 Top-K / Query 分解 |
| 低 | 低 | 低 | 低 | 整个系统问题 | 先看单个 case 再判断 |
在诊断时,先看单个 case 的可视化(问题 + 检索上下文 + 回答 + ground truth),再看聚合指标。纯数字很容易误导——有时 F/AR/CP/CR 都在 0.8 左右,但单看会发现都卡在某一类问题上。
离线 vs 在线评估
离线评估
用固定的 test set 跑 RAGAS,适合:
- CI/CD 回归测试(防止改了代码后指标退化)
- 消融实验(验证某个组件是否真的有用)
- 不同配置的 A/B 对比
关键工程实践:建议维护一个 30-100 条的金标数据集(包含人工核对过的 answer 和 ground_truth),每次改动后自动跑一遍 RAGAS。把指标变化纳入 PR review。
在线评估
生产环境中,你拿不到 ground truth,但可以监控:
| 在线信号 | 反映什么 |
|---|---|
| 用户点"有帮助/无帮助" | 隐式回答质量信号 |
| 用户追问率 | 回答不完整或不清晰 |
| 用户改写 query 率 | 首次检索失败 |
| 引用来源点击率 | 回答可信度 |
| 响应延迟 p50/p95/p99 | 系统健康度 |
其他评估体系
除 RAGAS 外,还有几个值得关注的框架:
| 框架 | 特点 | 适用场景 |
|---|---|---|
| ARES (Saad-Falcon et al., 2024) | 基于合成数据训练的 judge | 资源充足、追求极致评估 |
| RGB (Chen et al., 2024) | 针对中文 RAG 的 Benchmark | 中文 RAG 标准化对比 |
| TruLens | 工业级可视化框架 | 生产环境全链路追踪 |
| LangSmith | LangChain 官方评估 + trace | LangChain 生态 |
本节小结
核心记忆点:把 RAG 视为一个可分解诊断的工程系统,而非一个黑盒端到端模型。
- 检索侧看 Context Precision / Recall
- 生成侧看 Faithfulness / Answer Relevancy
- 故障诊断矩阵 → 明确修哪个环节
- 离线金标数据集 + 在线用户信号,两手都要抓