当前位置: 首页 > news >正文

检索召回率优化探究四:基于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执行时段问题总数召回总数召回率
1qwen-plus-2025-01-25中午11-13点1008686.00%
2qwen-plus-2025-01-25中午11-13点1008383.00%
3qwen-plus-2025-01-25中午11-13点1008383.00%
4qwen-plus-2025-01-25中午11-13点1008181.00%
5qwen-plus-2025-01-25中午11-13点1008585.00%
6qwen-plus-2025-01-25中午11-13点1008383.00%
7qwen-plus-2025-01-25中午11-13点1008585.00%
8qwen-plus-2025-01-25中午11-13点1008383.00%
9qwen-plus-2025-01-25中午11-13点1008989.00%
10qwen-plus-2025-01-25中午11-13点1008585.00%

从上表可知,平均召回率为:84.3%

评估组别重写 LLM执行时段问题总数召回总数召回率
1qwen-plus-2025-01-25晚上9-11点1008787.00%
2qwen-plus-2025-01-25晚上9-11点1008585.00%
3qwen-plus-2025-01-25晚上9-11点1008484.00%
4qwen-plus-2025-01-25晚上9-11点1008686.00%
5qwen-plus-2025-01-25晚上9-11点1008585.00%
6qwen-plus-2025-01-25晚上9-11点1008383.00%
7qwen-plus-2025-01-25晚上9-11点1008282.00%
8qwen-plus-2025-01-25晚上9-11点1008585.00%
9qwen-plus-2025-01-25晚上9-11点1008282.00%
10qwen-plus-2025-01-25晚上9-11点1008686.00%

从上表可知,平均召回率为:84.5%

LLM: qwen3-4b(非思考模式)

评估组别重写 LLM执行时段问题总数召回总数召回率
1qwen3-4b下午15-16点1008888.00%
2qwen3-4b下午15-16点1008888.00%
3qwen3-4b下午15-16点1008787.00%
4qwen3-4b下午15-16点1008787.00%
5qwen3-4b下午15-16点1008787.00%
6qwen3-4b下午15-16点1009090.00%
7qwen3-4b下午15-16点1008686.00%
8qwen3-4b下午15-16点1008989.00%
9qwen3-4b下午15-16点1008686.00%
10qwen3-4b下午15-16点1008484.00%

从上表可知,平均召回率为:87.2%(大于目标 85%)

评估组别重写 LLM执行时段问题总数召回总数召回率
1qwen3-4b下午18点1008989.00%
2qwen3-4b下午18点1008989.00%
3qwen3-4b下午18点1008888.00%
4qwen3-4b下午18点1008686.00%
5qwen3-4b下午18点1009090.00%
6qwen3-4b下午18点1008989.00%
7qwen3-4b下午18点1008585.00%
8qwen3-4b下午18点1008888.00%
9qwen3-4b下午18点1008989.00%
10qwen3-4b下午18点1008888.00%

从上表可知,平均召回率为:88.1%(大于目标 85%)

策略一检索评估,在同一个 prompt下,模型 qwen3-4b 是比 qwen-plus-2025-01-25 好一点的。不过,这也是正常的,毕竟模型 qwen3系列是比 qwen-plus 系列更先进的。

策略二检索评估

Prompt

请根据问题进行合理、合适的扩展。只提供扩展后的问题,不要给出多余的回答。
问题:{question}

指令跟随型语言模型:qwen3-30b-a3b-instruct-2507

评估组别重写 LLM执行时段问题总数召回总数召回率
1qwen3-30b-a3b-instruct-2507下午16-17点1008787.00%
2qwen3-30b-a3b-instruct-2507下午16-17点1008585.00%
3qwen3-30b-a3b-instruct-2507下午16-17点1008686.00%
4qwen3-30b-a3b-instruct-2507下午16-17点1008787.00%
5qwen3-30b-a3b-instruct-2507下午16-17点1008585.00%
6qwen3-30b-a3b-instruct-2507下午16-17点1008888.00%
7qwen3-30b-a3b-instruct-2507下午16-17点1008787.00%
8qwen3-30b-a3b-instruct-2507下午16-17点1008686.00%
9qwen3-30b-a3b-instruct-2507下午16-17点1008888.00%
10qwen3-30b-a3b-instruct-2507下午16-17点1008787.00%

从上表可知,平均召回率为:86.6%(大于目标 85%)

评估组别重写 LLM执行时段问题总数召回总数召回率
1qwen3-30b-a3b-instruct-2507晚上20点1008888.00%
2qwen3-30b-a3b-instruct-2507晚上20点1008484.00%
3qwen3-30b-a3b-instruct-2507晚上20点1008787.00%
4qwen3-30b-a3b-instruct-2507晚上20点1008787.00%
5qwen3-30b-a3b-instruct-2507晚上20点1008787.00%
6qwen3-30b-a3b-instruct-2507晚上20点1008787.00%
7qwen3-30b-a3b-instruct-2507晚上20点1008787.00%
8qwen3-30b-a3b-instruct-2507晚上20点1008686.00%
9qwen3-30b-a3b-instruct-2507晚上20点1008888.00%
10qwen3-30b-a3b-instruct-2507晚上20点1008686.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博客

http://www.xdnf.cn/news/1245511.html

相关文章:

  • Sklearn 机器学习 数据聚类 层次聚类的两个重要属性
  • 编码器模型和解码器模型解析
  • GPT-5的诞生之痛:AI帝国的现实危机
  • LLM开发——语言模型会根据你的提问方式来改变答案
  • arp攻击(ettercap 版本0.8.3.1)
  • Physics Simulation - UE中Projectile相关事项
  • tensorRT配合triton部署模型
  • HTML 如何转 Markdown
  • 【Redis】string常用命令
  • 417页PDF | 2025年“人工智能+”行业标杆案例荟萃
  • 三款好用的PDF阅读器
  • 深入理解 Android SO 导出符号:机制与安全优化
  • Python高级编程与实践:Python高级数据结构与编程技巧
  • 后量子时代已至?中国量子加密技术突破与网络安全新基建
  • 前端1.0
  • AIDL学习
  • 云计算一阶段Ⅱ——11. Linux 防火墙管理
  • 国产大模型平替方案:Spring Boot通义千问API集成指南
  • 【实时Linux实战系列】实时视频监控系统的开发
  • android开发 更改系统默认时区和默认语言
  • 笔试——Day29
  • C语言线程同步详解(互斥锁、信号量、条件变量和读写锁)
  • 【web应用】前后端分离项目基本框架组成:Vue + Spring Boot 最佳实践指南
  • 《C++初阶之STL》【模板参数 + 模板特化 + 分离编译】
  • tc 介绍
  • RHCA04--系统模块管理与资源限制
  • 26-数据仓库与Apache Hive
  • Dubbo-Go调Bug记录-泛化调用调不通
  • uniapp基础(五)调试与错误
  • Python 基础语法(二):流程控制语句详解