一、前言
在自然语言处理和信息检索领域,RAG(Retrieval-Augmented Generation)模型已经展现出了巨大的潜力。然而,当面对复杂的PDF文档时,传统的RAG模型往往会遇到一些挑战。这些文档通常包含各种格式、图片、表格等元素,使得检索和解析变得困难。为了应对这一挑战,LlamaIndex推出了LlamaParse技术,专门用于解析和处理复杂的PDF文档。
LlamaParse 采用了先进的解析技术,能够有效地提取PDF文档中的文本、图像和表格等内容,并将其转化为结构化的数据。通过与 LlamaIndex 的无缝整合,LlamaParse 不仅提高了解析的准确性和效率,还大大降低了处理复杂文档所需的成本。这一技术的出现,为RAG模型处理复杂PDF文档提供了一个强大的工具。
然而,尽管 LlamaParse 在解析和处理PDF文档方面表现出色,但在处理密集的非结构化文本数据时,仍然存在一些局限性。这时,SuperpoweredAI 推出的 spRAG 框架就显得尤为重要。spRAG是一个专门用于处理密集非结构化数据的RAG框架,特别适用于处理复杂的查询,如财务报告、法律文件和学术论文等。
与LlamaParse相比,spRAG在处理复杂查询方面有着显著的优势。它采用了两种关键技术:AutoContext和Relevant 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