自然语言处理中的检索增强生成研究综述

ops/2025/2/25 3:34:16/

一、摘要

本文的讨论内容:

  • 本文综述了各种重要的检索技术,特别是检索器和检索融合技术。
  • 本文进一步讨论了RAG的训练,包括有/没有数据存储更新的RAG。
  • 然后介绍了RAG在具有代表性的自然语言处理任务和工业场景中的应用。
  • 最后,探讨了RAG未来的发展方向和面临的挑战,以促进RAG的发展。

二、RAG概述

1.检索增强生成(RAG)的三个模块:

1.检索器(retriever)

检索器(Retriever)模块通常包含三个组成部分:

  • 用于将输入编码为嵌入(embeddings)的编码器(encoder)
  • 支持近似最近邻搜索的高效索引(efficient indexing)
  • 以及以键值对(key-value pairs)形式存储外部知识的数据存储(datastore)

 检索器模块的主要挑战:

如何在检索效率和检索质量之间找到最佳平衡

检索效率 指的是获取相关信息的速度,这涉及编码加速、高效索引、数据存储中的批量查询等。

检索质量 指的是检索到的信息与查询的相关性,这涉及块表示学习(chunk representation learning)、先进的近似最近邻搜索算法等。

2.生成器(generator)

生成器(Generator)模块可以分为两类生成器:

  • 默认生成器(default generators) 包括大多数预训练/微调的大型语言模型,如 GPT 系列模型 、Mistral 模型 [71] 和 Gemini 系列模型。
  • 检索增强生成器(RA generators) 指的是由融合检索模块组成的预训练/微调生成器,如 RETRO和 Enc-Dec。这些生成器用于生成响应或进行预测。

3.检索融合(retrieval fusions)

检索融合(Retrieval Fusions)旨在利用检索到的信息来增强生成过程。这些融合技术可分为三大类:

  • 基于查询的融合(query-based fusion) 在将输入传递给生成器之前,通过检索结果对输入进行增强。
  • 基于 logits 的融合(logits-based fusion) 关注生成器的输出 logits,并融合检索得到的 logits,以提高 logits 的稳健性。
  • 潜在融合(latent fusion) 通过将检索表示(retrieval representations)引入生成器的潜在表示(latent representations),从而在隐式层面上提升模型性能。

三、检索器(Retriever)

使用检索器的两个阶段:首先构造检索器,然后是查询检索器

1.构造检索器

如何使用大型自然语言语料库构建检索器,该过程包括三个步骤:

  • 分块语料库(chunking corpus)
  • 编码块(encoding chunks)
  • 构建向量数据库(building the vector database):构建向量数据库包括构建近似最近邻(ANN)索引,并以键值对(key-value pairs)的形式存储数据。

如图:

1. 语料块划分(Chunking Corpus)

语料块划分技术通常指将大型文档划分为较小的文本块 。相关文档:[10, 13, 43, 65, 111]

其核心思想:是为了提高检索效率和质量,确保每个文本块都能传达明确的、独立的核心思想,便于后续模型的处理

语料块划分的目的:

  • 文本块被划分为较小的片段,每个片段都包含一个明确的核心思想或主题。这使得检索系统能够更加准确地理解和检索相关信息。
  • 划分成较短的文本块后,每个块的长度较短,因此能够显著降低编码过程中的计算和内存开销。

语料块划分技术的主要挑战:是找到最佳的划分大小,以在文本语义和编码效率之间取得最佳平衡

 解决上述挑战,在确定语料块划分大小时需要考虑三个关键点:

  • 根据你的任务场景的需要:不同的任务场景,要求的划分大小不同
  • 根据你使用的编码器的属性:不同编码器对不同长度文本的编码能力不同。sentence-transformer [125] 模型在处理单句时表现更好,而 text-embedding-ada-002 [113] 在处理较长文本时效果更佳。
  • 根据你查询的文本长度和切分的块也要匹配

 语料块划分技术有三种类型:

  • 固定长度划分(Chunking with fixed length) 是最简单的方式,按顺序使用长度超参数将文档划分为块。
  • 语义划分(Semantic chunking) 根据语义划分文档,例如使用句点字符或换行符来表示句子的结束。现有的最先进自然语言处理工具包,如 NLTK [112] 和 spaCy [33],提供了方便的句子切割方法。
  • 基于内容的划分(Content-based chunking) 根据文档的独特结构特征对其进行分段。例如,电子病历可以根据章节轻松划分,或者编程代码可以根据函数块进行划分。

2. 编码块(encoding chunks)

编码:是指将文本块转化为向量表示(嵌入)。这些嵌入通常捕捉了语料块的语义,使得检索器能够基于内容相关性进行相似度搜索,而不仅仅是进行关键词匹配。

 根据嵌入的稀疏性,编码方法可以分为两种:

稀疏编码:稀疏编码通过创建高维向量来表示文本,其中大多数元素为零。基本的稀疏编码是独热编码(one-hot encoding)[50],它用与词汇表大小相等的高维向量表示一个词,但只将表示该词存在的元素标记为 1,其余元素为零。由这种编码生成的嵌入称为独热向量。

其他常见稀疏编码:

        (1) 词袋模型(BoW)[51]。这种编码通过用词频替代零一计数来改进独热编码。然而,BoW 忽略了文档中的语法和词序,专注于统计信息,因此只能表达有限的语义。 

        

        (2) 词频-逆文档频率(TF-IDF)[120]。这种编码不仅统计每个词的出现频率,还根据词在所有文档中的普遍性来调整这些计数。

稀疏编码是一种高效的文本块编码方式。然而,这种编码可能无法捕捉更深层次的语义含义。

 密集编码:生成的向量每个维度可以捕捉一系列语义特征,且大多数元素为非零浮点值。密集嵌入通常由(深度)神经网络模型生成。如下一些编码器:

BERT及其变体 [29]:生成密集的语义嵌入,捕捉上下文信息。其他BERT变体,如RoBERTa [99]、DistilBERT [128] 和 ELECTRA [19],通过先进的学习技术进一步提高语义表示能力。

Siamese编码器:这是一种旨在学习输入之间相似性的神经网络,通常通过对比学习进行训练。现有的最先进的Siamese编码器包括DPR [79]、SimCSE [40]。

基于LLM的编码器:这种编码器得益于大模型(LLMs)的强大表示能力。典型的基于LLM的编码器有text-embedding-ada-002 [113]、bge-embedding [156]、mxbai-embedding [130]。

目前,这种编码广泛应用于大多数语义表示场景。 

3.构建向量数据库(building the vector database) 

(1)构建索引:索引是一个数据结构。向量数据库中的索引旨在加速与高维查询嵌入相似的数据的搜索过程。向量数据库中的索引主要集中在支持高效的近似最近邻(ANN)搜索[32, 47, 77],而不是像插入、删除和更新这样的事务操作。

索引的关键挑战:是如何在搜索质量和搜索效率之间找到一个良好的平衡。

解决这个挑战:有多种具体的优化可以探索:

相似性度量的选择:相似性度量是检索器中的基本组件,用于衡量查询嵌入与文本块嵌入之间的相关性。相似性度量会影响搜索质量。典型的相似性度量包括余弦相似度、欧氏相似度、曼哈顿距离和杰卡德相似度。

嵌入的降维(DR):降低嵌入维度以提高搜索效率的不同方法,但可能会损害语义表示。

主要的降维方法包括:

  1. 主成分分析(PCA):通过转换原始数据到新的坐标系,保留最重要的特征,达到降维目的,是一种简单有效的统计方法。

  2. 局部敏感哈希(LSH):通过将数据映射到桶中,减少维度,同时保留原始数据的相似性。LSH的直觉是将相似的数据点映射到相同的桶中。

  3. 乘积量化(PQ):将高维空间划分为独立的子空间,每个子空间有一个代码簿,生成紧凑的向量,用于高效的近似搜索。

  4. AutoCompressor: 是一种新的技术,通过压缩原始上下文生成更短的语义嵌入,进一步减少维度。

先进的ANN索引:ANN索引通常指用于组织和管理数据的方法或结构,以优化近似最近邻搜索过程中的检索质量和检索效率。几种先进的ANN索引技术:

  • 带乘积量化的倒排文件系统(IVFPQ):通过先对数据进行粗粒度聚类(IVF)来减少搜索空间,再通过细粒度量化(PQ)对每个聚类的数据进行压缩,确保高效且高性能的ANN搜索。

  • 分层可导航小世界(HNSW):使用分层图结构,将高维向量作为节点并连接最近邻。通过概率性地确定图的层次结构,减少高层次节点,提高搜索效率。

  • 基于树的索引:将高维向量组织为树状结构(如KD树、Ball树、VP树等),通过树的结构进行高效搜索。典型的基于树的索引如Annoy,它使用基于随机投影的树的森林来划分向量空间,从而加速ANN搜索。

系统级优化

硬件感知优化

(2) 使用键值对构建数据存储库:在向量数据库中使用的数据存储库是一种专门的数据库,它以键值对的形式存储和管理数据,其中键是高维嵌入的唯一标识符,值是领域特定的知识。(键是高维嵌入(编码),值是与嵌入对应的原文档或领域知识)

  • 数据存储库:向量数据库以键值对的形式存储数据,其中 是高维嵌入的唯一标识符, 是与嵌入对应的领域特定知识。由于存储的数据量可能非常大,数据存储引擎(如LMDB、RocksDB)需要高效地进行检索和数据持久化。

  • 存储值的问题:在ANN搜索中,存储值的选择是一个关键问题。例如,对于问答任务,常见的做法是将 问题嵌入 作为键,将 问题-答案对 作为值。这种方式有助于生成过程,因为检索到的结果可以作为模型的示范,指导生成更相关的答案。

  • 先进的向量数据库:近年来,提出了多种先进的向量数据库,包括 MilvusFAISSLlamaIndex,这些数据库结合了高效的索引和数据存储机制,支持大规模数据存储和快速检索。

构造检索器的详细步骤(代码):

输入:一个自然语言语料库 𝐷 = {𝑑₁, . . . , 𝑑ₙ} 用于构建知识数据库,一个编码器 E 用于对文本块进行编码。输出:索引 I 和键值存储 SK = {}, V = {};    #K保存键 V保存值for 𝑑𝑖 ∈ 𝐷 do:    #遍历语料库,到每个文档dic{1,i}....c{m,i} = chunk(𝑑𝑖);    #对每个文档进行切分快for j from 1 to m doe{j,i} = E(c{j,i});     #对每个块进行编码Add e{j,i} into K and c{j,i} + c{j+1,i} into V;    #将当前块的编码和当前块和下一块放在K, V里面#如果需要,K 和 V 会持久化存储在存储设备中(例如 SSD)。end for#使用 K 构建索引 I:就是把chunks编码的向量,用一种数据结构进行组织起来
#将 K 和 V 存储到键值存储 S 中
##索引I和K,V都是存储在持久化的设备上的
return I and S;

2.查询检索器

如何查询预构建的检索器,三个步骤:

1.把查询进行编码

为了与预构建的嵌入空间进行相似的查找,检索器在查询阶段使用相同的编码器来编码查询。

2. ANN搜索

就是在构建的索引数据结构中搜索相似的向量,找到前K个最相似的结果,也就是键。这个搜索过程取决于索引算法(索引结构) ,然后在检索这K个键对应的值。从数据存储库中检索值是指根据最近邻的键标识符获取对应的值。

3.后处理

 后处理涉及一系列在初步检索步骤之后进行的技术。这些技术旨在根据特定任务目标对检索结果进行优化、增强或调整。

重排序:重排序旨在根据特定任务的目标重新排序已检索的知识。

其概念是,知识的检索是基于任务无关的度量标准(如欧几里得距离)进行的。现有的重排序方法 [18, 56, 85, 141] 主要设计不同的架构或策略来重新排序已检索的知识。

 查询检索器代码实现:

输入:
一个查询输入 𝑞,一个用于编码块的编码器 E,索引 I(用来加速查找的),键值存储 S,参数 𝑘。输出:
Top-𝑘 最近邻知识e = E(q)    #对查询进行编码{idx1,....idxk} = I.Search(e,k)    #查找前k个最相似的(最近邻){v1,.....vk} = S.Fetch({idx1,....idxk})    #查找对应的值(文档),这些用于融合的知识
##上面的这三步依赖于编码器、索引、和数据存储的特定的API{vj1,....vjk} = PostProcess({v1,....vk})    #进行后处理:如renrank重排return {vj1,....vjk}

四、检索融合(retrieval fusions)

 检索融合:是指如何利用检索到的知识来提升生成器的性能。三种类型的检索融合:

1.基于查询的融合

基于查询的融合是最简单和最直接的融合技术,就是将检索到的信息与输入的查询结合起来,生成响应。按照拼接信息的类型可分为:文本拼接、特征拼接

1.文本拼接:

就是使用检索的原始文本和查询的融合。有以下三个研究:

  • 第一个研究[49, 87, 122]直接将输入与前 k 个检索到的句子/文档拼接,形成生成器的查询
  • 第二个研究[34, 90, 141, 145]为了更好的利用大模型的上下文学习能力,设计了提示模板,来整合检索的信息和输入
  • 第三个研究[5, 96, 101, 150, 159]为了解决拼接后输入过长,提出了为检索到的知识库中的元素分配重要性权重,并基于这些权重过滤掉不相关的上下文

2.特征拼接:

通过检索后得到的结果进行编码,同样对查询也进行编码,编码成稀疏向量或者稠密向量,然后把这两个向量拼接在一起。输入到LLM的嵌入层。

  • 段落1的编码:E(段落1)
  • 段落2的编码:E(段落2)
  • 查询的编码:E(查询)

拼接后的特征向量可能是:

  • E(查询) + E(段落1)
  • E(查询) + E(段落2)

使用特征拼接的好处:

  • 向量拼接的优势

    • 提供了更高效、更语义化的表示。
    • 保留了核心的上下文信息,减少了冗余。
    • 更容易处理输入的长度和大小。
    • 向量表示能够更好地适应任务,特别是在生成任务中(如问答、摘要等)。
  • 直接拼接文本的挑战

    • 文本的冗余信息可能会影响模型的处理效率。
    • 可能会超出输入限制或导致上下文理解困难。
    • 可能需要更多的计算资源来处理较长的文本。

拼接向量 通常比 直接拼接文本 更适用于需要高效语义理解的任务,尤其是在使用生成模型时。

代码演示:

输入:
一个查询输入 𝑞,前 k 个最近邻知识 {𝑣1, . . . , 𝑣𝑘},用于特征拼接的编码器 E𝑓 和解码器 D𝑓,文本拼接的生成器 G输出:
生成的响应 𝑦if 使用文本连接 then𝑥 = 𝑣1 ⊕ . . . ⊕ 𝑣𝑘 ⊕ 𝑞;    #拼接检索后的结果和查询的向量#为了防止拼接过长,导致被截断,所以提示词模板在这一步很重要𝑦 = G(𝑥);    #将结果给生成器,产生结果elseeq = Ef(q), evj = Ef(vj), 𝑗 ∈ {1, . . . , 𝑘};    #对查询和检索的结果进行向量编码ex = 𝑒𝑞 ⊕ 𝑒𝑣1 ⊕ . . . ⊕ 𝑒𝑣𝑘;    #拼接向量y = Df(ex)end ifreturn y;

2..基于 logits 的融合

检索到的知识直接融合到模型输出层的技术,目的是增强或校准模型的预测。模型通过这些知识来调整其输出的logits,从而改善或调整预测结果。

步骤:就是通过输入查询得到检索的结果,然后,在把查询直接输入给LLM得到logits(未经过softmax进行处理的原始输出),然后,检索到的知识被用于调整已经生成的logits实现方法:

  • 将检索到的知识与模型的预测结果结合(融合)(例如通过加权平均,或者通过一些校准机制);
  • 通过集成多个模型的预测结果,或对logits进行校准,来确保预测结果更符合上下文或查询相关的知识。

最后,大模型才输出结果

 logits 基于的融合可以分为两个分支,即基于集成的融合和基于校准的融合。

基于集成的融合:

先通过原始的LLM把查询放入LLM中得到logits,然后在来一个rag模型,得到检索文档的logits,然后把这两个logits进行加权平均融合

基于集成的融合可以显著提高模型的泛化能力和鲁棒性 [80, 81, 158]

基于集成的融合的一个显著工作是 kNN-LM [81],该方法聚合了 top-𝑘 最近邻的目标 logit 值,然后对最终预测进行插值。与 kNN-LM 类似,Khandelwal 等人 [80] 提出了 kNN-MT,通过检索的 logit 来增强机器翻译,这一方法也得到了后续一些工作的跟进 [64, 172]。

基于校准的融合:

将检索到的知识的 logits(模型的原始输出)作为一种校准手段来调整模型的预测。

模型会使用外部检索到的知识的 logits 来对其预测进行校准。具体来说:

  • logits:是模型在给定输入时对每个可能翻译单词的未归一化输出。假设NMT模型为每个词预测了一个概率分布(logits),比如“猫”这个词的概率可能为0.7,“地毯”这个词的概率为0.6。
  • 校准过程:外部检索的知识(比如 “猫坐在地毯上”)的 logits 会被用作校准因素。如果检索到的翻译在上下文中更合适(例如在这个特定情况下,“地毯”比“垫子”更常见),那么基于外部知识的 logits 会影响模型原本的预测,使得 “地毯” 的概率提升,从而调整最终翻译结果。

使用基于 logits 的融合来集成检索知识的详细步骤 :

输入:
查询输入 𝑞,前 𝑘 个最近邻知识 {𝑣1, . . . , 𝑣𝑘},生成器 G输出:
生成的响应𝑦𝑞 = G(𝑞);    #原始模型的查询的logitsfor j from 1 to k doyvj = G(vj)    #用检索的文档来生成logitsend for                if 使用集成方法 then𝑦 = 𝜆Ej𝑦𝑣𝑗 + (1 − 𝜆) 𝑦𝑞;

3.潜在融合

潜在融合 研究如何将检索到的知识融合到生成器的隐藏状态中,以提高生成质量。根据引入方法的不同,潜在融合可以进一步分为两类:基于注意力的方法和加权相加的方法。

基于注意力融合:是一种将外部知识(如检索到的文本)与模型的内部表示(如隐藏状态)结合的技术。在这种方法中,模型可以通过“注意力”机制,有选择性地将外部信息整合进自身的推理过程中。Retrieval-Enhanced Transformer(RETRO)一个基于注意力融合的实现

RETRO优势:效率与可扩展性、性能与参数量的平衡:能够在不牺牲性能的情况下,保持较低的计算开销

除了 RETRO,其他研究 [12, 26, 93, 151, 154] 也通过利用新的注意力模块引入外部知识,为该领域做出了贡献。典型的例子包括,Li 等人 [93] 通过将上下文编码与模型推理解耦,扩展了 RETRO 模型。Wu 等人 [154] 和 Wang 等人 [147] 将隐藏的注意力键和值存储到外部记忆中,并通过注意力机制从记忆中检索知识。

加权相加: 注意力机制的高复杂度,Fevry 等人 [38] 提出了 EAE 模型,该模型从可学习的外部记忆中检索 top-𝑘 相关实体的嵌入,并将实体的嵌入添加到模型的隐藏状态中。Wu 等人 [153] 提出了 ReFusion,探索了各种可学习的重排序方案,首先重新加权检索到的知识嵌入,然后通过加权加法将其融入模型的隐藏状态中。这些方法标志着向动态选择和整合相关知识的模型的趋势,为更复杂和细致的语言生成与理解铺平了道路。

五、生成器

六、RAG训练

RAG训练,它可以分为两类:

不更新数据存储的RAG:仅更新RAG中每个模块的可训练参数,而数据存储中的知识在训练阶段保持不变

更新数据存储的RAG:数据存储中的知识会被更新,RAG中每个模块的参数也会被更新。

1.不更新数据存储的RAG

目标是根据现有的知识数据存储库,更新生成器中存储的短期记忆知识。RAG在训练过程中并不修改或增加存储在数据库中的知识,而是通过检索数据库中的信息来增强生成模型的能力

有三种训练情况,即训练检索器、训练生成器以及联合训练检索器和生成器。

 训练检索器:

通常指训练检索器编码器并重建索引。由于稀疏编码通常依赖于无参数的统计方法,因此训练编码器仅涉及密集编码方法。训练检索器编码器后,作为向量数据库中的键的嵌入也会发生变化。因此,所有索引应使用新嵌入重新构建。如果编码器保持不变,则可以使用新的ANN搜索算法或重新调整超参数来更新索引。在训练完检索器后,可以直接将其纳入RAG中,而不需要更新生成器。

 训练生成器:

训练生成器涉及更新其参数或检索融合模块中的参数。

尽管检索融合模块中的参数少于生成器中的参数,但仅微调这些参数可能会遇到一些训练问题,例如低收敛性和过拟合。如果有足够且强大的资源,同时微调生成器和检索融合模块中的参数是训练生成器和检索融合模块的更好方法。

联合训练检索器和生成器:

除了独立训练检索器和生成器外,联合训练检索器和生成器也是提升下游任务表现的一个不错选择。

复杂的索引(如FAISS)是一种用于高效相似性搜索和聚类的库,通常用于检索任务。FAISS 在检索阶段非常高效,但在微调时并不适合直接选择。但联合训练能够更好地协调检索器和生成器的工作,使得检索过程与生成过程相互促进,从而提高下游任务的性能。

2. RAG 与数据存储更新

涉及两个阶段:更新知识数据库,然后训练检索器和生成器。

更新知识数据库有三种情况:

1.使用可训练嵌入更新:知识数据库中的每个条目(例如问题-答案对)被表示为一个嵌入向量,这些嵌入是可以训练的。这意味着不仅是生成器和检索器的参数在训练时被更新,数据库中的嵌入也可以同时或异步更新。

2.使用新值更新:更新现有条目的值,例如一个已经存在的问题-答案对的答案发生了变化。更新值的过程通常包括查询现有的键值对,并直接对其进行更新。这可以确保数据库中的内容始终保持最新和准确。

3.使用新语料更新:此过程涉及将新的问题-答案对添加到数据库中。新的问答对被插入到存储库中,之后需要重建或更新与这些新数据相关联的索引。这是扩展知识库的一种方式,可以不断地将最新的信息加入其中,以提高模型的回答质量。

这些更新有助于提高模型的准确性和实时性,而在某些情况下,通过上下文学习,模型可以在不重新训练的情况下适应新的数据库内容。

七、任务

自然语言处理领域中的几个经典任务,并介绍了用于解决这些任务的先进RAG技术。

1.问答

QA系统大体上可以分为两类:开放域,系统可以回答几乎任何问题;封闭域,系统专注于特定领域的知识。

QA的主要挑战是理解问题的意图,并从海量数据中检索准确、相关的信息,以提供简洁的答案。

开放域 QA 系统通常首先需要从互联网上或大规模数据库中搜索知识,然后根据检索到的知识生成相应的答案。

自然地,给定类似的问题和相应的答案作为示范,将它们拼接成输入后 [60, 90, 145],RAG 中的生成器可以学习问题和答案之间的模式,并推断出应生成的答案。

此外,Fabbri 等人 [34] 专注于设计有效的模板,用于重新组织拼接的上下文。

Baek 等人 [7] 利用知识图谱检索与输入问题相关的事实,然后将它们与输入一起送入生成器。

另一类研究则专注于将检索到的嵌入与输入嵌入结合,应用于编码器-解码器模型 [25, 66, 67, 127]。

 一些研究将外部知识融入生成器的隐藏状态或最终的 logits 中。

对于隐藏状态中的融合,关键在于应该注入什么类型的知识,如实体 [26, 38]、片段 [10, 142] 或文档 [15]。对于 logits 中的融合,大多数研究通过集成技术将检索到的 logits 与输入的 logits 进行组合 [49, 87, 110, 131]。

一些研究 [45, 94, 116] 将检索到的问答对作为额外的训练数据。 

一些研究优化了检索模块,例如,在构建检索器数据库时提高键的表示 [121]、用预训练的排名模型替换索引 [163],或启用通过两个查询检索短语 [109]。 

 一些研究则关注加速 RAG 的生成效率。Jong 等人 [24] 提出了层稀疏交叉注意力来加速解码。

 一些研究 [6, 74, 149] 观察到检索结果在生成过程中并不总是提供有用信息,并学习在何时检索。

 Sun 等人 [137] 将 RAG 与代理结合,通过迭代推理得出最终结果。

八、应用 

 框架:Langchain [84] 和 LLaMAindex [95]

  • Langchain 提供了语言模型与外部知识源互动的框架,使生成模型能够动态地使用外部知识。
  • LLaMAindex 提供了高效且相关性强的检索支持,优化了检索过程。
  • 两者结合,使得 RAG 系统 不仅依赖于内部知识库,还能实时访问并整合外部资源,从而生成更加准确、信息丰富的回应。

九、讨论与未来方向

1.检索质量

检索质量指的是提高在RAG中检索到的信息的相关性,这涉及到以下四个关键因素的设计。

 第一个考虑因素(分块)

是确定在向量数据库中使用的最佳关键字。这个过程通常需要主观决策,并且需要人工努力才能有效设计。一个简单的想法是为给定任务选择输入,将每个任务视为一个问答问题。

第二个因素是选择嵌入模型:

下一步是利用嵌入模型将文本转换为向量表示。像BERT [29]、RoBERTa [99]或领域特定的嵌入模型在捕捉细微差别和上下文含义方面可能至关重要。将嵌入模型调整以更好地适应特定类型的数据或查询,可以显著提高检索质量。这需要在特定领域的语料库上训练模型,语料库应包括系统将要遇到的查询和文档类型。

第三,设计有效的相似度度量也是提高检索质量的关键:

相似度度量的目标是衡量查询与检索到的信息之间的相关性。一些经典的相似度度量,如余弦相似度或欧氏距离,用于推荐系统中的排名,也可以用于RAG [44]。除了这些度量外,一些研究还探索了更复杂的相似度度量,如最优传输距离 [21],以获得特定任务的相似度。

 第四,近似最近邻(ANN)搜索:

近似最近邻(ANN)搜索也是决定应返回哪些知识作为最近邻的关键步骤。先进的ANN搜索旨在提高检索效率,但通常会以牺牲检索质量为代价。选择合适的ANN算法,如产品量化 [68] 或HNSW [102],需要在检索效率和检索质量之间找到一个良好的平衡。所有这些因素共同作用,决定了检索器的检索质量。

 2.RAG效率

RAG效率对于下游NLP应用至关重要,它限制了可以检索的数据量。有两种简单的方法可以确保RAG效率而不需要新的算法,即减少数据量或增加更强大的计算和内存资源。然而,前者可能会影响检索质量,而后者则需要更多的资源成本。

RAG效率包括检索器的效率和检索融合的效率

检索器效率指的是检索相关信息的时间成本,可以分为三个部分:

编码时间、ANN搜索时间和数据存储库的数据获取时间。无需同时优化这三部分,因为瓶颈会因不同的数据库大小而有所不同。对于较小的检索数据库,例如少于100万条条目的数据库,编码阶段通常是主要的瓶颈,因为向量数据库可以全部存储在内存中。一些技术,如模型量化 [8, 82]、蒸馏 [30, 75] 或模型剪枝 [39],被用来加速编码。

搜索涉及大量数据,而数据获取则涉及I/O开销。在这种情况下,高效的ANN搜索算法 [32, 47, 77] 和系统级优化 [73, 76] 是主要的关注点。

检索融合效率旨在优化在整合检索结果时的推理效率,对于提高RAG效率是值得优化的。例如,由于长序列长度,基于查询的融合的计算开销通常是不可忽视的。一些研究,如Fid-light [55] 和 ReFusion [153],主要针对在整合检索到的信息时减少计算量。

 3.融合选择

本文介绍了三种类型的检索融合,每种融合都值得进一步探索。基于查询的融合将检索到的知识的文本或嵌入与输入连接。这些方法具有较好的可解释性,并且即使仅提供LLM的API时也容易应用。然而,连接会导致输入序列过长,从而在注意力机制中产生较大的计算开销,并可能导致输入被截断。一些研究[5, 153]旨在提高整合检索结果时的效率,而另一些研究[9, 147]则专注于在增加模型输入长度时提高效率。

相反,基于潜在的融合在更深层次、更加抽象的层面上融合信息,这可能捕捉到检索信息与查询之间更细致的关系。然而,这些融合方法显著缺乏可解释性,通常需要预训练或微调来调整检索嵌入或重新加权检索结果。因此,增强此类基于潜在的融合的可解释性也是未来值得探索的方向。

 基于logits的融合在决策层面整合信息,从而提供了一种更灵活和强大的数据融合方式。然而,这些融合可能会简化融合过程,通过将检索到的信息归结为logit值,减少了检索信息的丰富性。同时,此类融合需要对所有检索结果进行推理,这也是一个耗时的过程。

 除了在实际应用中应用一种融合方法外,结合不同的融合方法以获得更好的性能也是值得探索的。这些融合方法并不是互相排斥的,因为它们侧重于增强生成器的不同阶段,即输入、隐藏状态和输出。此外,在生成过程中,何时融合检索到的知识也是一个值得进一步探索的重要问题 [103]。

4.训练

对于不带数据存储更新的RAG,主要的挑战是如何联合优化RAG中的所有参数。这可能涉及新的损失函数,具有多个目标的优化,检索器和生成器中参数高效调优的新优化方法,或其他训练策略。

 对于带有数据存储更新的RAG,一个挑战是如何将检索表示与生成器的表示对齐。尽管数据存储中更新操作的时间成本不可忽视,但一些工作[14]通过异步更新减少了更新频率,从而实现了知识表示和模型表示的对齐。

另一个挑战是在添加新语料库时,何时重新训练/微调RAG中的生成器。由于现有基于LLM的生成器具备上下文学习能力且训练开销较大,重新训练/微调生成器或直接推理生成器在不同场景下成为一个具有挑战性的选择。最近,一些高效的训练策略[28, 57]被提出以加速微调过程,这些可以作为考虑因素。 

5.跨模态检索 

在NLP任务中检索跨模态信息可以大大提高表示的质量和丰富性,从而提升性能。 

首先,跨模态信息,如将文本与图像、视频或音频相结合,为内容提供了更丰富的上下文。例如,当语言含糊不清时,附带的图像可以澄清一些仅通过文本难以表达的含义。

 其次,不同的模态可以提供单一来源无法访问的各种类型的信息。例如,视觉数据可以提供空间、颜色和动作提示,而文本数据则可以提供详细的描述、情感或抽象概念。将这些信息结合起来,可以更全面地理解数据。

 训练于多模态数据的模型通常表现出更高的鲁棒性和泛化能力。这些模型擅长关联来自不同输入的信息,减少了对单一模态特征的过拟合。这种特性在现实世界的NLP应用中尤为重要,例如在自动驾驶车辆中,系统必须解读来自路标或对话的文本信息,并结合周围环境的传感器数据做出明智的决策。

 多模态数据可以解决单一模态无法解决的歧义。例如,"bank"一词可以指代金融机构或河岸,而视觉上下文可以帮助消除歧义。

 人类的交流本身就是多模态的,包含诸如手势、面部表情和语音语调等元素。能够处理多种交流方式的系统能够以更自然和直观的方式与人类互动。

总之,将跨模态信息集成到RAG中的NLP任务不仅可以增强数据表示的丰富性和质量,还显著提升系统的理解能力、互动能力和适应各种应用场景的能力。 


http://www.ppmy.cn/ops/161102.html

相关文章

【多线程-第三天-NSOperation的练习-tableView异步下载网络图片-下载操作缓存池 Objective-C语言】

一、下载操作缓存池 1.下面我们来看操作缓存池,我们先演示一下问题,看看为什么要加这么一个操作缓存池,什么是操作缓存池,不用管呢,我们先来看啊,首先有什么问题, 看这个问题之前,我这儿写一个touch,点击屏幕的时候调用, 额,不能点击屏幕啊,因为现在屏幕点不着,我…

Nginx学习笔记:常用命令端口占用报错解决Nginx核心配置文件解读

Nginx 1. 基础命令1.1 重新加载systemd配置1.2 停止Nginx服务1.3 启动Nginx服务1.4 重启Nginx服务1.5 查看Nginx服务状态1.6 测试配置和重载Nginx 2. 额外命令2.1 启用开机自启2.2 禁用开机自启2.3 强制关闭所有Nginx进程 3. Nginx端口占用解决方案3.1 查找占用端口8090的进程3…

【在 Debian Linux下安装 privoxy 将 Socks5 转换为 HTTP 代理与privoxy的过滤配置】

在 Debian Linux下安装 privoxy 将 Socks5 转换为 HTTP 代理与 privoxy 的过滤配置 Privoxy 代理的特点Privoxy 与其他代理的明显区别安装 Privoxy配置 Privoxy将 Socks5 转换为 HTTP 代理重启 Privoxy 服务使用 Privoxy 代理不同场景的过滤配置1. 打开配置文件2. 修改请求头部…

浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器

1、谷歌浏览器下载: 情况一:如果谷歌应用商店可以打开,那么就直接到谷歌应用商店下载,直接搜索vue.js.devtools添加扩展即可。 情况二:谷歌浏览器的谷歌应用商城打不开,那么就百度搜索极简插件找到vue.js.…

C语言之递归

目录 前言 一、递归原理 二、栈溢出 三、案例 1、两个整数的最大公约数 2、裴波那契序列 3、汉诺塔 ​4、判断是否为回文数 总结 前言 递归在计算机科学中是一个重要的概念,它指的是一个函数直接或间接地调用自身的过程。在C语言中,递归通常用于…

CSS中伪类选择器

作用:选中特殊状态的元素 如何理解"伪"?--虚假的,不真实的 如何理解"伪类"?--像类(class),但是不是类,是元素的一种特殊的状态. 一.动态伪类选择器 1. :link 超链接未被访问的状态; 2. :visited 超链接访问过的状态; 3. :hover 鼠标悬停在元素…

1.1 go环境搭建及基本使用

golang下载地址: Download and install - The Go Programming Language (google.cn) 验证安装是否成功: go version 查看go环境 go env 注意:Go1.11版本之后无需手动配置环境变量,使用go mod 管理项目,也不需要把项目放到GO…

基于数据可视化学习的卡路里消耗预测分析

数据分析实操集合: 1、关于房间传感器监测数据集的探索 2、EEMD-LSTM模型择时策略 — 1.EEMD分解与LSTM模型搭建 3、EEMD-LSTM模型择时策略 — 2. 量化回测 4、国际超市电商销售数据分析 5、基于问卷调查数据的多元统计数据分析与预测(因子分析、对应分…