跳转至

基于 RAGAS 评估 RAG 系统

学习目标

  • 理解RAGAS库在RAG(检索增强生成)系统评估中的作用。
  • 掌握如何使用RAGAS评估RAG系统的核心指标。

RAGAS 评估脚本

功能描述

ragas_evaluate.py脚本用于评估RAG系统的性能,具体功能包括:

  1. 数据集加载:从JSON文件加载包含问题、答案、上下文和真实答案的评估数据集。

  2. 数据格式转换:将JSON数据转换为RAGAS要求的Dataset格式。

  3. 环境配置:使用LangChain的OpenAI模型和嵌入模型初始化RAGAS评估环境。

  4. 评估执行:计算四个核心指标:

    • Faithfulness(忠实度):答案是否忠于上下文。
    • Answer Relevancy(答案相关性):答案与问题的匹配程度。
    • Context Relevancy(上下文相关性):上下文是否与问题相关。
    • Context Recall(上下文召回率):上下文是否包含所有必要信息。
  5. 结果输出与保存:打印评估结果并保存为CSV文件,便于后续分析。


完整代码

# 导入pandas库,用于数据处理和保存CSV文件
import pandas as pd
# 导入ragas库的evaluate函数,用于执行RAG评估
from ragas import evaluate
# 导入ragas的评估指标,包括忠实度、答案相关性、上下文相关性和上下文召回率
from ragas.metrics import (
    faithfulness,
    answer_relevancy,
    context_relevancy,
    context_recall
)
# 导入datasets库的Dataset类,用于构建RAGAS所需的数据格式
from datasets import Dataset
# 导入langchain_openai的嵌入模型和聊天模型,用于评估时的语义计算和推理
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
# 导入json库,用于加载JSON格式的评估数据集
import json

# 1. 加载生成的数据集
# 使用with语句打开JSON文件,确保文件正确关闭,指定编码为utf-8
with open("rag_evaluation_dataset.json", "r", encoding="utf-8") as f:
    # 将JSON文件内容加载到data变量中,data为包含多个数据条目的列表
    data = json.load(f)

# 2. 转换为RAGAS格式
# 创建字典eval_data,将JSON数据转换为RAGAS要求的字段格式
eval_data = {
    # 提取每个数据条目的question字段,组成问题列表
    "question": [item["question"] for item in data],
    # 提取每个数据条目的answer字段,组成答案列表
    "answer": [item["answer"] for item in data],
    # 提取每个数据条目的context字段,组成上下文列表(每个context为列表)
    "contexts": [item["context"] for item in data],
    # 提取每个数据条目的ground_truth字段,组成真实答案列表
    "ground_truth": [item["ground_truth"] for item in data]
}
# 使用Dataset.from_dict将字典转换为RAGAS所需的Dataset对象
dataset = Dataset.from_dict(eval_data)

# 3. 配置RAGAS评估环境
# 初始化ChatOpenAI模型,指定使用gpt-4模型,并设置OpenAI API密钥
llm = ChatOpenAI(model="gpt-4", openai_api_key="your_openai_api_key")
# 初始化OpenAI嵌入模型,用于计算语义相似度,设置API密钥
embeddings = OpenAIEmbeddings(openai_api_key="your_openai_api_key")

# 4. 执行评估
# 调用evaluate函数,传入数据集、评估指标、LLM模型和嵌入模型
result = evaluate(
    # 传入转换好的Dataset对象
    dataset=dataset,
    # 指定使用的评估指标列表
    metrics=[
        faithfulness,  # 忠实度:答案是否基于上下文
        answer_relevancy,  # 答案相关性:答案与问题的匹配度
        context_relevancy,  # 上下文相关性:上下文是否仅包含相关信息
        context_recall  # 上下文召回率:上下文是否包含所有必要信息
    ],
    # 传入配置好的LLM模型
    llm=llm,
    # 传入配置好的嵌入模型
    embeddings=embeddings
)

# 5. 输出并保存结果
# 打印评估结果标题
print("RAGAS评估结果:")
# 打印评估结果,包含各指标的分数
print(result)
# 将评估结果转换为pandas DataFrame,便于保存
result_df = pd.DataFrame([result])
# 将DataFrame保存为CSV文件,文件名为ragas_evaluation_results.csv,不保存索引
result_df.to_csv("ragas_evaluation_results.csv", index=False)

说明

  1. 数据集格式

    • RAGAS要求数据集包含questionanswercontexts(列表格式)和ground_truth四个字段。
    • contexts必须是列表,即使每个问题只对应一个上下文(如["context text"])。
  2. 评估指标

    • Faithfulness:依赖LLM(如gpt-4)判断答案是否基于上下文,避免生成无关内容。
    • Answer Relevancy:使用嵌入模型(OpenAIEmbeddings)计算答案与问题的语义相似度。
    • Context Relevancy:评估上下文是否仅包含与问题相关的信息,减少冗余。
    • Context Recall:检查上下文是否覆盖所有必要信息,需高质量的ground_truth支持。
  3. 环境配置

    • ChatOpenAI用于生成评估所需的推理(如判断忠实度),需指定模型(如gpt-4)和API密钥。
    • OpenAIEmbeddings用于计算语义相似度(如答案相关性),需确保API密钥有效。
    • 可替换为其他LLM(如通义千问),需适配LangChain的模型接口。
  4. 结果分析

    • 评估结果为字典,包含各指标的分数(0-1,1为最佳),如:

      {'faithfulness': 0.95, 'answer_relevancy': 0.92, 'context_relevancy': 0.90, 'context_recall': 0.93}
      
    • 结果保存为CSV文件(ragas_evaluation_results.csv),便于统计分析和多次运行比较。
  5. 迁移性

    • 代码结构通用,可用于任何RAG系统评估,只需替换数据集和LLM配置。
    • 可扩展指标(如answer_correctness)或添加自定义数据处理逻辑(如过滤低质量数据)。

章节总结

本课件通过ragas_evaluate.py代码,详细介绍了使用RAGAS评估RAG系统的完整流程。