RAG理论到实践:高级、模块化RAG在AI工程架构中的行业通用解决方案与实施策略(Advanced RAG✨)
随着 ChatGPT 的兴起,大语言模型再次走进人们的视野,其在 NLP 领域表现出的语言识别、理解以及推理能力令人惊叹。越来越多的行业开始探索大语言模型的应用,比如政务、医疗、交通、导购等行业。
通义系列、GPT 系列、LLama 系列等模型,在语言交互场景下表现十分抢眼。以 Gemini 为代表这类大模型甚至发展出了视觉和听觉,朝着智能体的方向演化。他们在多个指标上展现的能力甚至已经超过了人类。然而,大型语言模型也存在诸多不足:
-
知识的局限性:模型知识的广度获取严重依赖于训练数据集的广度,目前市面上大多数的大模型的训练集来源于网络公开数据集,对于一些内部数据、特定领域或高度专业化的知识,无从学习。
-
知识的滞后性:模型知识的获取是通过使用训练数据集训练获取的,模型训练后产生的一些新知识,模型是无法学习的,而大模型训练成本极高,不可能经常为了弥补知识而进行模型训练。
-
幻觉问题:所有的 AI 模型的底层原理都是基于数学概率,其模型输出实质上是一系列数值运算,大模型也不例外,所以它有时候会一本正经地胡说八道,尤其是在大模型自身不具备某一方面的知识或不擅长的场景。而这种幻觉问题的区分是比较困难的,因为它要求使用者自身具备相应领域的知识。
-
数据安全性:对于企业来说,数据安全至关重要,没有企业愿意承担数据泄露的风险,将自身的私域数据上传第三方平台进行训练。这也导致完全依赖通用大模型自身能力的应用方案不得不在数据安全和效果方面进行取舍。为了解决纯参数化模型的局限,语言模型可以采取半参数化方法,将非参数化的语料库数据库与参数化模型相结合。这种方法被称为 RAG(Retrieval-Augmented Generation)。
1.RAG简介
词汇 | 解释说明 |
---|---|
embedding | 嵌入(embedding)是指将高维数据映射为低维表示的过程。在机器学习和自然语言处理中,嵌入通常用于将离散的符号或对象表示为连续的向量空间中的点。在自然语言处理中,词嵌入(word embedding)是一种常见的技术,它将单词映射到实数向量,以便计算机可以更好地理解和处理文本。通过词嵌入,单词之间的语义和语法关系可以在向量空间中得到反映。 |
VectorDB | 向量数据库是一种特殊类型的数据库,它可以存储和处理向量数据。向量数据通常用于表示多维度的数据点,例如在机器学习和人工智能中使用的数据。在向量数据库中,数据被表示为向量,这些向量可以在多维空间中进行比较和搜索。 |
RAG 是 Retrieval-Augmented Generation(检索增强生成)的缩写,它是一种用于自然语言处理和文本生成的模型框架。RAG 结合了信息检索和文本生成的技术,旨在通过检索相关信息来增强文本生成的质量和相关性。在 RAG 中,检索阶段用于从大规模的知识库中获取与正在生成的文本相关的信息。这些信息可以包括文本片段、实体、事实、知识等。生成阶段则利用检索到的信息来生成自然语言文本,使得生成的文本更加准确、相关和丰富。
RAG 模型通常基于大规模的预训练语言模型(如 BERT、GPT 等),并结合了信息检索技术和文本生成技术。这种模型框架在问答系统、对话系统、摘要生成等自然语言处理任务中具有广泛的应用。总的来说,RAG 是一种结合了信息检索和文本生成技术的模型框架,旨在通过检索相关信息来增强自然语言文本的生成过程。
- RAG 的组成部分
RAG(Retrieval-Augmented Generation)模型框架包括以下几个关键组成部分:
-
检索器(Retriever)
:检索器是 RAG 框架中的一个重要组成部分,用于从大规模的知识库中检索相关的信息。这些信息可能是文本片段、图像、视频等。检索器可以使用各种信息检索技术,如倒排索引、BM25 等,以有效地从知识库中检索相关的内容。 -
生成器(Generator)
:生成器是 RAG 框架中的另一个关键组成部分,用于利用从检索器中检索到的信息来生成自然语言文本。生成器通常基于大规模的预训练语言模型(如 BERT、GPT 等),能够产生丰富、流畅且相关性强的文本输出。 -
交互式组件(Interactive Components)
:RAG 模型可能还包括一些交互式组件,用于在检索和生成之间进行交互性操作,以进一步提高生成文本的质量。这些组件可以包括重写模块、排序模块等,用于对检索到的信息进行进一步加工和处理。 -
联合训练框架(Joint Training Framework)
:RAG 模型也可能包括一个联合训练框架,用于同时优化检索器和生成器,以使它们能够更好地协同工作,产生更准确、相关和丰富的文本输出。
总的来说,RAG 模型框架主要由检索器、生成器以及可能的交互式组件和联合训练框架组成。这些组件共同作用,利用检索的信息来增强文本生成的质量和相关性。RAG 的设计使其具有广泛的应用潜力,特别是在问答系统、对话系统和摘要生成等领域。
现在虽然在 RAG 架构上出现了初级 RAG、高级 RAG 以及模块化 RAG 的架构设计,但都是在上面的 4 个关键部分内做一些模块删减或做一些架构调整。基本数据流如下:
针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料
分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈
2.行业 RAG 建设方案演进
RAG 建设方案的演进主要有 3 个阶段:初级 RAG、高级 RAG 和模块化 RAG,后者比前者无论是在检索准确性上,还是工程架构上,都有比较大的进步。
2.1 初级 RAG(Naive RAG)
基本 RAG 需要从外部知识数据库中获取文档,然后,将这些文档与用户的查询一起被传输到 LLM,用于生成响应。从本质上讲,RAG 包括一个检索组件、一个外部知识数据库和一个生成组件。
在基本的 RAG 场景中,大致有如下步骤:首先将文本划分为多个块,使用 Transformer Encoder 模型将这些块嵌入到向量中,将这些向量存储到向量数据库并建立索引,查询会检索向量数据库中相关的上下文,这些上下文和查询一起生成最终的 LLM 提示,并引导 LLM 合成响应。
RAG 系统包含三个关键模块:
-
Retriever:从上下文相关的知识源中检索文本段落;
-
Reranker(可选):对检索到的段落重新打分和重新排序;
-
Generator:将上下文与检索到的段落集成以生成输出文本
原始 RAG 是最早的研究范式,主要包括以下几个步骤:
-
建立索引
:这一过程通常在离线状态下进行,数据清洗并分块,将分块后的知识通过 embedding 模型产出语义向量,并创建索引。 -
检索
:用户的 query 问题,使用相同的 embedding 模型,计算问题嵌入和文档块嵌入之间的相似度,选择相似度最高的前 K 个文档块作为当前问题的增强上下文信息。 -
生成
:将给定的问题和相关文档合并为新的提示,然后由大型语言模型基于提供的信息回答问题。如果有历史对话信息,也可以合并到提示中,用于多轮对话。
初级 RAG 主要在三个方面面临挑战:检索质量、回应生成质量和增强过程。
-
检索质量
:在检索质量上,最主要的问题是精度比较低,即检索集中的文档块并不都与查询内容相关,这可能导致信息错误或不连贯。其次是召回率低问题,即未能检索到所有相关的文档块,使得大语言模型无法获取足够的背景信息来合成答案。 -
回应生成质量
:最突出的问题模型幻觉,即模型在缺乏足够的知识时,回答的答案是虚假的。另一个问题是回答不相关,即模型生成的答案未能针对查询问题。 -
增强过程
:最终,增强过程面临几个重要挑战。特别重要的是,如何将检索到的文段的上下文有效融入当前的生成任务。如果处理不得当,生成的内容可能显得杂乱无章。当多个检索到的文段包含相似信息时,冗余和重复成为问题,这可能导致生成内容的重复。此外,如何判断多个检索到的文段对生成任务的重要性或相关性非常有挑战性,增强过程需要恰当地评估每个文段的价值。检索到的内容可能具有不同的写作风格或语调,增强过程需调和这些差异,以确保最终输出的一致性。最后,生成模型可能会过度依赖于增强信息,导致生成的内容仅是重复检索到的信息,而缺乏新的价值或综合信息。
要解决上面的问题,需要在检索前和检索后做一些优化,这就衍生出了高级 RAG 的解决方案。
2.2 高级 RAG(Advanced RAG)
Naive RAG 在检索质量、响应生成质量以及增强过程中存在多个挑战。Advanced RAG 范式随后被提出,并在数据索引、检索前和检索后都进行了额外处理。通过更精细的数据清洗、设计文档结构和添加元数据等方法提升文本的一致性、准确性和检索效率。在检索前阶段则可以使用问题的重写、路由和扩充等方式对齐问题和文档块之间的语义差异。在检索后阶段则可以通过将检索出来的文档库进行重排序避免 “Lost in the Middle ” 现象的发生。或是通过上下文筛选与压缩的方式缩短窗口长度。
高级 RAG 相比于初级 RAG,新增了检索前处理、检索后处理以及混合索引等能力,用于解决索引、检索和生成的问题。
2.2.1 预检索技术
预检索技术包括可以在索引步骤中或在搜索数据库中的块之前使用的技术。
第一种技术是提高索引数据的质量:在机器学习领域,有一句话叫 “垃圾进,垃圾出”,这也适用于 RAG,但许多人只是忽略了这一步骤,并在这一非常关键的初始步骤之后专注于优化步骤。你不应该期望将每一个文档(无论是否相关)都放入你的矢量数据库.为了提高索引数据的质量,应该做如下操作:
-
删除与特定任务无关的文本 / 文档
-
将索引数据重新格式化为与最终用户可能使用的格式类似的格式
-
向文档中添加元数据,以实现高效和有针对性的检索。
这是一个例子。我需要检索的文本是数学问题,但关于不同概念的两个数学问题在语义上可能相似。例如,许多问题可能使用 “汤姆第一天吃了 8 个苹果……”,但它们可能测试加法、乘法和除法,这是非常不同的。在这种情况下,最好使用概念和级别的元数据对它们进行标记,并在检索它们之前检查正确的概念。
另一个非常典型的情况是,块在拆分时可能会丢失信息。考虑一篇典型的文章,开头的句子通过名字介绍实体,而后面的句子只依靠代词来指代它们。不包含实际实体名称的分割块将失去语义,无法通过向量搜索进行检索。因此,在这种情况下,用实际名称替换代词可以提高分割块的语义意义。
第二种技术是分块优化:根据你的下游任务是什么,你需要确定块的最佳长度是多少,以及你希望每个块有多少重叠。如果你的块太小,它可能不包括 LLM 回答用户查询所需的所有信息;如果块太大,它可能包含太多不相关的信息,从而混淆 LLM,或者可能太大而无法适应上下文大小。根据我自己的经验,对于管道中的所有步骤,你不必拘泥于一种块优化方法。
例如,如果你的管道同时涉及高级任务(如摘要)和低级任务(如基于函数定义的编码),则可以尝试使用较大的块大小进行摘要,然而使用较小的块大小作为编码参考。
还有另一种技术是在尝试在矢量数据库中匹配用户的查询之前重写该查询。此步骤的本质是将用户的查询转换为与矢量数据库中的查询格式和内容类似的格式和内容。Query2Doc 技术生成伪文档,并用这些文档扩展查询 。类似地,HyDE(假设文档嵌入)生成与查询相关的假设文档。
2.2.2、后检索技术
在从数据库中检索到相关的块之后,仍然有更多的技术可以提高生成质量。根据任务的性质和文本块的格式,你可以使用以下一种或多种技术。
-
如果你的任务与
一个特定的块
更相关,一种常用的技术是重新排序或评分。正如我前面提到的,向量相似性搜索中的高分并不意味着它总是具有最高的相关性。你应该进行第二轮重新排序或评分,找出对生成答案真正有用的文本块。对于重新排序或评分,你可以要求 LLM 对文档的相关性进行排序,也可以使用一些其他方法,如关键字频率或元数据匹配,在将这些文档传递给 LLM 以生成最终答案之前,对选择进行细化。 -
另一方面,如果你的任务与
多个块有关
——比如摘要或比较。你可以在将信息传递给 LLM 之前进行一些信息压缩作为后处理,以减少噪声或上下文长度。例如,你可以首先从每个块中总结、转述或提取关键点,然后将聚合的、浓缩的信息传递给 LLM 进行生成。
2.3、模块化 RAG(Modular RAG)
随着 RAG 技术的进一步发展和演变,新的技术突破了传统的 Naive RAG 检索 — 生成框架,基于此我们提出模块化 RAG 的概念。在结构上它更加自由的和灵活,引入了更多的具体功能模块,例如查询搜索引擎、融合多个回答。技术上将检索与微调、强化学习等技术融合。流程上也对 RAG 模块之间进行设计和编排,出现了多种的 RAG 模式。然而,模块化 RAG 并不是突然出现的,三个范式之间是继承与发展的关系。Advanced RAG 是 Modular RAG 的一种特例形式,而 Naive RAG 则是 Advanced RAG 的一种特例。
RAG 框架种类 | 优点 | 缺点 |
---|---|---|
初级 RAG(Naive RAG) | 1. 采用传统的索引、检索和生成流程 | 1. 检索质量低,可能导致 “空中掉落” 现象 |
2. 直接基于用户输入进行查询 | 2. 响应生成质量存在幻觉和询矢量转换 不相关性问题 | |
3. 结合相关文档与问题形成新的提示,供大型语言模 型生成答案 | 3. 增强过程中的集成挑战如冗余和风格一致性 | |
高级 RAG(Advanced RAG) | 1. 优化数据索引,提高索引内容质量 | 1. 高级优化增加了复杂性 |
2. 实施预检索和后检索方法,提高检索和生成的质量 | 2. 对计算资源和处理能力有更高要求 | |
3. 引入混合检索和索引结构优化,如图结构信息 | 3. 需要更多的定制和调优以提高效率和相关性 | |
模块化 RAG(Modular RAG) | 1. 增加功能模块,提供更多多样性和灵活性 | 1. 构建和维护模块化系统可能较为复杂 |
2. 适应性强,可针对特定问题上下文替换或重组模块 | 2. 需要仔细管理以确保模块间的协调和一致性 | |
3. 采用串行或端到端训练方法,允许跨多个模块的定制 | ||
原文链接:https://blog.csdn.net/sinat_39620217/article/details/141600025
3.高级RAG(Advanced RAG)
- 基本索引
3.1 检索前处理
3.1.1 查询转换
查询转换是一种通过修改用户输入以提高检索质量的技术。如果查询很复杂,LLM 可以将其分解为多个子查询。
例如,如果你问:“哪个框架在 Github 上,Langchain 和 LlamaIndex 哪个 star 更多?”,
并且不太可能在语料库中的某些文本中找到直接比较,因此将这个问题分解为有意义的两个子查询以更简单、更具体的信息检索为前提:
—“Langchain 在 Github 上有多少 star?”
— “Llamaindex 在 Github 上有多少 star?”
它们将并行执行,然后将检索到的上下文合并到一个提示中,供 LLM 合成初始查询的最终答案。
3.1.2 数据对齐
该策略主要针对不同文档之间的对齐问题和差异。对齐的核心思想是引入 “假设性问题”,即创建适合用每篇文档回答的问题,并将这些问题与文档结合起来。这种做法有助于解决文档间的对齐问题和不一致性。主要做法如下:
-
对知识主题进行抽取。利用大模型,生成针对每篇知识 D 用户可能会问的问题 Q1、Q2、Q3,把 Q1、Q2、Q3 加入到向量索引中。
-
知识匹配。当用户询问问题 Q 时,Q 可通过与 Q1、Q2、Q3 匹配,从而找到对用的知识 D。
3.2 索引优化
索引优化主要是探索建立的索引能更好的匹配用户的问题,主要涉及三方面,建立层次索引
、优化 embedding 模型
、引入混合检索的策略
,提高知识的召回率。
3.2.1 层次索引
近似检索和传统数据库检索不同,近似检索通过聚类或 HNSW 建立索引后,在检索时,会有一定的近似误差,如果在大量的知识库中检索,会产生检索准确度和性能的问题,在大型数据库的情况下,一种有效的方法是创建两个索引——一个由摘要组成,另一个由文档块组成,并分两步搜索,首先通过摘要过滤掉相关文档,然后只在这个相关组内搜索。
3.2.2 embedding 优化
RAG 中除了对知识的组织形式和召回策略的优化,embedding 模型的优化同样至关重要。
-
微调模型直接影响到 RAG 的有效性。使用垂域数据对 embedding 模型进行训练,对于提升用户 query 和知识直接的关联性至关重要。
-
动态 embedding
:根据单词出现的上下文,embedding 的结果会不同。例如,在 Transformer 模型(如 BERT)中,同一单词根据周围词汇的不同,其 embedding 结果也会有所变化。有研究表明,在 OpenAI 的 text-embeddingada-002 模型中,文本长度小于 5 个 token 时,常出现误召回的情况。
根据以往经验,使用垂域数据训练 embedding 模型,当再出现相同领域的数据时,使用向量召回的准确率能达到 80%。
3.2.3 混合检索
在知识召回时,为了提高召回率,召回手段不仅仅只依靠语义向量,页可通过倒排索引的方式召回,并通过 Rerank 模型做数据筛选,减少输入大模型的 token 数。
3.3 检索后处理
检索结束后,为了能尽可能的召回比较全面的知识,会做一些关联性知识联想的操作,把相关知识尽可能多的检索,以便大模型得到更多的优质输入。
3.3.1 句子窗口检索
知识片段拆解越散,向量匹配的准确性基本上会越好,但检索出来的知识可能更片面,这是一个不可调和的矛盾。为了在获取最相关的单个句子后更好地推理找到的上下文,将上下文窗口扩展为检索到的句子前后的 k 个句子,然后将这个扩展的上下文发送到 LLM。这项技术在 Llama 中有实践: Metadata Replacement + Node Sentence Window
3.3.2 父子知识检索
这里的思路与语句窗口检索器非常相似——搜索更精细的信息片段,然后在在 LLM 进行推理之前扩展上下文窗口。文档被拆分为较小的子块,这些子块和较大的父块有引用关系。
首先在检索过程中获取较小的块,然后如果前 k 个检索到的块中有超过 n 个块链接到同一个父节点(较大的块),将这个父节点替换成给 LLM 的上下文——工作原理类似于自动将一些检索到的块合并到一个更大的父块中,因此得名。请注意,搜索仅在子节点索引中执行。Llama 也有类似的实现:Recursive Retriever + Node References。
3.3.3 融合检索
3.2.4 聊天引擎检索
3.2.5 多文档检索
3.4 Advanced RAG 技术总结
RAG 通过集成外部知识检索来增强语言模型,从而提高生成的准确性、相关性和信息覆盖率。
-
检索器
的进步提升了长文档和关键字查询的词汇、语义和上下文相关性匹配度。 -
重排序体系结构
专门用于精确预测相关性,采用结合预训练、模型大小和网络体系结构的策略。 -
生成器
通过截断、提取、加权和记忆无缝地整合外部证据。 -
混合 RAG 系统
将两种 LLM 结合在一起,以最大限度地提高质量和高效 SLM 的可扩展性和吞吐量。
4. 模块化 RAG(Modular RAG)
模块化 RAG 是指检索增强生成技术的一种演进形式,其进展带来了更加多样化和灵活的过程,具体体现在以下关键方面:
增强数据获取:RAG 已经超越了传统的非结构化数据,现在包括半结构化和结构化数据,在预处理结构化数据方面更加关注,以改善检索并减少模型对外部知识来源的依赖。
整合技术:RAG 正在整合其他技术,包括微调、适配器模块和强化学习,以增强检索能力。可适应的检索过程:检索过程已经发展到支持多轮检索增强,利用检索内容来指导生成,反之亦然。此外,自主判断和 LLM 的使用增加了通过确定检索的需求来回答问题的效率。
如何系统的去学习大模型LLM ?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业
?”“谁的饭碗又将不保了?
”等问题热议不断。
不如成为「掌握AI工具的技术人
」,毕竟AI时代,谁先尝试,谁就能占得先机!
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高
针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料
分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈