大模型 RAG 应用中的两种高级检索模式:融合检索与递归检索
RAG 检索增强生成中,单一向量检索常难满足复杂需求。本文详解融合检索与递归检索两种高级模式。融合检索通过多路查询(如问题重写、多索引)结合重排序提升召回率;递归检索利用层级结构(如摘要到详情、文档到 Agent)实现深度探索。结合 LangChain 等框架实践,可显著提升企业级 RAG 系统的准确性与适应性。

RAG 检索增强生成中,单一向量检索常难满足复杂需求。本文详解融合检索与递归检索两种高级模式。融合检索通过多路查询(如问题重写、多索引)结合重排序提升召回率;递归检索利用层级结构(如摘要到详情、文档到 Agent)实现深度探索。结合 LangChain 等框架实践,可显著提升企业级 RAG 系统的准确性与适应性。

RAG(检索增强生成)技术中,R 代表 Retrieval(检索),这一环节对最终生成质量至关重要。基于向量(Vector)的语义检索是最为熟知的基础模式,但在实际应用中,仅使用单一向量检索往往难以满足多样化的复杂需求。在模块化 RAG 的时代,许多新范式与算法都对检索环节进行了大量创新与优化。本文将深入探讨两种在 RAG 应用中可灵活应用的高级检索模式:融合检索(Fusion Retrieval)与递归检索(Recursive Retrieval)。
融合检索是一种结合多维度检索的方法。简单来说,就是通过多个不同的检索方法进行查询检索,并对召回的结果通过排序算法(如 RRF)重新排序融合后用于后续生成。融合检索可以组合多路不同维度的检索结果,以弥补单个向量索引在检索精确性上的不足。
在实际应用中,可以根据自身需要选择不同的形式来实现多路检索:
实现融合检索并不复杂,不管在 LangChain 还是 LlamaIndex 框架中,都有转换器(Rewriter)、检索器(Retriever)、排序器(Reranker)的概念与组件,可以自行组合来实现融合检索。
QueryFusionRetriever。以下是一个典型的融合检索器扩展的 Python 代码示例(基于 LangChain):
from langchain.retrievers import ContextualCompressionRetriever, MultiQueryRetriever
from langchain.vectorstores import FAISS
from langchain.llms import OpenAI
from langchain.embeddings import HuggingFaceEmbeddings
# 初始化向量存储和检索器
embeddings = HuggingFaceEmbeddings()
db = FAISS.load_local("./faiss_index", embeddings)
llm = OpenAI(temperature=0)
# 创建多路查询检索器
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=db.as_retriever(), llm=llm
)
# 执行查询
query = "如何部署大模型?"
relevant_docs = multi_query_retriever.get_relevant_documents(query)
此外,还可以结合 Reranker 进一步提升精度。RRF 的核心思想是将不同检索源返回的文档按排名倒数求和,排名越靠前得分越高,公式通常为 $Score = \sum \frac{1}{rank + k}$,其中 $k$ 为平滑系数(通常设为 60)。
相对于易于理解的融合检索,另外一种较复杂的检索方法是递归检索。想象一下,如果你想在一大堆书中找到你所关注的一段文字,最快的方法不是简单粗暴的逐本翻阅,你可能会这么做:做一些基本过滤,查看书籍简介定位少量书籍,最后在几本书中借助目录找到内容。这本质上就是一种递归检索。
在不同层次上构建 Chunks 节点与检索器(比如摘要层与内容层、主要内容层与嵌入内容层),并建立层次之间的链接关系,使得能够在每次检索时自动实现向下递归探索,直至达到结束条件。
从一级的 Chunks 链接到的二级对象引用可以是以下几种:
虽然具体实现依赖框架,但核心逻辑如下:
# 伪代码示例:层级递归检索逻辑
def recursive_search(node, query):
# 第一层:摘要层检索
summary_chunks = search_in_summary_layer(query)
results = []
for chunk in summary_chunks:
if chunk.has_child_node():
# 递归进入子节点(详情层)
child_results = recursive_search(chunk.child_node, query)
results.extend(child_results)
else:
# 直接返回当前节点内容
results.append(chunk.content)
return results
| 特性 | 融合检索 (Fusion Retrieval) | 递归检索 (Recursive Retrieval) |
|---|---|---|
| 核心机制 | 多路并行检索 + 重排序 | 层级结构 + 深度探索 |
| 优势 | 提高召回率,覆盖不同维度信息 | 处理长文档,平衡精度与上下文 |
| 劣势 | 计算开销较大,延迟较高 | 实现复杂,链路较长可能累积误差 |
| 适用场景 | 通用问答,需综合多源信息 | 长文档分析,结构化数据查询 |
ParentDocumentRetriever 和 Summary Index 非常适合实现递归检索;LangChain 的 MultiQueryRetriever 则是融合检索的便捷实现。检索在复杂 RAG 应用中的重要性不言而喻。基于单一的向量语义检索很难满足实际企业生产环境下的复杂应用需求,以原型去应对生产的需求会导致举步维艰。所以,了解与学习不同的检索策略、算法、场景与范式对于提高 RAG 应用的'生产就绪'能力必不可少。
本文对 RAG 应用中较为复杂也最强大的融合检索与递归检索进行了详细剖析。实际上在目前的主流开发框架中(LangChain 或 LlamaIndex)都有着更丰富的检索索引、算法与组件的支持,包括但不限于:基于知识图谱索引的检索、基于关键词表的检索、基于向量的 BM25 检索算法、带语义路由的多路检索器、自动元数据过滤的检索以及多 Chunk Size 下的自动合并检索等。开发者应根据具体业务场景,灵活组合这些工具,构建高效、准确的 RAG 系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online