一、RAGas评估框架

1、简介

  • RAG Assessment(Retrieval-Augmented Generation Assessment):用于系统性评估 RAG 系统的整体性能,覆盖两个核心维度:

    1. 检索能力(Retrieval Capability)
      • 衡量系统从知识库或文档中检索相关信息的准确性和全面性。
      • 可量化指标包括:
        • Recall / Precision:检索结果的完整性与准确性
        • MRR(Mean Reciprocal Rank):首个相关文档的排名效果
        • nDCG(Normalized Discounted Cumulative Gain):考虑排名的整体相关性
    2. 生成能力(Generation Capability)
      • 衡量模型基于检索内容生成文本的质量和可靠性。
      • 可量化指标包括:
        • ROUGE / BLEU:生成文本与参考答案的相似度
        • Fact-Consistency:生成内容与检索内容或事实数据库的一致性
        • Human Evaluation:人工打分内容的可用性、流畅度和准确性
  • 目标:确保 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 自动化测量:
    1. 忠实度(Faithfulness):生成内容应基于给定上下文,避免幻觉,确保断言可从检索上下文推断
    2. 答案相关性(Answer Relevance):生成答案应直接回应用户问题,避免偏离主题
    3. 上下文相关性(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$,关注聚焦度和完整性

  • 评估方法

    1. 使用 LLM 基于答案生成一组可能问题 ${q_i}$
    2. 使用文本嵌入模型计算 $\text{sim}(q, q_i)$(余弦相似度)
    3. 计算答案相关性得分

    $$
    AR = \frac{1}{n} \sum_{i=1}^n \text{sim}(q, q_i)
    $$

  • 案例助解:Answer Relevance, AR

  • 指标特点:

    1. 高AR值:生成的问题与原始问题高度一致 → 答案聚焦且完整
    2. 低AR值:生成的问题发散或冗余 → 答案需优化(如删除无关信息)
    3. 优势:避免人工主观判断,自动化评估答案的针对性
  • 用户问题 $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$ 直接相关,避免冗余信息

  • 评估步骤

    1. 使用 LLM 从上下文提取相关句子集合 $S_{ext}$,Prompt 示例:
    请从提供的上下文中提取可能有助于回答以下问题的相关句子。如果没有找到相关句子,请返回“信息不足”。不要修改原句。
    
    1. 计算上下文相关性得分:

    $$
    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 特点

  • 优势

    1. 提高评估效率:RAGas 可快速完成 RAG 系统的性能评估,无需依赖人工注释,大幅缩短评估周期
    2. 节省成本:自动化评估显著降低了人工成本,相比传统人工评估更加经济
    3. 高度一致性:实验结果表明,RAGas 的评估结果在大多数情况下与人类评估者的判断高度一致,保证了评估的可靠性
  • 劣势

    1. 上下文相关性评估存在挑战:当上下文较长或信息复杂时,LLM(如 ChatGPT)在提取关键句子方面可能出现困难,影响上下文相关性评分
    2. 对微小差异敏感性不足:在比较候选答案的相关性或忠实度时,若差异非常细微,RAGas 可能难以捕捉,导致评分一致性降低
    3. 可能引入随机性:当多个候选答案得分相同,需要随机打破平局,这可能带来一定的评估随机性,影响确定性

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"
    )
  • 结果

image-20260515082456492

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")
  • 结果

image-20260515100657547

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 做事情的时候,偶尔会提示你喜欢哪种风格或者点评结果