向 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
的信息,以便可以在LlamaHub
UI 中显示。向
llama_datasets
仓库创建一个拉取请求,实际上传数据文件。
步骤 0 (先决条件)¶
克隆并 Fork (到您的本地机器) llama_hub
Github 仓库和 llama_datasets
仓库。您将从 Fork 后的版本的新分支向这两个仓库提交拉取请求。
步骤 1¶
在 llama_hub
Github 仓库的 llama_datasets/
中创建一个新文件夹。例如,在此案例中,我们将创建一个新文件夹 llama_datasets/paul_graham_essay
。
在该文件夹中,需要两个文件
card.json
README.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。