LangChain:调用向量存储库的搜索方法

在 LangChain 中,向量存储库(VectorStore)提供了统一的接口,其中包含多种搜索方法。这些方法用于根据语义或向量来检索最相似的文档。下面将逐一介绍常用的搜索方法及其特点。

在 LangChain 中,向量存储库(VectorStore)提供了统一的接口,其中包含多种搜索方法。这些方法用于根据语义或向量来检索最相似的文档。下面将逐一介绍常用的搜索方法及其特点。

核心搜索方法

功能:根据查询文本进行语义相似性搜索,返回最相似的文档列表。

1
results = vector_store.similarity_search(query, k=4, filter=None)
  • query (str):用户的查询文本。
  • k (int):返回的文档数量,默认为4。
  • filter (dict, optional):元数据过滤条件。
  • 返回List[Document],每个 Document 包含 page_contentmetadata

底层逻辑:内部会自动使用嵌入模型将 query 转换为向量,然后调用向量存储库的向量搜索接口。

similarity_search_by_vector

功能:直接使用给定的嵌入向量进行搜索,而不是传入文本。适用于已经获得查询向量的场景。

1
results = vector_store.similarity_search_by_vector(embedding, k=4, filter=None)
  • embedding (List[float]):查询向量。
  • 其他参数同上。
  • 返回List[Document]

用途:当你已经预先计算好查询向量时(例如从缓存或批量处理中获取),可以直接使用此方法,避免重复调用嵌入模型。

similarity_search_with_score

功能:与 similarity_search 类似,但返回的结果会附带相似度分数(距离值)。

1
results = vector_store.similarity_search_with_score(query, k=4, filter=None)
  • 返回List[Tuple[Document, float]],每个元组包含文档和对应的距离分数。分数越小表示越相似(具体含义取决于使用的距离度量)。

用途:当需要了解匹配的置信度或对结果进行阈值过滤时非常有用。

similarity_search_by_vector_with_score

功能:结合了 similarity_search_by_vectorsimilarity_search_with_score,即使用给定向量进行搜索,并返回带分数的结果。

1
results = vector_store.similarity_search_by_vector_with_score(embedding, k=4, filter=None)
  • 返回List[Tuple[Document, float]]

高级搜索方法

功能:最大边际相关性搜索。在返回相似文档的同时,尽可能降低结果之间的冗余性。即同时考虑了“与查询的相关性”和“结果的多样性”。

1
results = vector_store.max_marginal_relevance_search(query, k=4, fetch_k=20, lambda_mult=0.5, filter=None)
  • fetch_k (int):初始召回的候选文档数量(通常大于 k),从中进行多样性筛选。
  • lambda_mult (float):控制相关性和多样性的权衡。0~1之间,值越大越注重相关性,越小越注重多样性。
  • 返回List[Document]

用途:当需要避免结果过于相似(例如问答系统希望提供互补信息)时使用。

类似地,也有 max_marginal_relevance_search_by_vector 版本,接受向量作为输入。


as_retriever

功能:将向量存储库包装成一个检索器(Retriever)对象,以便在 LangChain 链中统一使用。

1
retriever = vector_store.as_retriever(search_kwargs={"k": 5})

检索器支持多种搜索类型(通过 search_type 参数):

  • "similarity":默认,使用 similarity_search
  • "mmr":使用 max_marginal_relevance_search
  • "similarity_score_threshold":基于分数阈值的相似性搜索
1
2
3
4
retriever = vector_store.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={"score_threshold": 0.8, "k": 3}
)

异步方法

LangChain 的向量存储库通常也提供异步版本的搜索方法,用于高并发场景:

  • asimilarity_search
  • asimilarity_search_by_vector
  • asimilarity_search_with_score
  • amax_marginal_relevance_search

这些方法用法与同步版本相同,返回 awaitable


元数据过滤(Filter)

大多数搜索方法都支持 filter 参数,用于根据文档元数据字段进行精确过滤。过滤语法因底层向量存储库而异,但 LangChain 尝试提供统一形式(如 {"source": "tweets"})。常用过滤器包括:

  • 等值匹配{"source": "tweets"}
  • 多值{"source": {"$in": ["tweets", "news"]}}
  • 范围{"date": {"$gte": "2023-01-01"}}

实际支持的操作符取决于具体的向量存储库实现(如 Chroma、PGVector、Milvus 等)。


总结:不同方法适用场景

方法 适用场景
similarity_search 最常用的基础搜索,快速获取相似文档
similarity_search_with_score 需要分数阈值过滤或评估匹配程度
similarity_search_by_vector 已有查询向量,避免重复嵌入计算
max_marginal_relevance_search 需要多样性结果,避免内容重复
as_retriever 在 LangChain 链或代理中统一调用检索器
作者

光星

发布于

2026-03-22

更新于

2026-03-22

许可协议

评论