引言
在自然语言处理(NLP)领域,检索增强生成(Retrieval-Augmented Generation, RAG)管道是一种强大的工具,它结合了信息检索和文本生成技术,以提供更准确和上下文相关的答案。为了评估和优化RAG管道的性能,我们需要一个高质量的数据集来进行基准测试。本文将深入探讨如何使用LabelledRagDataset
来构建和评估RAG管道。
什么是LabelledRagDataset?
LabelledRagDataset
是一个用于评估RAG管道的数据集,类似于传统机器学习中的数据集,其中特征(X)用于预测真实标签(y)。在RAG管道中,查询(query)和检索到的上下文(retrieved contexts)作为特征,而查询的答案(reference_answer)作为真实标签。
前置知识
在深入探讨之前,我们需要了解以下几个概念:
- RAG管道:RAG管道结合了检索和生成两个步骤。首先,系统从大量文档中检索相关信息,然后使用这些信息生成答案。
- Pydantic模型:Pydantic是一个用于数据验证和设置管理的Python库。它允许我们定义数据模型,并确保数据的类型和结构符合预期。
- WikipediaReader:一个用于从维基百科获取数据的工具,常用于获取文本数据。
构建LabelledRagDataExample
LabelledRagDataExample
是LabelledRagDataset
的基本单元。每个示例包含一个查询、查询的生成者、参考答案、参考答案的生成者以及相关的上下文。
代码示例
from llama_index.core.llama_dataset import (
LabelledRagDataExample,
CreatedByType,
CreatedBy,
)
# 构建一个LabelledRagDataExample
query = "This is a test query, is it not?"
query_by = CreatedBy(type=CreatedByType.AI, model_name="gpt-4")
reference_answer = "Yes it is."
reference_answer_by = CreatedBy(type=CreatedByType.HUMAN)
reference_contexts = ["This is a sample context"]
rag_example = LabelledRagDataExample(
query=query,
query_by=query_by,
reference_contexts=reference_contexts,
reference_answer=reference_answer,
reference_answer_by=reference_answer_by,
)
# 打印JSON格式的LabelledRagDataExample
print(rag_example.json())
解释
- query:测试查询。
- query_by:查询的生成者,这里是一个AI模型(gpt-4)。
- reference_answer:查询的参考答案。
- reference_answer_by:参考答案的生成者,这里是一个人类。
- reference_contexts:与查询相关的上下文。
构建LabelledRagDataset
LabelledRagDataset
是由多个LabelledRagDataExample
组成的集合。我们可以通过将多个示例传递给LabelledRagDataset
来构建数据集。
代码示例
from llama_index.core.llama_dataset import LabelledRagDataset
# 构建第二个LabelledRagDataExample
query = "This is a test query, is it so?"
reference_answer = "I think yes, it is."
reference_contexts = ["This is a second sample context"]
rag_example_2 = LabelledRagDataExample(
query=query,
query_by=query_by,
reference_contexts=reference_contexts,
reference_answer=reference_answer,
reference_answer_by=reference_answer_by,
)
# 构建LabelledRagDataset
rag_dataset = LabelledRagDataset(examples=[rag_example, rag_example_2])
# 将数据集转换为pandas DataFrame
print(rag_dataset.to_pandas())
解释
- LabelledRagDataset:包含多个
LabelledRagDataExample
的数据集。 - to_pandas():将数据集转换为pandas DataFrame,便于查看和分析。
序列化与反序列化
为了持久化数据集并从磁盘加载数据集,我们可以使用save_json
和from_json
方法。
代码示例
# 将数据集保存为JSON文件
rag_dataset.save_json("rag_dataset.json")
# 从JSON文件加载数据集
reload_rag_dataset = LabelledRagDataset.from_json("rag_dataset.json")
# 打印重新加载的数据集
print(reload_rag_dataset.to_pandas())
解释
- save_json:将数据集保存为JSON文件。
- from_json:从JSON文件加载数据集。
构建合成LabelledRagDataset
在某些情况下,我们可能需要使用合成数据来构建数据集。例如,我们可以使用GPT-4生成查询和参考答案。
代码示例
import nest_asyncio
nest_asyncio.apply()
!pip install wikipedia -q
from llama_index.readers.wikipedia import WikipediaReader
from llama_index.core import VectorStoreIndex
cities = ["San Francisco"]
documents = WikipediaReader().load_data(pages=[f"History of {x}" for x in cities])
index = VectorStoreIndex.from_documents(documents)
from llama_index.core.llama_dataset.generator import RagDatasetGenerator
from llama_index.llms.openai import OpenAI
llm = OpenAI(model="gpt-3.5-turbo", temperature=0.3)
dataset_generator = RagDatasetGenerator.from_documents(
documents,
llm=llm,
num_questions_per_chunk=2,
show_progress=True,
)
rag_dataset = dataset_generator.generate_dataset_from_nodes()
print(rag_dataset.to_pandas())
解释
- WikipediaReader:从维基百科加载数据。
- RagDatasetGenerator:生成合成数据集。
- generate_dataset_from_nodes:从文档节点生成数据集。
结论
通过本文,我们深入探讨了如何使用LabelledRagDataset
来构建和评估RAG管道。我们学习了如何构建LabelledRagDataExample
,创建LabelledRagDataset
,以及如何使用合成数据生成数据集。这些技术可以帮助我们更好地理解和优化RAG管道的性能。
希望本文对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言讨论!