From 32b49a605f3eb0d19d1ac70f80e2e04c2ded1a8c Mon Sep 17 00:00:00 2001 From: YuyaoZhangQAQ <1328091175@qq.com> Date: Tue, 7 Jan 2025 21:35:11 +0800 Subject: [PATCH] readme update --- README.md | 130 ++++++++--- README_zh.md | 610 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 705 insertions(+), 35 deletions(-) create mode 100644 README_zh.md diff --git a/README.md b/README.md index 00e32a4..8c9c698 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ #
⚡FlashRAG: A Python Toolkit for Efficient RAG Research
- +\[ English | [中文](README_zh.md) \]
@@ -33,6 +33,19 @@ With FlashRAG and provided resources, you can effortlessly reproduce existing SO RUC-NLPIR%2FFlashRAG | Trendshift

+## :link: Navigation +- [Features](#sparkles-features) +- [Roadmap](#mag_right-roadmap) +- [Changelog](#page_with_curl-changelog) +- [Installation](#wrench-installation) +- [Quick Start](#rocket-quick-start) +- [Components](#gear-components) +- [Supporting Methods](#robot-supporting-methods) +- [Supporting Datasets & Document Corpus](#notebook-supporting-datasets--document-corpus) +- [Additional FAQs](#raised_hands-additional-faqs) +- [License](#bookmark-license) +- [Citation](#star2-citation) + ## :sparkles: Features - **Extensive and Customizable Framework**: Includes essential components for RAG scenarios such as retrievers, rerankers, generators, and compressors, allowing for flexible assembly of complex pipelines. @@ -45,6 +58,8 @@ With FlashRAG and provided resources, you can effortlessly reproduce existing SO - **Optimized Execution**: The library's efficiency is enhanced with tools like vLLM, FastChat for LLM inference acceleration, and Faiss for vector index management. +- **Easy to Use UI** : We have developed a very easy to use UI to easily and quickly configure and experience the RAG baselines we have implemented, as well as run evaluation scripts on a visual interface. + ## :mag_right: Roadmap FlashRAG is still under development and there are many issues and room for improvement. We will continue to update. And we also sincerely welcome contributions on this open-source toolkit. @@ -103,7 +118,7 @@ To get started with FlashRAG, you can simply install it with pip: pip install flashrag-dev --pre ``` -Or you can clone it from Github and install (requires Python 3.9+): +Or you can clone it from Github and install (requires Python 3.10+): ```bash git clone https://github.com/RUC-NLPIR/FlashRAG.git @@ -146,62 +161,102 @@ From the official Faiss repository ([source](https://github.com/facebookresearch ## :rocket: Quick Start -### Toy Example +### Corpus Construction +To build an index, you first need to save your corpus as a `jsonl` file with each line representing a document. + +```jsonl +{"id": "0", "contents": "content"} +{"id": "1", "contents": "content"} +... +``` + +If you want to use Wikipedia as your corpus, you can refer to our documentation [Processing Wikipedia](./docs/process-wiki.md) to convert it into an indexable format. -For beginners, we provide a [an introduction to flashrag](./docs/introduction_for_beginners_en.md) ([中文版](./docs/introduction_for_beginners_zh.md) [한국어](./docs/introduction_for_beginners_kr.md)) to help you familiarize yourself with our toolkit. Alternatively, you can directly refer to the code below. +### Index Construction -#### Demo +You can use the following code to build your own index. -We provide a toy demo to implement a simple RAG process. You can freely change the corpus and model you want to use. The English demo uses [general knowledge](https://huggingface.co/datasets/MuskumPillerum/General-Knowledge) as the corpus, `e5-base-v2` as the retriever, and `Llama3-8B-instruct` as generator. The Chinese demo uses data crawled from the official website of Remin University of China as the corpus, `bge-large-zh-v1.5` as the retriever, and qwen1.5-14B as the generator. Please fill in the corresponding path in the file. +* For **dense retrieval methods**, especially popular embedding models, we use `faiss` to build the index. -
-
- -
-
+* For **sparse retrieval methods (BM25)**, we use `Pyserini` or `bm25s` to build the corpus into a Lucene inverted index. The built index contains the original documents. -To run the demo: +#### For Dense Retrieval Methods + +Modify the parameters in the following code to your own. ```bash -cd examples/quick_start +python -m flashrag.retriever.index_builder \ + --retrieval_method e5 \ + --model_path /model/e5-base-v2/ \ + --corpus_path indexes/sample_corpus.jsonl \ + --save_dir indexes/ \ + --use_fp16 \ + --max_length 512 \ + --batch_size 256 \ + --pooling_method mean \ + --faiss_type Flat +``` -# copy the config file here, otherwise, streamlit will complain that file s -cp ../methods/my_config.yaml . +* ```--pooling_method```: If this parameter is not specified, we will automatically select it based on the model name and model file. However, since different embedding models use different pooling methods, **we may not have fully implemented them**. To ensure accuracy, you can **specify the pooling method corresponding to the retrieval model you are using** (`mean`, `pooler`, or `cls`). -# run english demo -streamlit run demo_en.py +* ```---instruction```: Some embedding models require additional instructions to be concatenated to the query before encoding, which can be specified here. Currently, we will automatically fill in the instructions for **E5** and **BGE** models, while other models need to be supplemented manually. -# run chinese demo -streamlit run demo_zh.py +If the retrieval model supports the `sentence transformers` library, you can use the following code to build the index (**without considering the pooling method**). + +```bash +python -m flashrag.retriever.index_builder \ + --retrieval_method e5 \ + --model_path /model/e5-base-v2/ \ + --corpus_path indexes/sample_corpus.jsonl \ + --save_dir indexes/ \ + --use_fp16 \ + --max_length 512 \ + --batch_size 256 \ + --pooling_method mean \ + --sentence_transformer \ + --faiss_type Flat ``` -#### Pipeline +#### For Sparse Retrieval Methods (BM25) + +If building a bm25 index, there is no need to specify `model_path`. -We also provide an example to use our framework for pipeline execution. -Run the following code to implement a naive RAG pipeline using provided toy datasets. -The default retriever is `e5-base-v2` and default generator is `Llama3-8B-instruct`. You need to fill in the corresponding model path in the following command. If you wish to use other models, please refer to the detailed instructions below. +##### Building Index with BM25s ```bash -cd examples/quick_start -python simple_pipeline.py \ - --model_path \ - --retriever_path +python -m flashrag.retriever.index_builder \ + --retrieval_method bm25 \ + --corpus_path indexes/sample_corpus.jsonl \ + --bm25_backend bm25s \ + --save_dir indexes/ ``` -After the code is completed, you can view the intermediate results of the run and the final evaluation score in the output folder under the corresponding path. +##### Building Index with Pyserini + +```bash +python -m flashrag.retriever.index_builder \ + --retrieval_method bm25 \ + --corpus_path indexes/sample_corpus.jsonl \ + --bm25_backend pyserini \ + --save_dir indexes/ +``` ### Using the ready-made pipeline You can use the pipeline class we have already built (as shown in [pipelines](#pipelines)) to implement the RAG process inside. In this case, you just need to configure the config and load the corresponding pipeline. -Firstly, load the entire process's config, which records various hyperparameters required in the RAG process. You can input yaml files as parameters or directly as variables. The priority of variables as input is higher than that of files. +Firstly, load the entire process's config, which records various hyperparameters required in the RAG process. You can input yaml files as parameters or directly as variables. + +Please note that **variables as input take precedence over files**. ```python from flashrag.config import Config +# hybrid load configs config_dict = {'data_dir': 'dataset/'} -my_config = Config(config_file_path = 'my_config.yaml', - config_dict = config_dict) +my_config = Config( + config_file_path = 'my_config.yaml', + config_dict = config_dict ``` We provide comprehensive guidance on how to set configurations, you can see our [configuration guidance](./docs/configuration.md). @@ -216,8 +271,10 @@ from flashrag.prompt import PromptTemplate from flashrag.config import Config config_dict = {'data_dir': 'dataset/'} -my_config = Config(config_file_path = 'my_config.yaml', - config_dict = config_dict) +my_config = Config( + config_file_path = 'my_config.yaml', + config_dict = config_dict +) all_split = get_dataset(my_config) test_data = all_split['test'] @@ -232,7 +289,10 @@ prompt_templete = PromptTemplate( system_prompt = "Answer the question based on the given document. Only give me the answer and do not output any other words.\nThe following are given documents.\n\n{reference}", user_prompt = "Question: {question}\nAnswer:" ) -pipeline = SequentialPipeline(my_config, prompt_template=prompt_templete) +pipeline = SequentialPipeline( + my_config, + prompt_template = prompt_templete +) ``` Finally, execute `pipeline.run` to obtain the final result. @@ -244,7 +304,7 @@ output_dataset = pipeline.run(test_data, do_eval=True) The `output_dataset` contains the intermediate results and metric scores for each item in the input dataset. Meanwhile, the dataset with intermediate results and the overall evaluation score will also be saved as a file (if `save_intermediate_data` and `save_metric_score` are specified). -### Build your own pipeline +### Build your own pipeline! Sometimes you may need to implement more complex RAG process, and you can build your own pipeline to implement it. You just need to inherit `BasicPipeline`, initialize the components you need, and complete the `run` function. diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..23e60ae --- /dev/null +++ b/README_zh.md @@ -0,0 +1,610 @@ +#
⚡FlashRAG: 一个高效的RAG研究Python工具包
+\[ [English](README.md) | 中文 \] +
+ + + +License +Static Badge +
+ +

+ +

+安装 | +特性 | +快速使用 | +组件 | +支持的基线方法 | +支持的数据集 | +常见问题 +

+ +

+FlashRAG是一个用于复现和开发检索增强生成(RAG)研究的Python工具包。我们的工具包包括36个预处理的基准RAG数据集和15个最先进的RAG算法。 + +

+ +

+ +通过FlashRAG和提供的资源,您可以轻松复现现有的SOTA工作,或实现自定义的RAG流程和组件。 +

+RUC-NLPIR%2FFlashRAG | Trendshift +

+ +## :link: 导航 +- [特性](#sparkles-特性) +- [开发路线图](#mag_right-开发路线图) +- [更新日志](#page_with_curl-更新日志) +- [安装](#wrench-安装) +- [快速开始](#rocket-快速开始) +- [组件](#gear-组件) +- [基线方法](#robot-基线方法) +- [支持的数据集和文档语料库](#notebook-支持的数据集和文档语料库) +- [其他常见问题](#raised_hands-其他常见问题) +- [许可证](#bookmark-许可证) +- [引用](#star2-引用) + +## :sparkles: 特性 + +- **广泛且可定制的框架**:包括RAG场景的基本组件,如检索器、重排序器、生成器和压缩器,允许灵活组装复杂的管道。 + +- **全面的基准数据集**:收集了36个预处理的RAG基准数据集,用于测试和验证RAG模型的性能。 + +- **预实现的先进RAG算法**:基于我们的框架,提供15个先进的RAG算法及其报告结果。轻松在不同设置下复现结果。 + +- **高效的预处理过程**:通过提供各种脚本,如**语料处理**、**索引构建**和**文档预检索**,简化RAG工作流准备。 + +- **优化的执行效率**:库的效率通过vLLM、FastChat用于LLM推理加速和Faiss用于向量索引管理得到增强。 + +- **方便易用的UI界面**:我们开发了一个十分方便易用的UI界面,以供轻松、快捷地配置和体验我们已经实现的RAG方法,以及在可视化界面上运行评估脚本。 + +## :mag_right: 开发路线图 + +FlashRAG仍在开发中,存在许多问题和改进空间。我们将继续更新,并诚挚欢迎对这个开源工具包的贡献。 + +- [x] 支持OpenAI模型 +- [x] 提供每个组件的使用说明 +- [x] 集成sentence-transformers +- [ ] 包含更多RAG方法 +- [ ] 添加更多评估指标(如Unieval、命名实体F1)和基准(如RGB基准) +- [ ] 增强代码的适应性和可读性 + +## :page_with_curl: 更新日志 +[25/01/07] 我们目前支持多个检索器的聚合,详见[**多检索器使用**](https://github.com/RUC-NLPIR/FlashRAG/blob/main/docs/multi_retriever_usage.md)。 + +[25/01/07] 我们集成了一个非常灵活且轻量级的语料库分块库[**Chunkie**](https://github.com/chonkie-ai/chonkie?tab=readme-ov-file#usage),支持各种自定义分块方法(tokens、句子、语义等)。在[分块文档语料库](docs/chunk-doc-corpus.md)中使用它。 + +[24/10/21] 我们发布了一个基于Paddle框架的版本,支持中国硬件平台。详情请参阅[FlashRAG Paddle](https://github.com/RUC-NLPIR/FlashRAG-Paddle)。 + +[24/10/13] 添加了一个新的领域内数据集和语料库 - [DomainRAG](https://arxiv.org/pdf/2406.05654),基于中国人民大学的内部招生数据,涵盖七种任务类型,可用于进行领域特定的RAG测试。 + +[24/09/24] 我们发布了一个基于MindSpore框架的版本,支持中国硬件平台。详情请参阅[FlashRAG MindSpore](https://github.com/RUC-NLPIR/FlashRAG-MindSpore)。 + +[24/09/18] 由于在某些环境中安装Pyserini的复杂性和限制,我们引入了一个轻量级的`BM25s`包作为替代(更快且更易使用)。基于Pyserini的检索器将在未来版本中被弃用。要使用`bm25s`作为检索器,只需在配置中将`bm25_backend`设置为`bm25s`。 + +[24/09/09] 我们添加了对新方法[Adaptive-RAG](https://aclanthology.org/2024.naacl-long.389.pdf)的支持,该方法可以根据查询类型自动选择执行的RAG流程。请参阅[结果表](#robot-supporting-methods)。 + +[24/08/02] 我们添加了对新方法[Spring](https://arxiv.org/abs/2405.19670)的支持,通过仅添加少量的token嵌入显著提高LLM的性能。请参阅[结果表](#robot-supporting-methods)。 + +[24/07/17] 由于HuggingFace的一些未知问题,我们的原始数据集链接已失效。我们已更新链接。如果遇到任何问题,请检查[新链接](https://huggingface.co/datasets/RUC-NLPIR/FlashRAG_datasets/)。 + +[24/07/06] 我们添加了对新方法[Trace](https://arxiv.org/abs/2406.11460)的支持,通过构建知识图谱来优化文本。请参阅[结果](#robot-supporting-methods)和[详情](./docs/baseline_details.md)。 + +
+显示更多 + +[24/06/19] 我们添加了对新方法[IRCoT](https://arxiv.org/abs/2212.10509)的支持,并更新了[结果表](#robot-supporting-methods)。 + +[24/06/15] 我们提供了一个[演示](./examples/quick_start/demo_en.py)来使用我们的工具包执行RAG流程。 + +[24/06/11] 我们在检索器模块中集成了`句子转换器`。现在使用检索器时无需设置池化方法。 + +[24/06/05] 我们提供了详细的文档来复现现有方法(参见[如何复现](./docs/reproduce_experiment.md),[基线详情](./docs/baseline_details.md)),以及[配置设置](./docs/configuration.md)。 + +[24/06/02] 我们为初学者提供了FlashRAG的介绍,参见[FlashRAG介绍](./docs/introduction_for_beginners_en.md)([中文版](./docs/introduction_for_beginners_zh.md) [한국어](./docs/introduction_for_beginners_kr.md))。 + +[24/05/31] 我们支持Openai系列模型作为生成器。 + +
+ +## :wrench: 安装 + +要开始使用FlashRAG,您可以通过pip简单安装: +```base +pip install flashrag-dev --pre +``` + +或者您可以从Github克隆并安装(需要Python 3.10+): + +```bash +git clone https://github.com/RUC-NLPIR/FlashRAG.git +cd FlashRAG +pip install -e . +``` + +如果您想使用vllm、句子转换器或pyserini,可以安装可选依赖项: +```bash +# 安装所有额外依赖项 +pip install flashrag[full] + +# 安装vllm以提高速度 +pip install vllm>=0.4.1 + +# 安装sentence-transformers +pip install sentence-transformers + +# 安装pyserini(使用bm25检索) +pip install pyserini +``` + +由于使用`pip`安装`faiss`时的不兼容性,请使用以下conda命令进行安装。 +```bash +# 仅CPU版本 +conda install -c pytorch faiss-cpu=1.8.0 + +# GPU(+CPU)版本 +conda install -c pytorch -c nvidia faiss-gpu=1.8.0 +``` + +注意:在某些系统上无法安装最新版本的`faiss`。 + +来自官方Faiss仓库([来源](https://github.com/facebookresearch/faiss/blob/main/INSTALL.md)): + +> - 仅CPU的faiss-cpu conda包目前在Linux(x86_64和arm64)、OSX(仅arm64)和Windows(x86_64)上可用 +> - 包含CPU和GPU索引的faiss-gpu在Linux(仅x86_64)上可用,适用于CUDA 11.4和12.1 + +## :rocket: 快速开始 + +### 语料库构建 +要构建索引,首先需要将语料库保存为如下格式的`jsonl`文件,每行是一个文档。 + +```jsonl +{"id": "0", "contents": "内容"} +{"id": "1", "contents": "内容"} +... +``` + +如果您想使用维基百科作为语料库,可以参考我们的文档[处理维基百科](./docs/process-wiki.md)将其转换为索引格式。 + +### 索引构建 + +您可以使用以下代码构建您自己的索引。 + +* 对于**稠密检索方法**,特别是流行的嵌入模型,我们使用`faiss`来构建索引。 + +* 对于**稀疏检索方法 (BM25)**,我们基于`Pyserini`或`bm25s`将语料库构建为Lucene倒排索引。构建的索引包含原始文档。 + +#### 对于稠密检索方法 + +修改以下代码中的参数为您的参数。 + +```bash +python -m flashrag.retriever.index_builder \ + --retrieval_method e5 \ + --model_path /model/e5-base-v2/ \ + --corpus_path indexes/sample_corpus.jsonl \ + --save_dir indexes/ \ + --use_fp16 \ + --max_length 512 \ + --batch_size 256 \ + --pooling_method mean \ + --faiss_type Flat +``` + +* ```--pooling_method```: 如果未指定此参数,我们将根据模型名称和模型文件自动选择。然而,由于不同嵌入模型使用的池化方法不同,**我们可能没有完全实现它们**。为了确保准确性,您可以**指定您使用的检索模型对应的池化方法**(`mean`、`pooler` 或 `cls`)。 + +* ```---instruction```: 一些嵌入模型在编码前需要附加指令来连接查询,可以在此处指定。目前,我们将自动为 **E5** 和 **BGE** 模型填写指令,而其他模型需要手动补充。 + +如果检索模型支持 `sentence transformers` 库,您可以使用以下代码构建索引(**无需考虑池化方法**)。 + +```bash +python -m flashrag.retriever.index_builder \ + --retrieval_method e5 \ + --model_path /model/e5-base-v2/ \ + --corpus_path indexes/sample_corpus.jsonl \ + --save_dir indexes/ \ + --use_fp16 \ + --max_length 512 \ + --batch_size 256 \ + --pooling_method mean \ + --sentence_transformer \ + --faiss_type Flat +``` + +#### 对于稀疏检索方法 (BM25) + +如果构建bm25索引,则无需指定`model_path`。 + +##### 使用BM25s构建索引 + +```bash +python -m flashrag.retriever.index_builder \ + --retrieval_method bm25 \ + --corpus_path indexes/sample_corpus.jsonl \ + --bm25_backend bm25s \ + --save_dir indexes/ +``` + +##### 使用Pyserini构建索引 + +```bash +python -m flashrag.retriever.index_builder \ + --retrieval_method bm25 \ + --corpus_path indexes/sample_corpus.jsonl \ + --bm25_backend pyserini \ + --save_dir indexes/ +``` + +### 使用现成的管道 + +您可以使用我们已经构建的管道类(如[管道](#pipelines)所示)来实现内部的RAG流程。在这种情况下,您只需配置配置文件并加载相应的管道。 + +首先,加载整个流程的配置,记录RAG流程中所需的各种超参数。您可以将yaml文件作为参数输入,也可以直接作为变量输入。 + +请注意,**变量作为输入的优先级高于文件**。 + +```python +from flashrag.config import Config + +# hybrid load configs +config_dict = {'data_dir': 'dataset/'} +my_config = Config( + config_file_path = 'my_config.yaml', + config_dict = config_dict +) +``` + +我们提供了全面的配置设置指南,您可以参阅我们的[配置指南](./docs/configuration.md)。 +您还可以参考我们提供的[yaml文件](./flashrag/config/basic_config.yaml)来设置自己的参数。 + +接下来,加载相应的数据集并初始化管道。管道中的组件将自动加载。 + +```python +from flashrag.utils import get_dataset +from flashrag.pipeline import SequentialPipeline +from flashrag.prompt import PromptTemplate +from flashrag.config import Config + +config_dict = {'data_dir': 'dataset/'} +my_config = Config( + config_file_path = 'my_config.yaml', + config_dict = config_dict +) +all_split = get_dataset(my_config) +test_data = all_split['test'] + +pipeline = SequentialPipeline(my_config) +``` + +您可以使用`PromptTemplete`指定自己的输入提示: +```python +prompt_templete = PromptTemplate( + config, + system_prompt = "根据给定的文档回答问题。只给我答案,不输出其他任何词。\n以下是给定的文档。\n\n{reference}", + user_prompt = "问题: {question}\n答案:" +) +pipeline = SequentialPipeline( + my_config, + prompt_template = prompt_templete +) +``` + +最后,执行`pipeline.run`以获得最终结果。 + +```python +output_dataset = pipeline.run(test_data, do_eval=True) +``` +`output_dataset`包含输入数据集中每个项目的中间结果和指标分数。 +同时,包含中间结果和整体评估分数的数据集也将保存为文件(如果指定了`save_intermediate_data`和`save_metric_score`)。 + +### 构建您自己的管道! + +有时您可能需要实现更复杂的RAG流程,您可以构建自己的管道来实现它。 +您只需继承`BasicPipeline`,初始化所需的组件,并完成`run`函数。 + +```python +from flashrag.pipeline import BasicPipeline +from flashrag.utils import get_retriever, get_generator + +class ToyPipeline(BasicPipeline): + def __init__(self, config, prompt_templete=None): + # 加载自己的组件 + pass + + def run(self, dataset, do_eval=True): + # 完成自己的流程逻辑 + + # 使用`.`获取数据集中的属性 + input_query = dataset.question + ... + # 使用`update_output`保存中间数据 + dataset.update_output("pred",pred_answer_list) + dataset = self.evaluate(dataset, do_eval=do_eval) + return dataset +``` + +请首先从我们的[文档](./docs/basic_usage.md)中了解您需要使用的组件的输入和输出形式。 + +### 仅使用组件 + +如果您已经有自己的代码,只想使用我们的组件嵌入原始代码,您可以参考[组件基本介绍](./docs/basic_usage.md)获取每个组件的输入和输出格式。 + +## :gear: 组件 + +在FlashRAG中,我们构建了一系列常见的RAG组件,包括检索器、生成器、精炼器等。基于这些组件,我们组装了多个管道来实现RAG工作流,同时也提供了灵活性,允许用户自定义组合这些组件以创建自己的管道。 + +### RAG组件 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类型模块描述
判断器SKR 判断器使用 SKR 方法判断是否检索
检索器稠密检索器使用faiss进行搜索的双编码器模型,如dpr、bge、e5
BM25 检索器基于Lucene的稀疏检索方法
基于双向编码器的重排序器使用双向编码器计算匹配分数
基于交叉编码器的重排序器使用交叉编码器计算匹配分数
精炼器抽取式精炼器通过抽取重要上下文来精炼输入
摘要式精炼器通过seq2seq模型精炼输入
LLMLingua 精炼器LLMLingua系列提示压缩器
选择性上下文精炼器选择性上下文提示压缩器
知识图谱精炼器使用 Trace 方法构建知识图谱
生成器编码器-解码器生成器支持 解码器融合 (FiD) 的编码器-解码器模型
仅解码器生成器原生transformers实现
FastChat 生成器使用 FastChat 加速
vllm 生成器使用 vllm 加速
+ +### 管道 + +我们参考了一篇[检索增强生成的综述](https://arxiv.org/abs/2312.10997),根据推理路径将RAG方法分为四类: + +- **顺序**:顺序执行RAG过程,如Query-(预检索)-检索器-(后检索)-生成器 +- **条件**:针对不同类型的输入查询实现不同的路径 +- **分支**:并行执行多个路径,合并每个路径的响应 +- **循环**:迭代执行检索和生成 + +在每个类别中,我们实现了相应的常见管道。一些管道有对应的工作论文。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
类别模块描述
顺序Sequential Pipeline线性执行查询,支持精炼器和重排序器
条件Conditional Pipeline使用判断器模块,根据不同的查询类型执行不同的路径
分支REPLUG Pipeline通过在多个生成路径中整合概率来生成答案
SuRe Pipeline根据每个文档对生成的结果进行排序和合并
循环Iterative Pipeline交替检索和生成
Self-Ask Pipeline使用 self-ask 将复杂问题分解为子问题
Self-RAG Pipeline自适应检索、反思和生成
FLARE Pipeline生成过程中的动态检索
IRCoT Pipeline将检索过程与思维链集成
+ +## :robot: 基线方法 + +我们在一致的设置下评测了15种RAG基线模型: +- **生成器**:LLAMA3-8B-instruct,输入长度为2048 +- **检索器**:e5-base-v2作为嵌入模型,每个查询检索5个文档 +- **提示**:使用一致的默认提示,模板可以在[方法详情](./docs/baseline_details.md)中找到。 + +对于开源方法,我们使用我们的框架实现了它们的流程。对于作者未提供源代码的方法,我们尽最大努力按照原始论文中的方法进行实现。 + +对于某些方法的必要设置和超参数,我们在**特定设置**列中进行了记录。更多详情请参阅我们的[复现指南](./docs/reproduce_experiment.md)和[方法详情](./docs/baseline_details.md)。 + +需要注意的是,为了确保一致性,我们使用了统一的设置。然而,这一设置可能与方法的原始设置不同,导致结果与原始结果有所差异。 + +| 方法 | 类型 | NQ (EM) | TriviaQA (EM) | Hotpotqa (F1) | 2Wiki (F1) | PopQA (F1) | WebQA(EM) | 特殊设置 | +|-|-|-|-|-|-|-|-|-| +| Naive Generation | 顺序 | 22.6 | 55.7 | 28.4 | 33.9| 21.7| 18.8| | +| Standard RAG | 顺序 | 35.1 | 58.9 | 35.3 | 21.0 | 36.7|15.7| | +| [AAR-contriever-kilt](https://aclanthology.org/2023.acl-long.136.pdf) | 顺序 | 30.1 | 56.8 | 33.4 | 19.8 | 36.1 | 16.1| | +| [LongLLMLingua](https://arxiv.org/abs/2310.06839) | 顺序 | 32.2 | 59.2 | 37.5 |25.0| 38.7| 17.5| Compress Ratio=0.5 | +| [RECOMP-abstractive](https://arxiv.org/pdf/2310.04408) | 顺序 | 33.1 | 56.4 | 37.5 | 32.4 | 39.9| 20.2| | +| [Selective-Context](https://arxiv.org/abs/2310.06201) | 顺序 | 30.5 | 55.6 | 34.4 |18.5| 33.5| 17.3| Compress Ratio=0.5| +| [Trace](https://arxiv.org/abs/2406.11460) | 顺序 | 30.7 | 50.2 | 34.0 | 15.5 | 37.4 | 19.9 | | +| [Spring](https://arxiv.org/abs/2405.19670) | 顺序 | 37.9 | 64.6 |42.6 | 37.3 |54.8 |27.7 | 使用训练了潜入词表的 Llama2-7b-chat | +| [SuRe](https://arxiv.org/abs/2404.13081) | 分支 | 37.1 | 53.2 | 33.4 |20.6|48.1|24.2| 使用论文提供的提示词 | +| [REPLUG](https://arxiv.org/abs/2301.12652) | 分支 | 28.9 | 57.7 | 31.2 |21.1|27.8|20.2| | +| [SKR](https://aclanthology.org/2023.findings-emnlp.691.pdf) | 条件 | 33.2 | 56.0 | 32.4 | 23.4 |31.7|17.0|Use infernece-time training data| +|[Adaptive-RAG](https://aclanthology.org/2024.naacl-long.389.pdf) | 条件 | 35.1 | 56.6 | 39.1 | 28.4 | 40.4 | 16.0| | +| [Ret-Robust](https://arxiv.org/abs/2310.01558) | 循环 | 42.9 | 68.2 | 35.8 |43.4|57.2|33.7| 使用lora训练的LLama2-13B | +| [Self-RAG](https://arxiv.org/abs/2310.11511) | 循环 | 36.4 | 38.2 | 29.6 | 25.1|32.7|21.9| 使用selfrag-llama2-7B| +| [FLARE](https://arxiv.org/abs/2305.06983) | 循环 | 22.5 | 55.8 | 28.0 |33.9| 20.7| 20.2| | +| [Iter-Retgen](https://arxiv.org/abs/2305.15294), [ITRG](https://arxiv.org/abs/2310.05149) | Loop | 36.8 | 60.1 | 38.3 | 21.6| 37.9| 18.2| | +| [IRCoT](https://aclanthology.org/2023.acl-long.557.pdf) | 循环 | 33.3| 56.9|41.5|32.4 |45.6 |20.7 | | + +## :notebook: 支持的数据集和文档语料库 + +### 数据集 +我们收集并处理了36个广泛用于RAG研究的数据集,预处理它们以确保一致的格式,便于使用。对于某些数据集(如Wiki-asp),我们根据社区常用的方法对其进行了适应性调整,以满足RAG任务的要求。所有数据集均可在[Huggingface datasets](https://huggingface.co/datasets/RUC-NLPIR/FlashRAG_datasets)获取。 + +对于每个数据集,我们将每个拆分保存为一个`jsonl`文件,每行是一个如下所示的字典: +```python +{ + 'id': str, + 'question': str, + 'golden_answers': List[str], + 'metadata': dict +} +``` + +以下是数据集列表及其对应的样本数量: + +| 任务 | 数据集名称 | 知识来源 | 训练集数量 | 开发集数量 | 测试集数量 | +|---------------------------|-----------------|------------------|-----------|-----------|------------| +| 问答 | NQ | 维基百科 | 79,168 | 8,757 | 3,610 | +| 问答 | TriviaQA | 维基百科 & 网络 | 78,785 | 8,837 | 11,313 | +| 问答 | PopQA | 维基百科 | / | / | 14,267 | +| 问答 | SQuAD | 维基百科 | 87,599 | 10,570 | / | +| 问答 | MSMARCO-QA | 网络 | 808,731 | 101,093 | / | +| 问答 | NarrativeQA | 书籍和故事 | 32,747 | 3,461 | 10,557 | +| 问答 | WikiQA | 维基百科 | 20,360 | 2,733 | 6,165 | +| 问答 | WebQuestions | Google Freebase | 3,778 | / | 2,032 | +| 问答 | AmbigQA | 维基百科 | 10,036 | 2,002 | / | +| 问答 | SIQA | - | 33,410 | 1,954 | / | +| 问答 | CommonSenseQA | - | 9,741 | 1,221 | / | +| 问答 | BoolQ | 维基百科 | 9,427 | 3,270 | / | +| 问答 | PIQA | - | 16,113 | 1,838 | / | +| 问答 | Fermi | 维基百科 | 8,000 | 1,000 | 1,000 | +| 多跳问答 | HotpotQA | 维基百科 | 90,447 | 7,405 | / | +| 多跳问答 | 2WikiMultiHopQA | 维基百科 | 15,000 | 12,576 | / | +| 多跳问答 | Musique | 维基百科 | 19,938 | 2,417 | / | +| 多跳问答 | Bamboogle | 维基百科 | / | / | 125 | +| 多跳问答 | StrategyQA | 维基百科 | 2290 | / | / +| 长问答 | ASQA | 维基百科 | 4,353 | 948 | / | +| 长问答 | ELI5 | Reddit | 272,634 | 1,507 | / | +| 长问答 | WikiPassageQA | 维基百科 | 3,332 | 417 | 416 | +| 开放域摘要 | WikiASP | 维基百科 | 300,636 | 37,046 | 37,368 | +| 多项选择 | MMLU | - | 99,842 | 1,531 | 14,042 | +| 多项选择 | TruthfulQA | 维基百科 | / | 817 | / | +| 多项选择 | HellaSWAG | ActivityNet | 39,905 | 10,042 | / | +| 多项选择 | ARC | - | 3,370 | 869 | 3,548 | +| 多项选择 | OpenBookQA | - | 4,957 | 500 | 500 | +| 多项选择 | QuaRTz | - | 2696 | 384 | 784 | +| 事实验证 | FEVER | 维基百科 | 104,966 | 10,444 | / | +| 对话生成 | WOW | 维基百科 | 63,734 | 3,054 | / | +| 实体链接 | AIDA CoNll-yago | Freebase & 维基百科 | 18,395 | 4,784 | / | +| 实体链接 | WNED | 维基百科 | / | 8,995 | / | +| 槽填充 | T-REx | DBPedia | 2,284,168 | 5,000 | / | +| 槽填充 | Zero-shot RE | 维基百科 | 147,909 | 3,724 | / | +| 域内问答| DomainRAG | 中国人民大学网页| / | / | 485| + +### 文档语料库 + +我们的工具包支持jsonl格式的检索文档集合,结构如下: + +```jsonl +{"id":"0", "contents": "...."} +{"id":"1", "contents": "..."} +``` +`contents`键是构建索引的关键。对于包含文本和标题的文档,我们建议将`contents`的值设置为`{title}\n{text}`。语料库文件还可以包含其他键来记录文档的附加特征。 + +在学术研究中,维基百科和MS MARCO是最常用的检索文档集合。对于维基百科,我们提供了一个[综合脚本](./docs/process-wiki.md)来处理任何维基百科转储为干净的语料库。此外,许多工作中提供了各种处理版本的维基百科语料库,我们列出了一些参考链接。 + +对于MS MARCO,它在发布时已经处理完毕,可以直接从其在Hugging Face上的[托管链接](https://huggingface.co/datasets/Tevatron/msmarco-passage-corpus)下载。 + +### 索引 + +为了方便实验的复现,我们在ModelScope数据集页面提供了一个预处理的索引:[FlashRAG_Dataset/retrieval_corpus/wiki18_100w_e5_index.zip](https://www.modelscope.cn/datasets/hhjinjiajie/FlashRAG_Dataset/file/view/master?id=47985&status=2&fileName=retrieval_corpus%252Fwiki18_100w_e5_index.zip)。 + +该索引是使用e5-base-v2检索器在我们上传的wiki18_100w数据集上创建的,与我们实验中使用的索引一致。 + +## :raised_hands: 其他常见问题 + +- [如何设置不同的实验参数?](./docs/configuration.md) +- [如何构建我自己的语料库,例如特定分段的维基百科?](./docs/process-wiki.md) +- [如何索引我自己的语料库?](./docs/building-index.md) +- [如何复现支持的方法?](./docs/reproduce_experiment.md) + +## :bookmark: 许可证 + +FlashRAG根据[MIT许可证](./LICENSE)授权。 + +## :star2: 引用 +如果我们的工作对您的研究有帮助,请引用我们的论文: + +```BibTex +@article{FlashRAG, + author={Jiajie Jin and + Yutao Zhu and + Xinyu Yang and + Chenghao Zhang and + Zhicheng Dou}, + title={FlashRAG: A Modular Toolkit for Efficient Retrieval-Augmented Generation Research}, + journal={CoRR}, + volume={abs/2405.13576}, + year={2024}, + url={https://arxiv.org/abs/2405.13576}, + eprinttype={arXiv}, + eprint={2405.13576} +} +``` \ No newline at end of file