自学内容网 自学内容网

检索增强生成

检索增强生成

检索增强生成简介

检索增强生成(RAG)旨在通过检索和整合外部知识来增强大语言模型生成文本的准确性和丰富性,其是一个集成了外部知识库、信息检索器、大语言模型等多个功能模块的系统。

RAG 利用信息检索、深度学习等多种技术为大语言模型在生成过程中引入最新的、特定领域的知识,从而克服传统大语言模型的局限性,提供更加精准和可靠的生成内容。

检索增强生成的背景

  1. 训练数据的局限性

    • 知识过时:模型可能无法获取实时或最新的信息。例如,ChatGPT的训练数据截止到2022年,因此不能准确回答有关2023年的问题。
    • 知识边界:训练数据可能在一些特定领域中的信息覆盖不全,导致模型对这些领域知识的匮乏。
    • 偏见与虚假信息:因数据来源于互联网,可能会包含偏见或错误的信息,从而影响模型的输出。
  2. 模型自身的问题

    • 知识长尾:训练数据中某些信息出现频率较低,模型的学习效果就会较差。
    • 曝光偏差与解码偏差:模型训练和推理阶段的不同可能导致结果的不一致,随机解码策略也可能影响最终输出的准确性。
  3. 检索增强生成(RAG)

    • 作为解决方案,引入外部信息的RAG方法能够有效减少幻觉现象。通过查找相关知识,模型能更准确地回答问题,弥补了其内部知识的不足。

检索增强生成的组成

检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种结合了信息检索和文本生成的自然语言处理技术。它的核心思想是利用外部知识库来增强语言模型的生成能力,从而提高在知识密集型任务中的性能。

  1. 外部知识库(Corpus):RAG依赖于一个外部的知识库,通常是大规模的文本集合,如维基百科,用于提供问题相关的背景知识。

  2. 信息检索器(Retriever):检索器负责理解用户的查询,并从知识库中检索出与查询相关的文档或信息片段。

  3. 生成器(Generator):生成器通常是一个大型的语言模型,它结合检索到的知识和原始查询来生成最终的输出。

RAG的工作流程如下:

  • 用户提出一个自然语言问题(Query)。
  • 检索器将问题编码并从知识库中检索相关文档。
  • 检索到的文档和原始问题一起被传递给生成器。
  • 生成器利用这些信息生成回答。

RAG的优势在于:

  • 改善幻觉现象:不需要更新语言模型的内部知识,就可以改善生成质量,减少错误信息的产生。
  • 避免灾难性遗忘:更新内部知识可能会覆盖旧知识,RAG通过外部知识避免了这一问题。
  • 计算成本:避免了频繁更新大型语言模型的计算成本。

RAG系统的设计和优化可以从以下几个方面进行:

  1. 检索器与生成器的协作:分为黑盒增强架构白盒增强架构,前者不访问模型内部参数,后者允许对语言模型进行微调。

  2. 检索过程的优化:包括知识库的构建和优化、查询增强、检索器的选择和优化、检索效率的提升以及重排优化。

  3. 增强过程的优化:确定何时需要检索增强、在生成过程中何处插入检索信息、针对复杂查询的多次增强策略以及降本增效的知识压缩和缓存加速策略。

检索增强生成架构

RAG 架构分类

在这里插入图片描述

黑盒增强架构

黑盒增强架构是RAG系统中的一种实现方式,特别适用于那些无法访问或修改大语言模型内部参数的情况,例如只能通过API与模型交互的场景。在这种架构下,大语言模型被视为一个黑盒,只能通过输入和输出与之交互。以下是黑盒增强架构的两种主要类型:

1. 无微调架构

无微调架构是最简单的RAG实现方式,其中检索器和语言模型分别独立预训练,之后直接组合使用,不进行进一步的参数更新。这种架构的优点是:

  • 计算资源需求低:不需要对模型进行微调,因此对计算资源的需求较低。
  • 易于实现和部署:由于不需要对模型进行微调,这种架构易于实现和部署,适合对部署速度和灵活性有较高要求的场景。

In-Context RALM是无微调架构的一个代表性方法。它将检索到的文档作为上下文直接前置到输入问题前,然后输入给大语言模型。这种方法包括检索和生成两个阶段:
在这里插入图片描述

  • 检索阶段:输入的问题或部分句子作为查询从知识库中检索出相关文档。
  • 生成阶段:检索到的文档被直接拼接到Prompt中的上下文部分,然后将Prompt输入给大语言模型。

在执行检索操作时,需要考虑的关键参数包括检索步长和检索查询长度。这些参数的选择会影响到模型的响应速度和信息的即时性。

2. 检索器微调架构

尽管无微调架构易于实现,但它没有考虑检索器与语言模型之间的协同效应。为了进一步提升效果,可以采用检索器微调架构对检索器进行微调,以更好地适应大语言模型的需求。

REPLUG LSR是检索器微调框架的一个代表性方法。它使用大语言模型的困惑度分数作为监督信号来微调检索器,使其能更有效地检索出能够显著降低语言模型困惑度的文档。

REPLUG LSR采用KL散度损失函数来训练检索器,目的是对齐检索到的文档的相关性分布与这些文档对语言模型性能提升的贡献分布。
在这里插入图片描述

REPLUG LSR的关键步骤包括:

  • 文档概率分布:基于检索器计算的上下文与文档之间的相似度,通过余弦相似度来衡量,并将这些相似度分数转化为概率值。
  • 文档对语言模型的贡献分布:语言模型为每个被检索到的文档和原始上下文生成预测,最终所有输出结果形成一个概率分布。

REPLUG LSR将语言模型视为黑盒处理,仅通过模型的输出来指导检索器的训练,避免了对语言模型内部结构的访问和修改。此外,REPLUG LSR还采用了异步索引更新策略,降低了索引更新的频率,减少了计算成本。

AAR方法通过引入额外的小型语言模型,使用它的交叉注意力得分标注偏好文档,以此来微调检索器,使其能够在不微调目标语言模型的情况下增强其在不同任务上的表现。

白盒增强架构

  1. 仅微调语言模型

    • RETRO:RETRO是一种仅微调语言模型的方法,它通过修改语言模型的结构,使得在微调过程中能够将从知识库中检索到的文本直接融入到语言模型中间状态中,实现外部知识对大语言模型的增强。

      RETRO首先将知识库中的文本切块,然后用BERT对每个文本块生成嵌入向量。在自回归过程中,模型生成一段文本块后,就去知识库中检索出与之最相似的嵌入向量,然后这些嵌入向量和模型注意力层的输出一起被送入一个外部的Transformer编码器进行编码,得到的编码向量直接输入给模型的块交叉编码器的键(key)和值(value),以捕捉外部知识的关键信息。
      在这里插入图片描述

    • SELF-RAG:SELF-RAG通过在微调语言模型时引入反思标记,使语言模型在生成过程中动态决定是否需要检索外部文本,并对生成结果进行自我批判和优化。

  2. 检索器和语言模型协同微调

    • Atlas:Atlas是检索器和语言模型协同微调的代表性工作。它在预训练和微调阶段使用KL散度损失函数来联合训练检索器和语言模型,以确保检索器输出的文档相关性分布与文档对语言模型的贡献分布相一致。

      Atlas在预训练和微调过程中,检索器和语言模型参数同步被更新,检索器学习向语言模型提供最相关的文档,而语言模型则学习如何利用这些文档来改善其对查询的响应。为了确保检索结果与模型最新状态保持同步,Atlas同样需要定期更新语料库文档的向量编码,从而维持检索的准确性。

      在这里插入图片描述

对比与分析

黑盒增强架构
优势
  1. 快速部署

    • 无需对模型进行微调,可以快速将预训练模型投入使用,适合对时间敏感的任务。
  2. 简单性

    • 无需复杂的训练过程,减少了系统的复杂性,易于实现。
  3. 稳定性

    • 利用已知的模型性能,可以在某些场景下保持较为稳定的输出。
劣势
  1. 灵活性不足

    • 不支持根据特定任务进行模型调整,可能导致在新任务上的表现不佳。
  2. 性能限制

    • 尽管检索器微调能带来一定提升,但最终性能依然受限于语言模型固有的能力。
白盒增强架构
优势
  1. 高度灵活性

    • 允许对语言模型进行微调,可以根据具体任务需求进行定制化调整,提升模型的适应性。
  2. 优化潜力

    • 协同微调可以更好地协调检索器和语言模型,使其在互动中共同提升性能。
  3. 更强的性能

    • 通过针对性微调,能够实现更高的准确性与相关性,特别是在复杂场景下。
劣势
  1. 计算资源需求高

    • 协同微调和参数优化需要大量的计算资源与时间,对于小型团队或项目可能成为负担。
  2. 训练复杂性

    • 微调流程可能复杂,需调整参数、监控训练进度,要求研究人员具备较高的技术能力。

知识检索

在这里插入图片描述

知识库构建

1. 数据采集及预处理

数据采集

  • 整合数据:从不同渠道收集数据,并将其整合、转换成统一的文档对象。
  • 元信息:文档对象不仅包含文本信息,还包含元信息,如文章标题、分类信息、时间信息、关键词等,这些信息有助于后续的检索和过滤。

数据预处理

  • 数据清洗:清除文本中的干扰元素,如特殊字符、异常编码和无用的HTML标签,删除重复或高度相似的冗余文档,提高数据的清晰度和可用性。
  • 文本分块:将长文本分割成较小的文本块,如将一篇长文章分为多个短段落。这样做的好处包括:
    • 适应检索模型的上下文窗口长度限制。
    • 减少长文本中的不相关内容,降低噪音,提高检索效率和准确性。
  • 分块策略:制定合适的分块策略,包括确定切分方法(如按句子或段落切分)、设定块大小,以及是否允许块之间有重叠。
2. 知识库增强

知识库增强

  • 查询生成:利用大语言模型生成与文档内容紧密相关的伪查询,这些伪查询作为文档的“键”,在检索时与用户查询进行匹配,增强文档与用户查询的匹配度。

  • 标题生成:为没有标题的文档生成合适的标题,提供文档的关键词和上下文信息,帮助快速理解文档内容,并在检索时更准确地定位到与用户提问相关的信息。

    对于那些原始文档中缺乏标题的情况,通过语言模型生成的标题显得尤为重要,它们提供了文档的关键信息,有助于检索时的快速定位。

查询增强

查询增强技术的目的是通过提供更多样化和全面的查询,来提高检索系统对用户查询的理解和响应能力。这种方法尤其适用于知识库中存储的文本与用户提问方式存在差异的情况,有助于提升检索效果和生成内容的质量。

  1. 查询语义增强

    • 同义改写:这种方法通过将用户的原始查询改写成具有相同语义的不同表达方式,来增加检索到相关知识的机会。例如,对于查询“考拉的饮食习惯是什么?”可以改写为“考拉主要吃什么?”、“考拉的食物有哪些?”和“考拉的饮食结构是怎样的?”等。这些改写后的查询可以独立检索文档,然后将结果合并和去重,形成一个更大的相关文档集合。
    • 多视角分解:这种方法将复杂查询分解为多个子查询,每个子查询从不同的角度检索信息。例如,对于查询“考拉面临哪些威胁?”可以分解为关于栖息地丧失、气候变化、人类活动和自然灾害对考拉影响的子问题。这样可以得到来自不同视角的信息,综合这些信息可以生成一个更全面的答案。
  2. 查询内容增强

    • 生成背景文档:这种方法通过使用大语言模型生成与原始查询相关的背景文档,来丰富查询内容。例如,对于查询“如何保护考拉的栖息地?”可以生成一个背景文档,提供关于考拉栖息地的详细信息,如考拉的分布、食物来源和栖息地类型等。这些背景文档作为补充信息,可以提高检索结果的相关性和丰富性。

检索器

检索器是RAG系统中的关键组件,负责从知识库中检索与用户查询相关的文档。检索器可以分为两大类:判别式检索器生成式检索器

1. 判别式检索器

判别式检索器通过判别模型对查询和文档是否相关进行打分,分为稀疏检索器稠密检索器

(1) 稀疏检索器

稀疏检索器使用稀疏表示方法来匹配文本,主要基于词频的统计特征来对文档进行编码,然后计算查询与文档的相似度。典型的稀疏检索技术包括:

  • TF-IDF(Term Frequency-Inverse Document Frequency):基于词频(TF)和逆文档频率(IDF)来衡量词语的重要性。其计算公式如下:
  1. 词频(TF)
  • 定义:词频是指特定单词(或词项)在文档中的出现次数与该文档中所有单词的总数的比率。它表示一个词在某个特定文档中出现的频繁程度。
  • 公式
    t f i , j = n i , j ∑ k n k , j tfi,j = \frac{ni,j}{\sum_k n_{k,j}} tfi,j=knk,jni,j
    • 其中:
      • n i , j ni,j ni,j:单词 t i t_i ti 在文档 d j d_j dj 中出现的次数。
      • ∑ k n k , j \sum_k n_{k,j} knk,j:文档 d j d_j dj 中所有单词的总出现次数。
  1. 逆文档频率(IDF)
  • 定义:逆文档频率用于减少常见词(如“的”、“是”、“在”等)的权重,而增加在少数文档中出现的具有更多信息内容的词的权重。IDF越高,表示该词在整个文档集中的稀有程度越高。
  • 公式
    i d f i = log ⁡ ∣ D ∣ ∣ j : t i ∈ d j ∣ idfi = \log \frac{|D|}{|{j : ti \in d_j}|} idfi=logj:tidjD
    • 其中:
      • ∣ D ∣ |D| D:文档集合的总数。
      • ∣ j : t i ∈ d j ∣ |{j : ti \in d_j}| j:tidj:包含词 t i t_i ti 的文档数量,反映该词在文档中的分布情况。
    • 注意:为了避免除以零的情况,通常会加一个平滑常数。
  1. TF-IDF值
  • 定义:TF-IDF的最终值是词频和逆文档频率的乘积,用于表示一个词在文档中的重要性。具体来说,TF-IDF值越高,表明该词对文档的贡献越大。

  • 公式
    t f i d f i , j = t f i , j × i d f i tfidfi,j = tfi,j \times idfi tfidfi,j=tfi,j×idfi

  • BM25:一种在TF-IDF基础上改进的文本检索算法,通过文档长度归一化和词项饱和度调整,更精确地评估词项重要性。

(2) 稠密检索器

稠密检索器利用预训练语言模型对文本生成低维、密集的向量表示,通过计算向量间的相似度进行检索。主要分为交叉编码类双编码器类

  • 交叉编码类:端到端地给出查询和文档的相似度,将查询和文档拼接在一起,利用预训练语言模型(如BERT)生成向量表示,并通过分类器输出相似程度。适用于对少量候选文档进行精确排序的阶段。

  • 双编码器类:查询和文档各自通过独立编码器生成向量表示,然后计算这两个向量之间的相似度。此方法效率高,适合工业环境,具有高匹配效率。

    DPR(Dense Passage Retriever是双编码器的代表,使用BERT编码器将查询和文档映射到特征向量,再通过向量点积衡量相似度。

在这里插入图片描述

2. 生成式检索器

生成式检索器通过生成模型对输入查询直接生成相关文档的标识符(DocID),与判别式检索器不同,生成式检索器将知识库中的文档信息记忆在模型参数中。此类检索器通常采用基于Encoder-Decoder架构的生成模型(如T5、BART)。其训练过程分为两个阶段:

  • 第一阶段:通过序列到序列的学习方法,学习如何将查询映射到相关的文档标识符,主要通过最大似然估计(MLE)优化模型。

  • 第二阶段:通过数据增强和排名优化提高检索效率和准确性,数据增强可通过生成伪查询或使用文档片段来增加训练数据的多样性,排名优化则涉及使用特定的损失函数调整生成文档标识符的顺序和相关性。

生成式检索器的DocID设计至关重要,需要在语义信息的丰富性与标识符的简洁性之间取得平衡。常用的DocID形式分为基于数字的DocID和基于词的DocID。

检索效率增强

检索效率增强是提高大规模知识库检索性能的关键技术,特别是在处理海量文本数据时。为了提升检索效率,可以引入向量数据库,从而实现高效的向量存储和查询。这些数据库的核心在于设计高效的相似度索引算法。

1. 相似度索引算法

相似度索引算法主要分为三大类:基于空间划分的方法基于量化的方法基于图的方法

基于空间划分的方法
  • 基于树的索引方法:通过递归地划分空间形成树状结构,如KD树Ball树。在查询时,算法从树的根节点开始,逐步深入到合适的叶节点,最后在叶节点内进行相似度比较以找到最近的向量。
  • 基于哈希的方法:例如局部敏感哈希(LSH),通过哈希函数将向量映射到哈希表的不同桶中,使得相似向量通常位于同一桶内。
基于图的方法

通过构建邻近图,将向量检索转化为图的遍历问题。在索引构建阶段,每个向量表示图中的一个节点,根据向量间的距离或相似性建立边的连接。

此方法受小世界网络模型启发,旨在创建一种结构,使得从任意入口点出发能在较少步数内到达查询点的最近邻。这类方法代表性有NSWIPNSWHNSW等,稀疏图和稠密图的权衡也是此类方法设计中的一大挑战。

基于量化的方法

乘积量化(PQ),通过将高维向量空间划分为多个子空间,并在每个子空间中进行聚类得到码本和码字,以此构建索引。该方法的训练和查询过程包括:

  • 训练阶段:学习如何将高维向量量化为码字ID序列,聚类后用聚类中心点作为码字和码本。
  • 查询阶段:将查询向量划分为子向量,在每个子空间中找到最近的码字,形成距离表,并利用此表进行近似距离的计算。

在需要精度更高的应用场景中,可以在PQ的基础上进行精确排序,以获取更准确的最近邻结果。此外,还有一些乘积量化的优化算法和结合其他索引的算法,如OPQIVFPQ

2. 常见软件库介绍

在了解相似度索引算法后,接下来介绍几种常用于构建和管理向量数据库的软件库,这些库支持上述相似性索引算法,是实现高效向量检索的重要工具。

  • Faiss:由Meta AI Research开发的库,专门用于优化密集向量相似性搜索和聚类。Faiss提供多种索引算法,支持CPU和部分GPU加速,适用于多种应用场景。然而,Faiss本身并不是一个完整的数据库系统,而是一个功能强大的工具库,专注于高效的索引和搜索功能,在数据存储、管理、分布式支持和安全性等方面相对有限。

  • 其他向量数据库:市场上已有多款成熟的向量数据库,它们不仅包括相似度索引算法,还整合了数据存储、管理、分布式支持和安全性等多方面的功能。这些向量数据库能够支持更复杂的RAG(检索增强生成)应用场景。

通过这些相似度索引算法和软件库的使用,可以显著提高向量检索的效率,这对构建高效的检索系统至关重要。在实际应用中,选择合适的索引算法和软件库需根据具体的业务需求和数据特性进行决策。

向量数据库URLGitHub Stars
MilvusGitHub - milvus-io/milvus28.4K
TypesenseGitHub - typesense/typesense19.0K
QdrantGitHub - qdrant/qdrant18.9K
ChromaGitHub - chroma-core/chroma13.7K
WeaviateGitHub - weaviate/weaviate10.4K
PineconePinecone官网×

检索结果重排

在使用检索器时,可能会检索到与查询相关性不高的文档。

如果将这些文档直接输入给大型语言模型,可能会导致生成质量下降。因此,必须对检索到的文档进行进一步的精选,主要通过重排步骤来提高文档的质量。

重排的主要方法分为两类:基于交叉编码的方法基于上下文学习的方法

1. 基于交叉编码的重排方法

基于交叉编码的重排方法利用**交叉编码器(Cross-Encoders)**来评估文档与查询之间的语义相关性。交叉编码器通常将查询和文档拼接在一起,然后使用深度学习模型来评估它们的匹配程度。

一个著名的示例是MiniLM-L5,它是一种广泛应用的开源重排模型。该模型通过减少层数和隐层单元数来降低参数数量,同时使用知识蒸馏技术从大型、高性能的语言模型中继承学习,以提高模型性能。

2. 基于上下文学习的重排方法

基于上下文学习的重排方法利用大型语言模型执行重排任务,这种方法利用了模型的深层语义理解能力,取得了良好的效果。RankGPT是基于上下文学习的重排方法中的一个代表性案例。其使用的Prompt模板如下:

这是RankGPT,一款智能助手,专门用于根据查询的相关性对段落进行排序。
以下是{{num}}段文字,每段都有一个数字标识符[ ]。我将根据查询内容对它们进行排序:{{query}}
[1] {{passage_1}}
[2] {{passage_2}}
(更多段落)...
查询是:{{query}}
我将根据查询对上述{{num}}段文字进行排序。这些段落将按照相关性降序列出,使用标识符表示,最相关的段落将列在最前面,输出格式应该是[ ] > [ ] > 等,例如,[1] > [2] > 等。
对{{num}}段文字的排序结果(仅限标识符)是:

在重排过程中,输入文档的长度有时可能超过上下文窗口的限制。为了解决这个问题,RankGPT采用滑动窗口技术来优化排序过程。

这一技术将所有待排序的文档分割成多个连续的小部分,每个部分作为一个窗口。整个排序过程从文档集的末尾开始,首先对最后一个窗口内的文档进行排序,并将排序后的结果替换原始顺序。然后,窗口按照预设的步长向前移动,重复排序和替换的过程。这个过程将持续进行,直到所有文档都被处理和排序完毕。通过这种分步处理的方法,RankGPT能够有效地对整个文档集合进行排序,而不受限于单一窗口所能处理的文档数量。

生成增强

何时增强

重要性
  1. 避免不必要的增强:盲目增强可能会增加计算成本,并且可能降低生成效率和质量。
  2. 内部知识(Self-Knowledge):大语言模型在训练过程中掌握了大量知识,称为内部知识。对于这些问题,不需要外部增强。
  3. 错误增强的风险:检索到的外部知识可能包含噪声,输入给大语言模型可能会生成错误内容。
判断是否需要增强的方法
  1. 外部观测法

    • 直接询问:通过Prompt直接询问模型是否需要外部知识。
    • 多次询问:通过多次询问模型同一个问题,观察回答的一致性来判断是否具备内部知识。
    • 观察训练数据:通过分析模型的训练数据来判断其是否掌握了相关知识。
    • 构造伪训练数据统计量:当训练数据不可获取时,设计伪训练数据统计量来拟合训练数据的相关情况,如利用Wikipedia的页面浏览量来衡量实体的流行度。
  2. 内部观测法

    • 内部状态检测:在模型参数可访问的情况下,通过分析模型内部的隐藏状态来评估其知识掌握情况。
    • 探针方法:训练分类器根据模型的内部表示预测问题是属于模型“已知”还是“未知”。

在这里插入图片描述

  • 模型的不确定性:模型展现出的不确定性可能源于对问题的知识缺失,也可能是问题本身固有的模糊性或歧义性所致。
  • 黑盒模型的局限性:依赖于内部状态的检测方法不适用于黑盒语言模型,因为无法直接访问其内部隐藏状态。

何处增强

在这里插入图片描述

何处增强的三种方式
  1. 在输入端增强

    • 这种方法将检索到的外部知识文本与用户查询拼接到Prompt中,然后输入给大语言模型。这是一种主流的增强方法,重点在于Prompt设计以及检索到的外部知识的排序。良好的设计可以使模型更好地理解、利用外部知识。
  2. 在中间层增强

    • 利用注意力机制的灵活性,先将检索到的外部知识转换为向量表示,然后将这些向量插入通过交叉注意力融合到模型的隐藏状态中。Retro方法就是采用这种方式的典型代表,能够更深入地影响模型的内部表示,有助于模型更好地理解和利用外部知识。
  3. 在输出端增强

    • 利用检索到的外部知识对大语言模型生成的文本进行校准,是一种后处理的方法。模型首先在无外部知识的情况下生成一个初步回答,然后再利用检索到的外部知识来验证或校准这一答案。REFEED框架是此类方法的典型代表,可以确保生成的文本与外部知识保持一致,提高答案的准确性和可靠性。

多次增强

多次增强是处理复杂或模糊问题时的一种有效策略,它涉及到对问题进行多次迭代检索和增强,以确保生成的答案既正确又全面。以下是两种主要的多次增强方案:

分解式增强

分解式增强主要针对复杂问题,这类问题通常包含多个知识点,需要多跳理解。在这种情况下,模型可以将问题分解为多个子问题,并在子问题间迭代地进行检索增强,最终得出正确结论。

DEMONSTRATE–SEARCH–PREDICT(DSP)框架是这种增强方式的一个代表性例子。

DSP框架包含三个模块:

  • DEMONSTRATE模块负责将复杂问题分解为子问题;
  • SEARCH模块对子问题进行迭代检索增强;
  • PREDICT模块根据SEARCH提供的综合外部知识生成最终回答。

这种分解式增强将复杂问题化整为零,降低了单次检索增强的难度,但其性能很大程度上取决于子问题分解的质量。

渐进式增强

渐进式增强主要针对模糊问题,这类问题指代范围不明,难以一次就理解问题的含义。

TREE OF CLARIFICATIONS(TOC)框架是渐进式增强的代表性框架。

TOC框架通过递归式检索来引导大语言模型在树状结构中探索给定模糊问题的多种澄清路径。

例如,对于问题“国宝动物爱吃什么?”,TOC框架首先启动第一轮检索,根据检索到的相关文档和原始问题,生成一系列具体的细化问题,然后针对每个细化问题,框架独立展开深入的检索并对问题进一步细化。最终,TOC框架能够构建出多条完整的知识路径,每条路径的末端都代表了对原始问题的不同但有效的解答,通过整合所有有效的叶节点,得出一个精确且全面的长回答。

这两种多次增强的方法都是为了处理复杂或模糊问题,通过多次迭代检索和增强来提高大语言模型的生成质量和准确性。它们各自适用于不同的场景,并且在实际应用中可以根据具体的需求灵活选择或组合使用。

降本增效

在检索增强生成(RAG)系统中,为了降低计算成本并提高效率,我们可以采取两种主要策略:去除冗余文本和复用计算结果。以下是这两种策略的详细介绍:

1. 去除冗余文本

为了减少输入Token的数量和提高生成的相关性及准确性,可以对检索出的原始文本进行处理,去除不必要的信息:

  • Token级别方法:通过评估每个Token的重要性来剔除冗余信息。困惑度可以作为判断Token重要性的一个指标。例如,LongLLMLingua框架利用小模型评估Token的困惑度,并基于此删除冗余文本。

  • 子文本级别方法:通过对子文本进行打分来删除不必要的部分。FIT-RAG方法使用双标签子文档打分器从事实性和模型偏好程度两个维度评估文档的有用性,并删除评分较低的子文档。

  • 全文本级别方法:直接从整个文档中提取重要信息。PRCA方法通过训练信息提取器提炼重点内容,分为上下文提取阶段和奖励驱动阶段,最终得到的信息提取器可以直接将输入文档转化为压缩文本。

2. 复用计算结果

为了优化RAG效率,可以对计算必需的中间结果进行复用:

  • KV-cache机制:在自回归过程中,为了避免对每个Token都重新计算前面的Key和Value的结果,可以将之前计算的Key和Value的结果进行缓存。RAGCache设计了一种多级动态缓存机制,通过树结构缓存文档KV张量,并通过缓存检索器快速查找缓存节点。

  • PGDSF替换策略:RAG控制器采用前缀感知的贪婪双重尺度频率替换策略,综合考虑文档节点的访问频率、大小、访问成本以及最近访问时间,使得频繁使用的文档能够被快速检索到。

  • 重排策略:通过调整请求的处理顺序,优先处理那些能够更多利用缓存数据的请求,以减少重新计算的需求。

  • 动态推测流水线策略:通过并行KV张量检索和模型推理的步骤,有效减少了端到端延迟。

实践与应用

搭建简单 RAG 系统

RAG因其优越性能和广泛应用场景而备受关注。我们将介绍如何使用两个开源框架——LangChainLlamaIndex来搭建简单的RAG系统,并概述它们的特色和核心功能。

LangChain与LlamaIndex

1. LangChain
  • LangChain旨在简化利用大型语言模型进行应用程序开发的整个过程,提供一系列模块化组件,以帮助开发者部署基于大型语言模型的应用,包括构建RAG框架。
  • 主要包含六大模块:
    • Model IO:各种大型模型的接口及Prompt设计组件。
    • Retrieval:核心组件,包括文档加载、文本分割、向量构建、索引生成和向量检索。
    • Chains:将各个模块链接起来逐个执行。
    • Memory:存储对话过程中的数据。
    • Agents:利用大型语言模型决定自动执行的操作。
    • Callbacks:帮助开发者在各个阶段干预和监控。
2. LlamaIndex
  • LlamaIndex则更专注于数据索引与检索,能够迅速构建高效的检索系统。
  • 具备从多种数据源(如API、PDF文件、SQL数据库等)中提取数据的能力,并提供高效的工具来对这些数据进行向量化处理和索引构建。
  • 支持对上下文信息进行过滤、重新排序等精细化操作,并且能够与LangChain框架结合,进一步增强功能。

基于LangChain搭建简单RAG系统

1. 安装与配置

首先,安装LangChain框架及其依赖项:

pip install langchain langchain_community langchain_chroma
2. 数据准备与索引构建

使用WebBaseLoader从网页中加载内容并解析为文本:

from langchain_community.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://example.com/page")
docs = loader.load()

使用TextSplitter将长文档分割成更小的块:

from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)

使用向量存储和嵌入模型来编码和存储分割后的文档:

from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
3. RAG系统构建

创建检索器:

retriever = vectorstore.as_retriever()

设置OpenAI的API密钥并指定模型:

import os
os.environ["OPENAI_API_KEY"] = 'your_api_key'
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")

设置提示模板:

from langchain import hub
prompt = hub.pull("rlm/rag-prompt")

使用LangChain表达式语言(LCEL)构建RAG链:

from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser

def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# 使用RAG链回答问题
response = rag_chain.invoke("What is Task Decomposition?")
print(response)

通过以上步骤,开发者能够方便快捷地使用LangChain构建一个基础的RAG系统。LangChain提供了一系列强大的工具和组件,使得构建和整合检索与生成变得简单而高效。

RAG 的典型应用

1. 智能体(Agent)

RAG 在智能体系统中扮演着重要角色。在智能体主动规划和调用各种工具时,需要检索并整合多样化的信息,以更精确地满足用户需求。RAG 通过提供所需的信息支持,帮助智能体在处理复杂问题时展现更好的性能。

在这里插入图片描述

以一个典型的智能体框架为例,该框架主要包含四大部分:配置(Profile)、记忆(Memory)、计划(Planning)和行动(Action)。在这些模块中,记忆模块、计划模块与行动模块均融入了 RAG 技术,以提升整体性能。

  • 配置模块:设定智能体的基本信息,如年龄、性别、职业等基本属性,以及反映其个性和社交关系的信息。

  • 记忆模块:存储从环境中学习的知识和历史信息,支持记忆检索、更新和反思等操作。RAG 在此模块中检索相关信息,辅助记忆的读取和更新。

  • 计划模块:赋予智能体将复杂任务分解为简单子任务的能力,并根据记忆和行动反馈不断调整。RAG 在此模块中通过提供相关信息,帮助更合理有效地规划任务。

  • 行动模块:将智能体的计划转化为具体行动,包括网页检索、工具调用和多模态输出等,能够对环境或智能体自身状态产生影响。RAG 通过检索相关信息,辅助智能体的决策和行动执行。

例如,用户询问:“我现在在澳大利亚,我想去抱考拉,应该怎么办?”智能体通过以下步骤完成任务:

  1. 角色配置:初始化为旅游顾问,确定任务目标是协助用户与考拉亲密接触。

  2. 任务规划:确定考拉的地点、了解当地法律、规划出行建议。RAG 提供相关的旅游景点和法律法规信息,确保规划精准。

  3. 信息检索:首先在记忆中检索已有信息,如果不全,则激活行动模块调用外部知识源(如旅游网站)进行检索。

  4. 信息整合与决策:利用检索到的信息制定最佳行动方案,并向用户推送推荐地点和注意事项。

  5. 信息输出:最后将详细的路线规划和相关地点描述整合输出给用户。

该示例清楚展示了各个模块如何协同工作,以及 RAG 在其中迅速检索和整合信息的关键作用。

2. 多模态垂直领域应用

除了文本领域,RAG 系统在多模态数据的垂直领域展现了广阔的应用前景。例如,在医疗领域,多模态数据普遍存在,包括 X 光片、MRI、CT 扫描等影像资料,以及病历、生理监测数据等。RAG 系统必须具备融合和洞察这些不同模态数据的能力,以实现高效精确的应用。
在这里插入图片描述

以医学领域的多模态检索框架为例,该框架的工作流程如下:

  1. 特征提取:提取图像与文本的特征表示,深入理解图像内容与问题语义。

  2. 多模态检索:利用提取的特征向量在医学知识库中进行精准检索,获取与输入问题相关的信息,如医学案例、症状描述等。

  3. 信息整合:将检索到的信息进行整合,辅助模型生成准确的回答。比如,若询问“这张 X 光片的症状是什么?”,模型可能生成答案“心肌肥大”。

除了医疗领域,RAG 在金融、生物学等领域也展现了强大的处理能力,提高了专业人士的决策效率。随着技术进步和数据资源的丰富,未来 RAG 有望在更多垂直领域和数据模态中发挥关键作用。


原文地址:https://blog.csdn.net/qzhqbb/article/details/143661493

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!