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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术狂潮AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值