今天这篇文章就来为大家介绍了检索增强生成(RAG)技术的几种基本工作类型,以及RAG中用到的高级的技术,来看看科学家们优化大模型,都是用了什么样的好点子
RAG的几种工作类型
提示增强 Query-based RAG
Query-based RAG(基于查询的检索增强生成)结合了信息检索和自然语言生成的能力,也称为提示增强,是最基础的RAG系统类型。这种类型的RAG在处理用户提出的问题query时,会直接将问题与从文档中提取的信息一起,用Embedding的方式转化为大模型可以识别的向量,在语言模型的输入阶段进行融合。这是一种在RAG的多种应用中非常普遍的方法。
白话一点理解下这个过程,RAG系统开始于一个文本集合,我们可以把它的工作流程想象成几个简单的步骤:
首先,它将文本分解成若干部分,然后利用一种特殊的转换器(transformer encoder)将这些部分转换成向量形式,并将这些向量存储到一个索引中。这个过程就像是把书的内容撕成一页一页,然后扫描每页的关键信息,做成一个电子目录。
接下来,RAG系统会创建一个提示语,这是给语言模型(LLM)的指令,告诉它如何根据用户的问题来提供答案。这个提示语就像是给模型的一份搜索指南。
当用户提出问题时,RAG系统会用同样的转换器处理这个问题,将其转换成向量,然后在之前建立的索引中搜索最相关的几个条目,这些条目就像是从电子目录中找到的几页书。系统会从数据库中检索出这些相关的文本块,并将它们作为上下文信息,以提示语Prompt的方式提供给LLM语言模型,帮助它生成一个准确的回答。过程就好比是根据目录找到书的某些部分,然后把这些部分呈现给读者,帮助他们理解问题的答案。
①人工智能/大模型学习路线
②AI产品经理入门指南
③大模型方向必读书籍PDF版
④超详细海量大模型实战项目
⑤LLM大模型系统学习教程
⑥640套-AI大模型报告合集
⑦从0-1入门大模型教程视频
⑧AGI大模型技术公开课名额
基于隐式表示的RAG Latent Representation-based RAG
Latent Representation-based RAG(Retrieval-Augmented Generation)是一种利用潜在表示来增强生成模型的人工智能技术。在这种框架下,"Latent Representation"指的是数据在潜在空间中的表示,这是一个抽象的多维空间,其中每个维度代表了数据的一种潜在特征或属性。
在Latent Representation-based RAG中,模型会执行以下步骤:
- 检索阶段:模型接收到用户的查询后,从大量数据中检索出相关信息。这些信息可以是文本、图像或其他类型的数据。
- 编码阶段:检索到的信息和原始查询一起被编码成潜在表示。这通常通过使用如BERT、GPT或其他预训练语言模型来完成,将文本转换为固定大小的向量。
- 潜在空间处理:编码后的向量存在于潜在空间中,模型会在这个空间中对信息进行进一步的处理,比如通过计算向量间的相似度来找到最相关的信息。
- 生成阶段:利用潜在表示来生成响应或文本。这可能涉及到解码器网络,它根据潜在表示来生成自然语言或其他形式的输出。
基于对数的RAG Logit-based RAG
基于对数的RAG通常指的是模型在生成响应时,会考虑从检索到的文档中得到的对数几率(logits),这是一种衡量概率的数学方法。在RAG模型中,logit-based方法会将检索到的信息转化为概率分布,然后利用这些概率信息来加权或影响最终生成的文本。
具体来说,在Logit-based RAG模型中,会执行以下步骤:
- 检索阶段:模型接收到用户的查询后,会从预先存在的文档集合中检索出相关的文档或文档片段,作为摘要候选。
- 编码阶段:检索到的文档和原始查询一起被编码成向量形式,通常使用如BERT这样的预训练语言模型。
- 融合阶段:编码后的向量会结合检索到的文档的对数几率,这会涉及到对检索结果的排序或加权。
- 生成阶段:融合了检索信息和原始查询的向量输入到生成模型中,如基于Transformer的解码器,生成响应或文本。
推测性检索增强生成 Speculative RAG
Speculative RAG(推测性检索增强生成)是一种特殊的RAG(Retrieval-Augmented Generation)技术的应用方式,它利用检索过程来替代生成过程中的某些部分,旨在通过利用检索而非纯生成来节省资源并加快响应速度。在Speculative RAG中,系统会生成一些候选的回复,然后使用检索模块来替代小型模型的生成过程,将用户查询和检索到的内容一起送入大型模型进行验证。这种方法在检索器的成本低于生成器的生成成本时具有很大的应用潜力。例如,在类似ChatGPT接口作为生成器的场景下,调用次数越多意味着成本越高,因此可以搜索过往的相同或极度相似的问题来直接得到回答。
RAG中的高级技术
1.分块和矢量化
RAG系统的基础主要是对内部或者垂直领域知识的一个扩充,所以我们需要构建一个向量索引来捕捉文档内容的精髓。在实际操作中,就是要搜索与查询向量距离最近、语义最接近的向量。
由于transformer模型对输入序列长度有限制,因此,选择输入上下文时,选取几个句子的向量通常比从多页文本中取平均值的向量更能准确反映原文意义。这就是为什么将数据分块化是一个有效的策略。我们应该将文档切分成合理大小的块,例如完整的句子或段落,而不是将句子随意切割。幸运的是,现在有许多文本分割工具可以完成这项工作。以LlamaIndex平台的NodeParser为例,它提供了多种高级功能,包括自定义文本分割器、处理元数据以及定义节点或块之间的关系。
确定数据块的理想大小是一个需要仔细考虑的参数,这依赖于所使用的嵌入模型及其能够处理的token数量。标准的transformer编码器,比如BERT的句子转换器,通常限制在512个token以内。而像OpenAI的ada-002这样的模型能够处理更长的序列,例如8191个token。但关键的权衡在于,既要提供足够的上下文让大型语言模型(LLM)能够进行有效推理,同时又要确保文本长度适合嵌入模型有效地执行搜索。
下一步是选择一个模型来生产所选块的嵌入,同样有很多方法,例如搜索优化的模型( bge-large 或者E5 系列),MTEB 排行榜可以得到最新的一些方法信息。
2.分层索引
在RAG(Retrieval-Augmented Generation)的大型模型应用中,核心组件是搜索索引,它负责存储文档内容的向量化形式。查询向量化是首要步骤,随后是检索top k个最相关的数据块。实现这一过程最简单的方法是使用平铺索引,通过计算查询向量与所有块向量之间的距离来执行搜索。
为了在大规模数据集上实现高效的搜索,需要一个经过优化的向量搜索索引。常用的工具有faiss、nmslib或annoy,它们采用近似最近邻搜索技术,如基于聚类、树结构或HNSW(High-Performance Nearest Neighbor Search)算法。此外,还有一些管理型解决方案,例如Elasticsearch和专门的向量数据库,它们负责处理数据的索引和检索流程。
根据所选索引工具的不同,还可以将元数据与向量一起存储,利用元数据过滤器根据特定日期或数据源进行信息检索。LlamaIndex平台支持多种向量存储索引,并提供其他简单的索引实现方式,如列表索引、树索引和基于关键字的索引。
当处理大量文档时,关键在于能够高效地搜索和聚合信息,将检索到的内容整合在带有源引用的答案中。对于庞大的文档集合,一种有效的搜索策略是构建两个索引:一个用于文档摘要,另一个用于文档块。搜索过程分为两步:首先利用摘要索引快速过滤出相关文档,然后通过块索引在这些文档中进行详细搜索。这种方法提高了搜索效率,确保了信息的相关性和准确性。
3.融合/混合检索
还有一种提升搜索效果的策略是让大型语言模型(LLM)针对每个文本块生成相关问题,并将这些问题转化为向量。在搜索时,我们用这些问题的向量来查询索引,代替原先的文本块向量,然后将这些向量路由到它们对应的原始文本块,作为LLM生成答案的上下文。这样做可以提升搜索的准确性,因为相比于文本块本身,问题向量与查询在语义上更为接近。此外,还有一种称为HyDE的方法,它采用相反的逻辑:让LLM生成一个假设的查询响应,然后利用这个响应的向量来增强搜索效果。
为了在搜索中包含更精细的文本块并提升搜索质量,可以在LLM中添加更多的上下文信息。这可以通过两种方式实现:一种是句子窗口检索,即在检索到的文本块周围增加句子,以构建更完整的上下文;另一种是父文档检索,即通过递归地将文档分解成更大的块,这些大块中又包含有待检索的小块。
在句子窗口检索中,文档中的每一句子都被单独嵌入,这样可以利用余弦相似度进行精确的上下文搜索。一旦找到最相关的句子,就将其前后扩展k个句子作为上下文窗口,并将这个扩展的上下文提供给LLM,以便进行更准确的推理。
父文档检索与句子窗口检索类似,也是为了搜索更细粒度的信息,并在提供给LLM之前扩展上下文窗口。文档被分解成由较大父块引用的小块。具体操作是,文档被划分成块的层级结构,最小的块(叶子块)被发送到索引。在检索过程中,首先获取这些小块,然后如果在top-k的检索结果中,有超过n个小块与同一个父块(较大的块)相关联,就用这个父块来替换提供给LLM的上下文。
此外,还有一种传统的思路,即将现代的语义搜索或向量搜索的结果,如tf-idf或BM25这样的稀疏检索算法所得到的结果,结合起来,以获得最佳搜索效果。关键在于如何恰当地结合不同检索结果的相似度得分,这通常通过Reciprocal Rank Fusion(RRF)算法来实现,它能够重新排序检索结果,以得到最终的输出。
在 LangChain中,这是在集成检索器类中实现的,例如,一个 Faiss 矢量索引和一个基于 BM25的检索器,并使用 RRF 进行重新排序。
混合或融合搜索通常在考虑查询和存储文档之间有语义相似性和关键字匹配的情况下,将两种互补的搜索算法结合起来,提供更好的检索结果。
4.Rerank及过滤
我们获得了初步的搜索结果后,接下来的步骤是通过筛选和重新排序来优化这些结果。LlamaIndex平台提供了多种后处理工具,这些工具可以根据相似度评分、关键词匹配度或元数据等标准来过滤结果,也可以利用其他模型,如基于句子的Transformer交叉编码器,来进行结果的重新排序。此外,还可以根据元数据特征,例如日期的接近性,来进行聚类排序。
这个过程是将检索到的文本上下文传递给大型语言模型(LLM)以生成最终答案前的关键一步。通过这种方式,我们可以确保提供给LLM的上下文是最相关、最精确的,从而提高最终生成答案的质量
5.Query的变换
查询转换技术通过利用大型语言模型(LLM)作为推理引擎,对用户的原始查询进行改写或分解,以提升搜索效果。这项技术有多种实施方式。
面对复杂的查询时,LLM能够将其拆解为若干个更简单、更具体的子查询。例如,对于问题“在GitHub上,Langchain和LlamaIndex哪个获得了更多的星标?”由于直接的答案不太可能出现在语料库中,因此将这个问题分解为两个子问题进行搜索是更有意义的。这两个子问题可以是“Langchain在GitHub上获得多少星标?”和“LlamaIndex在GitHub上获得多少星标?”这两个问题可以同时进行搜索,然后,将搜索结果合并到一个提示中,由LLM来综合这些信息,生成对原始查询的最终答案。
在这个过程中,Langchain可以作为一个多查询检索器,而LlamaIndex则可以作为一个子问题查询引擎。这种技术不仅提高了检索的准确性,而且通过子问题的并行处理,也提高了整个搜索过程的效率。
后退提示(Step-back prompting)也是一种技巧,它利用大型语言模型(LLM)来构建一个比原始查询更广泛的问题,目的是获取更普遍或更高级别的相关信息。这样,原始查询的答案就能在这个更宽广的上下文中得到构建。同时,原始查询本身也会被检索,以便在最终的答案生成步骤中使用。
在这个过程中,两个上下文——更广泛的检索上下文和原始查询的检索结果——都会被提供给LLM。LangChain提供了一个参考实现,其链接为:langchain/cookbook/stepback-qa。此外,通过LLM进行的query重写可以优化初始查询,以提高检索效率。LangChain和LlamaIndex都提供了这种实现,其链接为:llamahub/llamapacks-fusionretriever-query_rewrite。
如果需要结合多个来源的信息来生成一个答案,可能是因为初始查询的复杂性要求执行多个子查询,并将检索到的上下文合并;也可能是因为单个查询在多个文档中找到了相关的上下文。在这种情况下,可以将引用任务嵌入到提示中,并指示LLM提供所使用的源的标识符。然后,将生成的响应与索引中的原始文本块进行匹配。
6.对话引擎技术
构建一个能够在单一查询中反复运行的RAG系统,关键在于集成了聊天逻辑,这使得系统能够考虑对话的连续性,类似于传统聊天机器人在大型语言模型(LLM)时代之前的做法。这种特性对于处理后续问题、重复的指代或是与之前对话内容相关的用户命令至关重要。
为了实现这一点,可以采用查询压缩技术,这种技术能够同时处理对话的历史上下文和用户的当前查询。实现上下文压缩的方法有多种,其中一种流行且相对简单的方法是使用ContextChatEngine。这种方法首先检索与用户当前查询相关的对话上下文,然后将这些信息连同聊天历史记录一起发送给LLM,以便在生成回答时考虑到之前的对话内容。
更高级的实现方式是CondensePlusContextMode,它在每次对话交互中,将聊天的历史记录和用户的最新消息压缩成一个新的查询。这个新查询随后被送入索引进行检索,检索到的上下文信息与原始的用户消息一起提供给LLM,以生成准确且相关的回答。这种方法通过压缩和整合信息,确保了对话的连贯性,并提高了回答的质量。
7.Query路由
Query路由是一个由LLM驱动的决策过程,它在接收到用户查询时,决定最佳的后续行动方案。可能的行动包括执行总结、搜索改写或采用多种不同的路由策略,并将它们的搜索结果汇总成一个综合答案。
Query路由也可以用来选择将用户查询发送到哪个索引或数据存储,例如传统的向量数据库、图形数据库、关系数据库等。在处理多个文档存储时,常见的做法是使用一个索引来存储文档摘要,另一个索引来存储文档块的向量。
Query路由的定义涉及到设置一系列可选的路由选项。路由决策是通过LLM的调用来完成的,它以一种预定义的格式返回结果,指导查询被发送到特定的索引。如果采用代理方式,查询可以被路由到子链或其它代理,例如在多文档代理方案中所示。
8. RAG中的智能体Agent
智能体(Agent)的核心思想是为具备推理能力的LLM配备一套工具和待完成的任务。这些工具可能包括确定性功能,如执行代码的函数、访问外部API,甚至与其他代理进行交互。LangChain的灵感正是来源于这种LLM相互连接的思想。
智能体本身是一个宏大的主题。比如在下图多文档代理的架构中,每个文档都配备有一个代理(例如OpenAIAgent),这些代理负责执行文档摘要和传统的问答(QA)功能。同时,存在一个顶层的总代理,它的职责是将用户查询分配给相应的文档代理,并且负责整合最终的答案。
每个文档代理都配备了两个关键工具:一个是向量存储索引,用于高效地检索文档;另一个是摘要工具,用于生成文档的简洁版本。代理会根据查询路由的需要来决定使用哪种工具。在这个架构中,每个代理都需要做出多个路由决策。
这种架构的优势在于它能够比较和评估不同文档及其摘要中的不同解决方案或实体,这覆盖了与文档集交互的最常见场景。
9.响应合成
响应合成是RAG(检索增强生成)流程中的最终环节,它负责根据检索到的所有相关信息和原始用户查询来生成最终答案。通常,这涉及到将所有检索到的、且超过特定相关性阈值的上下文与查询合并,然后一并提供给大型语言模型(LLM)进行处理。然而,还有更高级的方法,这些方法可能需要多次调用LLM,以便进一步优化检索到的上下文,并创造出更高质量的答案。以下是几种主要的响应合成策略:
迭代细化:通过分块逐步将检索到的上下文发送给LLM,以迭代方式细化答案。
内容总结:对检索到的上下文进行总结,以确保它们能够适应LLM的提示限制。
多答案合成:根据不同的上下文块生成多个潜在答案,然后将这些答案进行合并或总结,以形成最终的响应。
RAG应用与分类:
小结
RAG系统面临的主要挑战不仅限于确保答案的相关性和可靠性,还包括提高处理速度。除此之外,还需考虑其他重要因素,如将RAG与基于网络的搜索深度整合,以及探索大型语言模型(LLM)的长期记忆功能。尽管存在这些挑战,RAG技术仍然具有广泛的应用潜力。
在实际应用RAG技术时,我们期望本文讨论的多种技术解决方案能够帮助大家更好的理解RAG背后的奥秘哦,最后附上RAG生态大图:
既然大模型现在这么火热,各行各业都在开发搭建属于自己企业的私有化大模型,那么势必会需要大量大模型人才,同时也会带来大批量的岗位?“雷军曾说过:站在风口,猪都能飞起来”可以说现在大模型就是当下风口,是一个可以改变自身的机会,就看我们能不能抓住了。
读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓
👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓