第四章 RAG 范例 简单 RAG、高级 RAG 和模块化 RAG
4.1 天真的 RAG
Naive RAG 流程由以下关键阶段组成:
数据索引
- 数据加载:这涉及导入所有要使用的文档或信息。
- 数据拆分:将大型文档分成较小的部分,例如每个部分不超过 500 个字符。
- 数据嵌入:使用嵌入模型将数据转换为矢量形式,以便计算机可以理解。
- 数据存储:这些向量嵌入保存在向量数据库中,以便于搜索。
恢复
当用户提出问题时:
- 首先使用与数据索引阶段相同的嵌入模型将用户的输入转换为向量(查询向量)。
- 然后,将此查询向量与向量数据库中的所有向量进行匹配,以找到可能包含用户问题答案的最相似的向量(例如,使用欧几里得距离度量)。此步骤是关于识别相关知识块。
增强与生成
LLM 模型将用户的问题和从向量数据库中检索到的相关信息结合起来,形成响应。此过程将问题与已识别的数据(增强)结合起来,生成答案(生成)。
✋ 简单 RAG 的问题
幼稚的 RAG 在所有阶段都面临挑战:
- 检索— 无法检索所有相关块或检索不相关的块。
- 增强——从检索到的可能不连贯或包含重复信息的块中整合上下文的挑战。
- 生成——LLM 可能会生成不基于所提供上下文(检索到的块)的答案,或者生成基于检索到的不相关上下文的答案。
4.2 高级 RAG
高级 RAG 策略已经开发出来,以应对简单 RAG 面临的挑战。以下是关键高级 RAG 技术的概述。
RAG 应用程序必须高效地从数据源检索相关文档。但每个步骤都面临多重挑战。
- 如何实现文档和查询的准确语义表示?
- 什么方法可以对齐查询和文档(块)的语义空间?
- 检索器的输出如何与 LLM 的偏好保持一致?
这里我概述了检索前、检索中和检索后策略:
➡️ 预检索
如何优化数据索引?
- 提高数据质量——删除不相关的信息、消除实体和术语中的歧义、确认事实准确性、维护上下文并更新过时的信息。
- 优化索引结构——优化块大小以捕获相关上下文或从图形结构添加信息以捕获实体之间的关系。
- 添加元数据——将日期、章节、小节、目的或任何其他相关信息作为元数据添加到块中,以改进数据过滤
块优化——当使用外部数据源/文档构建 RAG 管道时,第一步是将它们分解成更小的块以提取细粒度特征。然后嵌入块以表示其语义。但嵌入太大或太小的文本块可能会导致次优结果,因此我们需要针对 RAG 管道中使用的文档类型优化块大小。
📝关键预检索技术摘要:
滑动窗口——利用块之间重叠的分块方法。
自动合并检索——在初始搜索阶段利用小文本块,随后将更大的相关文本块提供给语言模型进行处理。
摘要嵌入——根据文档摘要(或概括)优先进行 Top-K 检索,提供对整个文档上下文的全面理解。
元数据过滤——利用文档元数据来增强过滤过程。
图形索引——将实体和关系转换为节点和连接,显著提高相关性。
➡️ 检索
一旦确定了块的大小,下一步就是使用嵌入模型将这些块嵌入到语义空间中。
在检索阶段,目标是确定与查询最相关的块。这是通过计算查询和块之间的相似度来实现的。在这里,我们可以优化用于嵌入查询和块的嵌入模型。
领域知识微调——为了确保嵌入模型准确捕获 RAG 系统的特定领域信息,使用特定领域的数据集进行微调非常重要。嵌入模型微调的数据集应包含:查询、语料库和相关文档。
相似性度量——有许多不同的度量来衡量向量之间的相似性。相似性度量的选择也是一个优化问题。向量数据库(ChromaDB、Pinecode、Weaviate……)支持多种相似性度量。以下是不同相似性度量的几个示例:
- 余弦相似度
- 欧几里得距离(L2)
- 点积
- L2 平方距离
- 曼哈顿距离
➡️ 检索后
从向量数据库检索上下文数据(块)后,下一步是将上下文与查询合并作为 LLM 的输入。但检索到的某些块可能重复、嘈杂或包含不相关的信息。这可能会对 LLM 处理给定上下文的方式产生影响。
下面我列出了一些用于克服这些问题的策略。
重新排序— 对检索到的信息进行重新排序,以优先考虑最相关的内容。当引入额外的上下文时,LLM 通常会面临性能下降的问题,而重新排序通过对检索到的块进行重新排序并识别 Top-K 最相关的块来解决此问题,然后将其用作 LLM 中的上下文。LlamaIndex 、Langchain、HayStack等库提供了不同的重新排序器。
及时压缩— 检索到的信息可能很嘈杂,因此在提交给 LLM 之前,压缩不相关的上下文并减少上下文长度非常重要。使用小型语言模型计算及时的相互信息或困惑度来估计元素重要性。当上下文很长时,使用总结技术。
4.3 模块化 RAG
模块化 RAG 集成了 Adanced RAG 的各种模块和技术,以改进整个 RAG 系统。例如,整合用于相似性检索的搜索模块并在检索器中应用微调方法。模块化 RAG 成为构建 RAG 应用程序时的标准范例。以下是一些模块示例:
搜索模块——除了从矢量数据库检索上下文之外,搜索模块还集成来自其他来源的数据,例如搜索引擎、表格数据、知识图谱等。
内存模块——在 RAG 系统中添加内存组件,其中 LLM 不仅可以引用从矢量数据库检索到的块,还可以引用存储在系统内存中的先前的查询和答案。
融合——涉及原始查询和扩展查询的并行矢量搜索、智能重新排序以优化结果,以及将最佳结果与新查询配对。
路由——查询路由决定用户查询的后续操作,例如汇总、搜索特定数据库等。
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/6906