【AI大模型学习路线】第三阶段之RAG与LangChain——第十六章(Advanced RAG[1])MultiQuery retriever详解?
欢迎宝子们点赞、关注、收藏!欢迎宝子们批评指正!
祝所有的硕博生都能遇到好的导师!好的审稿人!好的同门!顺利毕业!
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://fighting.blog.csdn.net/article/details/148185942
Multi-Query Retriever 是一种增强型检索策略:
传统向量检索只根据一个 Query 进行 Top-K 检索,容易:
问题 | 举例 |
---|---|
检索视角单一 | 只找到问题的一部分答案 |
召回范围不全 | 遗漏重要上下文 |
用户问题含糊 | 模型理解偏差导致检索偏移 |
能力 | 描述 |
---|---|
自动扩展查询 | LLM 生成多个相关问题 |
多路径召回 | 每个子查询独立执行向量检索 |
提升语义覆盖 | 拓宽信息视角,防止遗漏关键知识点 |
LangChain 原生支持 | MultiQueryRetriever 可一键调用 |
[用户Query]
↓
LLM生成多个子查询(视角扩展)
↓
每个子查询 → 向量检索
↓
合并所有结果 → Deduplicate
↓
传入 LLM 回答
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.llms import OpenAI
from langchain.retrievers.multi_query import MultiQueryRetriever
# Step 1: 加载和切分文档
loader = TextLoader("data/ai_medical.txt")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(chunk_size=400, chunk_overlap=50)
docs = splitter.split_documents(docs)
# Step 2: 构建向量数据库
embedding = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embedding)
# Step 3: 构建 MultiQuery Retriever
llm = OpenAI(temperature=0)
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm,
verbose=True # 输出生成的子查询
)
# Step 4: 测试查询
query = "人工智能在癌症早期检测中的应用有哪些?"
results = retriever.get_relevant_documents(query)
# Step 5: 输出结果
for i, doc in enumerate(results):
print(f"\n【文档{i+1}】:\n{doc.page_content}")
[MultiQueryRetriever] 生成的子查询:
1. 什么是人工智能在癌症早期检测中的具体应用?
2. 有没有 AI 模型可以识别癌症的早期症状?
3. 在医学影像中,AI 是如何帮助检测癌症的?
场景 | MultiQueryRetriever 优势 |
---|---|
医疗文献问答 | 针对疾病、治疗、方法三维提问 |
法律问答 | 不同法条、解释路径召回 |
企业知识库 | 多岗位视角、多业务线相关信息聚合 |
多语言查询 | 自动扩展多语言问法用于检索 |
趋势 | MultiQuery作用 |
---|---|
LLM Agent 越来越像“提问者” | Agent 自动生成子查询用于知识规划 |
向量检索逐渐融合 hybrid 检索 | 子查询支持向量+BM25双通道融合 |
多模态检索 | 子查询跨模态扩展为图像/视频 caption 检索 |
上下文感知 Prompt 设计 | MultiQuery 与 Chain-of-Prompt 配合更强大 |
特性 | 单Query Retriever | MultiQueryRetriever |
---|---|---|
Query 来源 | 用户提供的原始问题 | LLM 扩展出的多个子查询 |
召回多样性 | 较弱,固定语义路径 | 强,语义视角多样 |
文档覆盖率 | 低 | 高 |
消耗 | 快速 | 稍慢(多次检索) |
适合场景 | 精准问答、简短问题 | 模糊问题、复杂问题、需探索性查找 |