RAG综述:《A Comprehensive Survey of Retrieval-Augmented Generation (RAG)》

来源于《A Comprehensive Survey of Retrieval-Augmented Generation (RAG): Evolution, Current Landscape and Future Directions》

在这里插入图片描述

一、RAG所解决的问题

如何有效地从外部知识源检索相关信息,如何将这些信息无缝地融入到生成文本中,以及如何在保证生成文本流畅性的同时确保其事实性和上下文相关性。

二、组件

RAG(检索增强生成)主要包含以下两个关键组件:检索器和生成器。

1. 检索器(Retriever)

  • 功能:从外部语料库中获取与输入相关的文档或信息,为生成器提供知识来源,以增强生成文本的准确性和事实依据。
  • 常见算法及特点
    • BM25
      • 基于经典的信息检索算法,使用词频 - 逆文档频率(TF-IDF)对文档进行相关性排名。
      • 计算文档相关性分数时,考虑查询词在文档中的出现频率,并根据文档长度和词在语料库中的频率进行调整。
      • 优势在于简单高效,适用于基于关键词匹配的任务。然而,其在理解语义方面存在局限性,对于复杂的自然语言查询,由于无法捕捉词间关系,性能较差。
    • Dense Passage Retrieval(DPR)
      • 一种现代的检索方法,将查询和文档编码到高维向量空间。
      • 采用双编码器架构,分别对查询和文档进行编码,从而实现高效的最近邻搜索。
      • 擅长捕捉查询与文档之间的语义相似性,能基于语义含义检索相关信息,而非仅仅依靠关键词匹配。通过在大规模问答对语料库上训练,即使查询与文档无精确术语匹配,也能找到上下文相关的文档。
    • REALM(Retrieval-Augmented Language Model)
      • 将检索机制集成到语言模型的预训练过程中。
      • 创新之处在于学习检索对特定任务(如问答、文档总结)性能有提升作用的文档。在训练期间,同时更新检索器和生成器,使检索过程针对生成任务进行优化。
      • 其检索器不仅能找到与查询相关的文档,还能挑选出对生成准确、连贯回复有帮助的文档,从而显著提高生成回复的质量,尤其在需要外部知识的任务中表现突出。

检索时查询和文档是分别经过编码器,计算余弦相似度等距离,只能得到字面上相似的;重排时查询和文档同时经过一个编码器,得到一个logit,得到相关分数。

2. 生成器(Generator)

  • 功能:负责接收检索器获取的信息,并将其与输入查询相结合,生成最终的连贯、上下文相关的文本输出。主要还是大模型。
  • 常见模型及特点
    • T5(Text-to-Text Transfer Transformer)
      • 采用统一的文本到文本框架处理各种自然语言处理任务。
      • 能够通过微调适应广泛的任务,如问答、总结和对话生成等。
      • 在RAG系统中,将检索与生成相结合时,T5 - based RAG模型在多个基准测试中表现优于传统生成模型(如GPT - 3和BART),其多任务学习能力使其成为处理多样化知识密集型任务的理想选择。
    • BART(Bidirectional and Auto-Regressive Transformer)
      • 特别适合处理从含噪声输入生成文本的任务,如总结和开放域问答。
      • 作为去噪自编码器,能够重建损坏的文本序列,从而在处理不完整或含噪声数据时,生成连贯、准确的文本。
      • 当与检索器结合用于RAG系统时,BART通过基于外部知识生成文本,有效提高了生成文本的事实准确性。

三、多种模态的RAG

包括文本、音频、视频、多模态RAG。

1.文本RAG

基于文本的RAG模型是最成熟且研究最多的类别。这些模型利用文本数据进行检索和生成任务。

2.音频RAG

区别在于使用音频数据。

3.视频RAG

4.多模态RAG

多模态RAG模型整合来自多种模态的数据——文本、音频、视频和图像,以提供更全面的检索和生成任务方法。像Flamingo这样的模型将多种模态集成到一个统一的框架中,使得文本、图像和视频可以同时处理。跨模态检索技术是核心。

利用大量成对的图像和文本描述数据集,当用户查询与存储的文本描述相匹配时,系统加速图像生成(“检索作为生成”)。图像到文本功能允许用户基于输入图像进行讨论。

四、流行的框架

Agentic Retrieval-Augmented Generation for Time Series Analysis

在这里插入图片描述
当前时间序列分析方法存在局限,如依赖固定长度窗口、难以捕捉复杂趋势、SLMs 处理长序列能力有限等。检索增强生成(RAG)方法可增强文本生成能力,Agentic RAGs 能通过多步推理和迭代优化更好地满足复杂需求。
时序任务包括:预测、缺失数据插补、异常检测、分类任务。

论文所提出的框架通过利用分层的多智能体架构,为时间序列分析提供了一种新颖的方法。**它包含一个主智能体,该主智能体协调专门的子智能体,每个子智能体致力于特定的时间序列任务,如预测、异常检测或插补。**这些子智能体采用预训练的语言模型SLM,并利用提示池作为内部知识库,存储代表历史模式和趋势的键值对。通过从这些池中检索相关提示,子智能体可以用有关过去相关模式的上下文知识来增强其预测,使它们能够适应复杂时间序列数据中的各种趋势。该框架的模块化设计,结合各个子智能体的优势,能够在各种时间序列分析任务中提高性能,超越传统固定窗口方法的限制。

在这里插入图片描述

RULE:多模态医学RAG

在这里插入图片描述

解决的问题:Med-LVLMs 在医疗诊断中存在事实性问题,其生成的响应可能与既定医学事实不符,影响临床决策。虽然检索增强生成(RAG)策略可提升模型事实准确性,但面临检索上下文数量难以确定模型过度依赖检索信息两大挑战。

框架:(1)事实性风险控制策略。(2)知识平衡偏好调整。

主要工作
1.微调医学影响领域的图像和文本编码器,使用对比学习。多模态RAG。
2.事实性风险控制策略:旨在通过校准检索上下文的数量来确保模型的回答具有较高的事实准确性。
在这里插入图片描述
在这里插入图片描述
3.知识平衡偏好调整:DPO。
偏好数据:模型原本回答正确但引入检索知识后回答错误的响应作为不被偏好的效应(模型对检索得到过度依赖);真实答案是被偏好的响应。

METRAG:面向实用性和紧凑性

认为完全依赖相似性有时会降低性能。所以提出和实用性相结合。
在这里插入图片描述
1.引入 LLM 对文档效用的监督获取效用导向思维,结合文档相似性和效用提升性能。
相似性模型作为现成检索器;文档效用是其辅助 LLM 回答问题的有用性,通过 LLM 对文档效用的监督使检索器具备效用导向思维。
引入 LLM 作为文档效用的监督信号,计算文档相对于输入查询的效用似然。最小化相似性和效用似然分布间的KL散度。
2.控制文档数量:从教师模型蒸馏数据,然后SFT和DPO一个学生模型做摘要。

RAFT:Retrieval Aware Fine-Tuning

域内RAG
在这里插入图片描述

RAFT 通过训练模型来忽略任何检索到的无助于回答给定问题的文档,从而消除干扰。这是通过从有用的文档中准确识别和引用相关片段来解决手头的问题来实现的。此外,RAFT 对思维链式响应的使用进一步完善了模型的推理能力。

SFT微调:给定一组文档,查询,答案和思维链过程(防止过拟合),训练模型从抗干扰文档的能力。
在这里插入图片描述

SELF-RAG

在这里插入图片描述
目的:通过按需检索和自我反思提高 LLM 生成质量与事实准确性,同时不影响其通用性。

SELF-RAG往语言模型的词表中引入了4种新类型的reflection tokens,分别是Retriver, IsRel, IsSup, IsUse,对应四种不同的子任务,每个子任务下包括多个对应的reflection tokens。
在这里插入图片描述
1.模型训练
涉及到两个模型,分别是评判模型C跟生成模型M。
评判模型C:根据不同情形生成对应的判别结果,分别对应前面提到的4种类型的reflection token。训练数据由GPT-4合成,用标准的条件语言模型训练目标优化评判模型(最大化reflection token在给定x和y条件下的对数似然概率。
生成模型:在完成评判模型C的训练后,需要利用其来生成训练生成模型M的数据。构建出对应的训练数据(x,augmented y)。在完成训练数据构建后,按照标准的自回归任务训练生成模型。
在这里插入图片描述

2.模型推理
生成模型M首先会判断当前问题是否需要使用检索,如果需要的话,就会检索召回多个相关文档,通过并行的方式同时处理多个文档,并生成对应回复,再通过排序选择其中最合适的回复作为最终结果。
在这里插入图片描述

KG-RAG:融合知识图谱

总览:KG-RAG 管道,该管道从原始文本中提取三元组,将它们存储在 KG 数据库中,并允许搜索复杂信息以使用外部 KG 来增强 LLM。
在这里插入图片描述
1.存储
将非结构化文本数据转换为结构化 KG,通过 LLM 进行三元组提取,引入三元组超节点处理复杂结构,最后计算节点、超节点和关系的嵌入并存储在向量数据库中。

2.检索在这里插入图片描述
在这里插入图片描述

3.生成
在这里插入图片描述
在这里插入图片描述

HippoRAG

KAG的参考框架。
海马体记忆索引理论:认为人类长期记忆由三个部分组成:新皮层、海马旁回和海马体。新皮层负责处理和存储感知输入,旁海马区将感知信号索引到海马体,海马体则利用其上下文依赖的记忆系统进行模式完成。

步骤
1.离线索引(新皮层):开放信息提取(OpenIE),构建知识图谱。
2.在线检索(海马旁回):当接收到查询时,LLM提取查询中的显著命名实体,并通过检索编码器将其链接到KG中的节点。然后,运行个性化PageRank(PPR)算法,以查询节点为种子,探索KG路径并识别相关子图。最后,聚合PPR节点的概率分布,用于检索排序。

在这里插入图片描述

在这里插入图片描述

### 关于 LightRAG 的代码实现 LightRAG 是一种将图结构引入文本索引的方法,旨在通过构建图结构捕捉实体间的复杂关系。这种方法允许系统更高效地处理复杂的多跳查询,特别是在涉及多个文档段落的情况下[^1]。 尽管目前没有直接提及具体的 LightRAG 实现细节或官方代码库的信息,但从其描述来看,可以推测其实现有赖于以下几个关键技术点: #### 1. 图结构的构建 为了支持高效的多跳查询,LightRAG 需要先构建一个基于实体和关系的图结构。这种图可以通过以下方式实现: - 使用 Python 中的 `networkx` 库来创建和操作图数据结构。 - 将实体作为节点,关系作为边存储在图中。 以下是简单的图构建示例代码: ```python import networkx as nx # 创建有向图 G = nx.DiGraph() # 添加节点(实体) G.add_node("Entity_A", type="Person") G.add_node("Entity_B", type="Location") # 添加边(关系) G.add_edge("Entity_A", "Entity_B", relation="visited") # 输出图信息 print(G.nodes(data=True)) print(G.edges(data=True)) ``` #### 2. 文本索引与检索 LightRAG 结合了双层次检索模式,这意味着它可能依赖某种形式的倒排索引来加速文本匹配过程。具体来说,可以利用 Elasticsearch 或 FAISS 来完成这一部分功能。 FAISS 示例代码如下: ```python import faiss import numpy as np # 构建索引 dimension = 128 # 嵌入维度 index = faiss.IndexFlatL2(dimension) # 插入嵌入向量 vectors = np.random.rand(100, dimension).astype('float32') index.add(vectors) # 查询最近邻 query_vector = np.random.rand(1, dimension).astype('float32') distances, indices = index.search(query_vector, k=5) print(indices) ``` #### 3. 多跳推理机制 对于多跳查询的支持,通常需要设计递归式的查询逻辑或者借助 Transformer 编码器解码器架构进行上下文理解。这部分可以从 RAG (Retrieval-Augmented Generation) 系统的设计思路出发[^2]。 假设我们已经有了预训练的语言模型,则可以在 PyTorch 上搭建基础框架: ```python from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer = AutoTokenizer.from_pretrained("facebook/rag-token-base") model = AutoModelForSeq2SeqLM.from_pretrained("facebook/rag-token-base") def generate_response(contexts, question): inputs = tokenizer([question], return_tensors="pt") with tokenizer.as_target_tokenizer(): targets = tokenizer([""], return_tensors="pt")["input_ids"] outputs = model.generate( context_input_ids=contexts, **inputs ) response = tokenizer.decode(outputs[0], skip_special_tokens=True) return response contexts = ... # 提供从数据库检索到的相关段落 question = "What is the capital of France?" response = generate_response(contexts, question) print(response) ``` 虽然上述代码片段并未完全针对 LightRAG 进行定制化开发,但它展示了如何结合外部知识源增强生成能力的核心理念。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵海之森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值