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全链路+TraceLangChain 生态

常见问题与优化

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论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。