Ragas:专为RAG系统打造的高效评估工具

发布于 2025-8-21 08:56
浏览
0收藏

Ragas 是一个专为检索增强生成(RAG)系统设计的开源评估框架。它通过多维度指标,系统性评估检索与生成质量,支持无参考自动化评测,帮助开发者精准定位性能瓶颈,提升RAG系统的准确性与可靠性,适用于各类知识密集型应用场景。

Ragas:专为RAG系统打造的高效评估工具

1. RAG 与评估的必要性

2. RAGAS是什么

3. Ragas 关键评估指标详解

3.1 检索质量指标

3.1.1 上下文精确度 (Context Precision)

3.1.2 上下文召回率 (Context Recall)

3.2 生成质量指标

3.2.1 忠实度 (Faithfulness)

3.2.2 答案相关性 (Response Relevancy)

4. Ragas 从安装到评估

4.1 Ragas 安装

4.2 准备需要评估的RAG系统

4.3 生成测试数据集

4.4 准备评估数据

4.5 选择并初始化 Ragas 指标

4.6 运行评估

4.7 分析结果

5. RAGAS的局限性

1. RAG 与评估的必要性

什么是检索增强生成 (RAG)?

检索增强生成(Retrieval-Augmented Generation,RAG)系统代表了大型语言模型(LLM)与信息交互方式的一项重大进步。

与传统上仅依赖其预训练的静态知识的LLM不同,RAG系统将LLM的生成能力与动态的外部信息检索机制相结合 。

这使得它们能够从庞大的外部来源(如数据库或知识库)获取相关数据 。通过使用检索到的信息增强LLM的上下文,RAG系统能够生成更具信息量、更精确的响应,从而有效解决LLM常见的领域知识空白、事实性问题以及“幻觉”(即编造信息)的倾向 。

为什么 RAG 系统需要评估?

RAG系统由检索器和生成式LLM的多个组件构成,这引入了多层复杂性,使得全面评估不仅有益,而且绝对必要。

仅仅最终答案“听起来不错”是远远不够的;它必须事实正确,基于检索到的数据,并与用户的查询直接相关。

如果没有严格的评估,如检索到不相关信息、事实不准确或细微幻觉等问题,会削弱RAG系统的实用性。

Ragas能够系统地评估RAG,通过单独和整体分析其组件,从而诊断问题 。

通过评估单个组件(检索器和生成器),开发人员可以精确定位性能瓶颈或错误发生的具体阶段,从而实现更高效的调试和有针对性的改进。

2. RAGAS是什么

Ragas是一个专门为系统评估RAG性能而精心设计的开源框架。

它的首要目标是为开发人员提供一种高效且可量化的方法,以衡量其RAG系统在两个关键维度上的有效性:信息检索的准确性和相关性,以及生成响应的质量和上下文适当性 。

Ragas的一个突出特点是其开创性的“无参考”评估能力,这显著减少了对人工标注真实答案的依赖,他本身是利用LLM进行评估,它能够模拟人类的判断和对细微差别的理解。

然而,这种方法也带来了一个需要权衡的问题:

LLM驱动的指标可能具有一定的不确定性,因为LLM对于相同的输入可能不会总是返回相同的结果。

这意味着,虽然LLM作为“评判者”极大地提高了评估的速度和自动化水平,但开发人员在实践中应注意这种波动性。为了获得稳健的评估结果,可能需要运行更多的测试样本或进行多次评估,以平衡评估速度与统计置信度。

官网:​​https://github.com/explodinggradients/ragas​

3. Ragas 关键评估指标详解

Ragas 提供了一套全面的指标,从而可以对 RAG 系统进行整体评估。这些指标可以评估 RAG 的两个基本方面:LLM 生成响应的质量和检索机制提供上下文的有效性。

它使开发人员不仅能够了解整体性能,还能精确诊断潜在的问题。

通过分析这些不同的指标类别,Ragas 能够实现有针对性的改进,从而提高 RAG 系统的准确性、相关性和可靠性。

3.1 检索质量指标

3.1.1 上下文精确度 (Context Precision)

衡量目的: 该指标衡量检索到的信息中真正相关且对回答用户查询有用的比例。它评估检索系统过滤掉不相关或“噪声”数据的能力。高分数表明检索到的文档高度相关且没有干扰信息 。

要点: 上下文精确度在减轻检索引起的幻觉方面发挥着直接作用。这个指标明确指出,它有助于“避免不相关的数据,这些数据可能会误导LLM的响应” 。它确保了输入上下文本身是干净和相关的。

3.1.2 上下文召回率 (Context Recall)

衡量目的: 该指标评估检索上下文的完整性,确保检索器成功检索了回答用户问题所需的所有相关信息。它检查在检索过程中是否遗漏了真实答案中的任何关键细节或事实。高分数表明检索器成功识别并提供了所有相关信息。

要点: 上下文召回率直接影响生成答案的完整性。这对于RAG系统生成完整的答案至关重要 。高上下文召回率确保LLM能够访问所有必要的信息,以提供全面和详尽的答案。相反,低召回率直接导致不完整的响应。

3.2 生成质量指标

3.2.1 忠实度 (Faithfulness)

衡量目的: 该指标评估生成响应与所提供的检索上下文的事实一致性。它可以确定LLM答案中提出的所有主张和陈述是否可以直接从检索到的信息中推断出来或完全得到支持 。

要点: 忠实度是抵御RAG中产生幻觉的主要防线。忠实度被定义为检查生成文本是否“忠实于检索到的信息,避免虚假信息” 。高忠实度分数直接表明RAG系统成功利用检索到的上下文生成了事实依据的响应,从而减轻了LLM产生幻觉的倾向。

3.2.2 答案相关性 (Response Relevancy)

衡量目的: 该指标评估生成答案与原始用户查询的相关性和集中程度。它确保LLM的响应直接解决用户的意图和问题,避免离题信息或不必要的冗余。高分数表明答案简洁且直接切中要点 。

要点: 答案相关性是用户体验和实用性的直接衡量标准。Ragas“检查响应是否符合用户问题。这个指标直接量化了这种契合度。虽然事实正确性(忠实度)至关重要,但一个事实正确但与用户实际问题不相关的答案会提供糟糕的用户体验。这个指标确保RAG系统不仅准确,而且对用户意图“有用”和“响应迅速”,弥合了技术性能与实际实用性之间的差距。

可用指标:​​https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/​

4. Ragas 从安装到评估

4.1 Ragas 安装

pip install ragas

4.2 准备需要评估的RAG系统

这是本次测试需要评估的RAG系统

# 配置OpenAI API环境变量
import os
os.environ["OPENAI_API_KEY"] = "hk-iwtbie100a91e427"
os.environ["OPENAI_API_BASE"] = "https://api.openai-hk.com/v1"
# 导入RAG系统所需的核心库
from langchain.document_loaders import PyPDFLoader  # PDF文档加载器
from langchain.text_splitter import RecursiveCharacterTextSplitter  # 文本分割器,用于将长文档分割成小块
from langchain_chroma import Chroma  # Chroma向量数据库,用于存储和检索文档嵌入
from langchain.embeddings import SentenceTransformerEmbeddings  # 句子嵌入模型,用于将文本转换为向量
# 创建PDF加载器实例,指定BERT论文的路径
loader = PyPDFLoader('./bert.pdf')

# 加载PDF文档,返回文档对象列表
# 每个文档对象包含页面内容和元数据(如页码、来源等)
docs = loader.load()
# 导入聊天提示词模板类
from langchain.prompts import ChatPromptTemplate

# 定义RAG系统的提示词模板
# 这个模板将指导LLM如何使用检索到的上下文来回答问题
template = """You are an assistant for question-answering tasks.
Use the following pieces of retrieved context to answer the question.
If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise.
Question: {question}
Context: {context}
Answer:
"""

# 从模板字符串创建ChatPromptTemplate对象
# 这个对象可以接受question和context参数来生成完整的提示词
prompt = ChatPromptTemplate.from_template(template)
# print(prompt)

# 导入OpenAI聊天模型和字符串输出解析器
from langchain_openai import ChatOpenAI
from langchain.schema.output_parser import StrOutputParser

defrag_chain():
    """
    创建并返回RAG处理链
    
    Returns:
        Chain: 完整的RAG处理链,包含提示词模板、语言模型和输出解析器
    """
    # 初始化OpenAI的GPT-4o-mini模型
    # temperature=0 确保输出的一致性和确定性
    llm = ChatOpenAI(model_name="gpt-4o-mini", temperature=0)
    
    # 使用管道操作符 | 连接处理链的各个组件
    # 处理流程: 提示词模板 -> 语言模型 -> 字符串解析器
    rag_chain = (
        prompt          # 1. 格式化提示词
        | llm           # 2. 发送给语言模型处理
        | StrOutputParser()  # 3. 解析输出为字符串
    )
    return rag_chain
# 导入父文档检索器相关组件
from langchain.retrievers import ParentDocumentRetriever  # 父文档检索器核心类
from langchain.storage import InMemoryStore              # 内存存储,用于存储父文档

# 配置文档分割策略
# 父文档分割器:创建较大的文档块,保持上下文完整性
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=1500)  # 父文档块大小:1500字符

# 子文档分割器:创建较小的文档块,提高检索精度
child_splitter = RecursiveCharacterTextSplitter(chunk_size=200)    # 子文档块大小:200字符

# 初始化嵌入模型
# 使用轻量级但高效的all-MiniLM-L6-v2模型进行文本向量化
embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")

# 创建向量数据库
# 用于存储子文档的向量表示,支持语义相似性搜索
vectorstore = Chroma(
    collection_name="split_parents",    # 集合名称
    embedding_function=embeddings       # 嵌入
)

# 创建内存存储
# 用于存储父文档的完整内容,通过ID快速检索
store = InMemoryStore()
# 创建父文档检索器实例
# 这是整个检索系统的核心组件,整合了所有必要的组件
parent_document_retriever = ParentDocumentRetriever(
    vectorstore=vectorstore,          # 向量数据库:存储子文档的向量表示
    docstore=store,                   # 文档存储:存储父文档的完整内容
    child_splitter=child_splitter,    # 子文档分割器:用于创建小块进行精确匹配
    parent_splitter=parent_splitter,  # 父文档分割器:用于创建大块提供丰富上下文
)
# 将加载的文档添加到父文档检索器中
# 这个过程会自动执行以下操作:
# 1. 使用parent_splitter将文档分割成父文档块
# 2. 使用child_splitter将父文档块进一步分割成子文档块
# 3. 将子文档块向量化并存储到vectorstore中
# 4. 将父文档块存储到docstore中,并建立父子关系映射
parent_document_retriever.add_documents(docs)

4.3 生成测试数据集

在生产环境中,评估RAG系统时对于数据集的要求:

• 高质量、覆盖面广的问答对,以确保评测结果具有统计意义和代表性。

• 问答对应涵盖文档的各个核心知识点、边界情况和易混淆点。

• 问题类型应多样化,包括事实性、推理性、细节性和开放性问题。

• 标准答案(Ground Truth)需经过人工校验,确保准确无歧义。

实际操作中,可以结合人工标注与大模型辅助生成,构建更大规模的评测集,以满足生产环境下对系统性能评估的严苛要求。

本次测试基于BERT论文,使用GPT生成3对问答对用于测试。

# 定义评估问题集合
# 这些问题涵盖了BERT论文的关键技术点,用于全面评估RAG系统的性能
questions = [
    "What are the two main tasks BERT is pre-trained on?",
    "What model sizes are reported for BERT, and what are their specifications?",
    "How does BERT's architecture facilitate the use of a unified model across diverse NLP tasks?"
]

# 定义标准答案(Ground Truth)
ground_truths = [
        "Masked LM (MLM) and Next Sentence Prediction (NSP).",
        "BERTBASE (L=12, H=768, A=12, Total Parameters=110M) and BERTLARGE (L=24, H=1024, A=16, Total Parameters=340M).",
        "BERT uses a multi-layer bidirectional Transformer encoder architecture, allowing for minimal task-specific architecture modifications in fine-tuning."
]

4.4 准备评估数据

一个完整的评估数据集应包含用户查询、RAG 系统检索到的上下文、RAG 系统生成的响应,以及可选的真实答案。通过上边的问答对来生成最终评估数据集

def format_docs(relevant_docs):
    """
    将检索到的文档列表格式化为单个字符串
    
    Args:
        relevant_docs: 检索器返回的文档对象列表
        
    Returns:
        str: 用换行符连接的文档内容字符串
    """
    return"\n".join(doc.page_content for doc in relevant_docs)

defcreate_ragas_dataset(rag_chain, retriever):
    """
    创建Ragas评估所需的数据集
    
    这个函数执行完整的RAG流程并收集评估所需的所有数据:
    1. 对每个问题使用检索器获取相关文档
    2. 使用RAG链生成答案
    3. 收集所有必要的数据用于评估
    
    Args:
        rag_chain: RAG处理链,用于生成答案
        retriever: 文档检索器,用于获取相关上下文
        
    Returns:
        Dataset: 包含评估所需所有字段的HuggingFace数据集
    """
    answers = []    # 存储RAG系统生成的答案
    contexts = []   # 存储检索到的上下文文档
    
    # 对每个评估问题执行RAG流程
    for query in questions:
        # 1. 使用检索器获取相关文档
        relevant_docs = retriever.invoke(query)
        
        # 2. 格式化上下文并生成答案
        formatted_context = format_docs(relevant_docs)
        answer = rag_chain.invoke({
            "context": formatted_context, 
            "question": query
        })
        
        # 3. 收集结果
        answers.append(answer)
        contexts.append([doc.page_content for doc in relevant_docs])
    
    # 构建Ragas评估数据集的标准格式
    data = {
        "user_input": questions,           # 用户输入的问题
        "response": answers,               # RAG系统生成的答案
        "retrieved_contexts": contexts,    # 检索到的上下文文档
        "reference": ground_truths         # 标准参考答案
    }
    
    # 创建HuggingFace数据集对象
    dataset = Dataset.from_dict(data)
    return dataset

4.5 选择并初始化 Ragas 指标

根据评估目标,选择一个或多个 Ragas 指标(详情见第3章)。

例如,如果关注生成答案的事实准确性,可以选择“忠实度”和“答案相关性”;

如果关注检索质量,则选择“上下文精确度”和“上下文召回率”。然后,使用配置初始化这些指标 。

# 导入Ragas评估框架的核心指标
from ragas.metrics import (
    answer_relevancy,    # 答案相关性:评估生成答案与问题的相关程度
    faithfulness,        # 忠实度:评估答案是否基于检索到的上下文
    context_recall,      # 上下文召回率:评估检索到的上下文是否包含回答问题所需的信息
    context_precision    # 上下文精确率:评估检索到的上下文中相关信息的比例
)

# 导入Ragas评估函数和数据集处理库
from ragas import evaluate        # 主要评估函数
from datasets import Dataset      # HuggingFace数据集库,用于构建评估数据集

4.6 运行评估

使用 Ragas 的 ​​evaluate​​ 函数,将准备好的数据集、选择的指标作为输入。

Ragas 将自动计算每个样本的指标分数,并聚合为数据集的整体分数。

def evaluate_ragas_dataset(ragas_dataset):
    """
    使用Ragas框架评估RAG系统性能
    
    该函数对构建好的数据集进行多维度评估,包括检索质量和生成质量。
    
    Args:
        ragas_dataset: 包含问题、答案、上下文和参考答案的数据集
        
    Returns:
        EvaluationResult: 包含各项评估指标得分的结果对象
    """
    # 执行Ragas评估,使用四个核心指标
    result = evaluate(
        ragas_dataset,
        metrics=[
            context_recall,      # 上下文召回率:检索是否包含了回答问题所需的信息
            context_precision,   # 上下文精确率:检索内容的相关性比例
            faithfulness,        # 忠实度:答案是否忠实于检索到的上下文
            answer_relevancy     # 答案相关性:答案与问题的相关程度
        ],
    )
    return result
# 步骤1: 创建用于父文档检索器评估的RAG处理链
# 这个链将与父文档检索器配合工作,处理检索到的丰富上下文
parent_document_qa_chain = rag_chain()
# 步骤2: 构建父文档检索器的评估数据集
# 这个过程将:
# 1. 对每个评估问题使用父文档检索器检索相关父文档
# 2. 使用RAG链基于检索到的父文档生成答案
# 3. 收集所有必要的数据用于Ragas评估
parent_document_dataset = create_ragas_dataset(parent_document_qa_chain, parent_document_retriever)
# 步骤3: 执行Ragas评估
# 使用四个核心指标对父文档检索器的性能进行全面评估
# 这可能需要几分钟时间,因为需要调用LLM进行评估计算
print("开始执行Ragas评估,请稍候...")
parent_document_result = evaluate_ragas_dataset(parent_document_dataset)
print("评估完成!")

4.7 分析结果

评估完成后,Ragas 会返回一个包含所有指标分数的对象。

Ragas:专为RAG系统打造的高效评估工具-AI.x社区

这些结果可以导出为 pandas DataFrame,以便进行详细的样本级分析。

Ragas:专为RAG系统打造的高效评估工具-AI.x社区

较高的指标值表示更好的性能。

这个迭代的评估过程是 RAG 系统开发和优化的核心。通过系统地运行测试、分析结果并根据指标反馈调整组件,开发人员可以持续改进 RAG 系统的性能、可靠性和用户满意度。

5. RAGAS的局限性

虽然 Ragas 在 RAG 系统评估方面提供了强大的工具和创新的“无参考”评测能力,但在实际应用中仍存在一些局限性,开发者在使用时需加以关注:

1)对大模型的依赖

Ragas 的许多评估指标(如忠实度、答案相关性等)依赖于大型语言模型(LLM)作为“裁判”进行自动化判断。这意味着评估的准确性和一致性很大程度上取决于所用 LLM 的能力和偏好。如果 LLM 本身存在幻觉或理解偏差,评估结果可能不完全可靠。

2)评估成本较高

由于需要多次调用 LLM 进行自动化评判,Ragas 的评估过程在大规模数据集上可能带来较高的计算和经济成本,尤其是在使用付费 API(如 OpenAI GPT-4)时。这对资源有限的团队可能是一个实际障碍。

3)指标解释性有限

尽管 Ragas 提供了多维度的量化指标,但这些分数的具体含义和改进方向有时并不直观。例如,某些指标分数较低时,开发者仍需结合样本级分析和人工检查,才能定位具体问题所在。

4)无法完全替代人工评测

虽然 Ragas 大幅减少了人工标注的需求,但在高风险或高要求场景下(如医疗、金融),人工评测仍然不可或缺。Ragas 更适合作为自动化、快速迭代的辅助工具,而非最终的质量裁决者。

5)对数据集构建质量的敏感性

Ragas 的评估效果依赖于输入数据集的合理性和代表性。如果评测数据集本身存在偏差或覆盖不全,评估结果也会受到影响。因此,数据集的设计和采样同样需要严格把控。

本文转载自​​​​AI取经路,作者:AI取经路


收藏
回复
举报
回复
相关推荐