使用 Ragas 为 RAG 生成测试集并评估特定文档表现
本文介绍如何使用 Ragas 框架基于特定文档生成 RAG 测试集。通过加载本地文档、配置大语言模型与嵌入模型,利用知识图谱构建和变换策略合成多样化的查询场景。内容涵盖环境安装、数据加载、测试集生成流程及内部工作原理,并补充了如何利用 Ragas 评分器对生成的测试集进行质量评估,帮助开发者准确衡量 RAG 系统在特定领域的应用效果。

本文介绍如何使用 Ragas 框架基于特定文档生成 RAG 测试集。通过加载本地文档、配置大语言模型与嵌入模型,利用知识图谱构建和变换策略合成多样化的查询场景。内容涵盖环境安装、数据加载、测试集生成流程及内部工作原理,并补充了如何利用 Ragas 评分器对生成的测试集进行质量评估,帮助开发者准确衡量 RAG 系统在特定领域的应用效果。

测试集是用于评估模型性能的数据集,它不参与模型的训练过程,而是用于在模型训练完成后测试其准确性和泛化能力。本文介绍如何使用 Ragas 框架创建一个测试集,以便可以评估自己的 RAG 系统在处理特定文档时的表现。通过使用自己的文档生成测试集,可以确保测试集与 RAG 具体应用场景紧密相关,从而更准确地评估 RAG 系统的效果。
Ragas 提供了从加载文档、选择语言模型(LLM)、生成测试集到导出结果的全链路支持。
文章首先指导用户如何安装必要的包,并提供了一个快速示例,展示如何为 RAG 流水线生成测试集。
pip install langchain-openai
pip install langchain-aws
pip install ragas
通过 git 克隆样本文档,并使用 DirectoryLoader 加载文档,用户可以替换为自己的文档。
git clone https://huggingface.co/datasets/explodinggradients/Sample_Docs_Markdown
使用 langchain_community 的 DirectoryLoader 加载器从样本数据集中加载文档。
from langchain_community.document_loaders import DirectoryLoader
path = "Sample_Docs_Markdown/"
loader = DirectoryLoader(path, glob="**/*.md")
docs = loader.load()
你也可以使用 llama_index 中的任何加载器加载文档,例如使用 SimpleDirectoryReader:
from llama_index.core import SimpleDirectoryReader
path = "Sample_Docs_Markdown/"
docs = SimpleDirectoryReader(path).load_data()
Ragas 需要利用大型语言模型(LLM)和嵌入模型来合成测试数据。可以选择 OpenAI、Amazon Bedrock、Azure OpenAI 等 LLM 供应商提供的模型。Ragas 集成了 Langchain 和 Llamaindex 框架。可以通过它们更好地和模型交互。
如果使用 OpenAI 的模型,并且使用 Langchain 框架进行调用,则需要安装 langchain-openai 包,这是一个通过 Langchain 框架与 OpenAI 模型进行交互的包。
pip install langchain-openai
接着,配置 OpenAI 密钥。
import os
os.environ["OPENAI_API_KEY"] = "your-openai-key"
将大型语言模型(LLMs)封装在 LangchainLLMWrapper 这个包装器中,以便它们可以与 ragas 集成。
from ragas.llms import LangchainLLMWrapper
from langchain_openai import ChatOpenAI
from langchain_openai import OpenAIEmbeddings
# 注意:实际使用中需根据 ragas 版本调整导入路径
# generator_embeddings = LangchainEmbeddingsWrapper(OpenAIEmbeddings())
# 此处简化演示,通常直接传入 embedding 对象或适配后的 wrapper
generator_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o"))
如果使用其他模型供应商的模型,将 ChatOpenAI(model="gpt-4o") 换成你的模型实例即可。例如使用通义千问大模型:
import os
os.environ["DASHSCOPE_API_KEY"] = "sk-..."
from langchain_community.llms import Tongyi
llm = Tongyi(
model="qwen-max",
# top_p="...",
# api_key="...",
# other params...
)
generator_llm = LangchainLLMWrapper(llm)
这里需要安装 pip install dashscope。
如果你使用 LlamaIndex 框架而不是 Langchain 与大模型交互,将 LangchainLLMWrapper 替换成 LlamaIndexLLMWrapper 即可。
使用加载的文档和设置好的 LLM 运行生成测试数据集。
from ragas.testset import TestsetGenerator
generator = TestsetGenerator(llm=generator_llm)
# 注意:embeddings 参数在某些版本中可省略或由内部处理
# dataset = generator.generate_with_langchain_docs(docs, testset_size=10)
testset_size 指定生成的测试集的大小为 10。
如果你前面使用的是 llama_index 的工具来加载文档,那么你应该使用 generate_with_llama_index_docs 这个方法代替 generate_with_langchain_docs。
# dataset = generator.generate_with_llama_index_docs(docs, testset_size=10)
生成的测试集可以导出并进行检查。
print(dataset.to_pandas())
在生成测试集的过程中,Ragas 有两个主要的操作:
下面详细介绍一下这两个过程的实现。
通过提供文档创建知识图谱,并使用 Transformations 丰富知识图谱。
from ragas.testset.graph import KnowledgeGraph
kg = KnowledgeGraph()
初始时,这个知识图谱没有任何节点(nodes)和关系(relationships)。
遍历之前加载的文档(docs),为每个文档创建一个 Node 实例,并将其添加到知识图谱的节点列表中。
from ragas.testset.graph import Node, NodeType
for doc in docs:
kg.nodes.append(
Node(
type=NodeType.DOCUMENT,
properties={"page_content": doc.page_content, "document_metadata": doc.metadata}
)
)
每个节点都被标记为 NodeType.DOCUMENT 类型,并包含两个属性:page_content(文档的内容)和 document_metadata(文档的元数据)。在添加文档后,知识图谱的状态更新为包含多个节点(nodes)和 0 个关系(relationships),因为目前只是简单地将文档作为节点添加到图中,还没有定义任何节点之间的关系。
通过变换(Transformations)丰富知识图谱(KnowledgeGraph)的信息。
from ragas.testset.transforms import default_transforms, apply_transforms
# define your LLM and Embedding Model
# here we are using the same LLM and Embedding Model that we used to generate the testset
transformer_llm = generator_llm
embedding_model = generator_embeddings # 需确保已正确初始化
trans = default_transforms(llm=transformer_llm, embedding_model=embedding_model)
apply_transforms(kg, trans)
通过调用 default_transforms 函数并传入 LLM 和嵌入模型,创建了一个变换集合 trans。然后,使用 apply_transforms 函数将这些变换应用到知识图谱 kg 上。
知识图谱丰富完成后,将知识图谱保存为 JSON 文件。
kg.save("knowledge_graph.json")
使用 kg.save("knowledge_graph.json") 将知识图谱保存为 JSON 文件。
随后,可以使用 KnowledgeGraph.load() 来加载这个保存的知识图谱。
loaded_kg = KnowledgeGraph.load("knowledge_graph.json")
print(loaded_kg)
查看加载之后知识图谱的状态,会包含多个节点和多个关系。这表明知识图谱已经被成功地丰富了。
加载之前生成的知识图谱 loaded_kg 和 generator_llm(之前设置的 LLM)来创建一个 TestsetGenerator 实例。这个实例将用于生成测试集。
from ragas.testset import TestsetGenerator
generator = TestsetGenerator(llm=generator_llm, knowledge_graph=loaded_kg)
查询分布(query distribution)是指在生成测试集时,不同类型的查询按照一定的概率分布被选取的模式。在机器学习和自然语言处理中,特别是在构建测试集时,查询分布可以确保测试集的多样性和代表性,从而更好地评估模型的性能。
from ragas.testset.synthesizers import default_query_distribution
query_distribution = default_query_distribution(generator_llm)
Ragas 默认使用 default_query_distribution 生成查询分布。它包括三种类型的查询合成器,每种都有不同的权重:
SingleHopSpecificQuerySynthesizer:单跳具体查询合成器,权重为 0.5。MultiHopAbstractQuerySynthesizer:多跳抽象查询合成器,权重为 0.25。MultiHopSpecificQuerySynthesizer:多跳具体查询合成器,权重为 0.25。权重表示在生成数据集时,它们被选中的概率。这些查询合成器负责生成不同类型的查询,而它们的概率则决定了在生成测试集时,每种类型的查询被生成的频率。这样做的目的是为了模拟真实世界中查询的多样性,以及确保测试集能够覆盖不同的查询类型。
通过这种方式,query_distribution 定义了一个生成测试集时的查询生成策略,确保了测试集中包含了不同类型和难度的查询,从而可以更全面地评估模型的性能。
使用 TestsetGenerator 实例的 generate 方法来生成测试集。
testset = generator.generate(testset_size=10, query_distribution=query_distribution)
print(testset.to_pandas())
这将生成一个包含 10 个测试案例的测试集,并且将测试集转换为 Pandas DataFrame,以便进行进一步的检查和分析。
生成测试集只是第一步,为了真正评估 RAG 系统的表现,我们需要使用 Ragas 提供的评分器对生成的测试集进行打分。这有助于量化系统在回答准确性、上下文相关性等方面的表现。
from ragas.metrics import answer_relevancy, faithfulness, context_precision
from ragas import evaluate
metrics = [answer_relevancy, faithfulness, context_precision]
result = evaluate(testset, metrics=metrics)
print(result)
通过上述代码,你可以得到各个维度的评分,从而全面了解 RAG 系统在特定文档上的处理能力。如果分数不理想,可以调整检索策略或优化文档切片方式,再次生成测试集进行评估。
本文详细介绍了如何使用 Ragas 框架基于特定文档生成 RAG 测试集。通过加载本地文档、配置大语言模型与嵌入模型,利用知识图谱构建和变换策略合成多样化的查询场景。内容涵盖环境安装、数据加载、测试集生成流程及内部工作原理,并补充了如何利用 Ragas 评分器对生成的测试集进行质量评估,帮助开发者准确衡量 RAG 系统在特定领域的应用效果。掌握这一流程对于构建高质量的企业级 RAG 应用至关重要。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online