
搜索引擎
LangChAIn和LlamAIndex是两个基于大型语言模型(LLM)的管道与应用程序方面非常著名的开源库。受ChatGPT发布的激励,它们于2022年10月和11月创建,到了2023年被大量采用。
提示工程是提升RAG流程性能的便捷且有效的方式。可查看OpenAI给出的详细提示工程指南。OpenAI在LLM(大型语言模型)提供商中处于领先地位,但也有许多其他选择。像Anthropic的Claude、Mistral虽小却功能强大的Mixtral模型、微软的Phi - 2,还有Llama2、OpenLLaMA、Falcon等众多开源模型。你可以从中挑选最适合的,将其用作RAG(检索增强生成)管道的核心。现在我们来深入讲解高级RAG技术,会涉及核心步骤与算法方案,不过为保证方案可读性,将省略一些逻辑循环和复杂的多步代理行为。

AI
1.2 向量化作法(Vectorisation)接下来要选一个用于搜索优化的模型嵌入我们的块。可选择的有不少,像bge - large或者E5嵌入系列。查看MTEB排行榜就能获取最新消息。若想了解分块与向量化步骤的端到端(end2end)实现,可查看LlamAIndex里完整数据摄取管道的示例。2.1 向量存储的索引。
RAG管道有个关键部分叫搜索索引,其存储着上一步得到的向量化内容。最初的实现是采用平面索引,也就是暴力计算查询向量与所有块向量之间的距离。若要实现对1万+元素规模的高效检索,搜索索引宜采用向量索引,像fAIss、nmslib、annoy这类基于近似最近邻居算法(如聚类、树结构或HNSW算法)的工具。另外,存在一些托管方案,像OpenSearch、ElasticSearch,还有向量数据库(如Pinecone、Weaviate和Chroma),它们会自动处理前面提及的数据摄取流程。根据索引选择、数据与搜索需求而定,也能存储元数据,利用元数据过滤器按日期、来源等条件检索信息。LlamAIndex支持多种向量存储索引,还兼容列表索引、树索引、关键词表索引等简单索引类型。这些索引会在后续的融合检索部分详细阐述。2.2 层级索引。
对于大型数据库,一种有效的做法是创建两个索引,一个基于摘要,另一个基于文档块,接着分两步搜索,先以摘要过滤相关文档,再于相关文档组内进行搜索。2.3 关于假设性问题与HyDE。
这种方法提升了搜索质量,毕竟查询和假设问题的语义相似性比实际块更高。还有一种反向逻辑方法叫HyDE,即让LLM针对给定查询生成一个假设性的响应,再把这个响应向量与查询向量一同使用,以此提升搜索质量。2.4 对内容进行增强。
2.4.1语句窗口检索工具。
2.4.2 自动合并检索器(亦称为父文档检索器)
2.5 融合检索亦或混合搜索。有一个很早之前的思路:把传统的基于关键字搜索(像tf - idf这种稀疏检索算法或者搜索行业的标准BM25)与现代语义或向量搜索相结合,然后把二者结果整合到一个检索结果里。这里最关键的一点在于怎样组合不同相似度分数的检索结果。一般会用Reciprocal Rank Fusion算法解决这个问题,该算法可有效地对检索结果重新排序,从而得到最终的输出结果。
在LangChAIn里,是借助Ensemble Retriever达成这种方法的。这个类会把你定义好的多个检索器组合起来,像基于fAIss的向量索引检索器和基于BM25的检索器,并且运用RRF算法对结果重新排序。在LlamAIndex里,这一过程也是以相似的方式达成的。混合或融合搜索往往能给出更出色的检索结果,其原因在于它融合了两种互补的搜索算法,既考量查询与存储文档语义相似性,又考虑关键词匹配。我们通过上述算法得到了检索结果,接下来要通过过滤、重排或者转换来优化这些结果。在LlamAIndex里,有多种后处理器可供使用。可以依据相似性分数、关键字、元数据进行结果过滤,也能借助其他模型(如LLM)、sentence - transformer交叉编码器、Cohere重新排名接口,或者基于元数据来重排结果。
现在,我们要探究更高级的RAG技术,像查询转换和路由。这些技术会用到大语言模型,它们体现了更复杂的逻辑思维,也就是在RAG流程里融入了LLM的推理能力。查询转换属于一系列技术,它把LLM当作推理引擎来更改用户输入,从而提升检索质量,有多种技术实现可选择。
大语言模型可把复杂查询拆成多个子查询,像……我们难以直接从语料库找到它们的比较,所以把这个问题拆解成两个更简单、具体且合理的子查询。这些子查询将并行运行,之后把检索到的信息汇总进一个LLM提示词里。在LangchAIn中,此功能以多查询检索器的形式呈现;在LlamAIndex里,则以子问题查询引擎的形式来实现。
要注意的是,LlamAIndex也支持基于OpenAI智能体的聊天引擎,能提供更灵活的聊天模式,并且LangchAIn也支持OpenAI功能API。
还有其他像ReAct智能体这样的聊天引擎类型,不过我们接下来直接跳到第7节去讨论智能体本身。查询路由由LLM驱动,是一种决策步骤。在用户查询后决定下一步行动,如总结、搜索某些数据索引,或者尝试多种不同路由并综合其输出以形成答案。查询路由器还被用于确定数据存储位置以处理用户查询。数据存储位置有多种,像传统向量存储、图形数据库、关系型数据库或者不同层级的索引系统等。处理多文档存储时,一般会用到摘要索引和文档块向量索引这两种索引。定义查询路由器,包含设定其可做的选择。大语言模型调用可实现特定路由的选择,结果按预定义格式返回,用于路由查询指定索引。若有关联操作,这些查询可能被发往子链或其他智能体,如下述多文档智能体方案所示。LlamAIndex与LangChAIn均为查询路由器提供支持。从首个LLM API发布起,智能体(LangchAIn和LlamAIndex都支持)就已经存在了。其思路是给有推理能力的LLM提供一组工具以及一个待完成的任务。这些工具包含某些确定性功能,像任何代码函数或者外部API,甚至其他智能体,这种LLM链接的思想正是LangChAIn得名的由来。智能体属于复杂技术,无法在RAG概述里深入探究这一主题。于是,我会接着基于智能体的多文档检索案例展开,并且简单提到OpenAI助手。这是个较新的概念,在近期的OpenAI开发者大会上以GPTs形式亮相,且会在下文要讲的RAG系统里起到作用。OpenAI助手主要整合了开源大型语言模型(LLM)周边工具,像聊天记录、知识存储、文档上传界面等。其中最关键的是函数调用API,它具备把自然语言转换为对外部工具或者数据库查询进行API调用的能力。
我们来瞧瞧多文档智能体的方案。这一配置相当复杂,要在每份文档上都初始化一个OpenAIAgent,该智能体可进行文档摘要与传统问答操作,此外还有一个顶层智能体,它会把查询分发给各文档智能体,最后综合得出最终答案。文档智能体各有向量存储索引与摘要索引这两个工具,由路由查询决定使用哪个。顶级智能体以所有文档智能体为工具。该方案呈现出一种高级的RAG架构,每个智能体都会做出许多路由决策。这种方式的优点在于,能够对不同文档及其摘要中描述的不同解决方案或实体进行比较,还能涵盖经典的单文档摘要与QA机制,基本囊括了文档集聊天最常见的用例。
从图片能看出这种复杂配置的不足,智能体内部大语言模型要多次往返迭代,所以运行速度慢。另外,在RAG管道里,LLM调用往往最耗时,而搜索在设计上就优化了速度。所以对于大型多文档存储,我觉得可以考虑简化这个方案来实现扩展。
响应合成主要有哪些方法?若需更多详细信息,请查阅响应合成器模块文档。
现在有一个很大的优势,那就是能够借助像GPT - 4这类高端大型语言模型(LLM)来生成高质量数据集。不过要知道,用小型合成数据集微调基础模型,或许会削弱基础模型的通用能力。作者开展了一项测试,对bge - large - en - v1.5编码器加以微调,结果发现其对检索效果的提升作用有限,这是由于针对搜索优化的最新Transformer编码器已十分高效。
大语言模型的微调。
检索内容的相关性是最为关键且可控的指标,实际上这一指标的提升依靠上述高级RAG管道的前1 - 7部分,以及编码器和排名器的微调部分。而第8部分与大语言模型的微调侧重于提高答案的相关性与合理性。在这里能找到一个简单有效的检索器评估管道实例,它被用于编码器的微调环节。还有一种更高级的方法,除了考虑命中率,还涵盖常用搜索引擎评估指标平均倒数排名,以及生成答案的质量指标,像真实性和相关性,这在OpenAI的实用指南中有展示。LangChAIn有一个很先进的评估框架LangSmith。在此框架里,能够实现自定义评估器,并且可以监控RAG管道的运行,从而提升系统的透明度。要是你正用LlamAIndex构建的话,可以试试rag_evaluator llama pack。本文简述RAG核心算法,且举例说明部分相关方法。还有许多其他事情有待考量,像是基于网络搜索的RAG(如LlamAIndex的RAG、webLangChAIn等),要更深入探究智能体架构,以及有关LLM长期记忆的一些思考方向。RAG系统的主要生产挑战除答案相关性和忠实度外就是速度。ChatGPT和多数其他助手采用的流式特性并非随机的赛博朋克风格,而只是缩短感知答案生成时间的一种方法。我觉得小参数规模的LLM前景十分光明,近期发布的Mixtral和Phi - 2就在引领我们朝着这个方向前行,这便是我的看法。
Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号