前言
前面系列学习了 RAG 的基础知识,无论是 NaiveRAG 还是 AdvancedRAG。那么在企业级生成环境中,怎么保障一个 RAG 应用的质量? 这就需要 RAG 评估了。
RAG 评估
RAG评估的核心逻辑是分解与量化。它将一个端到端的问答过程,拆解为“检索”和“生成”两个关键环节,并分别设立评估指标。
-
检索:关注“找得对不对、全不全”。
-
上下文相关性(Context Relevancy):检索出的文档块与问题有多相关?避免引入噪声。
-
上下文精度(Context Precision):检索到的上下文(context)中 相关信息的比例
- Context Precision = 上下文中与问题相关的信息数量 / 上下文总信息数量
-
上下文召回率(Context Recall):检索结果是否包含了回答所需的所有关键信息?避免信息遗漏。
- Context Recall = 上下文中包含的关键信息数量 / 参考答案中关键信息数量
-
-
生成:关注“用得准不准、好不好”。
- 答案忠实度:生成的答案是否严格基于检索到的上下文?这是**对抗“幻觉”**的生命线。
- 答案相关性:生成的答案是否直接、有效地回答了原始问题?避免答非所问。
F1 指标
同时对于context_recall和context_precision这两个指标,如果各有高低,比较难判断的时候,我们还会引入 F1 分数进行综合评估,F1 分数用来平衡精确度和召回率,目标是找到适合特定应用需求的最佳平衡,是精确度和召回率的调和平均值:
🌰:现有两组指标:
- A组:context_recall = 0.6667, context_precision = 0.4511
- B组:context_recall = 1.0000, context_precision = 0.3869
- F1_A = 0.4511 * 0.6667 / (0.4511 + 0.6667) = 0.5380
- F1_B = 1.0000 * 0.3869 / (1.0000 + 0.3869) = 0.5579
综上,B组 的 RAG 质量更好一点。
评估方式
RAG 应用的评估方法主要有:
- 人工评估:通过邀请专家或人工评估员对RAG生成的结果进行质量评估。
- 自动化评估:当前RAG评估的主流和发展方向。通过利用大型语言模型和相关算法,自动化评估工具能够实现对RAG生成文本的质量评分,从而快速评估模型性能。
RAGAs
RAGAs(Retrieval-Augmented Generation Assessment)就是常见的自动化评估工具之一。他是一个基于 “LLM-as-a-Judge” 模式的开源Python库,支持Langchain 和 Llama-Index。
- 核心目标:提供一套综合性的评测指标和方法,以量化地评测RAG管道(RAG Pipeline)在不同组件层面上的性能。
- 核心:
-
检索质量:评估检索到的上下文与问题的相关性。
-
生成质量:评估生成的答案是否忠实于上下文,以及是否直接回答了问题。
-
整体质量:综合前两者,给出整体评分。
-
RAGAs 评估主要从检索阶段和生成阶段统计以下几项指标得分来评估 RAG 系统质量。
这四个指标之间是有协同关系的,RAG 的性能是检索器和生成器协同工作的结果,指标之间存在紧密的关联:
- 检索器是生成器的基础: Context Recall 和 Context Precision 直接决定了输入给生成器的上下文质量。
- 理想状态: 高召回率 + 高精确率。检索器能找到所有相关信息,且只找到相关信息。
- 现实权衡: 在大规模数据集中,召回率和精确率往往难以兼得。提高召回率(找全)可能牺牲精确率(引入噪声干扰),反之亦然。
更多相关原理详见 RAGAS论文。
更多使用方式 RAGAs官方文档
实战
明白上述概念之后,我们通过一个简单的实战 Demo 来加深对 RAGAs 评估的理解。
数据准本
RAG 评估实际就像我们传统开发的 QA(环节),我们需要准备评估数据。数据准备一般要求:
- 数据规模:最小样本数据。200-500 / 500-1000
- 类型分布:
- 问题类型:事实性问题30-40%,解释性问题20-30%
- 操作性,边界问题
- 难度级别:
- 简单 40%
- 中等 40%
- 复杂 20%
- 注意事项:完整,格式统一规范,样本正确性
ragas 指标
from ragas.metrics import (
answer_relevancy,
faithfulness,
context_recall,
context_precision,
)
ragas 角色说明
- questions:示例问题
- ground_truth:标准答案
- contexts:RAG 搜索到的上下文
- answers:LLM 根据 contexts 给出的答案
data = {
"question": questions, # 问题
"answer": answers, # 回复结果
"contexts": contexts, # 生成回答的原文档
"ground_truth": ground_truth # 期望的回答
}
整体的基本流程是:
评估执行
# 模型需要用Ragas包装
vllm = LangchainLLMWrapper(llms)
vllm_e = LangchainEmbeddingsWrapper(embeddings)
dataset = Dataset.from_dict(data)
result = evaluate(
dataset = dataset,
llm = vllm,
embeddings = vllm_e,
# metircs修改对应的评估数据
metrics=[
context_precision,
context_recall,
faithfulness,
answer_relevancy,
],
raise_exceptions=False
)
# csv保存
df = result.to_pandas()
print(df)
df.to_csv('outputs/ragas_reval_medical.csv', index=True)
分析
精确率和召回率很高,这里就不看了。我们先挑一个忠诚度低的看看是为什么?
很明显 LLM 回答相较标准答案更丰富、更发散,虽然可能 LLM 回答的不一定错,但是一定是脱离了检索结果。
接下来,在看一个答案相关性较低的看看是为什么?问的是:刺五加浸膏150g是不是刺五加片的处方?核心:是不是。但是 LLM 回答可能回答得有点啰嗦导致评分下降。
指标问题总结
下表将您提供的核心诊断逻辑转换为了Markdown格式,便于在文档、笔记或代码注释中使用。
| 指标 | 可能的问题场景 | 核心问题指向 |
|---|---|---|
| context_recall 低 | 检索器未覆盖关键文档(如知识库缺失)、嵌入模型语义匹配能力不足等 | 检索器 |
| context_precision 低 | 检索器返回大量无关文档、向量数据库索引策略有误、相关文档排名低等 | 检索器 |
| faithfulness 低 | 生成模型未严格遵循上下文(如提示词未明确要求“基于提供的信息回答”)、上下文过长导致信息稀释等 | 生成器 |
| answer_relevancy 低 | 生成模型未准确理解问题意图(如问题复杂时未使用链式提示分解)、上下文与问题关联性弱等 | 生成器 |
| 四个指标均低 | 系统性问题,很可能是检索质量极差(Recall和Precision都低),导致生成器输入混乱,进而影响 Faithfulness和 Relevancy。也可能是问题本身超出系统能力范围。 | 检索器优先 |