检索增强生成 (RAG):What, Why and How?
AI魔法学院
2023-11-20
分享海报

1、什么是检索增强生成?
如果您一直在向量存储或其他数据库中查找数据,并在生成输出时将相关信息作为上下文传递给 LLM,那么您已经在进行检索增强生成了。检索增强生成(简称 RAG)是 Meta 2020 年推广的一种架构,旨在通过将相关信息与问题/任务细节一起传递给模型来提高 LLM 的性能。
2、为什么RAG
LLM是通过大量的数据进行训练的,可以回答任何问题或完成任务,利用其参数化记忆。这些模型有一个知识截止日期,取决于它们上次训练的时间。被问及超出其知识范围或在知识截止日期之后发生的事件时,模型会产生幻觉高。Meta公司的研究人员发现,通过提供与手头任务相关的信息,模型在完成任务时表现显著改善。例如,如果询问模型关于截止日期之后发生的事件,则提供该事件作为背景信息并随后提问将帮助模型正确回答问题。由于LLM具有有限的上下文窗口长度,在处理当前任务时只能传递最相关的知识。我们添加到上下文中数据质量影响着模型生成响应结果的质量。机器学习从业者在RAG流程不同阶段使用多种技术来改善LLM性能。

RAG 与微调微调是在特定任务上训练模型的过程,就像在问题解答数据集上微调 GPT-3.5 以提高其在特定数据集上的问题解答性能一样。如果你有一个足够大的数据集来完成手头的任务,而且数据集不会发生变化,那么微调就是一种很好的方法。如果数据集是动态的,我们就需要不断重新训练模型以跟上变化。如果手头的任务没有大型数据集,微调也不是一种好方法。在这种情况下,您可以使用 RAG 来提高 LLM 的性能。同样,您也可以使用 RAG 来提高 LLM 在摘要、翻译等任务上的性能,因为这些任务可能无法进行微调。

3RAG如何工作?


RAG 架构和管道包括三个主要阶段--数据准备、检索和生成。数据准备阶段包括确定数据源、从数据源中提取数据、清理数据并将其存储到数据库中。检索阶段包括根据手头的任务从数据库中检索相关数据。生成阶段包括利用检索到的数据和手头的任务生成输出结果。输出的质量取决于数据的质量和检索策略。下文将详细介绍每个阶段。IMG_256

数据准备

根据LLM将要处理的任务类型,数据准备通常涉及识别数据来源、从来源中提取数据、清洗数据并将其存储在数据库中。用于备数据的步骤可能因使用情况和检索方法而异。例如,如果您正在使用像Weaviate这样的向量存储器,您创建嵌入,并将它们存储在向量存储器中。如果您正在使用像Elasticsearch这样的搜索引擎,则需要在搜索引擎中对数据进行索引。如果您正在使用像Neo4j这样的图形数据库,则需要为数据创建节点和边,并将它们存储在图形数据库中。我们将在下一节讨论不同类型的数据库以及准备数据所涉及的步骤。

向量存储器

向量存储器适用于存储文本、图像、音频等非结构化数据,并基于语义相似性搜索该类别下的内容。我们使用一个内置模型来生成我们所保存到数据库中的每个片段(chunk)对应ding) 。根据不同类型和用例以及embedding模型, 数据会更小块进行处理, 例如:如果你要保存文本信息,可以按句子或段落划分;如果你要保存代码,则可以按函数或类划分;如果你选择提供与LLM相关上下文范围范围代码片段时 , 可以选择更小块大小. 将原始文件拆解后, 每个部分都会生成相应embedding 并且 存放到vector store . 当查询发送给 vector store , 查询也会转换为 embedding , 然后 vector store 返回与查询最相似 的 embeddings.Weaviate 这种 类型 的 向量 数据库 在 存取过程 中 都能够自 嵌入(embeddings) 的生成工作 , 因此 操作者只需关注 数据建模 和 切割策略即可。
关键词搜索

是一种简单的检索数据的方法,其中数据根据关键词进行索引,并且搜索引擎返回包含这些关键的文档。关键词搜索适用于存储结构化数据(如表格、文档等)并使用关键词对数据进行搜索。

图数据库

以节点和边的形式存储数据。它们适用于存储结构化数据(如表格、文档等),并通过数据之间的关系进行搜索。例如,如果您正在存储有关人员的数据,可以为每个人创建一个节点,并在彼此认识的人之间建立边缘。当向图数据库查询时节点相连接的节点。这种使用知识图谱进行检索的方式对于问题回答等任务非常有用,其中答案是一个人或实体。

搜索引擎
RAG架构中,可以从公共搜索引擎(如GoogleBing等)或内部擎(如ElasticsearchSolr等)中检索RAG管道中的数据。在RAG架构中,在检索阶段查询了搜索引擎并返回最相关的文档。搜索引擎适用于从网络上检索数据并使用关键字对其进行搜索。可以将来自搜索引擎的数据与其他数据库(如向量存储、图数据库等)中获取到 的 数据相结合,以提高输出质量。

————tips
结合多种策略(如语义搜索 + 关键字匹配)的混合方法也是可行的,而且众所周知,这种方法在大多数使用案例中都能提供更好的结果。例如,您可以使用矢量存储来存储文本数据,使用图数据库来存储结构化数据,然后将两个数据库的结果结合起来生成输出。

检索

一旦数据被识别和处理以备检索,RAG 管道就会根据所处理的任务(用户提出的问题)检索相关数据,并准备将上下文传递给生成器。检索策略可根据用例而有所不同。它通常涉及将用户的查询或任务传递给数据存储并提取相关结果。例如,如果我们正在使用一个存储相关数据块的矢量数据库构建一个问题解答系统,那么我们可以为用户的查询生成嵌入式数据,在矢量数据库中对嵌入式数据进行相似性搜索,然后检索出最相似的数据块(有些矢量数据库会在检索过程中生成嵌入式数据)。同样,根据不同的使用情况,我们可以在同一向量存储区或多个数据库中进行混合搜索,并将搜索结果作为上下文传递给生成器。

生成

一旦检索到相关数据,就会连同用户的查询或任务一起传递给生成器(LLM)。LLM 使用检索到的数据和用户的查询或任务生成输出。输出结果的质量取决于数据的质量和检索策略。生成输出结果的指令也会对输出结果的质量产生很大影响。
4、如何提高RAG性能
在生产中提高RAG性能的技术以下是在RAG流程的不同阶段可以用来提高生产中RAG性能的一些技术。

混合搜索:将语义搜索与关键词搜索结合起来,从向量存储中检索相关数据已被证明对大多数用例都能获得更好的结果。

摘要:对块进行摘要并将摘要存储在向量存储中,而不是原始块。例如,如果您的数据包含很多填充词,那么总结块以去除填充词并将摘要存储在向量存储中是一个好主意。这将改善生成质量,因为我们除了帮标记数量外还消除了数据中的干扰叠块:当将数据分割检索的块时,在语义搜索程中可能会选择具有相邻块相关和有用上下文信息的情况。如果没有周围上下文环境就直接传递该块给LLM进行生成,则可能导输出质量较差。为避免这种情况,我们可以将重叠部分传递给LLM进行生成。例如,如果我们将数据分割成100个标记大小的块,则可以通过50个标记大小来使这些块重叠。这样可以确保我们为LLM生成时传递了周围上下文信息。

微调嵌入模型:使用BERTada等现成的嵌入模型为数据块生成嵌入可能适用于大多数用例。但是如果您正在处理特定领域,请注意这些模型可能无法很好地表示该领域,在向量空间内导致检索质量较差。在这种情况下,我们可以对该领域内的调并使用一个自定义化后续使用embedding模型以提高检索质量。

元数据:提供关于上下文中传递的块的来源等元数据,将有助于LLM更好地理解上下文,从而产生更好的输出生成。

重新排序:在使用语义搜索时,可能会出现前k个结果相似的情况。在这种情况下,我们应该考虑根据其他因素(如元数据、关键词匹配等)对结果进行重新排序,以涵盖与LLM相关的各种间

丢失问题:观察到LLMs并不给予输入中所有标记相同权重。中间标记似乎比输入开头和结尾处的标记被赋予较低权重。这被称为中间丢失问题。为了避免这种情况,我们可以重新排列上下文片段,使最重要的片段位于输入开头和结尾,并将次要片段放置在中间位置。

出自:https://mp.weixin.qq.com/s/PeBW2Ncb0GkFAPx9AuPg1g

© THE END

转载请联系本网站获得授权

投稿或版权问题请加微信:skillupvip