Skip to content

使用 LabelledRagDataset 进行评估#

我们已经介绍了评估模块中的核心抽象,这些抽象使得基于LLM的应用或系统的各种评估方法成为可能,包括RAG系统。当然,要评估系统,需要评估方法、系统本身以及评估数据集。最佳实践是在来自不同来源和领域的几个不同数据集上测试LLM应用。这样做有助于确保系统的整体健壮性(即系统在未见过的新情况下的工作水平)。

为此,我们在我们的库中包含了 LabelledRagDataset 抽象。它们的核心目的是通过使这些数据集易于创建、易于使用和广泛可用,来促进系统在各种数据集上的评估。

该数据集包括示例,其中每个示例都包含一个 query、一个 reference_answer,以及 reference_contexts。使用 LabelledRagDataset 的主要原因是通过首先预测给定 query 的响应,然后将该预测的(或生成的)响应与 reference_answer 进行比较,来测试RAG系统的性能。

from llama_index.core.llama_dataset import (
    LabelledRagDataset,
    CreatedBy,
    CreatedByType,
    LabelledRagDataExample,
)

example1 = LabelledRagDataExample(
    query="这是一些用户查询。",
    query_by=CreatedBy(type=CreatedByType.HUMAN),
    reference_answer="这是一个参考答案。也被称为地面真相答案。",
    reference_contexts=[
        "这是一个列表",
        "用于生成参考答案的上下文",
    ],
    reference_by=CreatedBy(type=CreatedByType.HUMAN),
)

# 一个包含一个可怜的示例的数据集
rag_dataset = LabelledRagDataset(examples=[example1])

构建 LabelledRagDataset#

正如我们在上一节末尾所看到的,我们可以通过逐个构建 LabelledRagDataExample 来手动构建 LabelledRagDataset。然而,这有点繁琐,而人工注释的数据集虽然非常有价值,但由强大LLM生成的数据集也非常有用。

因此,llama_dataset 模块配备了 RagDatasetGenerator,它能够在一组源 Document 上生成一个 LabelledRagDataset

from llama_index.core.llama_dataset.generator import RagDatasetGenerator
from llama_index.llms.openai import OpenAI
import nest_asyncio

nest_asyncio.apply()

documents = ...  # 通过例如阅读器加载的一组文档

llm = OpenAI(model="gpt-4")

dataset_generator = RagDatasetGenerator.from_documents(
    documents=documents,
    llm=llm,
    num_questions_per_chunk=10,  # 设置每个节点的问题数量
)

rag_dataset = dataset_generator.generate_dataset_from_nodes()

使用 LabelledRagDataset#

如前所述,我们希望使用 LabelledRagDataset 来评估建立在相同源 Document 上的RAG系统的性能。这将需要执行两个步骤:(1)对数据集进行预测(即对每个个别示例的查询生成响应),以及(2)通过将其与参考答案进行比较来评估预测的响应。在步骤(2)中,我们还评估RAG系统检索的上下文,并将其与参考上下文进行比较,以获得对RAG系统检索组件的评估。

为了方便起见,我们有一个名为 RagEvaluatorPackLlamaPack,它简化了这个评估过程!

from llama_index.core.llama_pack import download_llama_pack

RagEvaluatorPack = download_llama_pack("RagEvaluatorPack", "./pack")

rag_evaluator = RagEvaluatorPack(
    query_engine=query_engine,  # 由与rag_dataset相同的源文档构建
    rag_dataset=rag_dataset,
)
benchmark_df = await rag_evaluator.run()

上述的 benchmark_df 包含了先前介绍的评估指标的平均分数:CorrectnessRelevancyFaithfulness 以及 Context Similarity,它衡量了参考上下文与RAG系统检索的上下文之间的语义相似性,用于生成预测响应。

如何找到 LabelledRagDataset#

您可以在 llamahub 找到所有的 LabelledRagDataset。您可以浏览其中的每一个,并决定是否要使用它来评估您的RAG管道,然后您可以通过两种方式之一方便地下载数据集以及源 Document:使用 llamaindex-cli 或通过使用 download_llama_dataset 实用函数在Python代码中。

# 使用命令行
llamaindex-cli download-llamadataset PaulGrahamEssayDataset --download-dir ./data
# 使用 Python
from llama_index.core.llama_dataset import download_llama_dataset

# 下载一个 LabelledRagDataset 和一个源文档列表
rag_dataset, documents = download_llama_dataset(
    "PaulGrahamEssayDataset", "./data"
)

贡献一个LabelledRagDataset#

您也可以向llamahub贡献一个LabelledRagDataset。贡献一个LabelledRagDataset包括两个高级步骤。一般来说,您需要创建这个LabelledRagDataset,将其保存为一个json文件,并将这个json文件和源文本文件一起提交到我们的llama_datasets Github仓库。此外,您还需要发起一个拉取请求,将数据集的必要元数据上传到我们的llama_hub Github仓库。

请参考下方链接的"LlamaDataset Submission Template Notebook"。

现在,开始构建强大的LLM应用程序吧#

希望本页面为您创建、下载和使用LlamaDataset来构建强大和高性能的LLM应用程序提供了一个良好的起点。要了解更多信息,我们建议阅读下方提供的笔记本指南。

资源#