大模型工程师学习日记(十):基于 LangChain 构建向量存储和查询 Qdrant
Qdrant介绍
Qdrant(读作:quadrant /'kwɑdrənt/ n. 象限;象限仪;四分之一圆)是一个向量相似度搜索引擎。它提供了一个生产就绪的服务,具有方便的 API 来存储、搜索和管理点 - 带有附加载荷的向量。Qdrant
专门支持扩展过滤功能,使其对各种神经网络或基于语义的匹配、分面搜索和其他应用非常有用。
官方文档:Home - Qdrant
以下展示了如何使用与Qdrant
向量数据库相关的功能。
有各种运行Qdrant
的模式,取决于所选择的模式,会有一些细微的差异。选项包括:
- 本地模式,无需服务器
- Qdrant 云
请参阅安装说明。
%pip install --upgrade --quiet langchain-qdrant langchain-openai langchain
#示例:qdrant_local.py
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_qdrant import Qdrant
from langchain_text_splitters import CharacterTextSplitter
loader = TextLoader("../../resource/knowledge.txt", encoding="UTF-8")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1500, chunk_overlap=0)
docs = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
本地模式
Python 客户端允许您在本地模式下运行相同的代码,而无需运行 Qdrant 服务器。这对于测试和调试或者如果您计划仅存储少量向量非常有用。嵌入可能完全保存在内存中或者持久化在磁盘上。
内存中
对于一些测试场景和快速实验,您可能更喜欢仅将所有数据保存在内存中,因此当客户端被销毁时数据会丢失 - 通常在脚本/笔记本的末尾。
#示例:qdrant_local.py
qdrant = Qdrant.from_documents(
docs,
embeddings,
location=":memory:", # 本地模式,仅内存存储
collection_name="my_documents",
)
磁盘存储
在不使用 Qdrant 服务器的本地模式下,还可以将您的向量存储在磁盘上,以便它们在运行之间持久化。
#示例:qdrant_disk.py
qdrant = Qdrant.from_documents(
docs,
embeddings,
path="/tmp/local_qdrant",
collection_name="my_documents",
)
相似度搜索
使用 Qdrant 向量存储的最简单场景是执行相似度搜索。在幕后,我们的查询将使用embedding_function
对查询进行编码,并用于在 Qdrant 集合中查找相似的文档。
query = "Pixar公司是做什么的?"
found_docs = qdrant.similarity_search(query)
print(found_docs[0].page_content)
结果输出
During the next five years, I started a company named NeXT, another company named Pixar, and fell in love with an amazing woman who would become my wife. Pixar went on to create the worlds first computer animated feature film, Toy Story, and is now the most successful animation studio in the world. In a remarkable turn of events, Apple bought NeXT, I retuned to Apple, and the technology we developed at NeXT is at the heart of Apple's current renaissance. And Laurene and I have a wonderful family together.
在接下来的五年里, 我创立了一个名叫 NeXT 的公司,还有一个叫Pixar的公司,然后和一个后来成为我妻子的优雅女人相识。Pixar 制作了世界上第一个用电脑制作的动画电影——“”玩具总动员”,Pixar 现在也是世界上最成功的电脑制作工作室。在后来的一系列运转中,Apple 收购了NeXT,然后我又回到了苹果公司。我们在NeXT 发展的技术在 Apple 的复兴之中发挥了关键的作用。我还和 Laurence 一起建立了一个幸福的家庭。
Qdrant 云
如果您不想忙于管理基础设施,可以选择在 Qdrant 云上设置一个完全托管的 Qdrant 集群。包括一个永久免费的 1GB 集群供试用。使用托管版本与使用 Qdrant 的主要区别在于,您需要提供 API 密钥以防止公开访问您的部署。该值也可以设置在 QDRANT_API_KEY
环境变量中。
url = "<---qdrant cloud cluster url here --->"
api_key = "<---api key here--->"
qdrant = Qdrant.from_documents(
docs,
embeddings,
url=url,
prefer_grpc=True,
api_key=api_key,
collection_name="my_documents",
)