测试集是用于评估模型性能的数据集,它不参与模型的训练过程,而是用于在模型训练完成后测试其准确性和泛化能力。
这篇文章介绍如何使用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()
选择LLM
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
generator_llm = LangchainLLMWrapper(ChatOpenAI(model="gpt-4o"))
generator_embeddings = LangchainEmbeddingsWrapper(OpenAIEmbeddings())
如果使用其他模型供应商的模型,将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,
embedding_model=generator_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)
导出测试集
生成的测试集可以导出并进行检查。
dataset.to_pandas()
工作原理
在生成测试集的过程中,Ragas有两个主要的操作:
- \1. 知识图谱创建(KnowledgeGraph Creation):使用你提供的文档创建一个知识图谱,并使用各种转换(Transformations)来丰富知识图谱,添加额外的信息,这些信息将用于生成测试集。
- \2. 测试集生成(Testset Generation):使用知识图谱生成一组场景(scenarios),这些场景将被用来生成测试集。
下面详细介绍一下这两个过程的实现。
知识图谱创建
通过提供文档创建知识图谱,并使用Transformations丰富知识图谱。
from ragas.testset.graph import KnowledgeGraph
kg = KnowledgeGraph()
初始时,这个知识图谱没有任何节点(nodes)和关系(relationships)。
- \1. 添加文档到知识图谱:
遍历之前加载的文档(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),因为目前只是简单地将文档作为节点添加到图中,还没有定义任何节点之间的关系。
- \2. 使用变换丰富知识图谱
通过变换(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
上。
- \3. 保存和加载知识图谱
知识图谱丰富完成后,将知识图谱保存为JSON文件。
kg.save("knowledge_graph.json")
使用kg.save("knowledge_graph.json")
将知识图谱保存为JSON文件。
随后,可以使用KnowledgeGraph.load()
来加载这个保存的知识图谱。
loaded_kg = KnowledgeGraph.load("knowledge_graph.json")
loaded_kg
查看加载之后知识图谱的状态,会包含多个节点和多个关系。这表明知识图谱已经被成功地丰富了。
使用知识图谱生成测试集
- \1. 创建TestsetGenerator实例:
加载之前生成的知识图谱loaded_kg
和generator_llm
(之前设置的LLM)来创建一个TestsetGenerator
实例。这个实例将用于生成测试集。
from ragas.testset import TestsetGenerator
generator = TestsetGenerator(llm=generator_llm, knowledge_graph=loaded_kg)
- \2. 定义查询分布:
查询分布(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
定义了一个生成测试集时的查询生成策略,确保了测试集中包含了不同类型和难度的查询,从而可以更全面地评估模型的性能。
- \3. 生成测试集:
使用TestsetGenerator
实例的generate
方法来生成测试集。
testset = generator.generate(testset_size=10, query_distribution=query_distribution)
testset.to_pandas()
这将生成一个包含10个测试案例的测试集,并且将测试集转换为Pandas DataFrame,以便进行进一步的检查和分析。
如何学习大模型
现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。
作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。
下面这些都是我当初辛苦整理和花钱购买的资料,现在我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来
,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线
很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。
二、AI大模型视频教程
三、AI大模型各大学习书籍
四、AI大模型各大场景实战案例
五、结束语
学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。
再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。
因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。