LangChain:调用向量存储库的搜索方法
在 LangChain 中,向量存储库(VectorStore)提供了统一的接口,其中包含多种搜索方法。这些方法用于根据语义或向量来检索最相似的文档。下面将逐一介绍常用的搜索方法及其特点。
在 LangChain 中,向量存储库(VectorStore)提供了统一的接口,其中包含多种搜索方法。这些方法用于根据语义或向量来检索最相似的文档。下面将逐一介绍常用的搜索方法及其特点。
核心搜索方法
similarity_search
功能:根据查询文本进行语义相似性搜索,返回最相似的文档列表。
1 | results = vector_store.similarity_search(query, k=4, filter=None) |
query(str):用户的查询文本。k(int):返回的文档数量,默认为4。filter(dict, optional):元数据过滤条件。- 返回:
List[Document],每个 Document 包含page_content和metadata。
底层逻辑:内部会自动使用嵌入模型将 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_vector 和 similarity_search_with_score,即使用给定向量进行搜索,并返回带分数的结果。
1 | results = vector_store.similarity_search_by_vector_with_score(embedding, k=4, filter=None) |
- 返回:
List[Tuple[Document, float]]。
高级搜索方法
max_marginal_relevance_search
功能:最大边际相关性搜索。在返回相似文档的同时,尽可能降低结果之间的冗余性。即同时考虑了“与查询的相关性”和“结果的多样性”。
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 | retriever = vector_store.as_retriever( |
异步方法
LangChain 的向量存储库通常也提供异步版本的搜索方法,用于高并发场景:
asimilarity_searchasimilarity_search_by_vectorasimilarity_search_with_scoreamax_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 链或代理中统一调用检索器 |
LangChain:调用向量存储库的搜索方法
http://blog.gxitsky.com/2026/03/22/AI-LangChain-028-VectorStor-Search-Method/

