外观
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),用于检索你自己提供的私有文档库,通常基于向量数据库:
ElasticsearchRetrieverAzureAISearchRetrieverAmazonKnowledgeBasesRetriever(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 |
| 企业级云搜索 | AzureAISearchRetriever 或 VertexAISearchRetriever |
| 提升召回率 | MultiQueryRetriever 包装向量检索器 |
Retriever ≠ Vector Store
与 Vector Store 的关系总结
- Vector Store → Retriever:通过
.as_retriever()转换,是最常见的路径。 - Retriever ↛ Vector Store:Retriever 是更高层抽象,可完全不涉及向量。
- 最佳实践:将 Vector Store 作为底层存储,Retriever 作为访问入口,便于后续替换或增强(如加 reranker)。
| 特性 | Vector Store | Retriever |
|---|---|---|
| 是否必须存储文档? | ✅ 是 | ❌ 否(只负责“检索”) |
| 是否必须使用嵌入? | ✅ 通常需要 | ❌ 不一定(如 WikipediaRetriever 直接调 API) |
| 能否封装非向量源? | ❌ 不能 | ✅ 可以(如 Arxiv、Tavily、Kendra) |