一、RAGas评估框架
1、简介
-
RAG Assessment(Retrieval-Augmented Generation Assessment):用于系统性评估 RAG 系统的整体性能,覆盖两个核心维度:
- 检索能力(Retrieval Capability)
- 衡量系统从知识库或文档中检索相关信息的准确性和全面性。
- 可量化指标包括:
- Recall / Precision:检索结果的完整性与准确性
- MRR(Mean Reciprocal Rank):首个相关文档的排名效果
- nDCG(Normalized Discounted Cumulative Gain):考虑排名的整体相关性
- 生成能力(Generation Capability)
- 衡量模型基于检索内容生成文本的质量和可靠性。
- 可量化指标包括:
- ROUGE / BLEU:生成文本与参考答案的相似度
- Fact-Consistency:生成内容与检索内容或事实数据库的一致性
- Human Evaluation:人工打分内容的可用性、流畅度和准确性
- 检索能力(Retrieval Capability)
-
目标:确保 RAG 系统在检索到高质量相关信息的基础上,生成内容既准确可信又实用可读,满足下游任务需求
-
文档:【 https://github.com/explodinggradients/ragas 】、【 https://docs.ragas.io/en/latest/ 】
2、评估策略
2.1 NLI 认知
-
自然语言推理(Natural Language Inference, NLI) 是自然语言处理(NLP)中的一个重要任务,涉及判断两个文本之间的逻辑关系。它的目标是通过分析两个文本(通常被称为前提和假设)来推断它们之间的推理关系。NLI 主要用于验证一个文本是否能从另一个文本中得出、与其一致或相矛盾
-
输入给定:
- Premise:前提句,提供的上下文文本
- Hypothesis:假设句,待验证的声明或断言
-
NLI 的核心目标是判断这个“假设”能否从“前提”中推断出来
-
NLI 的三类输出:
| 判断类别 | 意思 |
|---|---|
| Entailment(蕴含) | 前提能够支持假设,即假设一定为真 |
| Contradiction(矛盾) | 前提与假设相互矛盾,即假设一定为假 |
| Neutral(中立) | 前提和假设之间没有明显的逻辑关系,假设可能为真,也可能为假 |
- 案例助解:
| 前提 Premise | 假设 Hypothesis | 关系类型 | 说明 |
|---|---|---|---|
| 天气很热,气温高达 35°C | 今天的气温非常高 | 蕴含(Entailment) | 前提支持假设的真实性 |
| 他在今天的比赛中得了第一名 | 他在比赛中没有获胜 | 矛盾(Contradiction) | 前提与假设相互矛盾 |
| 她正在读一本书 | 她正在写书 | 中立(Neutral) | 前提无法直接支持或反驳假设 |
- 在 RAG 忠实度评分中,NLI 的作用:
-
将检索到的文档作为 Premise
-
将生成答案中的断言作为 Hypothesis
-
使用 NLI 模型判断断言是否得到前提支持,从而评估生成内容是否忠实于文档
-
2.2 三个质量维度
- RAG 系统的评估可分为三个主要质量维度,通过 LLM 自动化测量:
- 忠实度(Faithfulness):生成内容应基于给定上下文,避免幻觉,确保断言可从检索上下文推断
- 答案相关性(Answer Relevance):生成答案应直接回应用户问题,避免偏离主题
- 上下文相关性(Context Relevance):检索到的上下文应尽可能专注,包含尽量少的无关信息
2.2.1 忠实度
-
定义:若答案中的声明可从上下文推断,则答案被认为是忠实的
-
步骤:
- 提取声明:使用 LLM 将生成答案 $a_s(q)$ 拆解为更原子化的声明集合 $S(a_s(q))$
- 验证声明:使用函数 $v(s_i, c(q))$ 或 NLI 判断每个声明 $s_i$ 是否可从上下文 $c(q)$ 推断
- 计算忠实度得分:忠实度得分 $F$ 的计算方式是 $F = \frac{|V|}{|S|}$,其中 $|V|$ 是 LLM 支持的声明数量,$|S|$ 是声明的总数
-
案例助解:下面将按照以上步骤,用一个例子演示从提取声明到计算最终忠实度得分 $F$ 的整个过程
-
用户问题 $q$:
乔布斯是做什么的?他什么时候去世的?
- 模型生成的答案 $a_s(q)$: 集成了 RAG 系统的 LLM 生成的
乔布斯是苹果公司的联合创始人,同时也是皮克斯动画工作室的前CEO。他于2011年10月5日因胰腺癌去世。
- 检索到的上下文 $c(q)$:来自我们的 RAG 模块的文档片段
乔布斯是苹果公司的联合创始人。他推动了iPhone、iPod和Mac的发展。乔布斯曾是皮克斯动画公司的CEO,后来被迪士尼收购。他于2011年10月5日去世,死因为胰腺神经内分泌肿瘤。
-
计算步骤:
-
提取声明:从生成的答案中提取声明 $S(a_s(q))$,使用 LLM 生成更原子化、可验证的声明
序号 声明 $s_i$ s₁ 乔布斯是苹果公司的联合创始人 s₂ 乔布斯是皮克斯动画工作室的前CEO s₃ 乔布斯于2011年10月5日去世 s₄ 他因胰腺癌去世 -
验证声明:验证每个声明 $v(s_i, c(q))$:使用 LLM/NLI 判断每个 $s_i$ 是否可以从 $c(q)$ 推断出来
声明 上下文中是否支持? 说明 s₁ 是 “乔布斯是苹果公司的联合创始人。” → 直接支持 s₂ 是 “乔布斯曾是皮克斯动画公司的CEO” → 表述略有不同但语义等价 s₃ 是 “他于2011年10月5日去世。” → 直接支持 s₄ 否 上下文说的是“胰腺神经内分泌肿瘤”,不是“胰腺癌”,细节不完全一致 -
最后,计算忠实度得分 $F$
$$
F = \frac{|V|}{|S|} = \frac{3}{4} = 0.75
$$
2.2.2 答案相关性
-
定义:评估答案 $a_s(q)$ 是否直接回应问题 $q$,关注聚焦度和完整性
-
评估方法:
- 使用 LLM 基于答案生成一组可能问题 ${q_i}$
- 使用文本嵌入模型计算 $\text{sim}(q, q_i)$(余弦相似度)
- 计算答案相关性得分
$$
AR = \frac{1}{n} \sum_{i=1}^n \text{sim}(q, q_i)
$$ -
案例助解:Answer Relevance, AR
-
指标特点:
- 高AR值:生成的问题与原始问题高度一致 → 答案聚焦且完整
- 低AR值:生成的问题发散或冗余 → 答案需优化(如删除无关信息)
- 优势:避免人工主观判断,自动化评估答案的针对性
-
用户问题 $q$:
量子计算的主要优势是什么?
- 生成的答案$a_s(q)$:我们的 RAG 系统生成的答案
量子计算的主要优势包括并行性、解决复杂问题的速度远超经典计算机,以及在密码学和药物研发等领域的潜在应用。
- 基于答案生成问题($q_i$):使用 LLM 生成 3 个可能的问题,这里是第三方的大模型
Q1: 量子计算相比经典计算机有哪些优势?
Q2: 为什么量子计算在密码学中有应用潜力?
Q3: 量子计算的并行性如何提升计算速度?
-
计算步骤:
-
$\text{sim}(q, q_1) = 0.92$(高度相关)
-
$\text{sim}(q, q_2) = 0.75$(部分相关,聚焦子领域)
-
$\text{sim}(q, q_3) = 0.85$(较强相关)
-
计算答案相关性得分:
-
$$
AR = \frac{0.92 + 0.75 + 0.85}{3} = 0.84
$$
- 该答案相关性得分为 0.84(满分 1.0),表明答案与问题高度相关
2.2.3 上下文相关性
-
定义:衡量检索到的上下文 $c(q)$ 中有多少内容与问题 $q$ 直接相关,避免冗余信息
-
评估步骤:
- 使用 LLM 从上下文提取相关句子集合 $S_{ext}$,Prompt 示例:
请从提供的上下文中提取可能有助于回答以下问题的相关句子。如果没有找到相关句子,请返回“信息不足”。不要修改原句。- 计算上下文相关性得分:
$$
CR = \frac{\text{提取的相关句子数}}{\text{上下文总句子数}}
$$ -
案例助解:
-
用户问题:
量子计算机的工作原理是什么?
- 检索到的上下文 $c(q)$: 包含 5 个句子,这里是 RAG 系统查出来的
1. 量子计算机利用量子比特进行计算。
2. 传统计算机使用二进制位0和1。
3. 量子比特可以同时处于叠加态。
4. 北京是中国的首都。
5. 量子纠缠是实现量子计算的关键特性之一。
- 提取相关句子:
1,3,5
- 上下文相关性得分:
$$
CR = \frac{3}{5} = 0.6
$$
- 得分 0.6 表明上下文中包含约 60% 的直接相关信息,冗余内容(如句子4)未计入,有助于优化检索模块
2.2.4 对比
| 指标 | 定义 | 计算方法 / 核心公式 | 取值范围 | 主要作用 |
|---|---|---|---|---|
| 忠实度 (Faithfulness, F) | 评估生成答案中声明是否可从检索上下文推断 | 1. 将答案拆分为声明集合 $S(a_s(q))$ 2. 验证每个声明 $v(s_i, c(q))$ 3. 计算 $F = \frac{V}{S}$ |
0~1 | 衡量生成内容是否可靠、真实 |
| 答案相关性 (Answer Relevance, AR) | 评估答案是否直接回应用户问题 | 1. 基于答案生成问题集合 ${q_i}$ 2. 计算嵌入相似度 $\text{sim}(q, q_i)$ 3. 计算 $AR = \frac{1}{n} \sum_i \text{sim}(q, q_i)$ |
0~1 | 确保答案聚焦问题、完整且相关 |
| 上下文相关性 (Context Relevance, CR) | 评估检索到的上下文中有多少信息与问题直接相关 | 1. 提取相关句子集合 $S_{ext}$ 2. 计算 $CR = \frac{\text{提取相关句子数}}{\text{上下文总句子数}}$ |
0~1 | 优化检索模块,确保上下文尽量专注、减少冗余信息 |
3、RAGas 特点
-
优势:
- 提高评估效率:RAGas 可快速完成 RAG 系统的性能评估,无需依赖人工注释,大幅缩短评估周期
- 节省成本:自动化评估显著降低了人工成本,相比传统人工评估更加经济
- 高度一致性:实验结果表明,RAGas 的评估结果在大多数情况下与人类评估者的判断高度一致,保证了评估的可靠性
-
劣势:
- 上下文相关性评估存在挑战:当上下文较长或信息复杂时,LLM(如 ChatGPT)在提取关键句子方面可能出现困难,影响上下文相关性评分
- 对微小差异敏感性不足:在比较候选答案的相关性或忠实度时,若差异非常细微,RAGas 可能难以捕捉,导致评分一致性降低
- 可能引入随机性:当多个候选答案得分相同,需要随机打破平局,这可能带来一定的评估随机性,影响确定性
4、RAGas 实战
4.1 安装
pip install ragas>=0.2.0
4.2 MDD
- MDD,Metrics-Driven Development,指标驱动开发
4.2.1 核心目标
-
Ragas 通过提供一系列工具和技术,使开发者能够持续改进 RAG 应用,提高 RAG 应用的质量和用户满意度:
-
合成测试数据集生成:自动生成多样化测试数据,全面评估应用表现
-
基于LLM的评估指标:利用 LLM 辅助评估,客观衡量应用性能
-
生产质量监控:使用成本较低的模型实时监控应用质量,提供可操作的见解
-
应用迭代改进:基于实时反馈和深入分析,持续优化产品
-
4.2.2 指标驱动
-
MDD 是一种依赖数据理性做出决策的产品开发方法。这种方法涉及随时间持续监测关键指标,为应用程序的性能提供宝贵见解
-
关键功能
-
评估:能够以指标辅助的方式评估 LLM 应用程序并进行实验,确保高度的可靠性和可复制性
-
监控:从生产数据点中获得宝贵且可操作的见解,促进LLM应用的质量持续改进
-
4.3 生成测试集
- 环境有点麻烦,参考
G:\上课\人工智能\18-大模型第一阶段串讲内容\资料\requirements.txt
import os
from langchain_core.documents import Document
from langchain_openai import ChatOpenAI
from langchain_huggingface import HuggingFaceEmbeddings
from ragas.testset import TestsetGenerator
base_model_name = "qwen3.5-122b-a10b"
# 设置生成器LLM - 用于生成中文测试数据
generator_llm = ChatOpenAI(
model=base_model_name,
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0.7,
)
# 向量模型
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-base-zh-v1.5",
cache_folder=r"F:\workspace\AI\stu_nlp\rag\相似度计算\bge-base-zh-v1.5",
model_kwargs={"device": "cuda"},
encode_kwargs={"normalize_embeddings": True},
)
if __name__ == "__main__":
# 假设你的知识库是一行一段的文本文件
with open("./datasets/华清远见.txt", "r", encoding="utf-8") as f:
lines = f.readlines()
# 去掉换行符并构造 Document 列表
documents = [
Document(
page_content=line.strip(),
metadata={"source": "华清远见.txt"}
)
for line in lines
if line.strip()
]
# 创建Generator实例
generator = TestsetGenerator.from_langchain(
llm=generator_llm,
embedding_model=embeddings,
)
# 基于文档生成测试集
test_set = generator.generate_with_langchain_docs(
documents,
testset_size=20,
)
print(test_set)
df = test_set.to_pandas()
print(df)
df.to_excel(
"./datasets/华清远见.xlsx",
index=False,
engine="openpyxl"
)
- 结果

4.4 指标评估
4.4.1 修改模板提示词
- ragas 源码中的提示词是针对英文的,如果要用中文,需要修改源码或者加提示词
from ragas.prompt import Prompt
reasoning_question_prompt = Prompt(
instruction="""
你是一名问答系统评估专家。
任务:判断回答与问题的相关性(0~1)。
步骤:
1. 提取问题核心意图
2. 拆解2~4个子问题
3. 检查回答是否覆盖
4. 给出评分
只输出一段JSON字符串,不要任何包装结构,不要数组,不要对象列表
"""
)
4.4.2 忠实度
- 数据集来源:真实 RAG 系统的日志或测试输出(如从 Chroma/FAISS + LLM 系统中得到的问答记录)
- 一个好的评估数据集应该包括多样化的问题和高质量的参考答案
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_openai import ChatOpenAI
from datasets import Dataset
from ragas.metrics import faithfulness
from ragas import evaluate
import os
from ragas.prompt import Prompt
# 修改提示词,ragas中的提示词是英文的
reasoning_question_prompt = Prompt(
instruction="""
你是一名问答系统评估专家。
任务:判断回答与问题的相关性(0~1)。
步骤:
1. 提取问题核心意图
2. 拆解2~4个子问题
3. 检查回答是否覆盖
4. 给出评分
只输出一段JSON字符串,不要任何包装结构,不要数组,不要对象列表
"""
)
# 数据样本
data_samples = {
# 用户输入的问题
"user_input": [
"人工智能的三个主要分支是什么?",
"什么是向量数据库?它在RAG系统中有什么作用?",
"解释一下大语言模型的微调过程",
],
# 响应的内容
"response": [
"人工智能的三个主要分支是机器学习、深度学习和自然语言处理。",
"向量数据库是专门存储和检索向量嵌入的数据库系统,在RAG系统中用于高效地检索语义相似的文档。",
"大语言模型的微调是在预训练模型的基础上,使用特定任务的数据进一步训练模型的过程。",
],
# 参考内容
"reference": [
"人工智能的三个主要分支是机器学习、自然语言处理和计算机视觉。",
"向量数据库是专门设计用于存储和检索向量嵌入的数据库系统。在RAG系统中,它用于存储文档的向量表示,并通过相似性搜索快速检索与查询最相关的文档。",
"大语言模型的微调是一个过程,其中预训练的基础模型使用特定领域或任务的数据进行额外训练,以优化其在特定应用场景的性能。",
],
# 检索到的内容
"retrieved_contexts": [
["人工智能主要包括机器学习、深度学习、自然语言处理和计算机视觉等领域。"],
[
"向量数据库是专门用于向量数据存储和检索的系统。在RAG应用中,向量数据库存储文档嵌入,通过计算相似度快速找到匹配查询的文档。"],
["大语言模型微调是在已预训练的模型基础上,使用特定数据集进行额外训练的过程,目的是使模型适应特定任务或领域。"],
],
}
# 加载测试数据
data = Dataset.from_dict(data_samples)
# 创建模型对象
llm = ChatOpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
model="qwen3.7-plus",
)
# 创建向量化模型对象
embedding_model = HuggingFaceEmbeddings(
model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
cache_folder=r"E:\workspace\stu_rag\models\embedding_model",
)
# 获取忠诚度测试结果
result = evaluate(
dataset=data, # 测试数据
metrics=[faithfulness], # 测试指标 --- 列表里面可以放多个指标,它可以一起计算
llm=llm, # 模型
embeddings=embedding_model, # 向量化模型
)
# 结果转为pandas
df = result.to_pandas()
# 写入csv文件
df.to_csv(r"E:\workspace\stu_rag\datasets\faithfulness.csv", index=False)
- 结果

4.4.3 答案相关性
import os
from datasets import Dataset
from langchain_huggingface import HuggingFaceEmbeddings
from ragas.metrics import answer_relevancy
from ragas import evaluate
from langchain_openai import ChatOpenAI
from ragas.prompt import Prompt
reasoning_question_prompt = Prompt(
instruction="""
你是一名问答系统评估专家。
任务:判断回答与问题的相关性(0~1)。
步骤:
1. 提取问题核心意图
2. 拆解2~4个子问题
3. 检查回答是否覆盖
4. 给出评分
只输出一段JSON字符串,不要任何包装结构,不要数组,不要对象列表
"""
)
data_samples = {
"user_input": [
"人工智能的三个主要分支是什么?",
"什么是向量数据库?它在RAG系统中有什么作用?",
"解释一下大语言模型的微调过程",
],
"response": [
"人工智能的三个主要分支是机器学习、深度学习和自然语言处理。",
"向量数据库是专门存储和检索向量嵌入的数据库系统,在RAG系统中用于高效地检索语义相似的文档。",
"大语言模型的微调是在预训练模型的基础上,使用特定任务的数据进一步训练模型的过程。",
],
"reference": [
"人工智能的三个主要分支是机器学习、自然语言处理和计算机视觉。",
"向量数据库是专门设计用于存储和检索向量嵌入的数据库系统。在RAG系统中,它用于存储文档的向量表示,并通过相似性搜索快速检索与查询最相关的文档。",
"大语言模型的微调是一个过程,其中预训练的基础模型使用特定领域或任务的数据进行额外训练,以优化其在特定应用场景的性能。",
],
"retrieved_contexts": [
["人工智能主要包括机器学习、深度学习、自然语言处理和计算机视觉等领域。"],
[
"向量数据库是专门用于向量数据存储和检索的系统。在RAG应用中,向量数据库存储文档嵌入,通过计算相似度快速找到匹配查询的文档。"
],
[
"大语言模型微调是在已预训练的模型基础上,使用特定数据集进行额外训练的过程,目的是使模型适应特定任务或领域。"
],
],
}
base_model_name = "qwen3.5-122b-a10b"
dataset = Dataset.from_dict(data_samples)
critic_llm = ChatOpenAI(
model=base_model_name,
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0.2,
extra_body={
"enable_thinking": False
}
)
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-base-zh-v1.5",
cache_folder=r"F:\workspace\AI\stu_nlp\rag\相似度计算\bge-base-zh-v1.5",
model_kwargs={"device": "cuda"},
encode_kwargs={"normalize_embeddings": True},
)
score = evaluate(
dataset,
metrics=[answer_relevancy],
llm=critic_llm,
embeddings=embeddings,
)
pd = score.to_pandas()
print(pd.head())
pd.to_csv("./datasets/answer_relation.csv")
- 结果

4.4.4 上下文精确度
-
上下文精确度(Context Precision)用于衡量:在检索到的上下文中,有多少是真正与“问题及其正确答案”相关的内容,即检索结果是否支持正确答案
-
公式如下:
$$
\text{Context Precision} = \frac{\text{是否支持最终正确答案的证据}}{\text{总的检索上下文数量}}
$$
-
案例演示:
-
问题:谁发明了电灯?
-
Ground truth(正确参考材料):
- 段1:托马斯·爱迪生在1879年发明了第一款实用的电灯
- 段2:电灯的发展经历了多个科学家的改进过程
-
模型实际检索到的 4 个上下文如下:
编号 上下文内容 是否有用(支持答案) A 爱迪生还发明了留声机。 ❌ 无关 B 电灯的发展经历了多个科学家的改进过程。 ✅ 有用 C 托马斯·爱迪生在1879年发明了第一款实用的电灯。 ✅ 有用 D 电动机在工业革命中扮演重要角色。 ❌ 无关 -
所以:
-
检索上下文总数:4
-
其中有用的上下文数量:2(B 和 C)
-
$\text{Context Precision} = \frac{2}{4} = 0.5$
-
4.4.5 上下文召回率
- 上下文召回率(Context Recall)用于衡量:在所有“应该被检索到的关键信息(ground truth contexts)”中,系统实际成功检索到了多少,即该找的,你找到了多少
- 公式如下:
$$
\text{Context Recall} = \frac{\text{成功检索到的有用上下文数量}}{\text{所有 ground truth 中的有用上下文数量}}
$$
- 和上下文精确度的区别:
| 指标名 | 关注点 |
|---|---|
| Context Precision | 你检索的内容中有多少是有用的 |
| Context Recall | 所有应该检索的内容中,你找到了多少? |
-
案例演示:
-
问题:谁发明了电灯?
-
Ground truth(应找到的正确上下文)共 3 段:
- G1:托马斯·爱迪生在1879年发明了第一款实用的电灯
- G2:电灯的发展经历了多个科学家的改进过程
- G3:电灯的前身是汉弗里·戴维发明的电弧灯
-
检索模块实际返回的上下文如下:
编号 检索返回的上下文 是否在 Ground Truth 中 A 爱迪生还发明了留声机。 ❌ B 电灯的发展经历了多个科学家的改进过程。 ✅ G2 C 托马斯·爱迪生在1879年发明了第一款实用的电灯。 ✅ G1 D 电动机在工业革命中扮演重要角色。 ❌ -
计算
-
所有 Ground Truth 共有有用段落:3 段(G1, G2, G3)
-
实际检索到其中的:2 段(G1, G2)
-
$\text{Context Recall} = \frac{2}{3} \approx 0.6667$
-
-
和上下文精确度的对比
-
Context Precision = 2 / 4 = 0.5
-
Context Recall = 2 / 3 ≈ 0.6667
-
4.4.6 答案语义相似性
-
答案语义相似性(Answer Semantic Similarity)用于衡量:RAG 系统生成答案与标准参考答案(ground truth answer)在语义层面的接近程度
-
核心理念:与传统的字符串匹配不同,该指标关注:
- 不要求字面一致
- 不依赖关键词重合
- 关注语义表达是否一致,即:两个答案是否“表达了同一个意思”
-
计算方法:使用 余弦相似度
$$
\text{Answer Semantic Similarity} = \cos(\vec{a}{gen}, \vec{a})
$$-
$\vec{a}_{gen}$:生成答案的语义向量
-
$\vec{a}_{true}$:参考答案的语义向量
-
-
相似度范围:
-
1 → 语义完全一致
-
0 → 完全无关
-
< 0 → 表示语义冲突(较少见)
-
5、其他评估方案
- 人为评估,虽然费时费力,但是效果好啊
- 其实生活中也有使用到,比如用 AI 做事情的时候,偶尔会提示你喜欢哪种风格或者点评结果
浙公网安备 33010602011771号