01
—
什么是RAG
RAG(Retrieval-Augmented Generation)即检索增强生成,为大模型提供了从特定数据源检索到的信息,以此来修正和补充生成的答案。可以总结为一个公式:RAG = 检索技术 + LLM 提示。
举一个实际的例子,当我们向 LLM 提出一个问题,RAG 从各种数据源检索相关的信息,并将检索到的信息和问题注入到 LLM 提示中,LLM 最后综合这些信息给出最终答案。
RAG 是2023年基于 LLM 的系统中最受欢迎的架构。许多基于 web 搜索引擎和 LLM 的问答服务、使用私有数据的chat应用程序等产品,都是基于 RAG 来构建的。
有两个最著名的基于 LLM 的管道和应用程序的开源库——LangChain 和 LlamaIndex,受 ChatGPT 发布的启发,它们在 2022 年 10 月和 11 月创立,并在 2023 年获得大量采用。
02
—
基础的RAG技术
RAG系统始于文本文档语料库,基本流程为:将文本分块并嵌入向量,利用transformer编码器模型处理,对所有向量建立索引,并创建LLM提示语以指导模型回答用户查询,结合搜索步骤获取的上下文。运行时,使用相同编码器模型将用户查询向量化,执行索引搜索找到top-k结果,从数据库检索对应文本块,作为上下文提供给LLM提示语。
市面上有很多可以用来开发面向RAG的开源大模型,比如 Llama2,OpenLLaMA,Falcon等。
03
—
高级的RAG技术
1、分块和矢量化
首先,我们创建向量索引以表示文档内容,并在运行时搜索与查询向量语义最接近的向量。由于transformer模型输入长度固定,分块技术变得有意义,即将初始文档分成大小适中、保持意义的块,如句子或段落,而非随意分割。文本分割器的实现已多样化,例如LlamaIndex中的NodeParser提供高级选项。
数据块大小是一个关键参数,需考虑嵌入模型的token容量。标准transformer模型如BERT的句子转换器最多使用512个token,而OpenAI的ada-002能处理更长序列,但需在足够上下文与有效搜索之间做出权衡。
选择模型以生成所选块的嵌入同样重要,例如搜索优化的模型(如bge-large或E5系列)。MTEB排行榜提供最新方法信息。关于文档分块和向量化步骤的端到端实现,可参考LlamaIndex官方文档:
https://docs.llamaindex.ai/en/latest/moduleguides/loading/ingestionpipeline/root.html#。
2、搜索的索引
面向RAG的大模型应用的核心是搜索索引,它存储并检索向量化内容。查询首先被向量化,与所有块向量进行距离计算。为有效检索上万元素,需采用如faiss、nmslib或annoy等近似最近邻算法的向量索引。同时,ElasticSearch等向量数据库提供数据摄取流水线管理。
根据索引选择和数据需求,可将元数据与向量一同存储,以便按日期或数据源过滤信息。LlamaIndex支持多种向量存储索引及其他简单索引实现。
对于大量文档,需能高效搜索、聚合信息并附带源引用。对于大型数据库,有效策略是创建摘要和文档块两个索引,先通过摘要过滤相关文档,再在相关组中进行搜索。
另一种方法是让LLM为每个块生成问题,并将这些问题向量化,运行时在问题向量索引上执行查询搜索,再路由到原始文本块,作为LLM获取答案的上下文。此方法提高了搜索质量,因为查询与假设问题之间的语义相似性高于与实际块的相似性。还有一种反向逻辑方法HyDE,要求LLM生成给定查询的假设响应,利用其向量和查询向量来提高搜索质量。
为获取更好的搜索质量并检索更小的块,可为LLM添加周围上下文。有两种选择:一是句子窗口检索,即在检索到的小块周围按句子展开上下文;二是父文档检索,即将文档递归分割成包含较小子块的较大父块。
句子窗口检索方案中,文档中的每个句子都单独嵌入,为上下文余弦距离搜索提供高准确性。获取最相关的单个句子后,为更好地推理找到的上下文,在检索到的句子前后扩展为k个句子的上下文窗口,然后发送给LLM。
父文档检索与句子窗口检索相似,都是搜索更细粒度的信息,然后在提供给LLM进行推理之前扩展上下文窗口。文档被拆分成引用较大父块中的较小子块,形成层次结构,最小的叶子块被发送到索引。检索时,获取较小的块,如果top-k检索的块中有超过n个块链接到同一个父节点,就用这个父节点替换提供给LLM的上下文。注意,搜索仅在子节点索引中执行。
还有一个较老的思路,即结合现代语义或向量搜索与稀疏检索算法(如tf-idf或BM25)的最佳结果。关键在于恰当地结合检索到的结果与不同的相似度得分,通常借助Reciprocal Rank融合算法(RRF)来解决,对检索到的结果重新排序以得到最终输出。
在LangChain中,这是通过集成检索器类实现的,如结合Faiss矢量索引和基于BM25的检索器,并使用RRF重新排序。LlamaIndex也采用了类似的方式。混合或融合搜索通常结合两种互补的搜索算法,考虑查询与存储文档之间的语义相似性和关键字匹配,以提供更优的检索结果。
3、Rerank和过滤
得到检索结果后,需进行过滤和重新排序。LlamaIndex提供多种后处理程序,可根据相似度评分、关键词、元数据过滤结果,或使用其他模型如句子transformer交叉编码器、基于元数据(如日期最近性)的内聚重新排序等。这是将检索到的上下文提供给LLM获取答案前的最后一步。
4、query变换
查询转换是利用LLM作为推理引擎修改用户输入以提高检索质量的一系列技术,有多种选择。对于复杂查询,LLM可将其分解为子查询,以便更简单、具体地检索信息。例如,将“Github上Langchain或Llamaindex哪个星更多?”分解为“Langchain在Github上有多少星?”和“Llamaindex在Github上有多少星?”,然后并行执行并组合上下文,以便LLM合成最终答案。Langchain和Llamaindex分别实现了这一多查询检索和子问题查询功能。
后退提示(Step-back prompting)使用LLM生成更一般的查询,以检索更广泛或更高级别的上下文,并在此基础上构建原始查询的答案。同时,也执行对原始查询的检索,并在最终应答生成时将两个上下文提供给LLM。LangChain有相关参考实现。查询重写则利用LLM重新制定初始查询,以提高检索效率。LangChain和LlamaIndex均有实现,但LlamaIndex的参考实现更为强大。
对于使用多个来源生成答案的情况,无论是因初始查询复杂性需要执行多个子查询,还是在多个文档中发现单个查询的相关上下文,都能准确反向引用。此引用任务可插入提示语中,要求LLM提供所用源的id。生成的响应部分与索引中的原始文本块匹配,Llamaindex为此提供了有效的基于模糊匹配的解决方案。
5、聊天引擎
构建能在单个查询中多次运行RAG系统的关键特性是聊天逻辑,它需考虑对话上下文,如LLM时代前的经典聊天机器人。这对于支持后续问题、重复指代或任何与用户命令相关的对话上下文至关重要。查询压缩技术能同时考虑聊天上下文和用户查询。实现上下文压缩的一种方法是通过ContextChatEngine,它先检索与用户查询相关的上下文,然后将其与聊天历史一同从缓存发送给LLM,使LLM在生成答案时能意识到之前的上下文。更复杂的实现是CondensePlusContextMode,它在每次交互中将聊天历史和最后一条消息压缩成一个新查询,该查询进入索引后,检索到的上下文连同原始用户消息一起传递给LLM以生成答案。
6、query 路由
Query路由是由LLM驱动的决策步骤,决定给定用户查询后的行动,如总结、执行搜索或尝试多种路由并综合输出。它还可用于选择索引或数据存储,如向量存储、图形数据库或关系数据库。对于多文档存储,常见配置是一个摘要索引和一个文档块向量索引。定义Query路由包括设置其可选行动,通过LLM调用来执行,并按预定义格式返回结果,用于将查询路由到指定索引。代理方式下,查询可路由到子链或其他代理。LlamaIndex和LangChain均支持Query路由。
7、RAG中的智能体Agent
RAG中的智能体Agent自LLM API发布以来便存在,旨在为能推理的LLM提供工具和任务。工具可能包括确定性函数、外部API甚至其他代理。代理是一个广泛话题,OpenAI助手已实现许多LLM所需工具,其中最重要的是函数调用API,可将自然语言转换为对外部工具或数据库的API调用。LlamaIndex中的OpenAIAgent类将高级逻辑与ChatEngine和QueryEngine结合,提供基于知识和上下文感知的聊天功能,以及一次性调用多个OpenAI函数的能力,体现了智能代理的应用方式。
以多文档代理为例,每个文档上都会初始化一个代理(OpenAIAgent),负责文档摘要和经典QA,同时有一个顶级总代理负责查询路由和答案合成。每个文档代理都配备向量存储索引和摘要索引,并根据路由查询选择使用。该体系结构涉及大量路由决策,其优势在于能比较不同文档及其摘要中的解决方案或实体,覆盖最常见的与文档集聊天的使用场景。尽管该方案因内部多次LLM迭代而速度较慢,但通过优化RAG流水线中的搜索操作,可提升大型多文档存储的可伸缩性。
8、响应合成
响应合成是任何 RAG 流水线的最后一步,根据检索的所有上下文和初始用户查询生成一个答案。最简单的方法是将所有获取的上下文(高于某个相关性阈值)与查询一起连接并提供给 LLM。但是,还有其他更复杂的选项涉及多个 LLM 调用,以细化检索到的上下文并生成更好的答案。响应合成的主要方法有:
-
通过逐块向LLM发送检索到的上下文来迭代地细化答案;
-
总结检索到的上下文以适应提示;
-
根据不同的上下文块生成多个答案,然后将其连接或总结。
有关响应合成的更多信息,可以参考文档中的示例
https://docs.llamaindex.ai/en/stable/moduleguides/querying/responsesynthesizers/root.html。
04
**—
**
面向RAG的编码器和大模型微调
对RAG流水线中的深度学习模型进行微调,主要关注两个模型:一是Transformer Encoder,负责提升上下文检索质量;二是LLM,负责利用上下文回答用户查询。可以使用GPT-4等高端LLM生成高质量合成数据集。但需注意,使用大型数据集训练的开源模型,若仅用小型合成数据集快速调优,可能削弱模型总体能力。较新版本的Transformer编码器在搜索优化上表现显著,如bge-large-en-v1.5,在笔记本电脑环境中也能大幅提升检索质量。
4.1 编码器微调
一个经典选择是使用交叉编码器。当不完全信任基础编码器时,交叉编码器可对检索结果进行重新排序。其工作原理是将查询和每个最高k个检索到的文本块(用标记分隔)传递给交叉编码器,然后微调,使相关块输出为1,不相关块输出为0。这种调整过程可以参考:
https://docs.llamaindex.ai/en/latest/examples/finetuning/crossencoderfinetuning/crossencoderfinetuning.html#。
4.2 大模型微调
OpenAI最近推出了LLM微调API,LlamaIndex则提供了在RAG设置中微调GPT-3.5-turbo以“提取”GPT-4知识的教程。该方法涉及用GPT-3.5-turbo生成问题,再用GPT-4根据文档生成答案,构建基于GPT-4的RAG流水线,并在问答对数据集上微调GPT-3.5-turbo。评估显示,微调后的GPT-3.5-turbo能更好地利用上下文生成答案。RA-DIT: Meta AI Research论文提出了一种更复杂的方法,即在查询、上下文和答案三元组上同时优化LLM和检索器。此技术通过微调API和Llama2开源模型来微调OpenAI LLM,使知识密集型任务指标提升约5%,常识推理任务也有显著提升。实施细节可参考相关文献:
https://docs.llamaindex.ai/en/stable/examples/finetuning/knowledge/finetuneretrievalaug.html#fine-tuning-with-retrieval-augmentation。
05
**—
**
面向RAG的性能评估
多个框架可用于RAG系统性能评估,指标涵盖总体答案相关性、答案溯源性、可信度和检索到的上下文相关性等。
Ragas框架采用可信度和答案相关性评估RAG检索部分的质量,同时考虑上下文准召率。Truelens评估框架则建议以检索与查询的上下文相关性、答案溯源性及与查询的答案相关性作为性能评估的三元组,其中检索到的上下文相关性是关键且最可控的指标。
LangChain的LangSmith评估框架支持自定义评估器,并能跟踪RAG流水线状态,提升系统透明度。而LlamaIndex中的rag_evaluator包则提供了一个简便工具,可使用公共数据集评估RAG系统。
06
**—
**
小结
RAG系统的主要挑战包括答案的相关性和可信度,以及速度。此外,还需考虑网络搜索基础的RAG、与Agent架构的深度融合,以及LLM长期记忆的方法。尽管如此,RAG仍具广泛应用潜力。希望本文提及的技术能对RAG的落地应用有所帮助。
👉AGI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉AGI大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
👉AGI大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
2024最新版CSDN大礼包:《AGI大模型学习资源包》免费分享
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取