Qdrant 是专为扩展过滤支持而设计的向量相似度搜索引擎和向量数据库,这使得它适用于各种基于神经网络的语义匹配、图像搜索等应用。
Qdrant 使用 Rust 🦀 编写,即使在高负载下也能快速、可靠地工作。
上图展示了 Qdrant 一些主要组件的高级概述。以下是您应该熟悉的术语。
在开始之前,请确保 Docker 已安装并在您的系统上运行。
docker run --privileged -p 6333:6333 qdrant/qdrant
--privileged 是我本地执行时出现Operation not permitted进程创建受限加的,一般不用加
docker run -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage:z \
qdrant/qdrant
在默认配置下,所有数据都将存储在该./qdrant_storage目录中。
Qdrant 现在可以访问:
网页直接访问面板: http://127.0.0.1:6333/collections/dashboard
网页直接访问API:http://127.0.0.1:6333/collections,就可以看到
collections返回当前的所有集合,那就让我们来用python客户端连接,并创建一个集合吧
您将把所有矢量数据存储在 Qdrant 集合中,我们就这样称呼它test_collection吧。该集合将使用点积距离度量来比较向量。
from qdrant_client.http.models import Distance, VectorParams
client.create_collection(
collection_name="test_collection",
vectors_config=VectorParams(size=4, distance=Distance.DOT),
)
size:向量的大小(维度)
distance:距离度量类型
相似性学习模型中最典型的度量是余弦度量。
现在让我们添加一些带有有效负载的向量。有效负载是您想要与向量关联的其他数据:
from qdrant_client.http.models import PointStruct
operation_info = client.upsert(
collection_name="test_collection",
wait=True,
points=[
PointStruct(id=1, vector=[0.05, 0.61, 0.76, 0.74], payload={"city": "Berlin"}),
PointStruct(id=2, vector=[0.19, 0.81, 0.75, 0.11], payload={"city": "London"}),
PointStruct(id=3, vector=[0.36, 0.55, 0.47, 0.94], payload={"city": "Moscow"}),
PointStruct(id=4, vector=[0.18, 0.01, 0.85, 0.80], payload={"city": "New York"}),
PointStruct(id=5, vector=[0.24, 0.18, 0.22, 0.44], payload={"city": "Beijing"}),
PointStruct(id=6, vector=[0.35, 0.08, 0.11, 0.44], payload={"city": "Mumbai"}),
],
)
print(operation_info)
执行结果:
operation_id=0 status=<UpdateStatus.COMPLETED: 'completed'>
让我们问一个基本问题 - 我们存储的哪个向量与查询向量最相似[0.2, 0.1, 0.9, 0.7]?
search_result = client.search(
collection_name="test_collection", query_vector=[0.2, 0.1, 0.9, 0.7], limit=3
# , with_vectors=True, with_payload=True
)
print(search_result)
执行结果:
ScoredPoint(id=4, version=0, score=1.362, payload={"city": "New York"}, vector=None),
ScoredPoint(id=1, version=0, score=1.273, payload={"city": "Berlin"}, vector=None),
ScoredPoint(id=3, version=0, score=1.208, payload={"city": "Moscow"}, vector=None)
结果以相似度递减的顺序返回。请注意,默认情况下,这些结果中缺少有效负载和矢量数据。有关如何启用它的信息,请参阅结果中的有效负载和向量。
执行结果:
[
ScoredPoint(id=4, version=0, score=1.362, payload={'city': 'New York'}, vector=[0.18, 0.01, 0.85, 0.8]),
ScoredPoint(id=6, version=0, score=1.28, payload={'city': 'Berlin'}, vector=[0.05, 0.61, 0.76, 0.75]),
ScoredPoint(id=1, version=0, score=1.273, payload={'city': 'Berlin'}, vector=[0.05, 0.61, 0.76, 0.74])
]
思考:上面的举例模式类似现实生活中什么场景呢???
我们可以通过按有效负载过滤来进一步缩小结果范围。让我们查找包含“London”的最接近的结果。
from qdrant_client.http.models import Filter, FieldCondition, MatchValue
search_result = client.search(
collection_name="test_collection",
query_vector=[0.2, 0.1, 0.9, 0.7],
query_filter=Filter(
must=[FieldCondition(key="city", match=MatchValue(value="London"))]
),
with_payload=True,
limit=3,
)
print(search_result)
执行结果:
ScoredPoint(id=2, version=0, score=0.871, payload={"city": "London"}, vector=None)
您刚刚进行了矢量搜索。您将向量加载到数据库中并使用您自己的向量查询数据库。Qdrant 找到最接近的结果并向您提供相似度分数。
client.search()参数说明:
search方法返回一个包含 types.ScoredPoint 对象的列表,每个对象表示一个得分较高的向量点。
我们可以根据需要使用这些参数来执行 Qdrant 的搜索操作,并根据返回结果进行进一步处理。
def test_delete(self):
self.client.delete(
collection_name="test_collection",
points_selector=models.PointIdsList(
points=[6],
),
)
删除指定过滤器下的向量
def test_delete_filter(self):
self.client.delete(
collection_name="test_collection",
points_selector=models.FilterSelector(
filter=models.Filter(
must=[
models.FieldCondition(
key="city",
match=models.MatchValue(value="New York"),
),
],
)
),
)
问题:上面入参的都是用vector=[0.05, 0.61, 0.76, 0.74]这种向量,那和我的业务数据怎么关联呢???