前言如果你知道RAG检索增强生成那么一定知道这里面的R代表Retrieval即检索也一定知道这个环节对于最终的生成质量有多重要而基于向量Vector的语义检索是最为熟知的一种基础检索模式。但在实际应用中如果只是简单的使用一次向量检索往往很难满足多样化的需求。所以在模块化RAG的时代很多新的范式与算法都对检索这个环节进行了大量的创新与优化本文将深入探讨两种在RAG应用中可灵活应用的高级检索模式融合检索Fusion Retrieval递归检索Recursive Retrieval融合检索融合检索Fusion Retrieval是一种结合多维度检索的方法。简单的说就是通过多个不同的检索方法进行查询检索并对召回的结果通过排序算法比如RRF重新排序融合后用于后续生成。融合检索可以组合多路不同维度的检索结果以弥补单个向量索引在检索精确性上的不足。在融合检索中如何实现多路不同的检索在实际应用中可以根据自身需要选择不同的形式比如不同角度的重写问题、不同的检索算法、或者不同的索引类型等。【基于问题重写与扩展】借助查询重写或查询转换器对输入问题进行扩展生成多个不同表达形式或不同角度细化的输入问题并对每个问题分别进行检索然后对召回的知识块chunks通过重排reranker模块进行重新排序并取最终的top_K用于后续生成环节。通过Rewriter模块进行问题扩展【基于多种类型的索引】尽管基于高纬向量的索引在很多场景下的基于自然语言的语义检索可以工作的不错但其也并非全能比如你可能想借助知识图谱索引来更精确的获取实体之间的复杂关系借助树状的摘要索引来更好的回答概要性的问题等。因此你可以同时通过多路不同类型的索引比如向量索引与关键词索引来对输入问题进行检索并对召回的知识块进行重排序处理后获取top_K。也可以是同种索引但是采用不同的检索与评分算法基于向量索引与关键词索引对问题进行多路检索【基于复合方案的多路检索】这是对上面两种方法的组合。即同时借助于问题扩展与索引扩展来实现更多路的知识召回再通过重新排序获得top_K。这种组合方法由于召回了更多的chunks有利于获取更相关的知识但同时也增加了系统性能的消耗与模型使用的成本在实际使用时需要根据测试结果进行取舍。基于问题扩展索引扩展的融合检索【融合检索的关键技术】实现融合检索并不复杂不管在LangChain还是LlamaIndex框架中都有转换器(rewriter)、检索器(retriever)、排序器(reranker)的概念与组件可以自行组合来实现融合检索。查询扩展借助LLM自行实现或者借助已有组件比如LlamaIndex中的QueryTransform组件Reranker自行实现RRF算法函数或者借助Cohere Reranker这样的专业排序模型实现检索融合扩展已有的Retriever组件实现自定义融合检索器有的框架有现成的融合检索器比如LlamaIndex的QueryFusionRetriever。这是一个典型的融合检索器扩展...... class FusionRetriever(BaseRetriever): #基于多个检索器构造融合检索器 #参数检索器列表与top_k def __init__( self, retrievers: List[BaseRetriever], similarity_top_k: int 3, ) - None: self._retrievers retrievers self._similarity_top_k similarity_top_k super().__init__() #实现检索方法 def _retrieve(self, query_bundle: QueryBundle) - List[NodeWithScore]: #查询重写自行实现rewrite_query querys rewrite_query(query_bundle.query_str,num3) #调用辅助方法得到全部检索结果自行实现run_queries results_dict asyncio.run(run_queries(querys, self._retrievers)) #RRF重新排序自行实现rerank_results final_results rerank_results(results_dict,similarity_top_kself._similarity_top_k) return final_results递归检索相对于易于理解的融合检索另外一种较复杂的检索方法是递归检索。想象一下如果你想在一大堆书中找到你所关注的一段文字最快的方法不是简单粗暴的逐本翻阅你可能会这么做做一些基本过滤比如出版社如果事先知道查看书籍的简介定位需要查看的少量几本书在最后的几本书中借助目录与翻阅找到所关注的文字内容这本质上就是一种递归检索**在不同层次上构建chunks节点与检索器比如摘要层与内容层、主要内容层与嵌入内容层并建立层次之间的链接关系使得能够在每次检索时自动的实现向下递归探索直至达到结束条件。**我们画一张图简单表示其原理从图里可以看出递归检索的技术基础是能够从一级索引检索出来的chunks链接到二级的chunks或者其他具备检索功能的装置比如检索器、Chain、RAG引擎或者Agent等。实现这种链接的方式通常是在一级的chunk对象中比如LangChain中的Document对象或者LlamaIndex中的Node对象保存二级对象的引用。从一级的chunks链接到的二级对象引用可以是下面几种一个可以直接读取内容的二级chunk块一个可以检索出多个二级chunk块的检索器一个可以查询后输出答案的RAG引擎一个可以规划与完成问答的Agent智能体下面对这几种不同的链接形态及其应用场景、递归流程做简单阐述。【从chunk链接到chunk】这种递归检索本质是上一个chunk关联查找的过程通过检索出来的一级chunk找到对应的二级chunk返回即可。在RAG上这么做的主要意义通常是来自于一个老生常谈的问题即chunk的语义精确性与丰富性往往是矛盾的所以有时候需要针对这两种需求做分离设计。常见的应用场景有在一个小的chunk中保存对应的大的chunk引用父子块用于在更精准的语义搜索基础上提供更丰富的上下文在一个摘要chunk中保存对应的详细内容chunk的引用用于增强回答偏概要性或笼统性的提问方式的能力在一个假设性问题的chunk中保存对应的内容chunk的引用通过假设性问题来兼容更多的提问形式提高召回精确性下图表示了这种方式下的检索流程注意并非所有的一级chunk都一定要有二级chunk的链接蓝色部分表示实际检索过程**【从chunk链接到检索器】**这种情况下通过检索出来的一级chunk找到对应的二级检索器注意不是chunk并递归调用这个检索器再次检索并将二次检索出来的chunks用于后续生成。这种方式的一个典型的场景是在多文档问答的场景中通过生成摘要文档来实现分层过滤以帮助降低单一层次检索下的精度不足、知识干扰等问题在摘要与原始文档层面分别做嵌入与索引并链接在摘要级别做检索获得相关的摘要知识块根据摘要块的关联信息可以关联到原始文档块的检索器递归检索原始文档的知识块找到top-k用于生成下图表示了这种方式下的检索流程**【从chunk链接到RAG引擎】**这种方式与上一种的区别在于一级的chunk链接到的对象不再是输出检索结果的检索器retriever而是一个RAG引擎其输出的答案将作为后续生成的上下文。所以上一种方式场景中的检索器也可以改用RAG引擎能达到类似的效果。除此之外**还有一种典型的场景是用于对文档中嵌入的复杂内容进行深度查询。**比如我们现在有这样的一个网页在这个HTML页面也可以是其他的PDF文档中除了正常的文字内容以外还有一个或者多个嵌入的结构化表格很多时候我们需要对这种嵌入式的表格做更复杂的自然语言提问比如需要借助sql或者pandas。那么就可以借助递归检索对解析出来的表格元素创建独立RAG引擎这可以基于强大的Pandas组件甚至SQL数据库以满足对这个嵌入表格的复杂查询对结构化的表格生成一个摘要内容chunk并链接到表格的独立RAG引擎这些表格的摘要chunk与文档的其他chunk一起创建向量索引并构建RAG引擎提供对外查询下图表示了这种方式下的检索流程**【从chunk链接到Agent】**最后一种方式是从chunk节点链接到Agent在检索出基础chunk后根据其中保存的Agent引用继续探索调用Agent获取答案作为后续生成的上下文。这种模式本质上与”chunkRAG引擎“类似区别就是后端Agent与RAG引擎的区别由于Agent具备更强大的查询与工具能力因此可以在后端提供更丰富的二次输出能力。仍然以多文档的RAG应用为例我们做如下的设计以支持更复杂的问答场景对每个文档创建一个Agent每个Agent有两个可以使用的工具一个是用来回答事实性问题的工具一个是用来回答高层总结与分析类问题的工具对每个文档创建摘要文档与chunks并将其链接到对应的后端Agent对摘要文档的chunks创建一级向量索引与RAG引擎提供对外查询下图表示了这种方式下的检索流程结束语检索在复杂RAG应用中的重要性不言而喻基于单一的向量语义检索很难满足实际企业生产环境下的复杂应用需求以原型去应对生产的需求会导致举步维艰。所以了解与学习不同的检索策略、算法、场景与范式对于提高RAG应用的“生产就绪”能力必不可少。本文对RAG应用中较为复杂也最强大的融合检索与递归检索进行了详细剖析而实际上在目前的主流开发框架中LangChain或LlamaIndex都有着更丰富的检索索引、算法与组件的支持包括但不限于基于知识图谱索引的检索基于关键词表的检索基于向量的BM25检索算法带语义路由的多路检索器自动元数据过滤的检索多chunk size下的自动合并检索…最后的最后感谢你们的阅读和喜欢作为一位在一线互联网行业奋斗多年的老兵我深知在这个瞬息万变的技术领域中持续学习和进步的重要性。为了帮助更多热爱技术、渴望成长的朋友我特别整理了一份涵盖大模型领域的宝贵资料集。这些资料不仅是我多年积累的心血结晶也是我在行业一线实战经验的总结。这些学习资料不仅深入浅出而且非常实用让大家系统而高效地掌握AI大模型的各个知识点。如果你愿意花时间沉下心来学习相信它们一定能为你提供实质性的帮助。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】大模型知识脑图为了成为更好的 AI大模型 开发者这里为大家提供了总的路线图。它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。经典书籍阅读阅读AI大模型经典书籍可以帮助读者提高技术水平开拓视野掌握核心技术提高解决问题的能力同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说阅读经典书籍是非常有必要的。实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。面试资料我们学习AI大模型必然是想找到高薪的工作下面这些面试题都是总结当前最新、最热、最高频的面试题并且每道题都有详细的答案面试前刷完这套面试题资料小小offer不在话下640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】