一文看懂什么是RAG(检索增强生成) -- 知识铺
RAG(Retrieval Augmented Generation,检索增强生成)是一种结合了检索技术和大语言模型提示的生成式模型解决方案。它通过从各种数据源检索相关信息,并将这些信息与用户的问题结合起来,形成丰富的提示模板,以指导大模型生成准确的答案。RAG的主要特点是能够依赖大语言模型来强化信息检索和输出,同时能与外部数据无缝集成,解决通用大模型在垂直、专业领域的知识短板问题。此外,RAG还能在不参与大模型数据集训练的情况下,改善模型性能,更好地保证数据隐私和安全。RAG的发展经历了预训练和SFT的阶段,并在LLM时代后开始井喷。随着高性能大模型的训练成本降低,学术界和工业界试图通过推理阶段加入RAG模块,高性价比的方式整合外部知识来增强模型生成。
RAG的起源与发展
RAG(Retrieval-Augmented Generation)起始于2020年,通过融合预训练的检索组件和生成组件来捕捉知识,从而提升了模型的解释性和模块化特性。
大型语言模型时代的RAG发展
随着大型语言模型(LLM)的崛起,RAG技术成为增强聊天机器人和大型语言模型实用性的重要工具。它通过优化检索器、生成器等核心组件,为处理复杂的知识密集型任务提供了高效的解决方案。
RAG技术的演化阶段
RAG的强化可以在三个主要阶段进行:
预训练阶段,微调阶段,以及推理阶段。增强数据源涵盖了非结构化数据、结构化数据和由大型语言模型生成的内容。
学术与工业界对RAG的共识
学术界和工业界普遍认同RAG包含两个主要阶段:
-
检索阶段:使用编码模型根据输入的问题检索相关的文档。
-
生成阶段:基于检索到的上下文信息,系统生成相应的文本输出。
RAG的研究范式
RAG研究范式经历了不断的发展和变化,可以分为三类:
-
初级RAG:最初的实现方式。
-
高级RAG:引入了更复杂的机制和技术改进。
-
模块化RAG:强调组件的独立性和可替换性,以便于灵活调整和优化。 从历史发展的角度来看,RAG经历了Naive RAG、Advanced RAG和Modular RAG三个阶段。这种分类有助于学术上的研究和归纳总结,但在实际业务应用中,更重要的是实践中的创新和超越。
RAG技术发展经历了从初级RAG(Naive RAG)到高级RAG(Advanced RAG),再到模块化RAG(Modular RAG)的演变。每个阶段都对数据处理、检索和生成过程进行了优化和改进。
Naive RAG这是最基础的RAG实现,包含以下三个步骤:
- 索引:将文档库分割成较短的片段(Chunk),并通过编码器构建向量索引。
- 检索:根据问题与chunks的相似度来检索相关文档片段。
- 生成:利用检索到的上下文信息,通过大型语言模型生成问题的答案。
Advanced RAG为了解决Naive RAG在检索质量和响应生成质量上的挑战,Advanced RAG引入了以下改进:
- 优化数据索引,提高索引内容的质量。
- 实施预检索和后检索方法,如问题的重写、扩充等,以提高检索和生成的质量。
- 引入混合检索和索引结构优化,例如使用图结构信息。
Modular RAGModular RAG进一步突破了传统的检索-生成框架,引入了更多的功能模块,如查询搜索引擎、融合多个回答等。它结合了检索与微调、强化学习等技术,提供了更大的灵活性和适应性。此外,Modular RAG还允许跨多个模块进行定制和协调,以适应特定的问题上下文。
RAG的五个基本流程RAG的实施可以分为以下五个基本流程:
- 知识文档的准备:选择合适的文档作为知识源。
- 嵌入模型:使用嵌入模型将文档转换为向量形式。
- 向量数据库:构建和维护一个高效的向量数据库以支持快速检索。
- 查询检索:执行查询并从向量数据库中检索相关的文档片段。
- 生产回答:基于检索到的上下文信息,通过语言模型生成最终的回答。
1. 知识文档的准备
在构建一个高效的RAG系统时,首要步骤是准备知识文档。现实场景中,我们面对的知识源可能包括多种格式,如Word文档、TXT文件、CSV数据表、Excel表格,甚至是PDF文件、图片和视频等。因此,第一步需要使用专门的文档加载器(例如PDF提取器)或多模态模型(如OCR技术),将这些丰富的知识源转换为大语言模型可理解的纯文本数据。例如,处理PDF文件时,可以利用PDF提取器抽取文本内容;对于图片和视频,OCR技术能够识别并转换其中的文字信息。此外,鉴于文档可能存在过长的问题,我们还需执行一项关键步骤:文档切片。我们需要将长篇文档分割成多个文本块,以便更高效地处理和检索信息。这不仅有助于减轻模型的负担,还能提高信息检索的准确性。我们将在后文中详细讨论文档切片和其背后的逻辑。
2. 嵌入模型
嵌入模型的核心任务是将文本转换为向量形式,我们使用的日常语言中充满歧义和对表达词意无用的助词,而向量表示则更加密集、精确,能够捕捉到句子的上下文关系和核心含义。这种转换使得我们能够通过简单计算向量之间的差异来识别语义上相似的句子。
举例举例来说,如果我们想比较“苹果是一种水果”和“香蕉是黄色的”,嵌入模型可以将这些句子转换为向量,然后通过计算它们之间的相似度便可以确定它们的关联程度。那么这样的嵌入模型是如何得到的呢,作为一个经典的例子,我们以Google开发的Word2Vec(一文看懂什么是什么是 Word2vec)模型为基础,来探讨其训练过程。
Word2Vec与CBOW模型
在自然语言处理领域,Word2Vec是一个非常流行的词向量生成工具,它通过两种训练方法之一来学习词汇表中单词的分布式表示:连续词袋(CBOW)模型和跳字(Skip-gram)模型。为简单起见,我们以CBOW为例进行讲解。
CBOW模型的工作原理
CBOW模型的核心思想是利用给定句子中目标词的上下文(即周围的几个词)来预测这个中心词。例如,在句子“The cat sat on the mat”中,如果我们要预测词“sat”,我们会使用它周围的词作为输入。
- One-hot编码
- 对于上下文词“the”, “cat”, “on”, “the”, 和“mat”,首先将它们转换成one-hot向量。每个向量的长度等于词汇表的大小,只有对应位置上的值为1,其余全为0。
- 计算上下文向量
- 将每个one-hot向量与一个V×N维度的权重矩阵W相乘,其中V代表词汇表大小,N是词向量的维度。然后对所有结果求平均,得到一个能够表达整个上下文信息的向量e。
- SoftMax输出层
- 向量e接着会与另一个权重矩阵W’相乘,并通过SoftMax函数转换成概率分布,这给出了每个词作为中心词的概率。
- 权重更新
- 模型根据预测结果与实际中心词之间的差异调整两个权重矩阵W和W’,从而优化预测性能。
向量数据库
向量数据库是专门为存储和高效检索高维向量数据设计的系统,它们使得我们可以快速找到与用户查询最相似的知识条目。
查询检索与生成回答
当用户提出一个问题时,其文本会被转换成向量形式,并用于搜索向量数据库中的相似项。基于检索到的信息,结合用户的提问,可以构建提示模版并传递给大语言模型,由后者生成最终的回答。
RAG系统的优化策略
RAG(Retrieval-Augmented Generation)系统可以通过多个方面进行优化,包括但不限于数据清洗、分块处理、选择合适的嵌入模型、添加元数据、采用多级索引以及优化索引/查询算法等。
数据清洗
确保原始知识数据的准确性和清洁度,涉及基本文本清理、实体解析、文档划分、数据增强、用户反馈循环和时间敏感数据处理。
分块处理
为了提高检索效率,文档被分割成更小的文本块。分块的方法包括固定大小分块、内容分块、递归分块、从小到大分块和特殊结构分块。
嵌入模型的选择
不同的嵌入模型有不同的特点和适用场景,比如BERT等自注意力机制模型能更好地处理一词多义的问题。
元数据的应用
为向量添加额外的元数据标签可以帮助提高检索的相关性。
多级索引
针对不同类型的查询建立专门的索引,配合多级路由机制,可以更精确地匹配查询需求。
索引/查询算法
对于大规模向量数据,通常使用最近邻搜索(ANNS)等算法来找到足够接近或相似的项,而不是寻找绝对的最佳匹配。
有一些缓解这个问题的方法,例如增加聚类的数量,并指定搜索多个簇。然而,任何提高结果质量的方法都不可避免地会增加搜索的时间和资源成本。实际上,质量和速度之间存在着一种权衡关系。我们需要在这两者之间找到一个最优的平衡点,或者找到一个适合特定应用场景的平衡。不同的算法也对应着不同的平衡。
可以看看《一文看懂什么是K均值聚类》。
位置敏感哈希
沿着缩小搜索范围的思路,位置敏感哈希算法是另外一种实现的策略。在传统的哈希算法中,我们通常希望每个输入对应一个唯一的输出值,并努力减少输出值的重复。然而,在位置敏感哈希算法中,我们的目标恰恰相反,我们需要增加输出值碰撞的概率。这种碰撞正是分组的关键,哈希值相同的向量将被分配到同一个组中,也就是同一个“桶”里。此外,这种哈希函数还需满足另一个条件:空间上距离较近的向量更有可能被分入同一个桶。这样在进行搜索时,只需获取目标向量的哈希值,找到相应的桶,并在该桶内进行搜索即可。
量化乘积
在处理大规模向量数据时,内存开销是一个重要的考量因素。当面对每条数据都有上千维度、数据总量达到上亿级别的场景时,直接减少数据量不是可行的方案,因为每条数据都代表了实际的信息。为了应对这一挑战,我们可以通过减小每个数据本身的大小来降低内存使用,这里介绍一种称为乘积量化的方法。
图像压缩类比
类似于图像处理中的有损压缩技术,该方法通过合并一个像素及其周围的几个像素来减少存储信息量。应用到高维向量数据中,我们可以采用改进的聚类方法,即用簇的中心点来代替簇内的所有数据点。
量化过程
-
信息保留:尽管会丢失一些具体值的信息,但由于聚类中心点与簇内向量的相关性,以及增加簇数量以最小化信息损失的能力,原始数据点的信息大部分得以保留。
-
编码和码本:对这些中心点进行编码,允许我们用单个数字来表示整个向量,从而大大减少了存储空间的需求。创建一个码本记录每个中心向量值及其对应的编码值。
-
使用过程:当需要使用某个向量时,仅需通过其编码值查询码本,即可恢复出对应的中心向量的具体值。虽然这个向量不再是原始状态,但考虑到上述信息保留的策略,这种变化是可以接受的。 综上所述,将向量用其所属簇的中心点表示的过程就是量化,这种方法能够显著减少内存占用,同时保持较高的数据可用性。
在处理高维数据时,直接量化会遇到维度爆炸的问题,导致数据分布更加稀疏。为了减少丢失的细节,我们需要更多的聚类中心,例如在128维空间中,需要2的64次方个聚类中心,这会导致码本所需的内存变得非常庞大,甚至超过量化本身所节省的内存。解决这一问题的方法是将高维向量分割成多个低维子向量,然后在这些低维子向量中独立进行量化。例如,将128维的向量分解为8个16维的子向量,然后分别在8个独立的子空间中进行量化,形成各自的子码本。
每个16维的空间只需要256个聚类就可以得到不错的效果,并且每个子码本将变得很小,即便8个子码本加在一起的大小也仍然足够的小,实际上我们是在把码本大小增长从指数模型分解为加法模式。最后,我们还可以把前面的提速度方法和减内存的乘积量化法结合使用,同时实现速度和内存的优化。
分层导航小世界
从客户的角度来看,内存开销可能并不是最重要的考量因素。他们更加关注的是应用的最终效果,也就是回答用户问题的速度和质量。导航小世界(NSW)算法正是这样一种用内存换取更快速度和更高质量的实现方式。这个算法的思路和“六度分割理论”类似——你和任何一个陌生人之间最多只隔六个人,也就是说,最多通过六个人你就能够认识任何一个陌生人。我们可以将人比作向量点,把搜索过程看作是从一个人找到另一个人的过程。在查询时,我们从一个选定的起始点A开始,然后找到与A相邻且最接近查询向量的点B,导航到B点,再次进行类似的判断,如此反复,直到找到一个点C,其所有相邻节点都没有比它更接近目标。最终这个点C便是我们要找的最相似的向量。
本文介绍了检索增强生成(RAG)的概念、特点、发展阶段以及优化策略。RAG是一种结合了信息检索和文本生成的人工智能技术,旨在通过检索外部知识库来辅助大型语言模型(LLM)生成更准确、更相关的文本内容。文章首先概述了RAG的基本概念和工作流程,然后详细讨论了12个关键优化策略,包括查询重写、假设文档嵌入、多查询检索等。每个策略都旨在提高RAG系统的性能和准确性。此外,文章还探讨了高级检索策略如上下文压缩、句子窗口搜索、父文档搜索等,以及如何通过重排模型进一步提高检索结果的相关性和准确性。最后,文章强调了提示词的设计对于引导LLM生成高质量回答的重要性,并简要介绍了大语言模型在RAG系统中的作用。整体而言,本文为读者提供了一个全面而深入的RAG系统构建和优化指南。
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/ai/post/20241218/%E4%B8%80%E6%96%87%E7%9C%8B%E6%87%82%E4%BB%80%E4%B9%88%E6%98%AFRAG%E6%A3%80%E7%B4%A2%E5%A2%9E%E5%BC%BA%E7%94%9F%E6%88%90--%E7%9F%A5%E8%AF%86%E9%93%BA/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com