What is Retrieval Augmented Generation (RAG)?
💪

What is Retrieval Augmented Generation (RAG)?

Tags
AI
RAG
LLM
Published
March 18, 2024
Author
YidaHu

什么是RAG

"RAG"(Retrieval-Augmented Generation)是一个自然语言处理(NLP)技术,主要用于提高语言模型的效果和准确性。它结合了两种主要的NLP方法:检索(Retrieval)和生成(Generation)。
检索(Retrieval):这一部分的工作是从大量的文本数据中检索出与输入问题最相关的信息。它通常使用一个检索系统,比如基于BERT的模型,来在大规模的文档集合(例如维基百科)中寻找与输入相关的文段。
生成(Generation):生成部分则使用类似GPT的语言模型,它会根据检索到的信息来生成响应或回答。这个过程涉及理解检索到的内容,并在此基础上生成连贯、相关且信息丰富的文本。
RAG模型的关键在于它结合了这两种方法的优点:检索系统能提供具体、相关的事实和数据,而生成模型则能够灵活地构建回答,并融入更广泛的语境和信息。这种结合使得RAG模型在处理复杂的查询和生成信息丰富的回答方面非常有效。这种技术在问答系统、对话系统和其他需要理解和生成自然语言的应用中非常有用。
向量检索为核心的 RAG 架构已成为解决大模型获取最新外部知识,同时解决其生成幻觉问题时的主流技术框架,并且已在相当多的应用场景中落地实践。
开发者可以利用该技术低成本地构建一个 AI 智能客服、企业智能知识库、AI 搜索引擎等,通过自然语言输入与各类知识组织形式进行对话。

为什么需要RAG?

ChatGPT 的出现,使越来越多的开发者开始深入探索大语言模型在实际生产中的应用效果,尤其关注如何搭建一个拥有专属知识的大语言模型应用。
在开始 RAG 的介绍前,先介绍大语言模型在当下的能力边界。
我们可以把大模型比做是一个超级专家,他熟悉人类各个领域的知识,但他也有自己的局限性,比如他不知道你个人的一些状况,因为这些信息是你私人的,不会在互联网上公开,所以他没有提前学习的机会。
当你想雇佣这个超级专家来充当你的家庭财务顾问时,需要允许他在接受你的提问时先翻看一下你的投资理财记录、家庭消费支出等数据。这样他才能根据你个人的实际情况提供专业的建议。
这就是 RAG 系统所做的事情:帮助大模型临时性地获得他所不具备的外部知识,允许它在回答问题之前先找答案。
根据上面这个例子,我们很容易发现 RAG 系统中最核心是外部知识的检索环节。专家能不能向你提供专业的家庭财务建议,取决于能不能精确找到他需要的信息,如果他找到的不是投资理财记录,而是家庭减肥计划,那再厉害的专家都会无能为力。
 

基础RAG

RAG管道的起点是一系列文本文档,在此之前的所有内容,比如数据的获取和加载,都是由功能强大的数据加载工具完成的,这些工具可以读取各种文档或者连接到各种数据源。
notion image
基础RAG的操作流程大致如下:
1、将文本切成小段,然后利用某种Transformer编码器模型,将这些文本段转换为向量形式
2、把所有向量汇集到一个索引里
3、为大模型编写提示词,这提示词会指导模型根据我们在搜索步骤中找到上下文信息来回答用户的查询
在实际运行过程中,会用同一个编码器模型把用户的查询转换为向量,然后根据这个向量在索引中进行搜索。系统会找到最相关的前k个结果,从数据库中提取相应的文本段,然后把这些文本段作为上下文信息输入到大语言模型中。
在改进RAG的方法中,优化提示词是最具有成本效益的尝试。

高级RAG

现在,我们来深入了解高级RAG技术的概述。这里是一个展示核心步骤和相关算法的示意图。为了保持示意图的清晰易懂,一些逻辑循环和复杂的多步骤智能体行为被省略了。
notion image
高级RAG架构的一些关键组件。它更多的是一个可用工具的选择,而不是一个蓝图。
在这个方案中,绿色部分代表接下来将深入探讨的核心RAG技术,而蓝色部分则表示文本。

RAG中的核心组件

RAG的核心组件分为三个部分检索(Retrieval)、增强(Augmentation)、生成(Generation),其分类结构如下图:
notion image

RAG中的检索(Retrieval)

检索是检索增强生成(RAG)框架的核心组件之一,它负责从外部数据源或知识库中获取与用户查询相关的信息。
检索的质量和效率对于RAG系统的性能至关重要,因为它直接影响生成的文本或回答的准确性和相关性。
以下是与检索相关的一些关键概念和技术:
检索策略:RAG系统需要确定何时进行检索以及如何选择要检索的信息。检索策略可以根据任务和上下文进行调整,以提高系统的效率和性能。
检索粒度:检索可以以不同的粒度进行,从单个标记或实体到更大的文本块或知识图。选择适当的检索粒度取决于任务的要求和数据的结构。
检索方法:有多种检索方法可供选择,包括基于关键字的检索、实体检索、自然语言查询和知识图检索等。每种方法都有其适用的情境和优势。
检索效率:高效的检索是关键因素之一,尤其是在实时应用中。优化检索过程以降低延迟和资源消耗是重要任务之一。
外部数据源:RAG系统可以从各种外部数据源中进行检索,包括互联网上的文档、知识库、数据库和API。选择合适的数据源对于获取准确和丰富的信息至关重要。
在RAG框架中,检索与生成和增强技术密切合作,以生成最终的文本或回答。
因此,检索的质量和效率对于整个RAG系统的性能和效果至关重要。

RAG中的增强(Augmentation)

RAG中的增强技术是RAG框架的第三个核心组件,它的作用是进一步提升生成的质量和效果,以确保生成的文本或回答准确、相关且合乎要求。增强技术通过不同方式与检索和生成协同工作,以优化RAG系统的性能。
以下是与RAG中的增强技术相关的一些关键概念和方法:
文本修正:增强技术可以用于修正生成的文本,以确保其准确性和合理性。这可以通过自动文本校对、语法纠正和事实验证等方式实现。
知识融合:一些RAG系统具备将外部知识融合到生成文本中的能力。这可以通过将检索到的知识与生成的文本进行有机结合来实现。
上下文增强:增强技术可以利用上下文信息来优化生成文本的相关性。这包括利用对话历史、用户偏好和任务上下文等信息。
控制生成风格:一些RAG系统允许用户控制生成文本的风格、语气和表达方式。这提供了更高度定制化的生成能力。
多模态增强:在生成多模态内容时,增强技术可以确保不同模态之间的一致性和相关性,以提供更丰富的用户体验。
实时更新:一些RAG系统具备实时更新的能力,可以从外部数据源获取最新信息,并及时反映在生成的文本中。这对于需要及时更新的任务非常重要。
增强技术的选择和应用取决于特定任务和应用场景的要求。通过合理利用增强技术,RAG系统可以提供更具洞察力和相关性的生成文本,从而提高用户满意度和系统的实用性。

RAG中的生成(Generation)

生成是检索增强生成(RAG)框架的另一个核心组件,它负责根据检索到的信息和用户查询生成最终的文本或回答。生成的质量和效果直接影响着RAG系统的性能和可用性。
以下是与生成相关的一些关键概念和技术:
生成模型:RAG系统通常使用生成模型来生成文本或回答。这些模型可以是预训练的语言模型(如GPT系列),也可以是其他生成模型。生成模型的选择取决于任务的要求和性能需求。
文本生成:生成模型将检索到的信息和用户查询转化为自然语言文本。生成文本的质量取决于模型的能力以及输入信息的准确性和相关性。
控制生成:一些RAG系统具备生成文本的控制能力,允许用户指定特定的风格、语气或其他要求。这提供了更高度定制化的生成能力。
多模态生成:一些高级RAG系统具备生成多模态内容的能力,包括图像、音频和视频。这拓展了RAG的应用领域。
对话生成:一些RAG系统用于对话生成,能够实现复杂的对话和多轮问答。这在聊天机器人和虚拟助手等应用中特别有用。
评估生成:生成的质量通常需要经过评估来衡量,以确保生成的文本准确、相关且合乎要求。评估方法和指标对于RAG系统的性能评估至关重要。
在RAG框架中,生成与检索和增强技术协同工作,以生成最终的输出。生成的能力和质量对于RAG系统的整体性能和用户体验至关重要。
RAG 的技术原理
在 RAG 出现之前,早期的问答系统主要依赖预定义的规则和模板,以及简单的关键词匹配技术。知识图谱的出现,为问答系统带来了一定的改进,但这些系统仍然依赖固定的数据结构和知识库,限制了系统处理复杂问题的能力发展。
大语言模型出现后,尤其是 ChatGPT 的出现,显著提高了机器对自然语言的理解能力,大语言模型在大量文本上进行预训练后,能够生成更自然、更准确的语言。
RAG 结合了信息检索和文本生成两种方法,旨在突破传统问答系统的局限。通过将外部数据检索的相关信息输入大语言模型,大语言模型能够基于这些信息生成回答,进而增强答案生成的能力。RAG 能够处理更广泛、更复杂的问题。
使用 RAG 后可以有效解决大语言模型细分领域的幻觉和知识过期的问题。通过预检索模块,无需一次性向大语言模型输入过多的知识,大部分知识都可以用外部数据库承载,解决了当前大语言模型对话长度受 Token 限制的问题。
值得注意的是,在生成回答时,RAG 系统不是简单地复制检索到的信息,而是在综合并加工这些信息,这使最终的回答既准确又具有一定的原创性。这一点是 RAG 区别于其他简单问答系统的关键。
01. RAG 的核心组件
RAG 主要有两个核心组件:信息检索和文本生成。
信息检索
信息检索(Retrieve)的主要任务是在一个大型的知识库或文档集合中搜索与用户提出的问题相关的信息。这个过程类似人在图书馆中查找相关书籍以回答某个问题。通常,这一步骤依赖传统的信息检索技术,如倒排索引、TF-IDF 评分、BM25 算法等,或者采用更现代的基于向量的搜索方法。
虽然让大语言模型拥有特定领域的知识就要外挂向量数据库已经成为业内共识,但其实不只是向量数据库,所有外部存储的内容都可以被检索,再进行二次生成。
文本生成
文本生成(Generate)的职责是根据检索到的信息生成一个连贯、准确的回答。这个过程可以看作根据收集到的材料撰写一篇简短的文章或回答。
这个功能通常采用预训练的生成式语言模型来实现,如 GPT 系列。这些模型在大量文本上进行预训练,能够生成流畅且语义连贯的文本。
信息检索和文本生成两个组件的紧密结合至关重要。信息检索为文本生成提供了必要的原料,而文本生成则将这些原料转化为易于理解和有用的信息。这种结合使得 RAG 能够处理更复杂的查询,并生成更准确、更丰富的回答。
值得注意的是,在进行检索之前,对数据的处理也非常重要。通常,外部数据不仅存储在数据库中,也可能存储在外部文档(PDF、Markdown、Word、Excel 等)或网页中。这时,需要对所有外部数据进行清洗和处理,同时需要提取一些元数据,包括文件名、时间、章节、图片等。
另外,仅加载外部文件是不够的。通常,外部文件非常大,而且 Embedding 模型和大语言模型都有长度限制,这时就需要将文件进一步切割成文本块(Chunk),才能精准地进行检索和生成。根据索引方式的不同、模型选择的不同,以及问答文本长度和复杂度的不同,切割的方法也有不同,简单的数据处理的流程如图 1 所示。笔者会在第 10 章对数据处理进行更详细的介绍。
notion image
图 1
02. RAG 的工作流程
首先,通过检索系统引导大语言模型从外界数据库中查找与问题相关的文档或段落;然后,重新构建输入大语言模型的内容。最后,使用大语言模型在此基础上生成符合检索系统规定格式的答案。简而言之,RAG 被视为模型的“外挂数据库”,以优化其回复。
为了让读者有完整的结构概览,结合数据处理流程和 RAG 流程,可以将 RAG 的工作流程简化为图 2 所示的形式。接下来将重点介绍 RAG 的工作流程。
notion image
图 2
 

RAG的优势:

  • 更灵活的知识获取:RAG允许从外部数据源实时检索信息,因此可以获取最新的、领域特定的知识,而微调通常依赖于静态的预训练数据。
  • 避免“幻觉”问题:RAG通过检索外部信息来验证生成的文本,可以减少生成不准确信息的问题,这在微调中可能更容易出现。
  • 多模态支持:RAG可以轻松支持多模态内容的生成,包括文本、图像、音频等,而微调通常专注于文本生成。
 

未来展望

RAG(检索增强生成)技术在不断发展和演进,未来有许多潜在的发展方向和前景。
挑战识别和解决:未来的研究可以致力于识别和解决RAG技术面临的挑战,特别是在知识检索、生成文本质量和多模态支持方面的挑战。这包括改进检索准确性、提高生成文本的一致性和深化多模态整合。
多模态扩展:随着多模态内容的需求不断增长,未来的研究可以探索如何更好地支持多模态生成,包括文本、图像、音频等。这涉及到跨模态信息的有效整合和生成技术的改进。
实时知识更新:对于需要及时更新的任务,未来的研究可以集中在如何实现实时知识检索和更新,以确保生成的文本始终保持最新和准确。
增强RAG生态系统:RAG技术的发展可以促进建立更加完善的RAG生态系统,包括更多的开源工具、资源和应用场景。这将有助于更广泛地推广和应用RAG技术。
融合知识图谱:未来的研究可以考虑如何更好地融合知识图谱等结构化知识源,以进一步提高RAG系统的性能和效果。
总的来说,RAG技术具有广阔的研究前景和应用前景。未来的研究将继续探索新的方法和技术,以不断改进和扩展RAG系统的功能和性能,从而更好地满足各种知识密集型任务和应用场景的需求。
 

知识库问答(二):LangChain调优

原创 木水酱 ,公众号:银河系降落伞
源地址:https://mp.weixin.qq.com/s/0wh7oBgyRj6jHrlYWa_P-g
初次体验效果并不够理想,这也是目前RAG常被人诟病的一点:入门简单,但用好却非常难!
因此我查阅了大量资料,基于LanChain实现的步骤,从整理知识库文档、知识库数据入库、embedding、召回Top k、构建prompt、LLM生成答案这6个阶段,分别总结了可能的调优方向(不涉及实现细节)。
就其中操作性较强的可优化点,我们也做了一些测试,确实发现了效果的显著提升。
如果对LangChain框架的实现原理还不够了解,可点击产品视角的大模型RAG应用-知识库问答(一):LangChain初体验查看

如何调优

整理知识库文档阶段

在最开始,我们需要确定知识库包含哪些文档,比如政策原文文档、业务积累的QA、操作指引、产品说明等,并对这些文档进行预处理。
知识库本身质量对最终效果的影响至关重要,这是大模型最终生成回答的原始语料。
在此阶段,可以考虑以下优化方向:
  • 文档的格式:pdf、docx()等不同格式的文档,识别难度不一样。从目前公开的资料来看,一般PDF文档的效果会更好一些,因为pdf文档的格式信息相对来说较为简洁,对大模型干扰少。但也有说.docx的效果更优的,因此实践中还是要根据场景去测试。
  • 文档命名:尽量控制在10字左右,涵义简洁明了,避免标题中出现无意义的数字、符号或缩写。
  • 文档语言:尽量统一为同一种。因为embedding模型对于中英文、繁简体的支持可能不一样,如果文档不做处理,引擎会把中英文切到一个 chunk 里面,向量化之后有一半可能是乱码,有一半是没有用的数据。
  • 文档内容:设置可清晰识别的一二级标题,对难以处理的图片、表格、公式、超链接、附件、架构图、代码等进行特殊处理。
  • 构建问答对:因为最终的交互是问答的形式,所以在构建知识库时,如果能基于用户可能的提问方式,构建问答对,作为知识库原始数据,一般能达到更好的效果,但构建问答对的过程需要耗费较多人力,还需要考虑运营成本。
需要注意的是,对知识库的处理是一个case by case的事情,并不存在一个放之四海而皆准的公式,需要根据具体的场景和需求以及处理成本去做大量实践,才能找到最适合自己的。

知识库数据入库阶段

整理好知识库文档,就需要上传文档,开始构建本地的知识库。同时,知识库文档入库时,为了便于分析和处理,需要将长文本切割为小块(chunk)。
在此阶段,可以考虑以下优化方向:
  • 优化内容提取的方式:应用适当的方法从文档中提取内容,如从PDF中提取文档内容可参考https://www.luxiangdong.com/2023/10/05/extract/#/写在前面
  • 设置合理的文档切割chunk_size:设置chunk_size时,需要考虑知识库文档本身是较长的文档,还是较短的内容;所选取的embedding模型在多大的chunk_size上表现最佳;对用户提问以及对应回答原文长度的预期等。在实际中,要结合这些因素,选择最佳的分块策略,具体可参考:https://www.luxiangdong.com/2023/09/20/chunk/#/分块需要考虑的因素
  • 文档段落处理:基于文档切割时所设置的chunk_size,对知识库文档的段落进行拆分或者合并,尽量保证连贯语义数据不会被切割。
  • 手动切割分段:为了保证知识库数据的完整性,人工对内容进行准确切割
  • 知识库文档标注:为了提升召回准确性,一方面在导入前,先对知识库文档内容进行标注处理,另一方面对于切割后的chunk进行标注,如标注chunk来源哪个文档的哪个段落。

3、embedding阶段

将知识库文档切割成chunk之后,需要通过embedding技术,转换为算法可以处理的向量,存入向量数据库。
在此阶段,可以考虑以下优化方向:
  • embedding模型的选择:不同的embedding模型对准确性的影响较大,且不同的场景适合的embedding模型可能不一致,一般的说法是bge-large-zh模型对中文的支持较好,我们在实践中也发现bge-large-zh优于m3e-base。
  • 向量库类型:LangChain Chatchat框架默认的是faiss,据说milvus也不错(但我们还没有验证过)。
一般采用 Top5 的召回准确率和 Top10 的召回准确率来评估embedding模型的好坏,TopN() 召回准确率 = TopN 条 chunk 包含了答案的问题数/总的问题数。

4、召回Top-K阶段

用户提问后,同样将用户的问句向量化。将用户的问句与向量数据库中的chunk匹配,匹配出与问句向量最相似的top k个。
在此阶段,可以考虑以下优化方向:
  • 检索模型优化:在上一篇的实践中我们发现,回答错误的原因有很大部分是未匹配到正确的原文片段,因此检索优化是调优的重点方向。分享一个我看到的做法:将所有的文本组织成二级索引,第一级索引是 [关键信息],第二级是 [原始文本],二者一一映射。检索部分只对关键信息做embedding,参与相似度计算,把召回结果映射的原始文本交给LLM。具体可查看:https://zhuanlan.zhihu.com/p/651179780
  • k的取值:考虑用户的提问一般会是什么问题,其对应的文档片段大致会在什么区间,根据实际的使用场景去不断测试,选择最佳的k值。一般来说,调大k值,会增加召回片段中含有正确答案的概率,但k值并不是越大越好,k值过大时,召回的无关信息更多,模型生成的答案质量反而会更差。
  • Temperature参数的值:Temperature代表的是生成内容的精准程度,1代表十分精确,不包含废话和错误信息,而0代表发散,生成的内容会更有创造性,大模型将根据已有信息编造内容。需要根据自己的场景,设置合适的Temperature值。
  • 利用大模型能力增强召回效果:除了调用大模型生成答案以外,在召回阶段还可以应用大模型增强召回效果,但需要考虑多次调用大模型的成本。具体可查看:https://zhuanlan.zhihu.com/p/653808554
  • Top k的排序方式:开源框架()检索返回的Top K,会按照它们在数据库中的顺序进行排序,目的是保留原始数据库的上下文结构。但开源框架返回的不一定是最优的排序,尤其是当索引有数百万或千万级别时,精确度一般不会太高。这时候可以增加top k的大小,比如从10个增加到30个,然后再使用更加精确的算法进行rerank。具体可查看:https://www.zhihu.com/question/628651389/answer/3356678699

5、Prompt阶段

匹配出与问句向量最相似的top k个chunk之后,会将匹配出的文本和问句,一起添加到配置好的prompt中,提交给LLM。
在这个阶段,可能需要一定的prompt工程,选择最合适的prompt模板
根据论文《Lost in the Middle: How Language Models Use Long Contexts》,大模型对上下文中间位置的知识点提取较差,因此在prompt中,把query放到头部和尾部,同时根据相似度,把相似度大的文档放到context的两端,能提升回答效果。

6、LLM生成答案

prompt提交给LLM后,LLM将生成回答,返回给用户。此时最大的影响因素就是大语言模型本身的性能
选择大模型时,也需要在成本和收益之间找到最佳平衡点,有些场景可能不需要最好的大模型,就可以实现还不错的效果。
有条件的还可以对模型进行微调,使模型能力更加匹配自身的场景。

调优实践

基于以上的分析,我们先选取了实现成本最小的方式进行调优,结果如下:
1、更换大模型:从ChatGLM2-6B替换成baichuan2-13b,发现针对我们的场景,后者的性能可以提升一倍左右
2、更换embedding模型:将embedding模型从LangChain Chatchat默认的m3e-base替换为bge-large-zh,发现后者优于前者
3、测试不同Top k的值:比较Top 5、Top 10、Top 15的结果,发现Top 10时效果最优。
notion image
4、对文档名称进行处理:由于原来的政策文件,在导出时文件名会进行简化,如too_long_发展行动方案。因此,人工对文件进行重命名,上传相同文件构建知识库,同时在构建知识库时勾选【开启中文标题加强】选项,发现重命名文件对结果的提升效果不明显,但勾选【开启中文标题加强】选项后,回答的无关信息减少,效果有所提升。
notion image
目前来看,尽管效果有所提升,但仍未达到可用水平,后续我们也将尝试其他的调优策略。

参考文献: