spRAG:一个处理密集非结构化文本复杂检索的 RAG 框架

一、前言

在自然语言处理和信息检索领域,RAG(Retrieval-Augmented Generation)模型已经展现出了巨大的潜力。然而,当面对复杂的PDF文档时,传统的RAG模型往往会遇到一些挑战。这些文档通常包含各种格式、图片、表格等元素,使得检索和解析变得困难。为了应对这一挑战,LlamaIndex推出了LlamaParse技术,专门用于解析和处理复杂的PDF文档。

LlamaParse 采用了先进的解析技术,能够有效地提取PDF文档中的文本、图像和表格等内容,并将其转化为结构化的数据。通过与 LlamaIndex 的无缝整合,LlamaParse 不仅提高了解析的准确性和效率,还大大降低了处理复杂文档所需的成本。这一技术的出现,为RAG模型处理复杂PDF文档提供了一个强大的工具。

然而,尽管 LlamaParse 在解析和处理PDF文档方面表现出色,但在处理密集的非结构化文本数据时,仍然存在一些局限性。这时,SuperpoweredAI 推出的 spRAG 框架就显得尤为重要。spRAG是一个专门用于处理密集非结构化数据的RAG框架,特别适用于处理复杂的查询,如财务报告、法律文件和学术论文等

与LlamaParse相比,spRAG在处理复杂查询方面有着显著的优势。它采用了两种关键技术:AutoContextRelevant Segment Extraction(RSE)。AutoContext 能够在嵌入文本块之前,自动将文档级别的上下文注入到单个块中,使得嵌入更准确地表示文本的内容和含义。RSE 则是一种后处理步骤,能够将相关的文本块智能地组合成更长的文本段,为语言模型提供更好的上下文。

在一项具有挑战性的基准测试 FinanceBench 中,spRAG 的准确率高达83%,而普通RAG基准模型仅为19%。这充分展示了spRAG在处理复杂查询方面的优越性能。此外,spRAG的安装和使用也非常简单,可以通过Python包pip轻松安装。

LlamaParse 和 spRAG 在RAG模型的发展历程中扮演着重要的角色。LlamaParse 专注于解析和处理复杂的PDF文档,而 spRAG 则专注于处理密集的非结构化文本数据和复杂查询。两者的结合,为RAG模型在各种场景下的应用提供了强大的支持,推动了自然语言处理和信息检索领域的发展。

二、关键技术

在 spRAG 框架中,有两项关键技术发挥着至关重要的作用,它们分别是 AutoContext 和 Relevant Segment Extraction(RSE)。这两项技术的引入,显著提升了 spRAG 在处理密集非结构化文本数据和复杂查询方面的性能。下面,我们就来详细了解一下这两项技术的原理和作用。

2.1、AutoContext:自动注入文档级别上下文

在传统的RAG模型中,文本数据通常被分割成固定长度的块,然后再进行嵌入。这种方式虽然简单,但却忽略了文档级别的上下文信息,导致嵌入的上下文不够准确和完整。而 AutoContext 技术则巧妙地解决了这一问题。

AutoContext 的核心思想是在嵌入各个文本块之前,先自动将文档级别的上下文信息注入到每个块中。具体来说,它会生成一个包含1-2个句子的文档摘要,并将其与文件名一起添加到每个块的开头。这样一来,每个块就不再是孤立的,而是携带了整个文档的上下文信息。

通过 AutoContext,嵌入的文本块变得更加准确和完整,能够更好地捕捉文本的内容和含义。在实际测试中,AutoContext 显著提高了检索质量,不仅加快了检索正确信息的速度,还大大降低了搜索结果中出现不相关结果的概率。这对于下游的聊天和生成应用来说,意义重大,因为它减少了语言模型误解文本的可能性。

2.2、Relevant Segment Extraction(RSE):智能组合相关文本块

在处理复杂查询时,答案往往分散在多个文本块中,单独的块可能无法提供完整的上下文。为了解决这一问题,spRAG 引入了Relevant Segment Extraction(RSE)技术。

RSE 是一个后置处理步骤,它的目标是智能地识别和组合能够提供最相关信息的文本部分,形成更长的文本段(segment)。这些文本段为语言模型提供了比任何单个块更好的上下文,使其能够更准确地理解和回答复杂的问题。

RSE的工作原理如下:首先,它会对检索到的相关文本块进行聚类,将内容相似或语义相关的块归为一组。然后,它会根据查询的需求,智能地选择和组合这些块,形成长度适当、信息相关的文本段。这个过程不受固定长度块的限制,能够灵活地适应不同查询的需求。

举个例子,如果我们问"苹果公司最近一个财年的主要财务业绩是什么?",RSE就会将最相关的部分确定为整个"综合运营报表"部分,这可能包含5-10个块的内容。而如果问"苹果公司的首席执行官是谁?",RSE则会识别出包含"蒂姆·库克,首席执行官"的单个块作为最相关的部分。

通过RSE,spRAG能够智能地提取和组合最相关的文本信息,为语言模型提供更完整、更准确的上下文,从而显著提升了在复杂查询任务上的表现。

AutoContext 和 RSE 这两项技术的引入,展现了 spRAG 在处理密集非结构化文本数据和复杂查询方面的智能和创新。AutoContext 通过自动注入文档级别的上下文,使得嵌入的表示更加准确和完整;RSE则通过智能组合相关文本块,为语言模型提供更好的上下文,提升了复杂查询任务的表现。

三、技术架构

spRAG 的核心是一个名为 KnowledgeBase 的对象,它接收原始文本形式的文档,并对其进行分块、嵌入以及其他一些预处理操作。在查询时,你可以向 KnowledgeBase 对象输入查询,它会返回最相关的文本片段。

KnowledgeBase 对象默认是持久化的。在创建和更新时,重构对象所需的完整配置会以JSON文件的形式保存下来。

3.1、关键组件

spRAG 有五个主要组成部分。这些组件定义了 spRAG 的知识库,并且可以由用户自定义:

1. VectorDB:VectorDB是一个存储嵌入向量和少量元数据的组件。它在问答系统、管理和存储检索到的文本块的嵌入中发挥着重要作用。

2. ChunkDB:ChunkDB根据文档ID和块索引以嵌套字典格式存储文本块的内容,以文档ID和块索引为键。 RSE 使用该数据库来检索与特定块关联的全文。

3. Embedding:Embedding 组件定义嵌入模型。该模型将文本数据映射到向量空间,允许基于文档之间的语义相似性进行搜索。

4. Reranker:Reranker组件用于在搜索矢量数据库后提供更准确的块排名。该组件负责重新评估和优化搜索结果的相关性。

5. LLM:LLM(大语言模型)组件用于文档摘要。特别是,它在 AutoContext 功能中发挥着重要作用,该功能用于将文档级上下文注入到每个块中。

除了默认选项外,spRAG 还为每个组件提供了替代选项。你也可以通过子类化基类并将该子类的实例传递给KnowledgeBase构造函数来定义完全自定义的组件。

3.2、、组件详解

VectorDB

VectorDB组件存储嵌入向量和少量元数据。目前可用的选项有:

  • BasicVectorDB

ChunkDB

ChunkDB以嵌套字典格式存储文本块的内容,以文档ID和块索引为键。RSE使用它来检索与特定块相关的完整文本。目前可用的选项有:

  • BasicChunkDB

Embedding

Embedding组件定义嵌入模型。目前可用的选项有:

  • OpenAIEmbedding
  • CohereEmbedding
  • VoyageAIEmbedding

Reranker

Reranker组件定义重排器。它在向量数据库搜索之后(RSE之前)使用,以提供更准确的块排名。目前可用的选项有:

  • CohereReranker

LLM

LLM定义用于文档摘要的大语言模型,仅在AutoContext中使用。目前可用的选项有:

  • OpenAIChatAPI
  • AnthropicChatAPI

spRAG框架的技术架构设计合理,组件划分清晰,充分考虑了处理密集非结构化文本数据的需求。其中,VectorDB和ChunkDB的引入,解决了存储和检索嵌入向量及文本块的问题;Embedding组件提供了多种嵌入模型选择,增强了框架的灵活性;Reranker组件通过重排搜索结果,提高了查询的准确性;LLM组件在AutoContext功能中发挥了关键作用,实现了文档级别上下文的自动注入。

此外,spRAG还提供了默认选项和替代选项,以及自定义组件的能力,使得框架具有很强的可扩展性和适应性。这种灵活的设计方式,使得spRAG能够满足不同用户和应用场景的需求。

四、如何使用

spRAG 可以通过 Python 包轻松安装,并且只需设置API密钥即可使用。安装 spRAG 最简单的方法是使用 Python 包管理器 pip:

pip install sprag

spRAG 默认使用 OpenAI 进行文本嵌入 (embeddings),使用 Claude 3 Haiku 模型进行自动上下文 (AutoContext) 处理,并使用 Cohere 进行结果重新排序 (reranking)。因此,在运行以下代码之前,您需要确保已设置这些服务的 API 密钥作为环境变量,变量名称分别为:OPENAI_API_KEY、ANTHROPIC_API_KEY 和 CO_API_KEY,如果你想使用其他模型运行 spRAG,请参考下面的“基本定制”部分。

你可以使用 create_kb_from_file 函数直接从文件创建新的知识库 (KnowledgeBase):

from sprag.create_kb import create_kb_from_file

file_path = "spRAG/tests/data/levels_of_agi.pdf"
kb_id = "levels_of_agi"
kb = create_kb_from_file(kb_id, file_path)

KnowledgeBase 会自动保存到磁盘,无需手动保存。现在,您可以通过知识库的 kb_id 加载它(仅当您从单独的脚本运行代码时才需要),并使用 query 方法进行查询:

from sprag.knowledge_base import KnowledgeBase

kb = KnowledgeBase("levels_of_agi")
search_queries = ["通用人工智能 (AGI) 有哪些级别?", "AGI 的最高级别是什么?"]
results = kb.query(search_queries)

for segment in results:
    print(segment)

4.1、基本定制

以下示例展示了如何定制知识库的配置。在本例中,我们将将其配置为仅使用 OpenAI(如果您没有 Anthropic 和 Cohere 的 API 密钥)。为此,我们需要传入大语言模型 (LLM) 的子类和重新排序器 (Reranker) 的子类。我们将使用 gpt-3.5-turbo 作为 LLM(用于 AutoContext 中的文档摘要),由于 OpenAI 不提供重新排序器,因此我们将使用 NoReranker 类。

from sprag.llm import OpenAIChatAPI
from sprag.reranker import NoReranker

llm = OpenAIChatAPI(model='gpt-3.5-turbo')
reranker = NoReranker()

kb = KnowledgeBase(kb_id="levels_of_agi", reranker=reranker, auto_context_model=llm)

现在,我们可以使用 add_document 方法将文档添加到此知识库中。请注意,add_document 方法接受原始文本而不是文件,因此我们必须首先从文件中提取文本。document_parsing.py 文件中提供了一些用于执行此操作的实用函数。

from sprag.document_parsing import extract_text_from_pdf

file_path = "spRAG/tests/data/levels_of_agi.pdf"
text = extract_text_from_pdf(file_path)
kb.add_document(doc_id=file_path, text=text)

五、总结

近年来,随着自然语言处理和信息检索技术的不断发展,RAG(Retrieval-Augmented Generation)模型受到了越来越多的关注。RAG模型通过将知识检索与语言生成相结合,展现出了在处理复杂查询任务方面的巨大潜力。

spRAG 是由 SuperpoweredAI 团队开发的一个专门用于处理密集非结构化文本数据的RAG框架,特别适用于处理复杂查询,如财务报告、法律文件和学术论文等。与传统的RAG模型相比,spRAG 在处理复杂查询任务方面表现出了显著的优势。在一项具有挑战性的基准测试FinanceBench中,spRAG的准确率高达83%,而普通RAG基准模型仅为19%。

spRAG 的成功离不开其巧妙的技术架构设计和关键组件的实现。它的核心是一个名为 KnowledgeBase 的对象,负责接收原始文本文档,并对其进行分块、嵌入等预处理操作。在查询时,KnowledgeBase 对象会返回最相关的文本片段。spRAG 的配置由五个关键组件定义:VectorDB、ChunkDB、Embedding、Reranker和LLM,每个组件都是可定制的,提供了默认选项和替代选项,以及自定义组件的能力。

在 spRAG 框架中,有两项关键技术发挥着至关重要的作用:AutoContext 和 Relevant Segment Extraction(RSE)。AutoContext 通过自动将文档级别的上下文注入到每个块中,使得嵌入的表示更加准确和完整。RSE则是一个后处理步骤,能够智能地识别和组合能够提供最相关信息的文本部分,形成更长的文本段,为语言模型提供更好的上下文。

除了出色的性能表现,spRAG还具有易用性和可扩展性的特点。它的安装和使用都非常简单,可以通过Python包pip轻松安装。同时,spRAG提供了灵活的组件配置和自定义能力,使其能够适应不同用户和应用场景的需求。

参考资料

[1]. spRAG GitHub: https://github.com/SuperpoweredAI/spRAG

[2]. FinanceBench: https://arxiv.org/abs/2311.11944

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

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

相关文章

数据同步新突破!一招解决文化公司系统对接难题!

一、客户介绍 某文化传播有限公司,是一家专注于文化艺术领域,集创作、制作、交流等多功能于一体的公司。公司始终秉承创意和质量的双重标准,为观众带来一系列高质量的文化艺术作品。该公司的经营范围广泛,涵盖了组织文化艺术交流…

cmake进阶:变量的作用域说明三(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下: cmake进阶:变量的作用域说明一(从函数作用域方面)-CSDN博客cmake进阶:变量的作用域说明二(从函数作用域方面)-CSDN博客…

VALSE 2024年度进展评述内容分享-视觉通用人工智能

2024年视觉与学习青年学者研讨会(VALSE 2024)于5月5日到7日在重庆悦来国际会议中心举行。本公众号将全方位地对会议的热点进行报道,方便广大读者跟踪和了解人工智能的前沿理论和技术。欢迎广大读者对文章进行关注、阅读和转发。文章是对报告人…

优雅处理返回信息状态码:Result对象在Spring Boot中的应用

前言 在开发过程中,处理返回的信息状态码是一个重要的问题,尤其是在大型项目中。为了统一处理这些状态码,我在Spring Boot中创建了一个名为Result的Java对象,用于封装返回的信息和状态码。在本文中,我将分享如何实现这…

【C++题解】1435. 数池塘(八方向)

问题:1435. 数池塘(八方向) 类型:深搜 题目描述: 农夫约翰的农场可以表示成 NM(1≤N,M≤100)个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。 每一个方格或…

重写muduo之获取线程tid代码

目录 1、概述 2、CurrentThread.h 3、 CurrentThread.cc 1、概述 我们的服务器程序不一定就只有1个Eventloop,我们可能有很多的Eventloop,每个Eventloop都有很多channel,自己channel上的事件要在自己的Eventloop线程上去处理,E…

免费开源的tiktok加速软件

背景 tiktok是国内企业出海做的比较成功的案例,可以简单的理解为海外版的抖音,关于tiktok的运营和变现不是我们擅长的领域,这里就不多说了,这篇文章主要着重在解决tiktok的网络问题,介绍如何用开源的软件自己搭建一套…

基于 Ubuntu22.04 安装 SSH 服务

文章目录 一、Ubuntu22.04 安装 SSH 服务二、配置 OpenSSH(安全性)1. 更改 OpenSSH 端口2. 限制使用 SSH 登录尝试次数3. 禁止 SSH 以 root 身份连接 三、设置防火墙(UFW)锁定 SSH四、远程终端软件通过 SSH 连接 Ubuntu22.041. 远…

SpringMVC简介和体验

一、SpringMVC简介和体验 1.1 介绍 Spring Web MVC :: Spring Framework Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc )&#…

算法学习007-进制转换 c++递归算法实现 中小学算法思维学习 信奥算法解析

目录 C进制转换 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、推荐资料 C进制转换 一、题目要求 1、编程实现 小明学c有一段时间了,今天他想做一个进制转换的小程序,将十进…

LEETCODE LCR 041. 数据流中的移动平均值

class MovingAverage:def __init__(self, size: int):"""Initialize your data structure here."""self.sizesize1self.front0self.rear0self.queue[None for _ in range(size1)]self.sum0def next(self, val: int) -> float:# 满了if (self.…

flutter 生成单选组件

一、效果图 二、主要代码 import package:company_manage_flutter/xcClass/dicDataProp.dart; import package:flutter/material.dart; import package:get/get.dart;class CheckListWidget extends StatefulWidget {final List<Map<String, dynamic>> list;final…

Vue中Element的下载

打开vscode让项目在终端中打开 输入npm install element-ui2.15.3 然后进行下载 在node_modules中出现element-ui表示下载完成 然后在输入Vue.use(ElementUI); import Vue from vue import App from ./App.vue import router from ./router import ElementUI from element-ui…

【目标检测】Deformable DETR

一、前言 论文&#xff1a; Deformable DETR: Deformable Transformers for End-to-End Object Detection 作者&#xff1a; SenseTime Research 代码&#xff1a; Deformable DETR 特点&#xff1a; 提出多尺度可变形注意力 (Multi-scale Deformable Attention) 解决DETR收敛…

已解决 RuntimeError: No CUDA GPUs are available 亲测有效!!!

已解决 RuntimeError: No CUDA GPUs are available 亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 报错问题解决思路解决方法 报错问题 RuntimeError: No CUDA GPUs are available 这个错误通常发生在尝试在没有CUDA支持的GPU或没有安装NVIDIA GPU的机器上运行基于C…

Hamilton回路求解

如果可以 我想和你回到那天相遇 让时间停止 那一场雨 红线划过 深藏轮回的秘密 我挥霍运气 因为你 才让我 背对命运不害怕 --------- 如果可以 (Acapella) - 韦礼安 大家好&#xff0c;我又又又来了&#xff0c;今天给大家聊聊Hamilton回路&#xff01; 背景 国际象…

使用CUDA的PyTorch进行张量重整化的gpu加速

使用CUDA的PyTorch进行张量重整化的gpu加速 摘要IntroductionAlgorithm and TorchTrg discussionModels and Results GPU-Acceleration of Tensor Renormalization with PyTorch using CUDA 摘要 作者展示了基于张量重整化群&#xff08;TRG&#xff09;方法的数值计算可以通过…

HarmonyOS NEXT星河版之在线考试功能实战

文章目录 一、目标二、基础搭建2.1 定义数据2.2 mock数据2.3 主页面布局2.3.1 布局规划2.3.2 标题栏2.3.3 进度条2.3.4 答题模块2.3.5 底部按钮 2.4 主页面逻辑2.4.1 加载数据及定义变量2.4.2 上一题、下一题 三、选项点击及高亮3.1 声明对象及变量3.2 给选项注册点击事件3.3 处…

AI图书推荐:Zapier和AI融合来自动化业务流程

这本书《Zapier和AI融合来自动化业务流程》&#xff08;Automate It with Zapier and Generative AI&#xff09;由Kelly Goss撰写&#xff0c;这本书是为想要使用Zapier和AI集成功能来自动化重复性任务、提高生产力的微型、小型或中型企业的业务所有者、运营经理和团队准备的。…

C++入门基础(四)

目录 auto关键字(C11)类型别名思考auto的使用细则auto与指针和引用结合起来使用在同一行定义多个变量 auto不能推导的场景auto不能作为函数的参数auto不能直接用来声明数组 复杂场景下的auto 基于范围的for循环(C11)范围for的语法范围for的使用条件 指针空值---nullptr(C11)C98…
最新文章