向 LlamaHub 贡献 LlamaDataset¶
LlamaDataset 的存储是通过一个 Git 仓库管理的。要贡献数据集,需要向 llama_index/llama_datasets Github (LFS) 仓库提交拉取请求。
要贡献一个 LabelledRagDataset (它是 BaseLlamaDataset 的子类),需要两组文件:
- 保存为名为
rag_dataset.json的 json 格式的LabelledRagDataset - 用于创建
LabelledRagDataset的源文档文件
这份简短的 notebook 提供了一个使用 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。此步骤上传有关新LlamaDataset的信息,以便可以在LlamaHubUI 中显示。向
llama_datasets仓库创建一个拉取请求,实际上传数据文件。
步骤 0 (先决条件)¶
克隆并 Fork (到您的本地机器) llama_hub Github 仓库和 llama_datasets 仓库。您将从 Fork 后的版本的新分支向这两个仓库提交拉取请求。
步骤 1¶
在 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
# download and install dependencies for rag evaluator pack
RagEvaluatorPack = download_llama_pack(
"RagEvaluatorPack", "./rag_evaluator_pack"
)
rag_evaluator_pack = RagEvaluatorPack()
# download and install dependencies for benchmark dataset
rag_dataset, documents = download_llama_datasets(
"PaulGrahamEssayTruncatedDataset", "./data"
)
# evaluate
query_engine = VectorStoreIndex.as_query_engine() # previously defined, not shown here
rag_evaluate_pack.run(dataset=paul_graham_qa_data, query_engine=query_engine)
最后,步骤 1 的最后一个事项是在 llama_datasets/library.json 文件中创建一个条目。在此案例中:
...,
"PaulGrahamEssayDataset": {
"id": "llama_datasets/paul_graham_essay",
"author": "andrei-fajardo",
"keywords": ["rag"],
"extra_files": ["paul_graham_essay.txt"]
}
注意:extra_files 字段保留给源文件。
步骤 2 上传实际数据集¶
在此步骤中,由于我们在 llama_datasets 仓库上使用了 Github LFS,贡献方式与您向我们其他任何开源 Github 仓库贡献的方式完全相同。也就是说,提交一个拉取请求。
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 您的分支,然后提交您的 PR。