实用指南:零基础学AI大模型之MultiQueryRetriever多查询检索全解析

news/2026/1/19 22:12:01/文章来源:https://www.cnblogs.com/tlnshuju/p/19503858

实用指南:零基础学AI大模型之MultiQueryRetriever多查询检索全解析

2026-01-19 22:07  tlnshuju  阅读(0)  评论(0)    收藏  举报
大家好,我是工藤学编程 一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK)
AI大模型零基础学AI大模型之LangChain Retriever

前情摘要

1、零基础学AI大模型之读懂AI大模型

零基础学AI大模型之MultiQueryRetriever多查询检索全解析

1. 引言:RAG检索的“痛点”与MultiQueryRetriever的价值

在之前的系列文章中,我们已经完成了RAG系统的核心链路搭建——从文档加载、分割、Embedding转换,到基于Milvus的向量检索(相似性搜索、MMR搜索)。但实际应用中会发现一个关键问题:单查询检索往往存在“覆盖不全”的短板

比如用户问“老王不知道为啥抽筋了”,但文档中可能用“肌肉痉挛的诱因”“腿部抽筋的常见原因”等表述;再比如技术文档中“SSL证书”和“TLS证书”指同一概念,用户用其中一个术语查询就会遗漏相关内容。这些场景下,单查询的召回率会大打折扣。

而MultiQueryRetriever正是为解决这个问题而生——通过LLM生成多个相关变体查询,从不同角度覆盖用户需求,结合Milvus的向量检索能力,既能提升召回率(官方数据+25%↑),又能保证准确率(+18%↑)。本文就带你用本地部署的Deepseek模型,结合LangChain和Milvus,实战实现这一高效检索方案。


2. MultiQueryRetriever核心原理拆解

MultiQueryRetriever的核心逻辑并不复杂,本质是“查询扩展+结果融合”的组合拳:
在这里插入图片描述

2.1 核心工作流程

  1. 接收用户原始查询(如“老王不知道为啥抽筋了”);
  2. 调用LLM(本文用本地Deepseek)生成N个相关变体查询(如“肌肉痉挛的常见原因”“突然抽筋可能是什么导致的”“腿部抽筋的诱因分析”);
  3. 将原始查询+所有变体查询分别提交给Milvus向量检索;
  4. 对所有检索结果去重、合并,返回最相关的文档片段。

2.2 核心优势

  • 解决术语差异:无需用户统一表述,自动匹配文档中不同术语;
  • 覆盖模糊查询:针对表述不明确的问题,从多个角度补充查询维度;
  • 兼容多场景:支持技术文档、医疗咨询等专业领域,也适配多语言混合查询。

3. 实战准备:环境、数据与本地Deepseek配置

在动手写代码前,先完成3项核心准备工作:

3.1 环境依赖安装

确保已安装以下依赖包(版本兼容即可):

pip install langchain langchain-milvus langchain-community deepseek-ai python-dotenv

3.2 qa.txt数据生成(关键!)

qa.txt的内容需覆盖“抽筋”相关的多维度表述,才能体现MultiQueryRetriever的效果。直接复制以下内容保存为data/qa.txt(需手动创建data文件夹):

问:腿部抽筋的常见原因有哪些?
答:腿部抽筋常见原因包括缺钙、缺镁、电解质紊乱、过度劳累、寒冷刺激、血液循环不畅等,老年人因肌肉量减少也可能频繁出现。
问:肌肉痉挛是什么原因引起的?
答:肌肉痉挛(俗称抽筋)的诱因主要分为生理性和病理性两类。生理性诱因有运动后未及时拉伸、夜间睡眠姿势不当;病理性诱因可能是糖尿病、甲状腺功能减退、周围神经病变等。
问:突然抽筋了该怎么缓解?
答:突然抽筋时可立即伸直腿部,缓慢拉伸痉挛部位肌肉,轻柔按摩小腿或手臂,同时补充少量淡盐水缓解电解质失衡,避免强行用力导致肌肉拉伤。
问:夜间睡觉腿抽筋和缺钙有关吗?
答:夜间睡觉腿抽筋与缺钙有一定关联,但并非唯一原因。维生素D缺乏影响钙吸收、腿部受凉、血管硬化导致供血不足,都可能引发夜间抽筋。
问:老年人频繁抽筋该注意什么?
答:老年人频繁抽筋需注意三点:1. 定期检测血钙、血镁水平,适量补充钙片和维生素D;2. 避免长时间站立或行走,睡前用温水泡脚促进血液循环;3. 排查是否有高血压、糖尿病等基础疾病,避免药物副作用引发抽筋。
问:运动后腿部肌肉痉挛怎么预防?
答:运动后预防肌肉痉挛的方法:运动前充分热身,运动中及时补充电解质饮料,运动后针对性拉伸肌肉,避免在高温或低温环境下长时间剧烈运动。
问:手抽筋的常见诱因是什么?
答:手抽筋常见诱因包括手部过度活动(如打字、做家务)、缺钙、颈椎病压迫神经、寒冷刺激等,长期营养不良或脱水也可能导致手部肌肉痉挛。

3.3 本地Deepseek模型配置

假设你已完成Deepseek本地部署(参考之前的《大模型私有化部署全指南》),核心配置要点:

  • 本地部署地址:默认通常为http://localhost:11434/v1(需确认部署时的端口);
  • 无需api_key(本地部署默认关闭鉴权,若开启需在部署时配置);
  • 模型选择:推荐使用deepseek-chat(对话型模型,生成变体查询效果更优)。

3.4 Milvus环境确认


4. 完整实现:LangChain+Milvus+本地Deepseek多查询检索

以下是完整可运行代码,关键部分已标注注释,直接替换本地Deepseek地址即可使用:

import logging
from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_milvus import Milvus
from langchain_community.embeddings import DashScopeEmbeddings
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_community.chat_models import ChatDeepseek
# -------------------------- 1. 日志配置(查看变体查询生成过程)--------------------------
logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)
# -------------------------- 2. 加载并分割文档 --------------------------
# 加载qa.txt文件
loader = TextLoader("data/qa.txt", encoding="utf-8")
data = loader.load()
# 分割文档(复用之前讲过的RecursiveCharacterTextSplitter)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=150,  # 每个片段150字,适配短问答
chunk_overlap=20  # 重叠20字,避免割裂语义
)
splits = text_splitter.split_documents(data)
# -------------------------- 3. 初始化Embedding模型 --------------------------
# 若有本地Embedding(如通义千问本地版),可替换此处
embedding = DashScopeEmbeddings(
model="text-embedding-v2",
max_retries=3,
dashscope_api_key="sk-xxx"  # 替换为你的api_key
)
# -------------------------- 4. 连接Milvus向量数据库 --------------------------
vector_store = Milvus.from_documents(
documents=splits,
embedding=embedding,
collection_name="mulit_retriever2",  # 集合名称
connection_args={"uri": "http://192.168.229.128:19530"}  # 用户提供的Milvus IP
)
# -------------------------- 5. 配置本地Deepseek模型 --------------------------
llm = ChatDeepseek(
model_name="deepseek-chat",  # 本地部署的模型名称
base_url="http://localhost:11434/v1",  # 替换为你的本地Deepseek地址
temperature=0.7,  # 控制变体查询的多样性
max_tokens=200
)
# -------------------------- 6. 创建MultiQueryRetriever --------------------------
retriever_from_llm = MultiQueryRetriever.from_llm(
retriever=vector_store.as_retriever(),  # 基于Milvus的检索器
llm=llm,  # 本地Deepseek模型(生成变体查询)
number_of_queries=3  # 生成3个变体查询(默认3个,可调整1-5个)
)
# -------------------------- 7. 执行检索并输出结果 --------------------------
# 用户原始查询(模糊表述)
question = "⽼王不知道为啥抽筋了"
# 执行多查询检索
results = retriever_from_llm.invoke(question)
# 打印结果统计
print(f"\n检索到的相关文档数量:{len(results)}")
print("\n-------------------------- 检索结果详情 --------------------------")
# 遍历输出结果(去重后的相关文档)
for idx, result in enumerate(results, 1):
print(f"\n【相关文档{idx}】")
print(f"内容:{result.page_content}")
print(f"元数据:{result.metadata}")

代码关键修改说明

  1. 替换base_url="http://localhost:11434/v1"为你的本地Deepseek实际部署地址;
  2. 替换dashscope_api_key为你的真实密钥(若使用本地Embedding可删除此部分);
  3. 确认Milvus的uri192.168.229.128:19530,与本地部署地址一致。

5. 结果验证与效果分析

运行代码后,会看到以下关键输出(日志部分):

INFO:langchain.retrievers.multi_query:Generated queries:
1. 老王抽筋的可能原因是什么?
2. 导致老王出现抽筋症状的因素有哪些?
3. 老王不明原因抽筋,可能和什么有关?

这就是本地Deepseek生成的3个变体查询,再看最终检索结果:

  • 会返回qa.txt中所有与“抽筋原因”相关的文档片段(通常4-5条);
  • 若仅用原始查询“老王不知道为啥抽筋了”单查询检索,可能仅返回2-3条相关结果;
  • 结果已自动去重,不会因多个变体查询导致重复输出。

核心效果对比

检索方式检索到的相关文档数覆盖维度
单查询检索2-3条仅匹配“抽筋原因”的直接表述
MultiQueryRetriever4-5条覆盖“肌肉痉挛诱因”“老年人抽筋”“生理性/病理性原因”等多维度

这正是MultiQueryRetriever的价值——通过扩展查询维度,让模糊查询也能精准覆盖更多相关内容。


6. 常见问题与避坑指南

在这里插入图片描述

6.1 本地Deepseek连接失败

  • 检查本地Deepseek是否正常启动(可通过浏览器访问base_url验证);
  • 确认端口未被占用,若修改过部署端口,需同步更新代码中的base_url
  • 若开启了API鉴权,需在ChatDeepseek中添加api_key参数。

6.2 Milvus连接超时

6.3 变体查询生成效果差

  • 调整temperature参数(0.5-0.8为宜,过高易生成无关查询);
  • 增加number_of_queries(最多5个,过多可能导致冗余结果);
  • 更换本地模型(如deepseek-coder更适合技术类查询,deepseek-chat更适合日常问答)。

如果觉得本文对你有帮助,欢迎关注我的“零基础学AI大模型”系列,后续会持续更新更多RAG进阶实战内容!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别嘈杂!Moodist%20白噪音神器,搭配%20cpolar%20解锁随时随地的宁静

Moodist 作为一款沉浸式环境音效生成器,核心功能是将雨打屋檐、篝火噼啪、山间溪流等数十种自然与生活音效拆分为独立模块,用户可自由调配比例,打造专属治愈音效,适配职场人、学生党、宝妈等各类需要舒缓环境的人群,其…

基于Hough变换的答题卡识别MATLAB之旅

9.基于Hough变化的答题卡识别 MATLAB程序 答题卡自动阅卷系统通过获取答题卡图像作为系统输入,并通过计算机处理、自动识别填图标记,存入数据库完成阅卷。但是答题卡在运输和使用过程中,容易受到设备、环境等因素的影响,使得图像质…

计算机小程序毕设实战-基于django+微信小程序的运动饮食健康生活系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

C# 实现 TCP/IP 客户端与服务器数据交互及与西门子 S7 - 200Smart 通讯

C# TCP IP 客户端和服务器工程源码,带注释,里面含有以字节、字、浮点型数据、字符串数据进行数据交互的客户端与服务器源码,可实现中英文字符串实现聊天,本图为与西门子S7-200Smart通讯为例在 C# 的编程世界里,实现 TC…

Day23-20260119

本文介绍了Java数组的基本概念和使用方法。数组是相同类型数据的有序集合,通过索引访问元素。主要内容包括:数组的声明和创建(使用new操作符)、内存分析(堆、栈、方法区)、三种初始化方式(静态、动态和默认初始…

【计算机毕业设计案例】基于微信小程序的考研资源共享平台的设计与实现基于django+微信小程序的考研信息查询系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

c++中的常用栈操作

核心代码如下: include include include using namespace std; int main() { stack st; //1.入栈 st.push(A); st.puch(B); st.push(C); cout<<"栈的大小:"<<st.size()<<endl;//2.访问栈…

PySide系列-07-QMainWindow

PySide step by step系列 1、QMainWindow QMainWindow 是一个继承自 QWidget 的类&#xff0c;专门设计用来作为主应用程序窗口。它内置了多个标准的 GUI 组件区域&#xff0c;方便开发人员快速搭建界面。 QMainWindow 提供了以下几个核心区域&#xff08;布局区域&#xff…

2026/1/17-Atcoder Beginner Contest 441 T1~4

前言 比赛的时候只写了A~E后面结束后补,比赛链接:Atcoder 441 致力于把题目用通俗的语言翻译出来,让新人也能看懂A 只要X Y范围在 (P,Q) 和 (P+99,Q+99)范围之间就成立 B 只要分成两个集合A,B 字符串中每一个字符都去…

群友靶机lara复现 - 场

lara靶机lara nmap -p- 192.168.10.13 Starting Nmap 7.95 ( https://nmap.org ) at 2026-01-18 07:21 EST Nmap scan report for lara (192.168.10.13) Host is up (0.00085s latency). N…

小程序毕设选题推荐:基于django+微信小程序的健康生活系统个人健康生活平台小程序【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

信件分析(2)

学习构建北京市政百姓信件分析实战案例,完成 (1) 采集北京市政百姓信件内容; (2) 编写 MapReduce 程序清洗信件内容数据; (3) 利用 HiveSql 语句离线分析信件内容数据; (4) 利用 Sqoop 导出 Hive 分析数据…

探索人脸识别追踪:从图像采集到电机驱动的奇妙旅程

人脸识别追踪。 图像采集识别和电机驱动系统&#xff0c;利用openmv图像识别对人脸进行实时采集&#xff0c;采集信号传入到单片机&#xff0c;根据分析结果利用matlab-PID算法控制电机系统跟随人脸运动&#xff0c;自动检测追踪在科技飞速发展的当下&#xff0c;人脸识别追踪技…

​​​​​​​推荐10个数据备份与恢复工具?先搞懂这3种备份方式,再选才不踩坑!

在中小企业或个人用户的数据管理实践中&#xff0c;“备份”常被当作最后一道防线。但很多人装了工具、设了任务&#xff0c;真到需要恢复时却发现&#xff1a;要么文件没同步&#xff0c;要么版本不对&#xff0c;甚至整个备份链已损坏。问题往往不在工具本身&#xff0c;而在…

ACPI!gReadyQueue中的plistCtxtQ和ACPI!GetOpRegionScopeWorker函数中的赋值*state->PciObj = state->Parent

ACPI!gReadyQueue中的plistCtxtQ和ACPI!GetOpRegionScopeWorker函数中的赋值*state->PciObj state->Parent1: kd> g Breakpoint 3 hit eax00000800 ebx00000000 ecx89d7f270 edx89db4e50 esi89db3410 edi00000800 eipf740d4fa espf791ac5c ebpf791ac68 iopl0 …

FPGA 实现多路高精度 AD1246 高速数据采集与接收设计

FPGA高速数据接收设计&#xff0c;多路高精度AD1246数据采集在当今数字化时代&#xff0c;对于高速、高精度的数据采集需求日益增长。FPGA&#xff08;现场可编程门阵列&#xff09;以其灵活的可编程性和强大的并行处理能力&#xff0c;成为实现高速数据采集系统的理想选择。本…

手把手教你降AI不伤文:保姆级操作让论文既通过检测又保持专业

手把手教你降AI不伤文&#xff1a;保姆级操作让论文既通过检测又保持专业 TL;DR&#xff1a;降AI率最怕的就是把专业术语改没了、论文变得不伦不类。本文教你如何实现「降AI不伤文」&#xff1a;选对工具&#xff08;推荐嘎嘎降AI&#xff09;、分段处理、处理后校对。掌握这套…

微分方程一维抛物热传导方程数值解法全解析

微分方程一维抛物热传导方程向前向后欧拉C-N格式二阶BDF格式MATLAB源码 显式欧拉&#xff0c;隐式欧拉&#xff0c;梯形公式&#xff0c;改进欧拉 五点差分&#xff0c;九点差分 差分格式&#xff0c;紧差分格式 直拍&#xff0c;只有pdf版方法说明 word版 公式纯手打 数值例子…

《实时渲染》第2章-图形渲染管线-2.2应用程序阶段

应用程序阶段由CPU主导,负责处理输入、碰撞检测、剔除等任务,并将渲染图元传递给后续图形管线阶段,部分工作也可通过GPU计算着色器加速。实时渲染 2. 图形渲染管线 2.2 应用程序阶段 开发人员可以完全控制应用程序阶…

2026年8款免费降AI率工具实测推荐,毕业党必看

2026年8款免费降AI率工具实测推荐&#xff0c;毕业党必看 TL;DR&#xff1a;2026年高校AIGC检测全面升级&#xff0c;传统降重方法已失效。实测8款降AI工具后&#xff0c;推荐嘎嘎降AI&#xff08;达标率99.26%&#xff0c;性价比最高&#xff09;、比话降AI&#xff08;知网AI…