Want to Become a Sponsor? Contact Us Now!🎉

langchain-tutorials
使用LangChain和Qdrant进行高级向量搜索

使用LangChain和Qdrant进行高级向量搜索

Published on

介绍Qdrant:LangChain的向量相似性搜索引擎

在语言建模和基于文本的应用领域中,高效地搜索和检索相似向量的能力至关重要。无论是查找相关文档、匹配用户查询还是执行基于语义的匹配,拥有一个功能强大且方便的向量相似性搜索引擎可以极大增强应用的能力。这就是Qdrant的用途。

Qdrant是一个向量相似性搜索引擎,提供了生产就绪的服务和方便的API,用于存储、搜索和管理带有附加负载的向量。它旨在高效处理大规模向量搜索,并提供丰富的过滤功能,以满足高级匹配需求。Qdrant特别适用于需要神经网络或基于语义的匹配、分面搜索等应用。

文章摘要

  • Qdrant是一个向量相似性搜索引擎,提供了生产就绪的服务和方便的API,用于存储、搜索和管理带有附加负载的向量。
  • 它提供了丰富的过滤功能,适用于需要高级匹配的应用。
  • Qdrant可以作为LangChain中的检索器,用于余弦相似性搜索或最大边缘相关(MMR)搜索。
<AdComponent />

安装Qdrant客户端并设置OpenAI API密钥

要在LangChain中使用Qdrant,第一步是安装“qdrant-client”包,该包提供了与Qdrant交互所需的客户端库。您可以使用以下命令进行安装:

%pip install --upgrade --quiet qdrant-client

接下来,您需要设置OpenAI API密钥,以便使用OpenAI嵌入进行相似性搜索。您可以使用Python中的“getpass”和“os”模块设置API密钥:

import getpass
import os
 
os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API密钥:")

在LangChain中加载和拆分文档

安装了Qdrant客户端并设置了OpenAI API密钥后,您可以开始在LangChain中加载和拆分文档。为此,您可以使用LangChain社区模块提供的“TextLoader”类来加载您的文档。

from langchain_community.document_loaders import TextLoader
 
loader = TextLoader("/path/to/your/documents.txt")
documents = loader.load()

加载文档后,您可以使用LangChain文本拆分模块提供的“CharacterTextSplitter”类将它们拆分为较小的块。当处理大型文档或希望对文本的特定部分执行搜索时,这将非常有用。

from langchain_text_splitters import CharacterTextSplitter
 
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

在不同模式下连接到Qdrant

一旦加载和拆分了文档,您可以根据部署需求以不同模式连接到Qdrant。Qdrant支持多种部署选项,包括本地模式、本地服务器部署和Qdrant Cloud。

本地模式与内存存储

在本地模式下,您可以在没有服务器的情况下运行Qdrant,并仅在内存中保留数据。这种模式适用于快速实验和测试。要在本地模式下使用带有内存存储的Qdrant,可以使用“Qdrant.from_documents”方法,将“location”参数指定为“:memory:”。

from langchain_community.vectorstores import Qdrant
from langchain_openai import OpenAIEmbeddings
 
embeddings = OpenAIEmbeddings()
 
qdrant = Qdrant.from_documents(docs, embeddings, location=":memory:", collection_name="my_documents")

本地模式与磁盘存储

如果您希望在本地模式下将数据持久化存储到磁盘上,则可以指定存储Qdrant数据的路径。当处理较大的数据集或需要在会话之间保留数据时,这将非常有用。要在本地模式下使用带有磁盘存储的Qdrant,可以使用“Qdrant.from_documents”方法,并指定“path”参数。

qdrant = Qdrant.from_documents(docs, embeddings, path="/tmp/local_qdrant", collection_name="my_documents")

本地服务器部署

对于更大规模的部署,您可以连接到在本地运行的Qdrant实例,使用Docker容器或Kubernetes部署。要在本地服务器部署中连接到Qdrant,您需要指定Qdrant实例的URL,并将“prefer_grpc”参数设置为“True”以获得更好的性能。

url = "<---在此处输入qdrant URL--->"
qdrant = Qdrant.from_documents(docs, embeddings, url=url, prefer_grpc=True, collection_name="my_documents")

Qdrant Cloud

如果您更喜欢完全托管的Qdrant集群,则可以设置一个Qdrant Cloud账户,并使用提供的URL和API密钥连接到集群。这个选项为部署Qdrant提供了可扩展且安全的解决方案。要在Qdrant Cloud中连接到Qdrant,您需要在“Qdrant.from_documents”方法中指定URL和API密钥。

url = "<---在此处输入qdrant云集群URL--->"
api_key = "<---在此处输入API密钥--->"
qdrant = Qdrant.from_documents(docs, embeddings, url=url, prefer_grpc=True, api_key=api_key, collection_name="my_documents")

在下一节中,我们将探讨如何在Qdrant集合上执行相似度搜索,并获取搜索结果的相似度分数。

待续...

langchain Qdrant

在不同模式下连接到Qdrant

Qdrant根据您的需求提供了不同的连接模式。无论您是想在本地运行Qdrant,还是在本地部署或在云上部署该产品,都有适合您需求的选项可用。

使用内存存储的本地模式

在本地模式下,您可以在不需要Qdrant服务器的情况下运行Qdrant。这对于测试和调试目的非常有用,或者当您只需要存储少量向量时。在此模式下,嵌入式完全保留在内存中,并且在客户端被销毁时将丢失。

要在使用内存存储的本地模式下连接到Qdrant,您可以使用以下代码:

from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
 
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
    documents, embeddings, location=":memory:", collection_name="my_collection"
)

使用磁盘存储的本地模式

如果您喜欢在本地模式下将向量持久存储到磁盘上,可以指定向量将存储的路径。这样您就可以在运行之间重用向量,并避免每次都从头开始。

要在使用磁盘存储的本地模式下连接到Qdrant,您可以使用以下代码:

from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
 
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
    documents, embeddings, path="/path/to/storage", collection_name="my_collection"
)

在本地部署服务器

如果选择在本地部署Qdrant,可以使用Docker容器或具有官方Helm图表的Kubernetes部署。您需要提供Qdrant服务的URL。

要在本地部署服务器上连接到Qdrant,您可以使用以下代码:

import qdrant_client
from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
 
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
client = qdrant_client.QdrantClient("<qdrant-url>", api_key="<qdrant-api-key>")
qdrant = Qdrant(client=client, collection_name="my_collection", embeddings=embeddings)

Qdrant Cloud

如果您喜欢使用Qdrant Cloud,可以通过提供适当的URL和API密钥连接到它。

要在Qdrant Cloud中连接到Qdrant,您可以使用以下代码:

from langchain.vectorstores import Qdrant
from langchain.embeddings import HuggingFaceEmbeddings
 
embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
qdrant = Qdrant.from_documents(
    documents, embeddings, url="<qdrant-url>", api_key="<qdrant-api-key>", collection_name="my_collection"
)

通过使用这些不同的连接模式,您可以轻松将Qdrant集成到LangChain应用程序中,并利用其强大的向量相似度搜索功能。

在Qdrant集合上执行相似度搜索

连接到Qdrant集合后,您可以对存储在集合中的向量执行相似度搜索。这使您可以找到与给定查询向量相似的向量。

要执行相似度搜索,您需要提供一个查询向量,并指定要检索的最近邻居的数量。Qdrant将返回最近邻居以及其相似度分数。

以下是使用Qdrant执行相似度搜索的示例:

# 查询向量
query_vector = [0.1, 0.2, 0.3, 0.4, 0.5]
 
# 要检索的最近邻居的数量
k = 5
 
# 执行相似度搜索
results = qdrant.search(query_vector, k)

results 对象将包含最近邻居及其相似度分数。然后,您可以使用这些信息进一步处理和分析结果。

利用Qdrant的丰富过滤能力

Qdrant提供了广泛的过滤能力,可以根据特定条件对搜索结果进行细化筛选。您可以通过指定向量属性或与向量关联的有效载荷属性上的条件来过滤搜索结果。

以下是在LangChain中使用Qdrant的过滤能力的一些示例:

按向量属性过滤

# 根据特定属性值过滤
results = qdrant.search(query_vector, k, filter={"vector_attributes": {"attribute_name": "attribute_value"}})
 
# 根据属性值范围过滤
results = qdrant.search(query_vector, k, filter={"vector_attributes": {"attribute_name": {"gte": 10, "lte": 20}}})

按有效载荷属性过滤

# 根据特定有效载荷属性值过滤
results = qdrant.search(query_vector, k, filter={"payload_attributes": {"attribute_name": "attribute_value"}})
 
# 根据有效载荷属性值范围过滤
results = qdrant.search(query_vector, k, filter={"payload_attributes": {"attribute_name": {"gte": 10, "lte": 20}}})

这些过滤能力使您能够轻松缩小搜索结果范围,并检索满足特定条件的向量。

使用最大边际相似度 (MMR) 搜索检索多样化的结果

除了执行相似度搜索外,Qdrant还提供了使用最大边际相似度 (MMR) 搜索方法检索多样化结果的能力。MMR搜索旨在找到一组既相关又多样的文档,从而更全面地表示搜索空间。 为了执行MMR搜索,您需要提供一个查询向量,要检索的最近邻数目以及一个多样性参数,该参数控制相关性和多样性之间的权衡。

以下是使用Qdrant执行MMR搜索的示例:

# 查询向量
query_vector = [0.1, 0.2, 0.3, 0.4, 0.5]
 
# 要检索的最近邻数目
k = 5
 
# 多样性参数
lambda_param = 0.5
 
# 执行MMR搜索
results = qdrant.mmr_search(query_vector, k, lambda_param)

results对象将包含一组多样性的最近邻居及其相似度分数。通过调整多样性参数,您可以控制搜索结果中相关性和多样性之间的平衡。

在LangChain中将Qdrant用作检索器

Qdrant可以在LangChain中作为检索器使用,用于余弦相似性搜索和MMR搜索。通过将Qdrant集成到您的LangChain应用程序中,您可以利用其强大的向量相似性搜索功能来增强检索性能和准确性。

要将Qdrant用作余弦相似性搜索的检索器,您可以使用以下代码:

from langchain.retrievers import QdrantRetriever
 
retriever = QdrantRetriever(qdrant)
results = retriever.retrieve_cosine(query_vector, k)

要将Qdrant用作MMR搜索的检索器,您可以使用以下代码:

from langchain.retrievers import QdrantRetriever
 
retriever = QdrantRetriever(qdrant)
results = retriever.retrieve_mmr(query_vector, k, lambda_param)

通过在LangChain中使用Qdrant作为检索器,您可以轻松将向量相似性搜索功能融入基于语言模型的应用程序中。

结论

在本文中,我们探讨了如何连接到不同模式的Qdrant,如何在Qdrant collections上执行相似性搜索,如何利用Qdrant的强大过滤功能,如何使用MMR搜索检索多样的结果以及如何将Qdrant用作LangChain的检索器。通过将Qdrant集成到您的LangChain应用程序中,您可以利用其强大的向量相似性搜索引擎来增强检索性能和准确性。

Anakin AI - The Ultimate No-Code AI App Builder