RAG(五) 向量存储检索器(Retriever)的使用
本文详细解析了LangChain框架中向量存储检索器(Retriever)在RAG问答系统中的核心作用与配置方法。Retriever作为连接向量数据库与大语言模型的关键组件,通过语义匹配从海量文档中检索相关信息,为LLM提供精准上下文。文章重点介绍了基于FAISS向量库的Retriever配置方式,包括search_type(相似度检索/阈值检索/MMR检索)和search_kwargs(相似度阈
在基于检索增强生成(RAG)的问答系统中,向量存储检索器(Retriever) 是连接原始文档与大语言模型(LLM)的核心桥梁。它负责从海量的向量数据中快速找到与用户问题最相关的信息,为 LLM 提供精准的上下文,从而大幅提升回答的准确性和可靠性。本文将结合实战代码,深入讲解 Retriever 的核心概念、配置方法及在 RAG 流程中的应用。
一、Retriever 的核心作用
Retriever(检索器)是 LangChain 框架中专门用于从向量数据库中检索相关文档的组件,其核心作用可概括为:
- 语义匹配:将用户的自然语言问题转换为向量,与向量数据库中存储的文档向量进行语义相似度计算;
- 精准筛选:根据预设的规则(如相似度阈值)筛选出最相关的文档片段;
- 上下文供给:将筛选后的文档作为上下文传递给 LLM,确保 LLM 仅基于相关信息回答问题。
在 RAG 流程中,Retriever 是承上启下的关键:上接用户问题的向量转换,下接 LLM 的提示词构建,直接决定了最终回答的质量。
二、Retriever 的核心配置与参数
以 FAISS 向量数据库为例,我们基于实战代码讲解 Retriever 的核心配置方式。
1. 基础依赖准备
首先需要完成向量数据库的构建,这是 Retriever 工作的前提:
from langchain_community.document_loaders import PyPDFDirectoryLoader
from langchain_community.vectorstores import FAISS
from langchain_huggingface import HuggingFaceEmbeddings
# 1. 加载PDF文档
loader = PyPDFDirectoryLoader("./pdf1/")
docs = loader.load()
# 2. 初始化本地嵌入模型
model_name = r'D:\本地模型\BAAI\bge-large-zh-v1___5'
embeddings = HuggingFaceEmbeddings(model_name=model_name)
# 3. 构建FAISS向量数据库
vectorStoreDB = FAISS.from_documents(docs, embedding=embeddings)
2. Retriever 的创建与关键参数
通过as_retriever()方法可将向量数据库转换为检索器,核心参数如下:
# 创建带相似度阈值的检索器
retriever = vectorStoreDB.as_retriever(
search_type="similarity_score_threshold", # 检索类型
search_kwargs={"score_threshold": 0.3} # 检索参数
)
(1)search_type:检索类型
LangChain 支持多种检索策略,常用的有:
similarity:默认值,返回相似度最高的前 N 个文档(默认前 4 个);similarity_score_threshold:按相似度阈值筛选,仅返回分数高于阈值的文档;mmr:最大边际相关性检索,平衡相关性和多样性,避免返回重复内容。
(2)search_kwargs:检索参数
根据search_type的不同,需配置对应的参数:
- 当
search_type="similarity_score_threshold"时:score_threshold:相似度阈值(0-1),值越高要求越严格,本文中设置为 0.3,表示仅返回相似度≥0.3 的文档;
- 当
search_type="similarity"时:k:返回的文档数量,默认值为 4,可根据需求调整(如{"k": 5});
- 通用参数:
fetch_k:在最终筛选前先获取的文档数量(用于 MMR 等策略),默认值为 20。
三、Retriever 在 RAG 流程中的实战应用
Retriever 的最终价值体现在完整的 RAG 问答链中,结合你提供的代码,完整的流程如下:
1. 完整代码实现
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
import os
from dotenv import load_dotenv
from pydantic import SecretStr
# 加载环境变量,初始化LLM
load_dotenv()
llm = ChatOpenAI(
base_url="https://api.deepseek.com/v1",
model="deepseek-chat",
api_key=SecretStr(os.environ["DEEPSEEK_API_KEY"]),
)
# 构建提示词模板
template = """
只根据以下文档回答问题:
{context}
问题:{question}
"""
prompt = ChatPromptTemplate.from_template(template)
outputParser = StrOutputParser()
# 构建检索+问答链
setup_and_retrieval = RunnableParallel(
{
"context": retriever, # 检索器负责获取context
"question": RunnablePassthrough() # 透传用户问题
}
)
# 完整的RAG链:检索 → 提示词构建 → LLM生成 → 结果解析
chain = setup_and_retrieval | prompt | llm | outputParser
# 调用问答链
result = chain.invoke("关于劳动争议?")
print(result)
2. Retriever 的执行逻辑
在上述代码中,Retriever 的执行流程为:
- 用户输入问题 “关于劳动争议?”;
RunnableParallel将问题同时传递给 Retriever 和透传组件;- Retriever 将问题转换为向量,在 FAISS 库中检索相似度≥0.3 的文档,作为
context; context和question一起传入提示词模板,生成包含上下文的完整提示词;- LLM 基于提示词生成回答,最终通过
StrOutputParser解析为字符串。
四、Retriever 的调优建议
- 相似度阈值调优:
score_threshold需根据实际场景调整,知识类问答建议设为 0.5-0.7(更严格),通用问答可设为 0.2-0.4(更宽松); - 返回数量控制:使用
similarity类型时,合理设置k值(建议 3-5),过多文档会增加 LLM 的上下文负担,过少可能遗漏关键信息; - 检索策略选择:如果需要避免重复内容(如长文档问答),优先使用
mmr检索类型; - 嵌入模型匹配:Retriever 的检索效果依赖嵌入模型,建议使用与文档语言匹配的模型(如中文场景优先使用 bge-large-zh 系列)。
五、总结
Retriever 作为 LangChain RAG 体系的核心组件,其核心价值在于精准、高效地从向量数据库中检索相关文档。通过本文的讲解,我们可以明确:
- Retriever 的核心是基于向量的语义匹配,配置的关键是
search_type和search_kwargs; similarity_score_threshold类型适合需要严格控制相关性的场景,similarity类型适合追求召回率的场景;- Retriever 的调优需结合业务场景,平衡相关性和召回率,才能最大化 RAG 系统的回答质量。
在实际开发中,Retriever 的配置是 RAG 系统调优的核心环节之一,合理的检索策略能让 LLM 的回答既精准又全面。

总结
- 核心定位:Retriever 是 LangChain 中连接向量数据库与 LLM 的关键组件,负责基于语义相似度检索相关文档,为 RAG 提供精准上下文;
- 核心配置:通过
as_retriever()创建,关键参数包括search_type(检索类型)和search_kwargs(如相似度阈值score_threshold、返回数量k); - 实战要点:需根据业务场景调整检索策略(如严格匹配用
similarity_score_threshold,追求召回率用similarity),并结合嵌入模型调优检索效果。
更多推荐



所有评论(0)