检索召回率优化探究四:基于LangChain0.3集成Milvu2.5向量数据库构建的智能问答系统
背景
基于 LangChain 0.3 集成 Milvus 2.5 向量数据库构建的 NFRA(National Financial Regulatory Administration,国家金融监督管理总局)政策法规智能问答系统。(具体代码版本,可见)
上一次探究中,使用 LangChain 提供的工具类:RePhraseQueryRetriever,并结合大语言模型:qwen-turbo-2025-07-15 将查询问题重写为 3个不同问题依次检索,实现了召回率 >= 85% 的目标。实现的检索流程图如下:
而本次探究是为了完成书本中检索前处理方法中最后一种——查询扩展。介绍的是一种比较有前景的查询优化技术,假设性文档嵌入(Hypothetical Docunment Embeddings, HyDE),该技术源于一篇论文《Precise Zero-Shot Dense Retrieval without Relevance Labels》。
目标
检索召回率 >= 85%
实现方法
本次探究:学习 HyDE 的思想,通过应用大语言模型对查询进行扩展,使用扩展后的问题进行嵌入并检索文本分块,从而实现检索召回率提高的目标。这个对应于 RAG系统整体优化思路图(见下图)的“检索前处理-查询扩展”。
执行过程
HyDE 学习
用作学习辅助的书本对 HyDE介绍的不多,还得是要直接看论文。全英的论文,怎么办?大语言模型工具来也。使用的是通义阅读助手(论文),不过也不能全部依赖它,原文还是要对比着看,尤其是关键的技术名词、原理等。
论文《Precise Zero-Shot Dense Retrieval without Relevance Labels》探讨解决的问题是:零样本密集检索中的学习问题。传统的密集检索方法需要大量的标记数据来进行训练,而HyDE 则不需要任何标记数据或相关性判断,仅需要使用一些简单的文本示例即可完成学习任务。
在论文中,有一个重要的概念是:指令跟随型语言模型( instruction-following
language model),它们是一类能够理解并执行用户以自然语言形式给出的指令或任务的生成式人工智能模型。它们的核心能力在于将人类意图转化为具体操作,而无需依赖严格的编程语法或格式约束。
指令跟随型语言模型,与我们常说的大语言模型有什么区别呢?
指令跟随型语言模型与大语言模型(Large Language Model, LLM)并非完全等同的概念,二者存在包含关系:指令跟随型模型都是大语言模型的子集,但大语言模型不一定具备指令跟随能力。
它们关键的区别如下表:
维度 | 大语言模型(LLM) | 指令跟随型语言模型 |
---|---|---|
训练目标 | 预测下一个词(语言建模) | 执行指令并生成符合要求的输出 |
数据需求 | 通用文本语料(书籍、网页、代码等) | 指令-响应对(如“总结文章→摘要文本”) |
典型任务 | 填空、文本续写、知识问答 | 翻译、写作、代码生成、多任务切换 |
用户交互 | 需通过提示工程(Prompt Engineering)引导 | 直接理解自然语言指令,无需复杂提示设计 |
实现过程
使用 HyDE 检索的流程图:
主要代码:
def get_hyde_chain():# model = get_qwen_model(model="qwen-plus-2025-01-25", streaming=False)model = get_qwen_model(model="qwen3-4b", streaming=False, model_kwargs={"enable_thinking": False})# model = get_qwen_model(model="qwen3-30b-a3b-instruct-2507", streaming=False)hyde_chain = HYDE_QUERY_PROMPT | model | StrOutputParser()return hyde_chain
应用于评估的部分代码,请看项目中的:evaluation.rag_retrieve_evaluation.execute_retrieval()
检索评估(召回率)
RAG 相关处理说明:
切分策略:分块大小: 500; 分块重叠大小: 100; 使用正则表达式,[r"第\S*条 "]
嵌入模型:模型名称: BAAI/bge-base-zh-v1.5 (使用归一化)
向量存储:向量索引类型:IVF_FLAT (倒排文件索引+精确搜索)向量度量标准类型:IP(内积); 聚类数目: 100; 存储数据库: Milvus
向量检索:查询时聚类数目: 10; 检索返回最相似向量数目: 3
检索评估数据集:evaluation/data/retrieveInputData_V1_2.xlsx
策略一检索评估
Prompt
您是一位非常熟悉国家金融监督总局政策法规的专家。您的任务是根据问题进行合理、合适的扩展,用来从矢量数据库中检索出最相关的国家金融监督总局的政策法规条文。通过对问题的扩展,来克服基于内积(IP)的相似性搜索的一些限制。只提供扩展后的问题,不要给出多余的回答。
问题:{question}
LLM: qwen-plus-2025-01-25
检索结果如下两表
评估组别 | 重写 LLM | 执行时段 | 问题总数 | 召回总数 | 召回率 |
1 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 86 | 86.00% |
2 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 83 | 83.00% |
3 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 83 | 83.00% |
4 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 81 | 81.00% |
5 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 85 | 85.00% |
6 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 83 | 83.00% |
7 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 85 | 85.00% |
8 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 83 | 83.00% |
9 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 89 | 89.00% |
10 | qwen-plus-2025-01-25 | 中午11-13点 | 100 | 85 | 85.00% |
从上表可知,平均召回率为:84.3%
评估组别 | 重写 LLM | 执行时段 | 问题总数 | 召回总数 | 召回率 |
1 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 87 | 87.00% |
2 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 85 | 85.00% |
3 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 84 | 84.00% |
4 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 86 | 86.00% |
5 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 85 | 85.00% |
6 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 83 | 83.00% |
7 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 82 | 82.00% |
8 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 85 | 85.00% |
9 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 82 | 82.00% |
10 | qwen-plus-2025-01-25 | 晚上9-11点 | 100 | 86 | 86.00% |
从上表可知,平均召回率为:84.5%
LLM: qwen3-4b(非思考模式)
评估组别 | 重写 LLM | 执行时段 | 问题总数 | 召回总数 | 召回率 |
1 | qwen3-4b | 下午15-16点 | 100 | 88 | 88.00% |
2 | qwen3-4b | 下午15-16点 | 100 | 88 | 88.00% |
3 | qwen3-4b | 下午15-16点 | 100 | 87 | 87.00% |
4 | qwen3-4b | 下午15-16点 | 100 | 87 | 87.00% |
5 | qwen3-4b | 下午15-16点 | 100 | 87 | 87.00% |
6 | qwen3-4b | 下午15-16点 | 100 | 90 | 90.00% |
7 | qwen3-4b | 下午15-16点 | 100 | 86 | 86.00% |
8 | qwen3-4b | 下午15-16点 | 100 | 89 | 89.00% |
9 | qwen3-4b | 下午15-16点 | 100 | 86 | 86.00% |
10 | qwen3-4b | 下午15-16点 | 100 | 84 | 84.00% |
从上表可知,平均召回率为:87.2%(大于目标 85%)
评估组别 | 重写 LLM | 执行时段 | 问题总数 | 召回总数 | 召回率 |
1 | qwen3-4b | 下午18点 | 100 | 89 | 89.00% |
2 | qwen3-4b | 下午18点 | 100 | 89 | 89.00% |
3 | qwen3-4b | 下午18点 | 100 | 88 | 88.00% |
4 | qwen3-4b | 下午18点 | 100 | 86 | 86.00% |
5 | qwen3-4b | 下午18点 | 100 | 90 | 90.00% |
6 | qwen3-4b | 下午18点 | 100 | 89 | 89.00% |
7 | qwen3-4b | 下午18点 | 100 | 85 | 85.00% |
8 | qwen3-4b | 下午18点 | 100 | 88 | 88.00% |
9 | qwen3-4b | 下午18点 | 100 | 89 | 89.00% |
10 | qwen3-4b | 下午18点 | 100 | 88 | 88.00% |
从上表可知,平均召回率为:88.1%(大于目标 85%)
策略一检索评估,在同一个 prompt下,模型 qwen3-4b 是比 qwen-plus-2025-01-25 好一点的。不过,这也是正常的,毕竟模型 qwen3系列是比 qwen-plus 系列更先进的。
策略二检索评估
Prompt
请根据问题进行合理、合适的扩展。只提供扩展后的问题,不要给出多余的回答。
问题:{question}
指令跟随型语言模型:qwen3-30b-a3b-instruct-2507
评估组别 | 重写 LLM | 执行时段 | 问题总数 | 召回总数 | 召回率 |
1 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 87 | 87.00% |
2 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 85 | 85.00% |
3 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 86 | 86.00% |
4 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 87 | 87.00% |
5 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 85 | 85.00% |
6 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 88 | 88.00% |
7 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 87 | 87.00% |
8 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 86 | 86.00% |
9 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 88 | 88.00% |
10 | qwen3-30b-a3b-instruct-2507 | 下午16-17点 | 100 | 87 | 87.00% |
从上表可知,平均召回率为:86.6%(大于目标 85%)
评估组别 | 重写 LLM | 执行时段 | 问题总数 | 召回总数 | 召回率 |
1 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 88 | 88.00% |
2 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 84 | 84.00% |
3 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 87 | 87.00% |
4 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 87 | 87.00% |
5 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 87 | 87.00% |
6 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 87 | 87.00% |
7 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 87 | 87.00% |
8 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 86 | 86.00% |
9 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 88 | 88.00% |
10 | qwen3-30b-a3b-instruct-2507 | 晚上20点 | 100 | 86 | 86.00% |
从上表可知,平均召回率为:86.7%(大于目标 85%)
检索评估小结
- 从上述策略一和策略二的评估结果来看,策略一在使用大语言模型:qwen3-4b 模型(非思考模式)的召回率是相对其他两组要高一点的,两组平均检索召回率是:87.65%(大于目标 85%)
- 从查询扩展的结果中可看到,有些问题在之前从未检索到正确的条文,在这次是 TOP1,而且相似度也相对较高。

- 从抽样的检索结果来看,整体平均相似度比之前的应该都要高出10-15个百分点。
总结
使用 HyDE 的思想来做查询扩展:
- 有一个有意思的事情就是,就当问题是比较常见的,也就是在扩展所使用 LLM的能力范围内的,问题的答案可能在检索前处理阶段就已经获得了。这点,在实战项目中,要注意考虑;
- 提示词模版的设计要考虑到所使用的模型,比如上述探究所使用的 qwen3-30b-a3b-instruct-2507,它是一个指令跟随型语言模型,用策略一的 prompt 得到的效果就不如策略二的 prompt 好。
本次探究:策略一在使用大语言模型:qwen3-4b 模型(非思考模式),对比上一次探究的结果:
模型 | 模型量级 | 检索前处理方法 | 检索结果长度 | 召回率 |
qwen-turbo-2025-07-15 | 轻量级 | 查询重写 3次,依次检索 | 2000-2500个字符 | 87.50% |
qwen3-4b | 中等到大模型之间 | 查询扩展 | 1500个字符 | 87.65% |
查询重写还是会比较依赖原始查询问题的质量,再考虑到实际应用中用户的问题会提的比较模糊或者描述得不够具体等情况,项目当前的问答检索最终选择了本次探究的最优解。
至此,检索前处理的探究就告一段落了。
之前两次检索前处理探究,请看下面“本文关联项目的文章” 后两篇。
接下来,依旧继续按 RAG系统整体优化思路图进行优化,探究一下索引优化。
文中基于的项目代码地址:https://gitee.com/qiuyf180712/rag_nfra
本文关联项目的文章:RAG项目实战:LangChain 0.3集成 Milvus 2.5向量数据库,构建大模型智能应用-CSDN博客
检索召回率优化探究二:基于 LangChain 0.3集成 Milvus 2.5向量数据库构建的智能问答系统-CSDN博客
检索召回率优化探究三:基于LangChain0.3集成Milvu2.5向量数据库构建的智能问答系统-CSDN博客