Langchain

Langchain 是一个使开发基于大型语言模型(LLM)的应用程序变得更容易的库。它统一了不同库的接口,包括主要的嵌入提供商和 Qdrant。使用 Langchain,您可以专注于业务价值,而不是编写样板代码。

Langchain 将 Qdrant 集成作为合作伙伴包分发。

它可以通过 pip 安装

pip install langchain-qdrant

该集成支持使用稠密/稀疏和混合检索来搜索相关文档。

Qdrant 作为一个向量索引,可以存储嵌入以及用于生成它们的文档。有多种使用方式,但调用 QdrantVectorStore.from_textsQdrantVectorStore.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 服务器。这对于测试和调试,或者如果您计划只存储少量向量,都非常有用。嵌入可以完全保存在内存中或持久化到磁盘上。

内存中

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

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
  • 需要提供一个使用任何稀疏嵌入提供商的 SparseEmbeddings 接口实现作为 sparse_embedding 参数的值。

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 参数提供一个 稠密嵌入值。
  • 需要提供一个使用任何稀疏嵌入提供商的 SparseEmbeddings 接口实现作为 sparse_embedding 参数的值。
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 文档中找到更多信息。

此页面有用吗?

感谢您的反馈!🙏

很抱歉听到这个消息。😔 您可以在 GitHub 上编辑此页面,或创建一个 GitHub issue。