在本博客中,我将解决这些挑战,更重要的是,我们将深入研究提高RAG性能的解决方案,使其可用于生产环境。
图片来源:https://arxiv.org/pdf/2401.05856.pdf
我将讨论来自不同研究论文的各种优化技术。这些技术中的大多数将基于我特别喜欢的一篇研究论文,题为“Retrieval-Augmented Generation for Large Language Models: A Survey.”(链接:https://arxiv.org/pdf/2312.10997.pdf)。该论文包含了大部分最新的优化方法。
1. RAG工作流程分解
首先,为了增强对RAG的理解,我们将RAG工作流程分解为三个部分,并对每个部分进行优化以提高整体表现。
- Pre-Retrieval
在Pre-Retrieval步骤中,准备LLM原始训练数据集之外的新数据(也称为外部数据)并将其分成chunk,然后使用嵌入模型将块数据转换为数字表示并将其存储在向量数据库中。这个过程创建了一个LLM可以理解的知识库。
- Retrieval
在最重要的Retrieval步骤中,将用户查询转换为称为嵌入的向量表示,并使用余弦相似度从向量数据库中查找相关块。它试图从向量存储中找到高度相关的文档块。
- Post-Retrieval
接下来,RAG模型通过在上下文(查询+上下文)中添加相关的检索数据来增加用户输入(或提示)。此步骤使用提示工程技术与LLM进行有效沟通。增强的提示允许LLM使用给定的上下文为用户查询生成准确的回答。
- 目标
我们的目标是通过对不同部分应用各种技术来增强RAG工作流的每个组件能力。
2. Pre-Retrieval优化
Pre-retrieval技术包括提高索引数据的质量和块优化。这个步骤也可以称为增强语义表示
- 增强数据颗粒度
提高数据质量 “垃圾进,垃圾出”。
数据清洗在RAG框架中起着至关重要的作用。RAG的效果取决于数据清洗和组织的好坏。删除不必要的信息,如特殊字符、不需要的元数据或文本。
- 删除不相关的文本/文档:删除所有不需要LLM来回答的不相关文档。还要删除噪声数据,这包括删除特殊字符、停止词(如“the”和“a”等常用词)和HTML标记。
- 识别和纠正错误:包括拼写错误、打字错误和语法错误。
- 在分块中用名称代替代词,可以提高检索时的语义重要性。
- 添加元数据
添加元数据,如概念和层级标签,以提高索引数据的质量。
添加元数据信息包括将引用的元数据(如日期和用途)集成到块中以进行过滤,以及将引用的章节和小节等元数据集成到块中以提高检索效率。
以下是元数据有用的一些场景:
- 如果搜索对象的条件是最近一段时间,那么可以对日期元数据进行排序
- 如果你搜索科研论文,你事先知道你要找的信息总是位于一个特定的部分,比如实验部分,你可以添加文章部分作为每个块的元数据,并对其进行过滤,只匹配实验部分。
元数据很有用,因为它在向量搜索的基础上又增加了一层结构化搜索。
- 优化索引结构
- 知识图或图神经网络索引通过利用图数据索引中节点之间的关系,合并图结构中的信息以捕获相关上下文。
- 向量索引。
3. 分块优化
选择正确的chunk_size是一个关键的决定,它可以在几个方面影响RAG系统的效率和准确性:
- 相关性和粒度
较小的chunk_size,如128,产生更细粒度的块。但是,这种粒度存在风险,如重要信息可能不在检索到的最前面的块中,特别是当similarity_top_k设置被限制为2时。相反,块大小为512可能包含顶部块中的所有必要信息,从而确保查询的答案随时可用。
- 响应生成时间
随着chunk_size的增加,输入LLM生成答案的信息量也会增加。虽然这可以确保更全面的上下文,但它也可能减慢系统响应的速度。
- 挑战
如果文档块太小,它可能不包含LLM回答用户查询所需的所有信息,如果块太大,则可能包含太多不相关的信息,这会使LLM感到困惑,或者可能太大而无法适应上下文大小。
- 基于任务的文本分块
根据下游任务需要确定块的最优长度以及每个块有多少重叠。
像文本总结这样的高级任务需要更大的块大小,而像编码这样的低级任务需要更小的文本分块。
4. 分块技术
Small2big or Parent Ducument Retrieval
ParentDocumentRetriever通过分割和存储小块数据来实现这种平衡。在检索过程中,它首先获取小块,然后查找这些块的父id,并将这些较大的文档返回给LLM。
它在初始搜索阶段使用小文本块,随后向语言模型提供更大的相关文本块进行处理。
递归检索涉及在初始检索阶段获取较小的块以捕获关键语义。随后,在流程的后期阶段,将向LLM提供包含更多上下文信息的更大的文本块。这种两步检索方法有助于在效率和提供上下文丰富的响应之间取得平衡。
步骤:
-
该过程包括将原始大文档分解为较小、更易于管理的单元(称为子文档)和较大的块(称为父文档)。
-
它专注于为每一个子文档创建嵌入,这些嵌入比每一个完整的父块嵌入更丰富、更详细。它帮助框架识别包含与用户查询相关信息的最相关子文档。
-
一旦建立了与子文档的对齐,它就会检索与该子文档相关联的整个父文档。在所示的图片中,最终获得了父块。
-
父文档的这种检索很重要,因为它为理解和响应用户的查询提供了更广泛的上下文。框架现在可以访问整个父文档,而不是仅仅依赖于子文档的内容。
5. 句子窗口检索
这种分块技术与上面的非常相似。句子窗口检索的核心思想是根据查询从自定义知识库中有选择地获取上下文,然后利用该上下文的更广泛版本来生成更健壮的文本。
这个过程包括对一组有限的句子进行编码以供检索,以及围绕这些句子的附加上下文,称为“窗口上下文”,单独存储并链接到它们。一旦识别出最相似的句子,就会在这些句子被发送到大型语言模型(LLM)生成之前重新整合上下文,从而丰富整体上下文理解。
6. 检索优化
这是RAG工作流中最重要的部分,它包括基于用户查询从向量数据库中检索文档。这个步骤也可以称为对齐查询和文档。
- 查询重写
查询重写是对齐查询和文档语义的基本方法。
在这个过程中,我们利用语言模型(LLM)功能来改写用户的查询生成一个新的查询。需要注意的是,在人类看来相同的两个问题在嵌入空间中可能并不相似。
- MultiQuery检索器
多查询检索方法利用LLM从不同的角度为给定的用户输入查询生成多个查询,有利于处理具有多个子问题的复杂问题。
对于每个查询,它检索一组相关文档,并在所有查询中获取唯一联合,以获得更大的潜在相关文档集。
通过在同一个问题上生成多个子问题,MultiQuery Retriever可能能够克服基于距离的检索的一些限制,并获得更丰富的结果集。
- Hyde或Query2doc
Hyde和Query2doc都是类似的查询重写优化。考虑到搜索查询通常很短、模棱两可或缺乏必要的背景信息,LLM可以提供相关信息来指导检索系统,因为它们通过对数万亿个token进行预训练来记忆大量的知识和语言模式。
- StepBack-prompt(抽象式提示)
退步提示方法鼓励语言模型超越具体的例子,专注于更广泛的概念和原则。
该模板复制了“step - back”提示技术,该技术通过先问一个“step - back”问题来提高处理复杂问题的效果。通过检索原始问题和stepback问题的信息,可以将该技术与标准问答RAG应用程序结合使用。下面是一个stepback prompt的示例。
7. 微调嵌入模型
微调嵌入模型会显著影响RAG系统中检索内容的相关性。该过程包括自定义嵌入模型,以增强特定领域上下文中的检索相关性,特别是对于持续更新或存在罕见术语的专业领域。
- 生成用于训练和评估的合成数据集
这里的关键思想是,可以使用GPT-3.5-turbo等语言模型生成用于微调的训练数据,以基于文档块制定问题。这允许我们以可扩展的方式生成合成的正对(查询、相关文档),而不需要人工标注。最终的数据集将是成对的问题和文本块。
- 微调嵌入模型
在生成的训练数据集上微调任何嵌入模型。
- 混合搜索探索
RAG系统通过智能集成各种技术来优化其性能,包括基于关键字的搜索、语义搜索和向量搜索。
这种方法利用每种方法的特定优势来适应不同的查询类型和信息需求,确保对高度相关和上下文丰富的信息进行一致的检索。使用混合搜索作为检索策略的强大补充,从而提高了RAG流水线的整体效率。
- 常见的例子
最常见的模式是将稀疏检索器(如BM25)与密集检索器(如嵌入相似度)结合起来,因为它们的优势是互补的。它也被称为“混合搜索”。稀疏检索器擅长根据关键词找到相关文档,而密集检索器擅长根据语义相似度找到相关文档。
8. Post-Retrieval优化
a) 重排
在将检索结果发送给LLM之前对其重新排序可以显著提高RAG的性能。
向量相似性搜索的高分并不意味着它就具有最高的相关性。
核心概念包括重新排列文档记录,将最相关的放在最top,从而限制文档的总数。这既解决了检索过程中上下文窗口扩展的难题,又提高了检索效率和响应速度。
增加查询引擎中的similarity_top_k以检索更多上下文段落,在重排后可以减少到top_n。
b) 提示压缩
检索文档中的噪声会对RAG性能产生不利影响,因此,与查询最相关的信息可能会被隐藏在包含大量不相关文本的文档中。在应用程序中传递完整的文档可能会导致LLM调用成本更高,响应也更差。
在这里,重点在于压缩不相关的上下文,突出关键段落,并减少整个上下文的长度。
- 上下文压缩
上下文压缩就是为了解决这个问题。其思想很简单:与其按原样立即返回检索到的文档,它可以使用给定查询的上下文压缩它们,以便只返回相关信息。这里的“压缩”既指压缩单个文档的内容,也指过滤掉整个文档。
文档压缩器是一个小型语言模型,用于计算用户查询和检索文档的提示互信息,估计元素的重要性。
9. 模块化RAG
模块化RAG集成了多种方法来增强RAG的不同组成部分,如在检索器中加入相似度检索的搜索模块和应用微调方法
- RAG融合(RAG Fusion)
RA融合技术结合了两种方法:
- 多查询检索
利用LLMs从不同的角度为给定的用户输入查询生成多个查询,这有利于解决包含多个子问题的复杂问题。
- 重新排序检索到的文档
对所有检索到的文档重新排序,并删除所有相关分数低的文档
这种先进的技术保证了搜索结果符合用户的意图,无论他们是否明显。它帮助用户找到更有洞察力和相关的信息。
总结
本文讨论了优化RAG管道各部分和增强整体RAG流水线的各种技术。您可以在您的RAG流水线中使用这些技术中的一种或多种,从而使其更加准确和高效。我希望这些技术可以帮助你为你的应用构建一个更好的RAG流水线。
如何系统的去学习大模型LLM ?
大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业
?”“谁的饭碗又将不保了?
”等问题热议不断。
事实上,抢你饭碗的不是AI,而是会利用AI的人。
继科大讯飞、阿里、华为
等巨头公司发布AI产品后,很多中小企业也陆续进场!超高年薪,挖掘AI大模型人才! 如今大厂老板们,也更倾向于会AI的人,普通程序员,还有应对的机会吗?
与其焦虑……
不如成为「掌握AI工具的技术人
」,毕竟AI时代,谁先尝试,谁就能占得先机!
但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高。
针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料
分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
一、LLM大模型经典书籍
AI大模型已经成为了当今科技领域的一大热点,那以下这些大模型书籍就是非常不错的学习资源。
二、640套LLM大模型报告合集
这套包含640份报告的合集,涵盖了大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(几乎涵盖所有行业)
三、LLM大模型系列视频教程
四、LLM大模型开源教程(LLaLA/Meta/chatglm/chatgpt)
LLM大模型学习路线 ↓
阶段1:AI大模型时代的基础理解
-
目标:了解AI大模型的基本概念、发展历程和核心原理。
-
内容:
- L1.1 人工智能简述与大模型起源
- L1.2 大模型与通用人工智能
- L1.3 GPT模型的发展历程
- L1.4 模型工程
- L1.4.1 知识大模型
- L1.4.2 生产大模型
- L1.4.3 模型工程方法论
- L1.4.4 模型工程实践
- L1.5 GPT应用案例
阶段2:AI大模型API应用开发工程
-
目标:掌握AI大模型API的使用和开发,以及相关的编程技能。
-
内容:
- L2.1 API接口
- L2.1.1 OpenAI API接口
- L2.1.2 Python接口接入
- L2.1.3 BOT工具类框架
- L2.1.4 代码示例
- L2.2 Prompt框架
- L2.3 流水线工程
- L2.4 总结与展望
阶段3:AI大模型应用架构实践
-
目标:深入理解AI大模型的应用架构,并能够进行私有化部署。
-
内容:
- L3.1 Agent模型框架
- L3.2 MetaGPT
- L3.3 ChatGLM
- L3.4 LLAMA
- L3.5 其他大模型介绍
阶段4:AI大模型私有化部署
-
目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。
-
内容:
- L4.1 模型私有化部署概述
- L4.2 模型私有化部署的关键技术
- L4.3 模型私有化部署的实施步骤
- L4.4 模型私有化部署的应用场景
这份 LLM大模型资料
包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓