RAG 评估的特殊性
RAG 系统由检索和生成两个阶段组成。传统评估只看最终回答质量,但 RAG 的问题可能出在检索阶段——检索到的文档是错的,再好的生成模型也无法给出正确回答。因此 RAG 评估必须是全链路的。
评估维度
用户问题 → [检索器] → 检索文档 → [生成器] → 最终回答
↑ ↑
检索质量评估 生成质量评估
检索质量指标
| 指标 | 含义 |
|---|---|
| Context Precision | 检索文档中相关部分的比例 |
| Context Recall | 答案所需信息被检索到的比例 |
| Hit Rate | 至少检索到一个相关文档的比例 |
| MRR | 相关文档的排名倒数均值 |
生成质量指标
| 指标 | 含义 |
|---|---|
| Faithfulness | 回答是否忠于检索文档(无幻觉) |
| Answer Relevance | 回答与问题的相关程度 |
| Answer Correctness | 回答与标准答案的匹配度 |
| Hallucination Rate | 无法从文档推导的陈述比例 |
RAGAS 框架
RAGAS 是最流行的 RAG 评估框架,支持无参考评估(不需要标准答案)。
from ragas import evaluate
from ragas.metrics import (
faithfulness, answer_relevancy,
context_precision, context_recall,
)
from datasets import Dataset
eval_data = Dataset.from_dict({
"question": ["什么是量子计算?", "如何防止SQL注入?"],
"answer": [
"量子计算利用量子力学原理进行计算,使用量子比特...",
"防止SQL注入的方法包括参数化查询、输入验证...",
],
"contexts": [
["量子计算利用量子力学原理...", "量子比特可同时处于0和1的叠加态..."],
["SQL注入通过嵌入恶意SQL语句实现...", "参数化查询是最有效方法..."],
],
"ground_truth": [
"量子计算利用量子叠加和纠缠原理进行并行计算。",
"使用参数化查询、输入验证、ORM来防止SQL注入。",
],
})
results = evaluate(eval_data, metrics=[
faithfulness, answer_relevancy, context_precision, context_recall,
])
# {'faithfulness': 0.85, 'answer_relevancy': 0.92,
# 'context_precision': 0.78, 'context_recall': 0.88}
Faithfulness 详解
衡量回答中每个陈述是否能从检索文档推导:
# RAGAS Faithfulness 内部逻辑
async def compute_faithfulness(answer, contexts):
# 1. 将回答分解为独立陈述
statements = await llm_extract_statements(answer)
# 2. 逐个验证是否能从 contexts 推导
verifiable = sum(1 for s in statements if await llm_verify(s, contexts))
# 3. 返回可推导陈述的比例
return verifiable / len(statements) if statements else 0
Faithfulness 低分原因:生成模型"自由发挥"添加文档外信息;检索文档信息不足模型靠自身知识补全;模型对文档理解有误。
Context Precision 详解
对每个检索到的 chunk 判断是否相关,加权计算精度(靠前的相关 chunk 权重更高)。
评估数据集构建
数据分布建议
| 类型 | 比例 | 说明 |
|---|---|---|
| 事实查询 | 30% | 直接从文档查找 |
| 多跳推理 | 20% | 跨文档综合信息 |
| 对比分析 | 15% | 比较文档中不同信息 |
| 否定问题 | 10% | 文档中没有答案 |
| 多轮追问 | 15% | 基于前一轮的追问 |
| 对抗性问题 | 10% | 试图诱导幻觉 |
LLM 辅助生成
async def generate_eval_cases(documents, num_cases=50):
cases = []
for doc in documents:
prompt = f"""基于以下文档生成3个问答对用于RAG评估。
包含1个简单题(单文档)和2个中等题(需要推理)。
文档: {doc.content}
输出JSON: [{{"question":"...","answer":"..."}}]"""
result = await llm.generate(prompt)
cases.extend(json.loads(result))
return cases[:num_cases] # 人工审核后使用
自动化评估工具对比
| 工具 | 评估维度 | 需要标注 | 特点 |
|---|---|---|---|
| RAGAS | 全链路 | 可选 | 最流行,社区活跃 |
| TruLens | 全链路+体验 | 否 | 实时监控 |
| DeepEval | 全链路 | 可选 | Pytest 风格 |
| LangSmith | 全链路+Trace | 否 | LangChain 生态 |
常见问题与优化
Faithfulness 低但 Context Precision 高
检索到了正确文档但生成模型没有忠实使用。优化:调整 Prompt 强调"仅基于文档回答";降低 temperature;使用 citation 机制。
Context Recall 低
需要的信息没被检索到。优化:调小 chunk size 增加 overlap;使用 hybrid search(向量+关键词);添加 query rewriting;增加 top_k。
Answer Relevance 低
回答了但没回答到点子上。优化:Prompt 中明确要求直接回答问题;添加"文档中没有答案请说不知道"指令。
总结
RAG 评估的核心是全链路思维:检索和生成分别评估,才能定位问题根因。RAGAS 提供了无需标准答案的评估能力,是快速迭代首选。建议建立 20% 人工抽检机制,确保评估指标与真实体验一致。评估不是一次性的,而是伴随 RAG 系统全生命周期的持续实践。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
