Langchain
Langchain 是一个使基于大型语言模型构建应用变得更加容易的库。它统一了不同库(包括主要的嵌入提供商和 Qdrant)的接口。使用 Langchain,您可以专注于业务价值,而不是编写样板代码。
Langchain 将 Qdrant 集成作为合作伙伴包发布。
可以使用 pip 安装
pip install langchain-qdrant
该集成支持使用密集/稀疏和混合检索来搜索相关文档。
Qdrant 作为向量索引,可以存储嵌入及其用于生成的文档。有多种使用方法,但调用 QdrantVectorStore.from_texts
或 QdrantVectorStore.from_documents
可能是最直接的入门方式。
from langchain_qdrant import QdrantVectorStore
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
doc_store = QdrantVectorStore.from_texts(
texts, embeddings, url="<qdrant-url>", api_key="<qdrant-api-key>", collection_name="texts"
)
使用现有集合
要获取一个 langchain_qdrant.QdrantVectorStore
实例而无需加载任何新文档或文本,您可以使用 QdrantVectorStore.from_existing_collection()
方法。
doc_store = QdrantVectorStore.from_existing_collection(
embeddings=embeddings,
collection_name="my_documents",
url="<qdrant-url>",
api_key="<qdrant-api-key>",
)
本地模式
Python 客户端允许您在不运行 Qdrant 服务器的情况下以本地模式运行相同的代码。这对于测试和调试,或者如果您计划只存储少量向量非常有用。嵌入可以完全保存在内存中或持久化到磁盘上。
内存中
对于某些测试场景和快速实验,您可能更喜欢将所有数据只保存在内存中,这样当客户端被销毁时(通常在脚本/notebook 结束时)数据就会丢失。
qdrant = QdrantVectorStore.from_documents(
docs,
embeddings,
location=":memory:", # Local mode with in-memory storage only
collection_name="my_documents",
)
磁盘存储
本地模式(不使用 Qdrant 服务器)也可以将您的向量存储到磁盘上,以便在不同运行之间进行持久化。
qdrant = Qdrant.from_documents(
docs,
embeddings,
path="/tmp/local_qdrant",
collection_name="my_documents",
)
本地服务器部署
无论您选择使用 Docker 容器 在本地启动 QdrantVectorStore,还是选择使用 官方 Helm Chart 进行 Kubernetes 部署,连接到实例的方式都是相同的。您需要提供指向服务的 URL。
url = "<---qdrant url here --->"
qdrant = QdrantVectorStore.from_documents(
docs,
embeddings,
url,
prefer_grpc=True,
collection_name="my_documents",
)
相似性搜索
QdrantVectorStore
支持 3 种相似性搜索模式。可以在设置类时使用 retrieval_mode
参数进行配置。
- 密集向量搜索(默认)
- 稀疏向量搜索
- 混合搜索
密集向量搜索
仅使用密集向量进行搜索时:
retrieval_mode
参数应设置为RetrievalMode.DENSE
(默认)。- 需要为
embedding
参数提供一个 密集嵌入 值。
from langchain_qdrant import RetrievalMode
qdrant = QdrantVectorStore.from_documents(
docs,
embedding=embeddings,
location=":memory:",
collection_name="my_documents",
retrieval_mode=RetrievalMode.DENSE,
)
query = "What did the president say about Ketanji Brown Jackson"
found_docs = qdrant.similarity_search(query)
稀疏向量搜索
仅使用稀疏向量进行搜索时:
retrieval_mode
参数应设置为RetrievalMode.SPARSE
。- 需要为
sparse_embedding
参数提供一个使用任何稀疏嵌入提供商实现的 SparseEmbeddings 接口 的值。
langchain-qdrant
包开箱即用地提供了一个基于 FastEmbed 的实现。
要使用它,请安装 FastEmbed 包。
from langchain_qdrant import FastEmbedSparse, RetrievalMode
sparse_embeddings = FastEmbedSparse(model_name="Qdrant/BM25")
qdrant = QdrantVectorStore.from_documents(
docs,
sparse_embedding=sparse_embeddings,
location=":memory:",
collection_name="my_documents",
retrieval_mode=RetrievalMode.SPARSE,
)
query = "What did the president say about Ketanji Brown Jackson"
found_docs = qdrant.similarity_search(query)
混合向量搜索
要使用密集和稀疏向量进行带分数融合的混合搜索:
retrieval_mode
参数应设置为RetrievalMode.HYBRID
。- 需要为
embedding
参数提供一个 密集嵌入 值。 - 需要为
sparse_embedding
参数提供一个使用任何稀疏嵌入提供商实现的 SparseEmbeddings 接口 的值。
from langchain_qdrant import FastEmbedSparse, RetrievalMode
sparse_embeddings = FastEmbedSparse(model_name="Qdrant/bm25")
qdrant = QdrantVectorStore.from_documents(
docs,
embedding=embeddings,
sparse_embedding=sparse_embeddings,
location=":memory:",
collection_name="my_documents",
retrieval_mode=RetrievalMode.HYBRID,
)
query = "What did the president say about Ketanji Brown Jackson"
found_docs = qdrant.similarity_search(query)
请注意,如果您以 HYBRID 模式添加了文档,搜索时可以切换到任何检索模式。因为集合中同时存在密集和稀疏向量。
下一步
如果您想了解更多关于在基于 Langchain 的应用中运行 Qdrant 的信息,请阅读我们的文章 使用 Langchain 和 Qdrant 构建无需样板代码的问答系统。更多信息也可在 Langchain 文档 中找到。