宣布我们的 LlamaCloud 全面可用(以及我们的 1900 万美元 A 轮融资)!
LlamaIndex

Jerry Liu 2023-12-04

隆重推出 Llama 数据集 🦙📝

(作者:Andrei Fajardo 和 Jerry Liu @ LlamaIndex)

今天我们激动地宣布推出 Llama 数据集 🦙 📝——这是一系列社区贡献的数据集,允许用户轻松地针对不同用例对他们的 RAG 流水线进行基准测试。一个数据集包含问题-答案对以及源上下文。要使用它们,请从 LlamaHub 下载;然后使用数据集 + 一组评估指标评估您的 RAG 流水线。

我们首批推出了 10 个评估数据集,并将继续增加更多!我们也使得贡献您自己的数据集变得超级简单——上传您的源文档 + QA 对(手动或合成生成)。

背景

构建生产级 RAG 的一个大问题是评估。与传统软件系统不同,LLM 系统(以及更广泛的 ML 系统)是用于模拟嘈杂现实世界信号的随机黑箱。这意味着开发者无法轻松定义断言确定性行为的单元测试——可能总是存在导致错误的输入。由于开发者不完全清楚给定输入会产生什么输出,他们需要定义一个能够反映其生产用例的评估数据集,并使用一组评估指标在此数据集上评估其系统。

我们广泛地介绍过这个主题——每个 AI 工程师在尝试使用高级技术优化其 LLM 或 RAG 应用之前,都应该先设置评估。

但我们越来越发现,定义正确的评估数据集既困难又依赖于具体用例。使用学术基准(如 BEIR 和 HotpotQA)进行评估往往无法泛化到特定用例。在某些数据领域(例如 SEC 文件)效果良好的某些参数,可能在其他领域(例如研究论文)上失效。

这就是启发我们创建 Llama 数据集的原因。我们没有规定您必须使用哪些数据,而是决定创建一个中心,让您可以轻松为您的用例选择合适的数据集!

LlamaHub 上的 Llama 数据集

概述

今天的发布包括 LlamaHub 上的一系列 Llama 数据集,一个配套的 RagEvaluatorPack 用于帮助计算数据集上的指标,以及您可以独立使用的配套数据集抽象。

  • 要使用 Llama 数据集,请从 LlamaHub 下载并运行我们的 RagEvaluatorPack(或运行您自己的评估模块)。
  • 要生成 Llama 数据集,请定义一个 LabelledRagDataset,其中包含一组 LabelledRagDataExample 对象。
  • 要贡献 Llama 数据集,请向 LlamaHub 提交一个“数据卡”,并将您的原始数据集文件上传到我们的 llama_datasets 仓库。

请查看以下章节,了解示例数据集的演练过程。

我们首批推出了 10 个数据集

Llama 数据集示例页面

示例演练

让我们演练一下使用/贡献 Llama 数据集的各个步骤。

1. 下载和使用 Llama 数据集

在此处查看完整的 Notebook。

下载数据集很简单,执行以下命令(这里我们下载 Paul Graham)。

from llama_index.llama_dataset import download_llama_dataset

# download and install dependencies
rag_dataset, documents = download_llama_dataset(
    "PaulGrahamEssayDataset", "./paul_graham"
)

这将下载一个包含 QA 对(+ 参考上下文)的 rag_dataset,以及作为源文档语料库的 documents

让我们用 to_pandas() 检查 rag_dataset

rag_dataset 的示例行

对 RAG 数据集生成预测非常简单。您可以轻松地将任何查询引擎接入 amake_predictions_with

from llama_index import VectorStoreIndex

# a basic RAG pipeline, uses service context defaults
index = VectorStoreIndex.from_documents(documents=documents)
query_engine = index.as_query_engine()

# generate prediction dataset
prediction_dataset = await rag_dataset.amake_predictions_with(
    query_engine=query_engine, show_progress=True
)

prediction_dataset 是一个 RagPredictionDataset 对象,如下所示

预测数据集

给定 rag_datasetprediction_dataset,您可以使用我们的评估模块来衡量各种指标(例如忠实度、正确性、相关性)的性能。

for example, prediction in tqdm.tqdm(
    zip(rag_dataset.examples, prediction_dataset.predictions)
):
    correctness_result = judges["correctness"].evaluate(
        query=example.query,
        response=prediction.response,
        reference=example.reference_answer,
    )

为了消除编写所有这些评估模块的样板代码,我们还提供了一个 LlamaPack,可以为您完成这一切!

from llama_index.llama_pack import download_llama_pack

RagEvaluatorPack = download_llama_pack("RagEvaluatorPack", "./pack")
rag_evaluator = RagEvaluatorPack(
    query_engine=query_engine, rag_dataset=rag_dataset
)
benchmark_df = await rag_evaluator.arun()

2. 生成 Llama 数据集

在此处查看完整的 Notebook。

您可以使用我们的 LabelledRagDataExampleLabelledRagDataset 抽象来创建您自己的数据集。

这是一个手动添加示例的例子。

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

# constructing a 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,
)
from llama_index.llama_dataset.rag import LabelledRagDataset

rag_dataset = LabelledRagDataset(examples=[rag_example, rag_example_2])

您还可以使用 GPT-4 在任何文档语料库上合成生成数据集

# generate questions against chunks
from llama_index.llama_dataset.generator import RagDatasetGenerator
from llama_index.llms import OpenAI
from llama_index import ServiceContext

# set context for llm provider
gpt_4_context = ServiceContext.from_defaults(
    llm=OpenAI(model="gpt-4", temperature=0.3)
)

# instantiate a DatasetGenerator
dataset_generator = RagDatasetGenerator.from_documents(
    documents,
    service_context=gpt_4_context,
    num_questions_per_chunk=2,  # set the number of questions per nodes
    show_progress=True,
)

3. 贡献 Llama 数据集

我们在此处提供了一个现成的提交 Notebook 模板——只需用您的数据集填充空白即可!

如果您有兴趣贡献数据集,我们非常乐意展示它!您只需遵循以下步骤:

  1. 创建数据集:要创建一个 LabelledRagDataset,您可以从头开始手动或使用合成生成的示例创建它,或者从现有数据集创建它。
  2. 生成基准评估数据集:在您的数据集上对一个基本的 top-k RAG 流水线进行基准测试,并报告结果。这将为其他人提供参考点。您可以使用 RagEvaluatorPack 来达到此目的。
  3. 准备数据集卡片( card.json )和 README.md这些将显示在 LlamaHub 上此数据集的页面上。如果您想根据某些输入自动生成这些文件,请查看我们的 LlamaDatasetMetadata LlamaPack。
  4. llama-hub 提交一个 PR 以注册 LlamaDataset
  5. llama-datasets 提交一个 PR 以上传 LlamaDataset 及其源文件。

您可以在上面提供的Notebook 模板中遵循所有这些步骤——只需替换您自己的数据即可。

结论

我们很高兴您能查看我们的数据集并向我们提供反馈!我们也欢迎您的贡献。

资源

以下是博客文章中提到的资源。