Skip to main content
Qdrant(读作:quadrant)是一个向量相似性搜索引擎。它提供了一个生产就绪的服务,具有便捷的 API,用于存储、搜索和管理向量,并支持附加的有效载荷和扩展过滤。这使其适用于各种基于神经网络或语义的匹配、分面搜索以及其他应用。
本文档演示了如何将 Qdrant 与 LangChain 结合使用,以进行稠密(即基于嵌入)、稀疏(即文本搜索)和混合检索。QdrantVectorStore 类通过 Qdrant 新的 Query API 支持多种检索模式。它要求你运行 Qdrant v1.10.0 或更高版本。

设置

运行 Qdrant 有多种模式,根据所选模式的不同,会有一些细微差别。选项包括:
  • 本地模式,无需服务器
  • Docker 部署
  • Qdrant Cloud
请参阅 Qdrant 安装说明

凭证

运行此笔记本中的代码不需要任何凭证。 如果你想获得一流的模型调用自动跟踪,也可以取消注释以下内容来设置你的 LangSmith API 密钥:

初始化

本地模式

Python 客户端提供了在本地模式下运行代码的选项,无需运行 Qdrant 服务器。这对于测试、调试或仅存储少量向量非常有用。嵌入可以完全保存在内存中,也可以持久化到磁盘。

内存中

对于某些测试场景和快速实验,你可能更喜欢将所有数据仅保留在内存中,这样当客户端被销毁时(通常在脚本/笔记本结束时),数据就会被移除。

磁盘存储

本地模式(不使用 Qdrant 服务器)也可以将你的向量存储在磁盘上,以便在运行之间持久化。

本地服务器部署

无论你是选择使用 Docker 容器 在本地启动 Qdrant,还是选择使用 官方 Helm chart 进行 Kubernetes 部署,连接到此类实例的方式都是相同的。你需要提供一个指向该服务的 URL。

Qdrant cloud

如果你不想忙于管理基础设施,可以选择在 Qdrant Cloud 上设置一个完全托管的 Qdrant 集群。有一个永久免费的 1GB 集群可供试用。使用托管版本 Qdrant 的主要区别在于,你需要提供一个 API 密钥来保护你的部署免受公开访问。该值也可以在 QDRANT_API_KEY 环境变量中设置。

使用现有集合

要获取 langchain_qdrant.Qdrant 的实例而不加载任何新文档或文本,你可以使用 Qdrant.from_existing_collection() 方法。

管理向量存储

一旦你创建了向量存储,我们就可以通过添加和删除不同的项目与之交互。

向向量存储添加项目

我们可以使用 add_documents 函数向向量存储添加项目。

从向量存储中删除项目

查询向量存储

一旦你的向量存储创建完成并且相关文档已添加,你很可能希望在链或代理运行期间对其进行查询。

直接查询

使用 Qdrant 向量存储最简单的场景是执行相似性搜索。在底层,我们的查询将被编码为向量嵌入,并用于在 Qdrant 集合中查找相似的文档。
QdrantVectorStore 支持 3 种相似性搜索模式。可以使用 retrieval_mode 参数进行配置。
  • 稠密向量搜索(默认)
  • 稀疏向量搜索
  • 混合搜索

稠密向量搜索

稠密向量搜索涉及通过基于向量的嵌入计算相似性。要仅使用稠密向量进行搜索:
  • retrieval_mode 参数应设置为 RetrievalMode.DENSE。这是默认行为。
  • 应向 embedding 参数提供一个稠密嵌入值。

稀疏向量搜索

要仅使用稀疏向量进行搜索:
  • retrieval_mode 参数应设置为 RetrievalMode.SPARSE
  • 必须提供一个使用任何稀疏嵌入提供者的 SparseEmbeddings 接口实现,作为 sparse_embedding 参数的值。
langchain-qdrant 包提供了一个基于 FastEmbed 的开箱即用实现。 要使用它,请安装 FastEmbed 包。

混合向量搜索

要使用稠密和稀疏向量执行混合搜索并进行分数融合:
  • retrieval_mode 参数应设置为 RetrievalMode.HYBRID
  • 应向 embedding 参数提供一个稠密嵌入值。
  • 必须提供一个使用任何稀疏嵌入提供者的 SparseEmbeddings 接口实现,作为 sparse_embedding 参数的值。
请注意,如果你以 HYBRID 模式添加了文档,那么在搜索时可以切换到任何检索模式,因为集合中同时提供了稠密和稀疏向量。
如果你想执行相似性搜索并接收相应的分数,可以运行:
要获取 QdrantVectorStore 所有可用搜索功能的完整列表,请阅读 API 参考

元数据过滤

Qdrant 拥有一个功能强大的过滤系统,支持丰富的类型。也可以在 LangChain 中使用过滤器,方法是向 similarity_search_with_scoresimilarity_search 方法传递一个额外的参数。

转换为检索器进行查询

你也可以将向量存储转换为检索器,以便在你的链中更轻松地使用。

用于检索增强生成

有关如何将此向量存储用于检索增强生成(RAG)的指南,请参阅以下部分:

自定义 qdrant

有一些选项可以在你的 LangChain 应用程序中使用现有的 Qdrant 集合。在这种情况下,你可能需要定义如何将 Qdrant 点映射到 LangChain Document

命名向量

Qdrant 通过命名向量支持每个点多个向量。如果你使用外部创建的集合或希望使用不同名称的向量,可以通过提供其名称来配置它。

元数据

Qdrant 将你的向量嵌入与可选的类 JSON 有效载荷一起存储。有效载荷是可选的,但由于 LangChain 假设嵌入是从文档生成的,因此我们保留上下文数据,以便你也可以提取原始文本。 默认情况下,你的文档将以以下有效载荷结构存储:
但是,你可以决定为页面内容和元数据使用不同的键。如果你有一个想要重用的现有集合,这会很有用。

API 参考

有关所有 QdrantVectorStore 功能和配置的详细文档,请访问 API 参考