FlashRAG

文章目录

    • 一、关于 FlashRAG
      • 特点 ✨
      • 🔧 安装
    • 二、快速入门🏃
        • 1、Toy Example
        • 2、使用现成的管道
        • 3、建立自己的管道
        • 4、只需使用组件
    • 三、组件⚙️
        • 1、RAG 组件
        • 2、管道
    • 四、支持方法🤖
    • 五、支持数据集📓
    • 六、其他常见问题解答 🙌


一、关于 FlashRAG

  • github : https://github.com/RUC-NLPIR/FlashRAG
  • paper : FlashRAG: A Modular Toolkit for Efficient Retrieval-Augmented Generation Research
    https://arxiv.org/pdf/2405.13576

FlashRAG 是一个用于复现和开发检索增强生成 (RAG) 研究的 Python 工具包。

工具包包括 32 个预处理的基准 RAG 数据集和 12 个最先进的 RAG 算法。

在这里插入图片描述

借助 FlashRAG 和提供的资源,您可以轻松地在 RAG 域中重现现有的 SOTA 作品或实现自定义的 RAG 流程和组件。

FlashRAG 是根据MIT 许可证授权的。


特点 ✨

  • 🛠 广泛且可定制的框架:包括 RAG 场景的基本组件,例如检索器、重新排序器、生成器和压缩器,允许灵活组装复杂的管道。
  • 🗂 全面的基准数据集:32 个预处理的 RAG 基准数据集的集合,用于测试和验证 RAG 模型的性能。
  • 🎯 预实现的高级 RAG 算法:基于我们的框架,具有 12 种先进的 RAG 算法,并报告了结果。可轻松在不同设置下重现结果。
  • 🧩 高效的预处理阶段:通过提供检索的语料库处理、检索索引构建和文档预检索等各种脚本,简化 RAG 工作流程准备。
  • 🚀 优化执行:通过 vLLM、用于 LLM 推理加速的 FastChat 和用于向量索引管理的 Faiss 等工具增强了库的效率。

🔧 安装

要开始使用 FlashRAG,只需从 Github 克隆并安装(需要 Python 3.9+):

git clone https://github.com/RUC-NLPIR/FlashRAG.git
cd FlashRAG
pip install -e . 

二、快速入门🏃

1、Toy Example

运行以下代码,使用提供的玩具数据集实现一个简单的 RAG 管道。

默认检索器是e5,默认生成器是llama2-7B-chat

您需要在以下命令中填写相应的模型路径。

如果您希望使用其他模型,请参阅下面的详细说明。

cd examples/quick_start
python simple_pipeline.py \
    --model_path=<LLAMA2-7B-Chat-PATH> \
    --retriever_path=<E5-PATH>

代码完成后可以在相应路径下的输出文件夹里查看运行的中间结果以及最终的评估分数。

注意: 此示例仅用于测试整个流程是否能正常运行,我们的示例检索文档仅包含 1000 条数据,因此可能无法获得良好的结果。


2、使用现成的管道

您可以使用我们已经构建好的pipeline类(如pipelines所示)来实现里面的RAG流程,这种情况下,只需要配置config,加载对应的pipeline即可。

首先加载整个流程的config,里面记录了RAG流程中需要用到的各种超参数,可以把yaml文件作为参数输入,也可以直接作为变量输入,变量作为输入的优先级高于文件。

from flashrag.config import Config

config_dict = {'data_dir': 'dataset/'}
my_config = Config(config_file_path = 'my_config.yaml',
                config_dict = config_dict)

您可以参考我们提供的基础yaml文件来设置自己的参数,具体参数名称及含义请参考config参数说明。

接下来加载相应的数据集,并初始化管道。管道中的组件将被自动加载。

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

prompt_templete = PromptTemplate(
    config, 
    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.run即可得到最终结果。

output_dataset = pipeline.run(test_data, do_eval=True)

包含output_dataset输入数据集中每项的中间结果和度量分数。

同时,包含中间结果和总体评估分数的数据集也将保存为文件(如果指定了save_intermediate_datasave_metric_score)。


3、建立自己的管道

有时你可能需要实现更复杂的RAG流程,你可以构建自己的流水线来实现,只需要继承BasicPipeline,初始化你需要的组件,完成run功能即可。

from flashrag.pipeline import BasicPipeline
from flashrag.utils import get_retriever, get_generator

class ToyPipeline(BasicPipeline):
  def __init__(self, config, prompt_templete=None):
    # Load your own components
    pass

  def run(self, dataset, do_eval=True):
    # Complete your own process logic

    # get attribute in dataset using `.`
    input_query = dataset.question
    ...
    # use `update_output` to save intermeidate data
    dataset.update_output("pred",pred_answer_list)
    dataset = self.evaluate(dataset, do_eval=do_eval)
    return dataset

了解您需要使用的组件的输入和输出形式 :

https://github.com/RUC-NLPIR/FlashRAG/blob/main/docs/basic_usage.md


4、只需使用组件

如果您已经有自己的代码,只想使用我们的组件来嵌入原有的代码,您可以参考组件的基本介绍来获取各个组件的输入输出格式。


三、组件⚙️

在 FlashRAG 中,我们构建了一系列常用的 RAG 组件,包括检索器、生成器、refiners 等。

基于这些组件,我们组装了多个管道来实现 RAG 工作流,同时还提供了灵活性,可以按自定义方式组合这些组件以创建您自己的管道。

1、RAG 组件
TypeModuleDescription
JudgerSKR JudgerJudging whether to retrieve using SKRmethod
RetrieverDense RetrieverBi-encoder models such as dpr, bge, e5, using faiss for search
BM25 RetrieverSparse retrieval method based on Lucene
Bi-Encoder RerankerCalculate matching score using bi-Encoder
Cross-Encoder RerankerCalculate matching score using cross-encoder
RefinerExtractive RefinerRefine input by extracting important context
Abstractive RefinerRefine input through seq2seq model
LLMLingua RefinerLLMLingua-series prompt compressor
SelectiveContext RefinerSelective-Context prompt compressor
GeneratorEncoder-Decoder GeneratorEncoder-Decoder model, supporting Fusion-in-Decoder (FiD)
Decoder-only GeneratorNative transformers implementation
FastChat GeneratorAccelerate with [FastChat](
vllm GeneratorAccelerate with vllm

2、管道

参考有关检索增强生成的调查,我们根据推理路径将 RAG 方法分为四类。

  • 顺序:RAG 过程的顺序执行,如查询-(检索前)-检索器-(检索后)生成器
  • 条件:针对不同类型的输入查询实现不同的路径
  • 分支:并行执行多个路径,合并每个路径的响应
  • 循环:迭代执行检索和生成

在每个类别中,我们都实现了相应的通用流程,部分流程还有相应的工作底稿。

TypeModuleDescription
SequentialSequential PipelineLinear execution of query, supporting refiner, reranker
ConditionalConditional PipelineWith a judger module, distinct execution paths for various query types
BranchingREPLUG PipelineGenerate answer by integrating probabilities in multiple generation paths
SuRe PipelineRanking and merging generated results based on each document
LoopIterative PipelineAlternating retrieval and generation
Self-Ask PipelineDecompose complex problems into subproblems using self-ask
Self-RAG PipelineAdaptive retrieval, critique, and generation
FLARE PipelineDynamic retrieval during the generation process

四、支持方法🤖

我们实施了 12 部作品,其一致设定如下:

  • 生成器: LLAMA3-8B-instruct,输入长度为 4096
  • 检索器: e5-base-v2 作为嵌入模型,每个查询检索 5 个文档
  • 提示: 一致的默认提示,模板可以在这里找:
    https://github.com/RUC-NLPIR/FlashRAG/blob/main/flashrag/prompt/base_prompt.py

对于开源方法,我们利用我们的框架实现了它们的流程。对于作者没有提供源代码的方法,我们会尽量遵循原论文中的方法进行实现。

对于某些方法特有的必要设置和超参数,我们在具体设置栏中进行了记录。更多详细信息,请查阅我们的代码。

需要注意的是,为了确保一致性,我们使用了统一的设置。但是,此设置可能与该方法的原始设置不同,导致结果与原始结果有所不同。

MethodTypeNQ (EM)TriviaQA (EM)Hotpotqa (F1)2Wiki (F1)PopQA (F1)WebQA(EM)Specific setting
Naive GenerationSequential22.655.728.433.921.718.8
Standard RAGSequential35.158.935.321.036.715.7
AAR-contriever-kiltSequential30.156.833.419.836.116.1
LongLLMLinguaSequential32.259.237.525.038.717.5Compress Ratio=0.5
RECOMP-abstractiveSequential33.156.437.532.439.920.2
Selective-ContextSequential30.555.634.418.533.517.3Compress Ratio=0.5
Ret-RobustSequential42.968.235.843.457.233.7Use LLAMA2-13B with trained lora
SuReBranching37.153.233.420.648.124.2Use provided prompt
REPLUGBranching28.957.731.221.127.820.2
SKRConditional25.555.929.828.524.518.6Use infernece-time training data
Self-RAGLoop36.438.229.625.132.721.9Use trained selfrag-llama2-7B
FLARELoop22.555.828.033.920.720.2
Iter-Retgen, ITRGLoop36.860.138.321.637.918.2

五、支持数据集📓

我们收集并处理了 35 个在 RAG 研究中广泛使用的数据集,并对其进行了预处理,以确保格式一致,方便使用。对于某些数据集(例如 Wiki-asp),我们根据社区内常用的方法对其进行了调整,以适应 RAG 任务的要求。

对于每个数据集,我们将每个分割保存为一个jsonl文件,每行是一个字典,如下所示:

{
  'id': str,
  'question': str,
  'golden_answers': List[str],
  'metadata': dict
}

以下是数据集列表以及相应的样本大小:

TaskDataset NameKnowledge Source# Train# Dev# Test
QANQwiki79,1688,7573,610
QATriviaQAwiki & web78,7858,83711,313
QAPopQAwiki//14,267
QASQuADwiki87,59910,570/
QAMSMARCO-QAweb808,731101,093/
QANarrativeQAbooks and story32,7473,46110,557
QAWikiQAwiki20,3602,7336,165
QAWebQuestionsGoogle Freebase3,778/2,032
QAAmbigQAwiki10,0362,002/
QASIQA-33,4101,954/
QACommenseQA-9,7411,221/
QABoolQwiki9,4273,270/
QAPIQA-16,1131,838/
QAFermiwiki8,0001,0001,000
multi-hop QAHotpotQAwiki90,4477,405/
multi-hop QA2WikiMultiHopQAwiki15,00012,576/
multi-hop QAMusiquewiki19,9382,417/
multi-hop QABambooglewiki//125
Long-form QAASQAwiki4,353948/
Long-form QAELI5Reddit272,6341,507/
Open-Domain SummarizationWikiASPwiki300,63637,04637,368
multiple-choiceMMLU-99,8421,53114,042
multiple-choiceTruthfulQAwiki/817/
multiple-choiceHellaSWAGActivityNet39,90510,042/
multiple-choiceARC-3,3708693,548
multiple-choiceOpenBookQA-4,957500500
Fact VerificationFEVERwiki104,96610,444/
Dialog GenerationWOWwiki63,7343,054/
Entity LinkingAIDA CoNll-yagoFreebase & wiki18,3954,784/
Entity LinkingWNEDWiki/8,995/
Slot FillingT-RExDBPedia2,284,1685,000/
Slot FillingZero-shot REwiki147,9093,724/

六、其他常见问题解答 🙌

  • 如何建立我自己的语料库,例如特定分段的维基百科?
  • 如何索引我自己的语料库?

2024-05-24(五)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658959.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MT3049 区间按位与

思路&#xff1a; 使用ST表。ST表模板可参考MT3024 maxmin 注意点&#xff1a;此题范围较大&#xff0c;所以要避免超时。 ①使用 ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 加快输入输出速度。 ②换行使用\n而不是endl 代码&#xff1a; 1.暴力6/8 #…

图片怎么批量重命名从1到50?这3个方法一键改名

图片怎么批量重命名从1到50&#xff1f;图片批量重命名从1到50的过程不仅提高了我们处理大量图片文件的效率&#xff0c;还大大简化了命名过程&#xff0c;让我们能更加有条理地管理和存储图片。通过使用各种专业的工具和方法&#xff0c;我们可以轻松实现图片文件的自动化命名…

微信小程序代码加固教程后台接口防止别人乱调用

最近开发了一个小程序前端开发前端和后台花了1个多月时间开发&#xff0c;结果被人轻松的把微信小程序前端代码破解出来。而且完整一个字不差截图给我看了。 小程序是前后端都分离的&#xff0c;如果后端不作验证&#xff0c;别人把你的小程序前端扒了接口也暴露了&#xff0c;…

玩转STM32-通用同步/异步收发器USART(详细-慢工出细活)

CPU与外围设备之间的信息交换或计算机与计算机之间的信息交换称为通信。基 本的通信方式有两种&#xff0c;即并行通信和串行通信。文章目录 一、串行通信基础1.1 串行通信的方式1.2 串行通信的数据传输形式1.3 波特率 二、STM32的USART的结构特征&#xff08;了解&#xff09;…

现在怎么做抖店才能赚钱?这四个重要建议,你千万不能忽略!

大家好&#xff0c;我是电商花花。 现在目前看抖音小店前景和红利依然有很大的市场空间&#xff0c;抖音小店平台流量大&#xff0c;商家入驻门槛低&#xff0c;抖店的运营技术也不像其它传统电商平台那么高。 所以&#xff0c;当下抖音小店仍然是流量大&#xff0c;机遇多。…

使用手机短信恢复软件,完成从新手到专家的进阶之路

由于各种原因&#xff0c;如误删、手机设备损坏等&#xff0c;我们可能会面临重要短信丢失的风险。现在市面上有许多手机短信恢复软件可以帮助我们解决这个问题&#xff0c;但从新手到专家的进阶之路并非一蹴而就的过程&#xff0c;它需要耐心、实践和不断地学习。以下是一篇关…

开源集运wms系统

集运WMS系统是一种专为集运业务设计的仓库管理系统&#xff0c;它能够高效地处理来自多个来源的货物&#xff0c;优化存储和发货流程。 经过长时间的开发和测试&#xff0c;推出了我的集运WMS系统。它不仅具备传统WMS系统的所有功能&#xff0c;还针对集运业务的特点进行了特别…

【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析

&#x1f525; 个人主页&#xff1a;空白诗 &#x1f525; 热门专栏&#xff1a;【JavaScript】 文章目录 &#x1f33f; 引言五、 Destructuring Assignment - 解构赋值&#xff0c;数据提取的艺术 &#x1f3a8;&#x1f4cc; 数组解构&#x1f4cc; 对象解构&#x1f4cc; 特…

matlab生成波形然后采样,FPGA写testbench读取数据

一、在matlab产生激励 fs1000; % 这个是路数 M16; % 这个是FFT的点数&#xff0c;64K L65536; % 将N写为两个整数乘积的形式&#xff0c;即N ML&#xff0c;(log2 M和log2 L都为正整数) NM*L; % 这段 MATLAB 代码是用来生成一个时间序列的&#xff0c; % 该时间序列从0开…

一次性把“AI 原生应用技术栈”说明白

AI 当前有多火爆不用介绍了&#xff0c;随着各个厂商的努力&#xff0c;也慢慢浮现了有价值的应用&#xff0c;以及为更好的服务 AI 原始应用准备的各种平台产品。今天这篇简单介绍下当前业界最新的 AI 原生应用技术栈。 特别声明&#xff1a;AI 技术还在快速发展过程中&#…

数据可视化分析工具DataEase

本文软件由网友 雨林 推荐&#xff0c;老苏稍微研究了一下 DataEase 的安装&#xff0c;具体的使用教程&#xff0c;请参考官方的在线文档和教学视频 什么是 DataEase &#xff1f; DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#x…

新品发布(仓库小助手)一机在手,轻松无忧

你是否曾为繁琐的货物管理而烦恼&#xff1f; 你是否为了记录货物信息忙前忙后&#xff1f; 近几年&#xff0c;陆续有收到客户在运营跨境代购中的一些反馈&#xff0c;特别是仓库管理这块&#xff0c;比如包裹的出入库、移库、修改包裹信息等&#xff0c;都需要在电脑上完成&…

HTML新春烟花盛宴

目录 写在前面 烟花盛宴 完整代码 修改文字

轻松掌握图片批量处理,赶紧学习这些小技巧!

在现今数字化的社会中&#xff0c;我们每天都会接触到大量的图片&#xff0c;无论是在工作中还是日常生活中。要想高效处理这些图片&#xff0c;掌握图片批量处理的技巧就显得尤为重要。幸运的是&#xff0c;有许多小技巧和工具可以让这一过程变得轻松愉快。 在本文中&#xf…

解决 Echarts 图 tooltip 层级太高穿透问题

问题场景&#xff1a;Echarts 图 tooltip 是自动轮播的&#xff0c;当点击某个区域出现弹窗时&#xff0c;tooltip和弹窗同时显示&#xff0c;没在遮罩层下面&#xff0c;查看tooltip的层级显示99999&#xff0c;所以这里改一下tooltip的层级。 设置 extraCssText: "z-ind…

白酒:产地的标识对消费者选择的影响与策略

云仓酒庄豪迈白酒作为一款知名品牌&#xff0c;其产地的标识对消费者选择产生着重要的影响。产地的标识是消费者了解和信任产品的重要途径&#xff0c;因此&#xff0c;如何巧妙地运用产地的标识来吸引和留住消费者&#xff0c;是品牌营销的重要策略。 首先&#xff0c;产地的标…

Suno进阶手册 | 创作歌曲玩法全攻略!

Suno进阶手册:创作歌曲玩法全攻略! 前言1. 基础模式2. 高级模式总结前言 前段时间,Suno V3 横空出世,与此前的V2相比,V3生成的作品质量明显提升! 该说不说,对比同类型工具,Suno的体验“遥遥领先”,没有AI生成常有的机械感,歌词押韵,甚至还附带有和声、分段。 虽然…

有免费通配符证书吗?哪里可以申请?

市面上的免费SSL证书大多数为单域名证书&#xff0c;如果您的主域名拥有众多子域名&#xff0c;逐一申请单域名SSL证书不太现实&#xff0c;下面为介绍一款永久免费使用的通配符SSL证书申请流程 1 选择免费通配符证书提供商 免费通配符证书申请点击这里直接获取https://www.…

两年半前端面字节,广度和深度让我不想做前端了

两年半经历&#xff0c;面的是前端工程师&#xff0c;字节面试官的问题挺有广度与深度的&#xff0c;这里整理一下面试过程中的题目&#xff08;有些忘记了&#xff09;&#xff0c;分享给大家: 面试过程中的问题 1、简单的自我介绍与项目经验。 2、一道算法题。 3、一道 …

ClickHouse安装教程:开启你的列式数据库之旅

ClickHouse是一个高性能的列式数据库管理系统&#xff0c;适用于在线分析处理&#xff08;OLAP&#xff09;。以下是ClickHouse的一些基本使用步骤&#xff1a; 下载二进制文件&#xff1a;您可以通过运行以下curl命令在Linux、FreeBSD或macOS上本地下载ClickHouse&#xff1a…