看懂RAG-检索增强生成

一、RAG是什么

RAG就是一种使用来自私用或专有数据源的信息来辅助文本生成的技术。它将检索模型(设计用于搜索大型数据集或知识库)和生成模型(例如大型语言模型,此类模型会使用检索到的信息生成可供阅读的文本回复)结合在一起。

二、RAG工作原理是什么

  1. 第一阶段是知识索引,需要事先将文本数据进行处理,通过词嵌入等向量化技术,将文本映射到低维向量空间,并将向量存储到数据库中,构建起可检索的向量索引。在这个阶段,RAG涉及数据加载器、分割器、向量数据库、提示工程等组件以及LLM本身。
  2. 第二阶段是知识检索,当输入一个问题时,RAG会对知识库进行检索,找到与问题最相关的一批文档。这需要依赖于第一阶段建立的向量索引,根据向量间的相似性进行快速检索。
  3. 第三阶段是生成答案,RAG会把输入问题及相应的检索结果文档一起提供给LLM,让LLM充分把这些外部知识融入上下文,并生成相应的答案。RAG控制生成长度,避免生成无关内容。
    这样,LLM就能够充分利用外部知识库的信息,而不需要修改自身的参数。当知识库更新时,新知识也可以通过prompt实时注入到LLM中。这种设计既发挥了LLM强大的语言生成能力,又规避了其知识更新的困境,使之能更智能地回答各类问题,尤其是需要外部知识支持的问题。
    附一张RAG原理图 :
    在这里插入图片描述

三、RAG的优势和缺点是什么?

3.1 优势

  • 可以利用大规模外部知识改进LLM的推理能力和事实性。
  • 使用LangChain等框架可以快速实现原型。
  • 第一阶段的知识索引可以随时新增数据,延迟非常低,可以忽略不计。因此RAG架构理论上能做到知识的实时更新。
  • 可解释性强,RAG可以通过提示工程等技术,使得LLM生成的答案具有更强的可解释性,从而提高了用户对于答案的信任度和满意度。

3.2 缺点

  • 知识检索阶段依赖相似度检索技术,并不是精确检索,因此有可能出现检索到的文档与问题不太相关。
  • 在第三阶段生产答案时,由于LLM基于检索出来的知识进行总结,可能缺乏一些基本常识,从而导致无法应对用户询问知识库之外的基本问题。
  • 向量数据库是一个尚未成熟的技术,缺乏处理大量数据规模的通用方案,因此数据量较大时,速度和性能存在挑战。
  • 在推理时需要对用户输入进行预处理和向量化等操作,增加了推理的时间和计算成本。
  • 外部知识库的更新和同步,需要投入大量的人力、物力和时间。
  • 需要额外的检索组件,增加了架构的复杂度和维护成本。

四、RAG原理

1. Chunking and Vectorisation 分片和向量化

1.1 分片

Chunking(分块处理)是将长文本或大文档分割成较小的、易于处理的片段(chunks)的过程。这在处理大规模文本数据时尤为重要,因为许多NLP模型和算法在处理长文本时可能会遇到性能瓶颈或内存限制。分片的主要目的是:

  • 提高处理效率:将长文本分割成小块后,可以并行处理这些小块,从而提高处理速度。
  • 减少内存占用:处理较小的文本片段可以减小内存使用,避免内存溢出。
  • 适应模型输入限制:许多NLP模型(如Transformer)对输入文本的长度有上限,通过分块处理可以确保输入文本符合模型的长度要求。

1.2 向量化

Vectorisation(向量化)是将文本数据转换为数值向量的过程,以便于计算机处理和分析。在NLP中,向量化是文本表示的基础,常用的方法包括词袋模型(Bag of Words)、TF-IDF、词向量(Word Embeddings)和句向量(Sentence Embeddings)

2. 索引搜索

2.1 Vector store index - 向量存储索引

在向量存储索引中,数据通常以向量的形式表示,每个向量可以表示一个数据点的特征。例如,在自然语言处理任务中,文本可以被嵌入到高维向量空间中,每个向量代表一个句子或单词的语义特征。
在这里插入图片描述

2.2 Hierarchical indices - 分层索引

在层次化索引中,数据按层次结构组织,通常从根节点开始,逐级分为多个层级,每个节点可以有一个或多个子节点。这种结构类似于树形结构,常见的例子包括 B 树、B+ 树和 Trie 树等。
在这里插入图片描述

2.3 Hypothetical Questions and HyDE-假设情景提问

Hypothetical Questions 是指基于假设情境提出的问题。这种问题设计通常用于探索在不同假设下的可能结果或行为。HyDE 是一种用于增强文本理解和信息检索的技术,特别是在处理复杂查询和多步推理任务时。HyDE 的核心思想是通过生成假设文档嵌入(Hypothetical Document Embeddings)来改进模型的推理能力。
HyDE 包括以下步骤:

  1. 生成假设文档:基于用户的查询或问题,生成一个或多个假设文档。这些文档可以包含可能的答案或相关信息。
  2. 文档嵌入:将这些假设文档转换为向量表示(嵌入),使其能够在向量空间中进行相似性比较。
  3. 相似性搜索:在生成的假设文档嵌入和现有文档嵌入之间进行相似性搜索,以找到最相关的文档或答案。
    HyDE 方法的优势在于它能够通过生成和比较假设文档来增强模型的推理能力,从而在复杂查询和多步推理任务中表现更好。

2.4 Context enrichment-上下文补充

Context enrichment(上下文补充)是一种通过添加额外的相关信息来增强原始数据或查询的上下文的方法。上下文补充是指检索较小的文本片段以提高搜索质量,同时添加周围的上下文以便大型语言模型(LLM)进行推理。主要有以下几点:

  1. 检索较小的文本片段
    • 通过将文档分割成较小的片段(如段落、句子或更小的文本单元),可以更精细地匹配用户查询,从而提高检索的精确度。
    • 较小的片段可以减少噪音,使得检索结果更加相关和集中。
  2. 添加周围的上下文
    • 尽管较小的片段可以提高检索精度,但单独的片段可能缺乏足够的上下文信息,影响理解和推理。
    • 添加周围的上下文信息(如前后文)可以帮助大型语言模型更好地理解和推理,从而提供更准确和有意义的回答。
  3. 大型语言模型(LLM)的推理能力
    • LLM(如GPT-4)在处理自然语言任务时依赖于上下文信息进行推理和生成。
    • 提供充分的上下文可以帮助模型更准确地理解用户的查询和文档内容,从而提升回答质量。
2.4.1 Sentence Window Retrieval-窗口检索

窗口检索核心思想是通过在文档中提取和检索特定窗口大小的句子集合,以提高检索的精度和有效性。窗口检索的主要步骤是:

  • 先将文档切片成大小相同的块
  • 将切片后的块进行 Embedding 并保存到向量数据库
  • 根据问题检索出 Embedding 上下K个相似文档块
  • 将问题和检索结果一起交给 LLM 生成答案
    eg:
    在这里插入图片描述
2.4.2 Parent Document Retriever - 父文本检索

Parent Document Retriever 会在初步检索阶段选出与查询最相关的文档(即父文档),然后在这些文档中进一步进行更细粒度的检索,如句子或段落级别的检索。这种方法有助于在大规模文档库中快速定位相关内容,并提高后续精细检索的效率和准确性。这种方法的优点在于,它能够有效地缩小检索范围,提高检索速度,并且通过在相关文档中进行更精细的检索,能够提高检索结果的准确性和相关性。
在这里插入图片描述
文档被拆分成层次化的块,在检索时,我们检索到 k 个子块,如果有 n 个块引用同一个父块,则将它们替换为这个父块,并将其发送给大语言模型 (LLM) 进行答案生成。

2.5 Fusion retrieval or hybrid search-融合检索

融合检索(Fusion Retrieval) 是一种结合多个独立检索系统或算法的结果,以提高整体检索性能的方法。主要分以下类型:

  1. 结果融合(Result Fusion)
    • 将来自不同检索系统的搜索结果进行合并,例如通过投票、排序或加权平均等方法。
    • 这种方法可以利用不同系统的优势,弥补单一系统的不足。
  2. 特征融合(Feature Fusion)
    • 在检索过程中结合来自不同特征空间的信息,例如文本特征和图像特征。
    • 通过融合多种特征,可以提高检索的多样性和准确性。
  3. 模型融合(Model Fusion)
    • 结合多个检索模型,例如传统的TF-IDF模型和深度学习模型。
    • 通过综合不同模型的优点,可以提升检索效果。
      混合搜索(Hybrid Search) 是一种结合了基于关键词的检索(如布尔搜索、TF-IDF)和基于语义向量的检索(如基于BERT的向量搜索)的方法。通常包括:
  4. 关键词检索:使用传统的关键词匹配技术,如布尔搜索、TF-IDF、BM25等,快速筛选出与查询相关的文档。这种方法计算效率高,适合处理大规模数据。
  5. 语义检索:使用深度学习模型(如BERT、GPT等)将查询和文档转换为向量表示,进行语义相似度计算。这种方法可以捕捉到更深层次的语义信息,提高检索的准确性。
  6. 综合排序:将关键词检索和语义检索的结果进行综合排序,通常会使用一种加权机制,结合两者的得分。通过这种方式,可以在保证效率的同时,提高检索结果的相关性和精度。
    在这里插入图片描述
    通过结合这两种方法,混合搜索能够更全面地理解和匹配用户的查询,从而提供更相关和准确的检索结果。例如,当用户输入一个查询时,系统不仅会寻找包含这些关键词的文档,还会寻找那些在语义上与查询相关的文档。这种综合方法可以弥补单一搜索方法的局限性,提高检索的覆盖范围和准确性。

3. Reranking & filtering - 重排序和过滤

重排序是指对初步检索到的结果进行重新排序,以提高结果的相关性和质量。过滤是指从初步检索到的结果中去除不相关或低质量的结果,以确保最终呈现给用户的结果更为精确和相关。在LlamaIndex中主要用到了Node PostProcessor技术,Node PostProcessor主要是一个接收一组Node并且对其进行某种转化或过滤的模块。在LlamaIndex中,Node postprocessors通常在查询引擎中应用,在节点检索步骤之后和响应合成步骤之前。详情内容可参考:Node PostProcessor.

4. Query transformations - 查询转换

查询转换(Query Transformation)是指对用户输入的查询进行修改或调整,以提高其在信息检索系统中的效果和相关性。
当用户的问题比较复杂时,LLM会将问题拆解为多个子问题,将子问题喂给大模型,最终将子问题的答案整合返回给用户。在LangChain中MultiQueryRetriever模块主要处理对查询的拆解和转换。
在这里插入图片描述
这种理念的应用有LLM的回溯提示,回溯提示(Step-back prompting)是利用大型语言模型(LLM)生成一个更通用的查询,通过检索该查询,我们可以获得一个更通用或更高层次的上下文,这对于回答原始查询非常有用。对原始查询的检索也会执行,并且这两个上下文都会在最终答案生成步骤中输入到LLM中。

5.Chat Engine - 对话引擎

对话引擎是为了用户和大模型交互中的上下文问题,让大模型的回答可以参考之前的对话信息,主要实现逻辑是将过去一段时间的聊天对话数据和用户新的问题作为上下文同时输入给大模型。
在这里插入图片描述

6. Query Routing - 查询路由

在一个复杂的RAG系统中,查询路由是确保系统能够高效处理各种类型查询的关键。通过精确的路由,系统可以最大化利用现有资源,提供更高质量的响应。具体来说,query routing 包含以下几个步骤

  1. 查询理解(Query Understanding)
    • 语义解析:LLM 分析用户查询的语义,理解查询的核心意图和关键要素。
    • 上下文理解:如果查询是对话的一部分,LLM 会结合上下文信息,进一步理解查询的背景和用户的需求。
  2. 查询分类(Query Classification)
    • 意图识别:LLM 识别查询的具体意图,例如是询问事实、寻找资源、提出问题等。
    • 特征提取:从查询中提取出关键特征,如关键词、主题、领域等。
  3. 决策制定(Decision Making)
    • 路径选择:根据查询的特征和意图,LLM 决定将查询发送到哪个系统或执行哪种操作。例如,可以选择发送到特定的数据库、调用特定的API、或者使用特定的检索算法。
    • 资源分配:确定查询需要的计算资源和处理优先级,以优化系统性能和响应时间。
  4. 执行路由(Execution of Routing)
    • 查询转发:将查询转发到选定的处理路径或系统。
    • 反馈循环:根据处理结果和用户反馈,LLM 可以动态调整路由策略,优化未来的查询处理流程。

7. Agents in RAG - RAG代理

代理(Agents)是负责执行特定任务或一系列任务的模块或组件。RAG 系统结合了信息检索(Retrieval)和生成(Generation)的能力,通过代理的协作来实现复杂的查询处理和响应生成。以LlamaIndex中的Multi-Document Agents为例,每个文档中会有一个文档代理负责文档总结和一个总代理负责查询路由到文档代理。每个文档代理都有两个工具——一个向量存储索引和一个摘要索引,并根据路由的查询决定使用哪一个。而对于顶级代理,所有文档代理都是其工具。
在这里插入图片描述

8. Response Synthesiser - 响应合成

这是RAG功能链路的最后一节,根据检索到的文档和用户的提问产出最终的答案。如果将所有文档和问题同时输入给大模型,最终的结果可能并不完美,因此有以下几个方法比较重要:

  • 将检索到的上下文逐步输入给大模型,不断优化答案
  • 将上下文总结成一个prompt
  • 根据不同的上下文生成多个答案,最终将这些答案进行整合
    可参考:Response Synthesiser

参考文档

  1. https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d193d8fec6
  2. https://docs.llamaindex.ai/en/latest/module_guides/loading/ingestion_pipeline/
  3. https://api.python.langchain.com/en/latest/core_api_reference.html#module-langchain_core.chat_history
  4. https://www.pinecone.io/learn/chunking-strategies/
  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值