Skip to content

LangChain检索器

检索器

检索器

LangChain 中的 Retrievers(检索器) 是一个通用接口,用于根据用户的自然语言查询(unstructured query)返回相关文档(Documents)。它在构建 RAG(Retrieval-Augmented Generation,检索增强生成)系统中起着核心作用。

Retriever 是一个接口,输入是一个字符串查询,输出是一组 Document 对象。

  • 它比 Vector Store 更抽象、更通用。
  • Vector Store 可以被“转换”为 Retriever(通过 .as_retriever()),但 Retriever 不一定依赖向量存储。
  • 核心目的:从大量信息源中高效、准确地检索出与用户问题最相关的上下文,供 LLM 使用。
python
# Vector Store 可以被“转换”为检索器
retriever = vector_store.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 1},
)
results = retriever.invoke("热门专业top20中,前3名有哪些?")
print(results[0])

统一接口与使用方式

所有 Retriever 都实现 BaseRetriever 接口,支持以下标准方法:

python
# 同步调用
docs = retriever.invoke("How does photosynthesis work?")

# 异步调用(若支持)
docs = await retriever.ainvoke("Explain quantum computing.")

此外,Retriever 可无缝集成到 LangChain 的 RAG 链(如 create_retrieval_chain) 或 LangGraph 工作流中。

Retriever 的主要类型

A. 自定义文档检索器(Bring-your-own documents),用于检索你自己提供的私有文档库,通常基于向量数据库:

  • ElasticsearchRetriever
  • AzureAISearchRetriever
  • AmazonKnowledgeBasesRetriever(Bedrock)
  • VertexAISearchRetriever(Google Cloud)

这些通常底层仍使用向量搜索 + 元数据过滤,但封装为统一 Retriever 接口。

B. 外部索引检索器(External index),直接检索公开或第三方数据源,无需自己维护索引:

  • WikipediaRetriever → 搜索维基百科
  • ArxivRetriever → 检索 arXiv 学术论文
  • TavilySearchAPIRetriever → 调用 Tavily 的互联网搜索 API

这类 Retriever 将用户查询转发给外部服务,并将结果包装成 LangChain 的 Document 格式。

C. 高级/组合型 Retriever(All retrievers 列表中的其他类型),LangChain 还提供大量高级检索策略,例如:

  • 多路检索(MultiQueryRetriever):自动生成多个查询变体提升召回率
  • 压缩检索(ContextualCompressionRetriever):先检索再压缩文档片段
  • 重排序(CohereRerank、FlashRankRerank):对初步检索结果进行语义重排
  • 混合检索(Pinecone Hybrid Search):结合关键词 + 向量搜索
  • BM25 / TF-IDF Retriever:传统稀疏检索方法,可与向量检索融合

典型应用场景

检索器是一个灵活、可扩展的检索抽象层:

  • 统一了从本地向量库到互联网搜索的多种信息源;
  • 支持简单检索到复杂检索策略(多查询、重排序、压缩等);
  • 是构建生产级 RAG 应用的关键模块。
场景推荐 Retriever
私有知识库问答Chroma.as_retriever() + ContextualCompressionRetriever
实时网络搜索TavilySearchAPIRetriever
学术研究辅助ArxivRetriever
企业级云搜索AzureAISearchRetrieverVertexAISearchRetriever
提升召回率MultiQueryRetriever 包装向量检索器

Retriever ≠ Vector Store

与 Vector Store 的关系总结

  • Vector Store → Retriever:通过 .as_retriever() 转换,是最常见的路径。
  • Retriever ↛ Vector Store:Retriever 是更高层抽象,可完全不涉及向量。
  • 最佳实践:将 Vector Store 作为底层存储,Retriever 作为访问入口,便于后续替换或增强(如加 reranker)。
特性Vector StoreRetriever
是否必须存储文档?✅ 是❌ 否(只负责“检索”)
是否必须使用嵌入?✅ 通常需要❌ 不一定(如 WikipediaRetriever 直接调 API)
能否封装非向量源?❌ 不能✅ 可以(如 Arxiv、Tavily、Kendra)