当前位置:   article > 正文

模块化的RAG和RAG流程:第一部分_rag 文档规范

rag 文档规范

RAG的压缩和高级总结。

在第一部分中,我们将重点介绍模块化RAG的概念和组成部分,包括6种模块类型,14个模块和40多个运算符。

 简介

在过去的一年里,检索增强生成(RAG)作为实现LLM应用的方法的概念引起了相当大的关注。我们撰写了一份关于RAG的综合调查报告,深入探讨了从天真的RAG到先进的RAG和模块化RAG的转变。然而,该调查主要通过增强的视角(例如增强源/阶段/过程)来审视RAG技术。

本文将重点介绍模块化RAG范式。我们进一步定义了一个三层的模块化RAG范式,包括模块类型、模块和操作符。在这个范式下,我们详细阐述了当前RAG系统中的核心技术,包括6种主要的模块类型、14个模块和40多个操作符,旨在提供对RAG的全面理解。

通过组织不同的运营商,我们可以得出各种RAG流程,这是我们在本文中要阐明的一个概念。根据广泛的研究,我们已经提炼和总结了典型的模式、几个具体的实施案例和最佳行业案例。(由于空间限制,这部分将在第二部分中讨论。)

本文的目标是提供对RAG发展现状的更深入理解,并为未来的进展铺平道路。

模块化RAG提供了许多机会,方便定义新的运算符、模块和配置新的流程。

我们RAG调查中的数据

 什么是模块化RAG?

RAG的进展带来了更多样化和灵活的过程,如下关键方面所示:

  1. 增强数据采集:RAG已经扩展到传统的非结构化数据之外,现在还包括半结构化和结构化数据,重点是对结构化数据进行预处理,以改善检索效果并减少模型对外部知识源的依赖。
  2. 整合技术:RAG正在与其他技术整合,包括微调、适配器模块和强化学习,以增强检索能力。
  3. 适应性检索过程:检索过程已经发展到支持多轮检索增强,利用检索到的内容来指导生成,反之亦然。

    此外,通过自主判断和使用LLM,确定检索的需求,提高了回答问题的效率。

模块化RAG的定义

以上,我们可以看到RAG的快速发展已经超越了链式高级RAG范式,展示了模块化的特点。为了解决当前的组织和抽象不足,我们提出了一种模块化的RAG方法,无缝地集成了天真RAG和高级RAG的开发范式。

模块化RAG呈现出一种高度可扩展的范式,将RAG系统划分为模块类型、模块和运算符的三层结构。每个模块类型代表RAG系统中的核心流程,包含多个功能模块。每个功能模块又包含多个具体的运算符。

整个RAG系统成为多个模块和相应操作符的排列组合,形成我们所称的RAG流程。

在Flow中,可以在每个模块类型中选择不同的功能模块,并且在每个功能模块中可以选择一个或多个运算符。

与之前的范式的关系

模块化的RAG以多层次的模块形式组织RAG系统。高级RAG是RAG的一种模块化形式,而天真的RAG是高级RAG的一个特例。这三种范式之间的关系是继承和发展的关系。

模块化RAG的机会

模块化RAG的好处是显而易见的,为现有的与RAG相关的工作提供了新鲜而全面的视角。通过模块化组织,相关技术和方法得到了清晰的总结。

  • 研究视角。模块化RAG具有高度可扩展性,使研究人员能够根据对当前RAG发展的全面了解提出新的模块类型、模块和运算符。
  • 应用角度。RAG系统的设计和构建变得更加方便,允许用户根据他们现有的数据、使用场景、下游任务和其他需求来自定义RAG流程。开发人员还可以参考当前的流程构建方法,并根据不同的应用场景和领域定义新的流程和模式。

模块化RAG的框架

模块类型 - 模块 - 运算符

在本章中,我们将深入探讨三层结构,并为RAG构建一个技术路线图。由于空间限制,我们将避免深入讨论技术细节;然而,我们将提供全面的参考资料供进一步阅读。

 索引化

索引化是将文本分解为可管理的块的过程,在组织系统中是一个关键步骤,面临着三个主要挑战:

  • 不完整的内容表示。块的语义信息受到分割方法的影响,导致在较长的上下文中丢失或淹没重要信息。
  • 不准确的块相似性搜索。随着数据量的增加,检索中的噪声也增加,导致频繁与错误数据匹配,使检索系统变得脆弱和不可靠。
  • 不明确的参考轨迹。检索到的块可能来自任何文档,没有引用路径,可能导致来自多个不同文档的块的存在,尽管在语义上相似,但包含完全不同主题的内容。

 块优化

较大的块可以捕捉更多的上下文,但也会产生更多的噪音,需要更长的处理时间和更高的成本。而较小的块可能无法完全传达必要的上下文,但它们的噪音较少。

  •  滑动窗口

使用重叠的块是平衡这些需求的一种简单方法。通过使用滑动窗口,语义转换得到增强。

然而,存在一些限制,包括对上下文大小的控制不精确,截断单词或句子的风险,以及缺乏语义考虑。

  •  小到大

关键思想是将用于检索的块与用于合成的块分开。使用较小的块可以提高检索的准确性,而较大的块可以提供更多的上下文信息。

具体而言,一种方法可以是检索较小的块,然后引用父ID来返回较大的块。或者,可以检索单个句子,并返回该句子周围的文本窗口。

详细信息和LlamaIndex实施。

  •  摘要

这类似于小到大的概念,首先生成较大块的摘要,然后在摘要上进行检索。随后,可以对较大块进行二次检索。

  •  元数据附件

块可以通过元数据信息进行丰富,例如页码、文件名、作者、时间戳、摘要或块可以回答的问题。随后,可以根据这些元数据进行检索过滤,限制搜索范围。请参阅LlamaIndex中的实现。

 结构组织

提升信息检索效果的一种有效方法是为文档建立层次结构。通过构建块状结构,RAG系统可以加快相关数据的检索和处理。

  •  分层索引

在文档的层次结构中,节点以父子关系排列,与它们链接的是块。每个节点存储数据摘要,帮助快速遍历数据,并协助RAG系统确定要提取的块。

这种方法还可以减轻由块提取问题引起的错觉。

构建结构化索引的方法主要包括:

  • 结构意识。文档中的段落和句子分割。
  • 内容感知。PDF、HTML、Latex中的固有结构。
  • 语义意识。基于自然语言处理技术,如利用NLTK,对文本进行语义识别和分割。

检查Arcus在大规模下的分层索引。

  •  KG组织文件

在构建文档的层次结构中利用知识图谱(KGs)有助于保持一致性。它勾勒了不同概念和实体之间的连接,显著减少了产生错觉的可能性。

另一个优势是将信息检索过程转化为LLM能够理解的指令,从而提高知识检索的准确性,并使LLM能够生成上下文连贯的回答,从而提高RAG系统的整体效率。

检查Neo4j的实现和LllmaIndex Neo4j查询引擎。

使用知识图谱来组织多个文档,您可以参考这篇研究论文《KGP:用于多文档问答的知识图谱提示》。

 2. 预检索

Naive RAG的主要挑战之一是直接依赖用户的原始查询作为检索的基础。准确清晰地提出问题是困难的,不明智的查询会导致检索效果不佳。

这个阶段的主要挑战包括:

  • 查询问题表达不清楚。问题本身很复杂,语言组织不好。
  • 语言复杂性和歧义。语言模型在处理专业词汇或具有多重含义的模糊缩写时常常遇到困难。例如,它们可能无法确定“LLM”是指大型语言模型还是法律背景下的法学硕士。

 查询扩展

将单个查询扩展为多个查询可以丰富查询的内容,提供进一步的上下文以解决特定细微差别的缺失,从而确保生成的答案的最佳相关性。

  •  多查询

通过使用LLMs来扩展查询,可以通过及时工程来并行执行这些查询。查询的扩展不是随机的,而是经过精心设计的。这个设计的两个关键标准是查询的多样性和覆盖范围。

使用多个查询的一个挑战是可能会削弱用户最初的意图。为了减轻这个问题,我们可以指示模型在提示工程中给予原始查询更大的权重。

  •  子查询

子问题规划的过程代表了在组合时生成必要的子问题,以对原始问题进行情境化和完全回答。这个添加相关背景的过程,原则上类似于查询扩展。

具体来说,可以使用从最少到最多提示的方法将复杂问题分解为一系列更简单的子问题。

推荐阅读
相关标签