VectorStoreRetriever 三种搜索类型

VectorStoreRetriever 三种搜索类型深度解析:差异、场景与选型

在 LangChain 等大模型应用开发中,VectorStoreRetriever 是连接向量数据库与大模型的核心组件,负责从知识库中精准召回与查询相关的文档。它支持三种核心搜索类型:similarity(默认)、similarity_score_thresholdmmr

很多开发者在实际开发中会困惑:这三种搜索类型到底有什么区别?不同场景该选哪种?本文将从原理、参数、适用场景、实际效果四个维度,帮你彻底理清它们的差异,给出明确的选型建议。

一、先明确基础信息:三种搜索类型概览

先通过一张表格快速掌握三种搜索类型的核心定义和默认参数:

搜索类型 说明 默认参数
similarity 相似度搜索(默认) {"k": 4} - 返回前k个最相似的文档
similarity_score_threshold 带分数阈值的相似度搜索 {"k": 4, "score_threshold": 0.8} - 返回相似度大于阈值的文档
mmr 最大边际相关性搜索 {"k": 4, "fetch_k": 20, "lambda_mult": 0.5} - 平衡相关性和多样性

二、深度拆解:三种搜索类型的核心差异

1. similarity:纯相关性优先的基础搜索

核心原理

最基础的向量搜索逻辑:计算查询向量与知识库中所有文档向量的相似度(常用余弦相似度),按相似度从高到低排序,直接取前 k 个结果。

核心特点:只关注"相关性",不考虑结果是否重复,也不设置任何筛选门槛。

参数解读

仅需关注 k:代表最终返回的文档数量,默认值为4。无论文档相似度多低,只要排名在前k位,就会被返回(若知识库中文档不足k个,则返回全部)。

适用场景
  • 简单问答场景:比如小型知识库的精准匹配,希望快速获取最相关的结果;
  • 知识库特性:文档数量少、内容同质化低,几乎没有重复内容;
  • 需求明确:对结果数量有硬性要求,不需要过滤低相关性内容。
实际效果示例

查询:「如何学习Python」

返回结果:相似度排名前4的文档,可能是「Python基础语法入门」「Python基础语法详解」「Python入门实战案例」「Python学习路径规划」------ 其中前两篇内容高度重复,但因相关性最高仍会被同时返回。

2. similarity_score_threshold:带门槛的精准搜索

核心原理

在纯相似度搜索的基础上,增加了"相似度阈值"筛选。流程是:先计算所有文档的相似度 → 过滤掉相似度低于 score_threshold 的文档 → 从剩余符合条件的文档中取前 k 个(若符合条件的文档不足k个,则返回全部符合条件的)。

核心特点:兼顾相关性和精准度,通过阈值过滤低质量、低相关性的"噪音文档"。

参数解读
  • k:最终返回的最大文档数量,默认4;
  • score_threshold:相似度阈值(范围0-1),值越高要求越严格,默认0.8。
适用场景
  • 高精准度要求场景:比如专业领域问答(医疗、法律、金融),不允许返回无关或擦边内容;
  • 复杂知识库:知识库中存在大量无关文档,需要过滤噪音;
  • 严格质量控制:比如客服机器人,必须保证回答的依据是高度相关的文档。
实际效果示例

查询:「如何学习Python」,设置 score_threshold=0.8

返回结果:仅保留相似度≥0.8的文档。若符合条件的文档只有2篇(「Python基础语法入门」「Python学习路径规划」),则最终返回2篇,而非强制返回4篇。

3. mmr:平衡相关与多样的全面搜索

核心原理

MMR(Maximum Marginal Relevance,最大边际相关性)是一种进阶搜索算法,核心目标是"兼顾相关性和多样性",避免返回内容重复的结果。具体流程:

  1. 先从知识库中筛选出 fetch_k 个最相似的文档(作为候选集,默认20);
  2. 从候选集中迭代选择文档:优先选与查询相关的,但同时尽量避免选与已选文档高度相似的;
  3. 通过 lambda_mult 调节权重:值越接近1,越偏向相关性;越接近0,越偏向多样性(默认0.5,均衡状态)。
参数解读
  • k:最终返回的文档数量,默认4;

  • fetch_k:候选集大小(需≥k),候选集越大,可选的多样性文档越多;

  • lambda_mult:平衡系数(0-1),默认0.5:

    • lambda_mult=1:等价于纯similarity搜索(只看相关性);
    • lambda_mult=0:完全追求多样性(可能忽略相关性,不推荐)。
适用场景
  • 开放式问答场景:需要覆盖多角度答案,比如「Python学习方法有哪些」,希望同时获取基础语法、项目实战、书籍推荐、在线课程等不同维度的内容;
  • 高重复度知识库:知识库中存在大量相似文档(如同一问题的不同版本回答),需要避免重复召回;
  • 全面信息需求:比如用户需要了解某个主题的全貌,而非单一精准答案。
实际效果示例

查询:「如何学习Python」,设置 lambda_mult=0.5

返回结果:不会出现多篇重复的基础语法文档,而是均衡返回「Python基础语法入门」「Python项目实战指南」「Python经典学习书籍推荐」「Python在线课程汇总」------ 兼顾相关性和多样性。

三、关键差异对比表(一目了然)

对比维度 similarity similarity_score_threshold mmr
核心目标 仅追求最高相关性 高相关性 + 过滤低质量结果 相关性与多样性平衡
核心参数 k(返回数量) k、score_threshold(阈值) k、fetch_k(候选集)、lambda_mult(平衡系数)
结果特点 相关性最高,但可能重复 精准度高,无低相关结果 兼顾相关与多样,避免重复
适用场景 简单精准匹配、小型知识库 专业领域、高精准度需求 开放式问答、全面信息需求
结果数量 固定返回k个(不足则补全) 最多返回k个(可能更少) 固定返回k个

四、选型建议:按场景快速决策

掌握了差异后,实际开发中无需纠结,按以下原则快速选型:

  1. 若需求简单、追求快速精准匹配,且知识库内容干净(无太多噪音):选默认的 similarity
  2. 若对结果精准度要求极高,不允许出现无关内容(如专业领域、客服机器人):选 similarity_score_threshold,建议将 score_threshold 设为0.7-0.9(根据知识库实际情况调整);
  3. 若需要覆盖多角度答案、避免重复内容(如开放式问答、主题全貌查询):选 mmr,默认 lambda_mult=0.5 即可满足大部分场景,若需更侧重相关性可调至0.7-0.8。

五、总结

VectorStoreRetriever 的三种搜索类型,本质是为了适配不同的"召回需求":

  • similarity 是基础款,主打"快准";
  • similarity_score_threshold 是精准款,主打"无噪音";
  • mmr 是进阶款,主打"全面性"。

实际开发中,建议根据知识库的规模、内容特性以及用户的查询需求,灵活选择合适的搜索类型。如果不确定,也可以做小范围测试:用同一批查询对比三种类型的召回结果,再根据实际效果微调参数~

📌 本文配套代码示例(快速上手三种搜索类型):

ini 复制代码
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# 初始化向量存储(示例)
embeddings = OpenAIEmbeddings()
vector_store = Chroma(embedding_function=embeddings)

# 1. similarity 搜索
retriever_similarity = vector_store.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 4}
)

# 2. similarity_score_threshold 搜索
retriever_threshold = vector_store.as_retriever(
    search_type="similarity_score_threshold",
    search_kwargs={"k": 4, "score_threshold": 0.8}
)

# 3. mmr 搜索
retriever_mmr = vector_store.as_retriever(
    search_type="mmr",
    search_kwargs={"k": 4, "fetch_k": 20, "lambda_mult": 0.5}
)

# 执行查询
query = "如何学习Python"
print(retriever_similarity.get_relevant_documents(query))
print(retriever_threshold.get_relevant_documents(query))
print(retriever_mmr.get_relevant_documents(query))
}

如果觉得本文对你有帮助,欢迎点赞、收藏~ 有任何疑问或补充,欢迎在评论区交流!

相关推荐
草帽lufei2 小时前
LangChain 框架基础知识和核心组件Prompts,Chains
langchain·openai·gemini
旦莫2 小时前
Python测试开发工具库:日志脱敏工具(敏感信息自动屏蔽)
python·测试开发·自动化·ai测试
唐叔在学习2 小时前
Python自动化指令进阶:UAC提权
后端·python
旺仔小拳头..2 小时前
Java ---变量、常量、类型转换、默认值、重载、标识符、输入输出、访问修饰符、泛型、迭代器
java·开发语言·python
重铸码农荣光2 小时前
🤖 用 AI 写 Git Commit Message?我让新手秒变 Git 高手!
langchain·aigc·全栈
wujj_whut2 小时前
【Conda实战】从0到1:虚拟环境创建、多Python版本管理与环境切换全指南
开发语言·python·conda
geoqiye3 小时前
2026官方认证:贵阳宠物行业短视频运营TOP5评测
大数据·python·宠物
龙腾AI白云3 小时前
AI智能体搭建(3)深度搜索智能体如何搭建与设计 Agent#智能体搭建#多智能体#VLA#大模型
python·django·virtualenv·scikit-learn·tornado
海棠AI实验室3 小时前
第十一章 错误处理体系:异常分层与可恢复策略
python·异常处理