在上那篇提到的我手搓的那个 RAG 项目新增功能中,漏掉了递归检索与迭代查询,这篇补上(源码见知识星球)。经过初步调试对召回效果有明显提升,这种方法解决了传统 RAG 的几个关键问题:
处理复杂多步骤问题:通过多次迭代,分解复杂问题
信息不足的补充:当初始检索结果不足以回答问题时,自动生成补充查询
多角度信息收集:能够从不同角度收集相关信息
1、递归检索具体实现
递归检索函数(recursive_retrieval)
(支持最多三次迭代查询)
每次迭代使用混合检索(向量检索+BM25)获取信息
使用 LLM 分析当前检索结果,判断是否需要进一步查询
如果需要,LLM 会生成新的查询问题,用于下一轮检索
换句话说,递归检索的工作原理可以理解为"先检索-后思考-再检索"的过程,模拟了人解决问题的方式:先获取一些信息,思考下是否足够,如果不够则继续查找更多相关信息。总之,好的结果不是一蹴而就的。
2、核心组件全解析
下面再对整个代码的核心组件做进一步的解析,大家可以在这个基础上按照业务需求进一步优化:
图片
2.1文档处理和向量化
文本提取:使用 pdfminer.high_level.extract_text_to_fp 从 PDF 提取文本内容
文本分块:使用 RecursiveCharacterTextSplitter 将长文本分割成更小的块(在代码中块大小设为 400 字符,重叠为 40 字符)
向量化:使用 all-MiniLM-L6-v2 模型为每个文本块生成嵌入向量
存储:将文本块、向量和元数据存储到 ChromaDB 向量