向 LlamaHub 贡献 LlamaDataset¶
LlamaDataset 的存储通过 git 仓库进行管理。贡献数据集需要向 llama_index/llama_datasets Github (LFS) 仓库提交拉取请求。
贡献一个 LabelledRagDataset(BaseLlamaDataset 的子类)需要准备两组文件:
- 保存为 JSON 格式的
LabelledRagDataset,命名为rag_dataset.json - 用于创建
LabelledRagDataset的源文档文件
本简短笔记本使用 Paul Graham 文章文本文件提供一个快速示例。
%pip install llama-index-llms-openai
import nest_asyncio
nest_asyncio.apply()
加载数据¶
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
from llama_index.core import SimpleDirectoryReader
# Load documents and build index
documents = SimpleDirectoryReader(
input_files=["data/paul_graham/paul_graham_essay.txt"]
).load_data()
# generate questions against chunks
from llama_index.core.llama_dataset.generator import RagDatasetGenerator
from llama_index.llms.openai import OpenAI
# set context for llm provider
llm_gpt35 = OpenAI(model="gpt-4", temperature=0.3)
# instantiate a DatasetGenerator
dataset_generator = RagDatasetGenerator.from_documents(
documents,
llm=llm_gpt35,
num_questions_per_chunk=2, # set the number of questions per nodes
show_progress=True,
)
rag_dataset = dataset_generator.generate_dataset_from_nodes()
既然我们已经生成了 LabelledRagDataset(顺便说一句,完全可以用人工生成的查询和参考答案手动创建这样的数据集!),接下来我们将其存储为必要的 json 文件。
rag_dataset.save_json("rag_dataset.json")
生成基准测试结果¶
除了添加 LlamaDataset 外,我们还建议添加基准测试指标,以便其他开发者能将其作为衡量自身 RAG 流水线性能的参照标准。
from llama_index.core import VectorStoreIndex
# a basic RAG pipeline, uses defaults
index = VectorStoreIndex.from_documents(documents=documents)
query_engine = index.as_query_engine()
# manually
prediction_dataset = await rag_dataset.amake_predictions_with(
query_engine=query_engine, show_progress=True
)
提交拉取请求¶
在拥有 rag_dataset.json 和源文件 paul_graham_essay.txt(注意本例中只有一个源文档,但实际可能存在多个)的情况下,我们可以通过以下两个步骤向 LlamaHub 贡献一个 LlamaDataset:
与贡献
loader、agent和pack的方式类似,向llama_hub代码库提交一个拉取请求,为新的LlamaDataset创建专属文件夹。此步骤会上传该新数据集的相关信息,使其能在LlamaHub用户界面中展示。向
llama_datasets代码库提交拉取请求,实际完成数据文件的上传。
步骤 0(前置准备)¶
请先 Fork 并克隆(到本地机器)llama_hub 和 llama_datasets 这两个 GitHub 仓库。后续你需要从各自 Fork 版本的新分支向这两个仓库提交 Pull Request。
第一步¶
在 llama_hub Github 仓库的 llama_datasets/ 目录下新建一个文件夹。例如,本例中我们将创建名为 llama_datasets/paul_graham_essay 的新文件夹。
该文件夹内必须包含两个文件:
card.jsonREADME.md
具体到本地机器操作如下:
cd llama_datasets/
mkdir paul_graham_essay
touch card.json
touch README.md
建议参考已提交的其他 LlamaDataset 项目,根据新数据集的需求修改对应的文件。
在当前示例中,我们需要 card.json 文件呈现如下内容:
{
"name": "Paul Graham Essay",
"description": "A labelled RAG dataset based off an essay by Paul Graham, consisting of queries, reference answers, and reference contexts.",
"numberObservations": 44,
"containsExamplesByHumans": false,
"containsExamplesByAI": true,
"sourceUrls": [
"http://www.paulgraham.com/articles.html"
],
"baselines": [
{
"name": "llamaindex",
"config": {
"chunkSize": 1024,
"llm": "gpt-3.5-turbo",
"similarityTopK": 2,
"embedModel": "text-embedding-ada-002"
},
"metrics": {
"contextSimilarity": 0.934,
"correctness": 4.239,
"faithfulness": 0.977,
"relevancy": 0.977
},
"codeUrl": "https://github.com/run-llama/llama_datasets/blob/main/baselines/paul_graham_essay/llamaindex_baseline.py"
}
]
}
对于 README.md 文件来说,这些操作相当标准,主要需要你在 download_llama_dataset() 函数调用中修改数据集参数的名称。
from llama_index.llama_datasets import download_llama_datasets
from llama_index.llama_pack import download_llama_pack
from llama_index import VectorStoreIndex
# 下载并安装 RAG 评估包的依赖项
RagEvaluatorPack = download_llama_pack(
"RagEvaluatorPack", "./rag_evaluator_pack"
)
rag_evaluator_pack = RagEvaluatorPack()
# 下载并安装基准数据集的依赖项
rag_dataset, documents = download_llama_datasets(
"PaulGrahamEssayTruncatedDataset", "./data"
)
# 执行评估
query_engine = VectorStoreIndex.as_query_engine() # 先前定义,此处未展示
rag_evaluate_pack.run(dataset=paul_graham_qa_data, query_engine=query_engine)
最后,第一步的最后一项是在 llama_datasets/library.json 文件中创建一个条目。示例如下:
...,
"PaulGrahamEssayDataset": {
"id": "llama_datasets/paul_graham_essay",
"author": "andrei-fajardo",
"keywords": ["rag"],
"extra_files": ["paul_graham_essay.txt"]
}
注意:extra_files 字段专用于存放源文件。
第二步 上传实际数据集¶
在此步骤中,由于我们在 llama_datasets 代码库中使用 Github LFS,提交贡献的方式与向其他开放的 Github 代码库提交贡献完全相同。即:发起一个拉取请求(pull request)。
请先分叉(fork)llama_datasets 代码库,然后在 llama_datasets/ 目录下新建一个文件夹,其名称需与 library.json 文件中对应条目的 id 字段保持一致。以本例而言,我们将创建名为 llama_datasets/paul_graham_essay/ 的新文件夹。后续我们将在此目录中添加文档并提交拉取请求。
请在该文件夹中添加 rag_dataset.json(必须使用此文件名)以及其他源文档(本例中即 paul_graham_essay.txt 文件)。
llama_datasets/paul_graham_essay/
├── paul_graham_essay.txt
└── rag_dataset.json
最后只需执行 git add、git commit 和 git push 命令推送你的分支,并创建拉取请求即可。