Qdrant向量数据库

Qdrant 是专为扩展过滤支持而设计的向量相似度搜索引擎和向量数据库,这使得它适用于各种基于神经网络语义匹配图像搜索等应用。

Qdrant 使用 Rust 🦀 编写,即使在高负载下也能快速、可靠地工作。

Qdrant架构

上图展示了 Qdrant 一些主要组件的高级概述。以下是您应该熟悉的术语。

  • 集合(Collections):集合是一组命名的点(带有有效负载的向量),您可以在其中进行搜索。同一集合中每个点的向量必须具有相同的维度,并通过单个度量进行比较。命名向量可用于在单个点中包含多个向量,每个向量都可以有自己的维度和度量要求。
  • 距离度量(Distance Metrics):这些用于测量向量之间的相似性,必须在创建集合的同时选择它们。度量的选择取决于向量的获取方式,特别是取决于将用于编码新查询的神经网络。
  • (Points):点是 Qdrant 运行的中心实体,它们由向量和可选的 id 和有效负载组成。
    • id:向量的唯一标识符。
    • 矢量(Vector):数据的高维表示,例如图像、声音、文档、视频等。
    • 有效负载(Payload):有效负载是一个 JSON 对象,其中包含可以添加到向量中的附加数据。
  • 存储(Storage):Qdrant 可以使用两种存储选项之一:内存存储(将所有向量存储在 RAM 中,具有最高速度,因为仅需要持久性才需要磁盘访问)或Memmap存储(创建与磁盘上的文件)。
  • 客户端:可用于连接到 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 现在可以访问:

  • REST API:本地主机:6333
  • 网页用户界面:本地主机:6333/dashboard
  • GRPC API:本地主机:6334

网页直接访问面板: 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:距离度量类型

  • COSINE 余弦相似度(Cosine similarity):余弦相似度是一种常用的向量相似度度量方法,它衡量了两个向量之间的夹角余弦值。在Qdrant中,可以使用COSINE作为距离度量方法来计算余弦相似度。
  • EUCLID 欧氏距离(Euclidean distance):欧氏距离是最常见的距离度量方法,用于计算向量空间中两个向量之间的直线距离。在Qdrant中,可以使用L2作为距离度量方法来计算欧氏距离。
  • 点积(Dot Product):它是一种常见的向量运算。点积是将两个向量的对应元素相乘,并将乘积相加得到的标量值。可以使用点积来计算向量之间的夹角余弦值。夹角余弦值反映了两个向量的方向相似程度。夹角余弦值的取值范围在 -1 到 1 之间。

相似性学习模型中最典型的度量是余弦度量。

添加向量

现在让我们添加一些带有有效负载的向量。有效负载是您想要与向量关联的其他数据:

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()参数说明:

  • collection_name(必需):要搜索的集合名称。
  • query_vector(必需):查询向量。可以是以下类型之一:
    • types.NumpyArray:NumPy 数组表示的向量。
    • Sequence[float]:浮点数列表表示的向量。
    • Tuple[str, List[float]]:带有向量名称的元组。
    • types.NamedVector:命名向量对象。
  • query_filter(可选):过滤器条件。可以使用 types.Filter 类型的对象来指定过滤条件。默认为 None。
  • search_params(可选):搜索参数。可以使用 types.SearchParams 类型的对象来指定搜索参数。默认为 None。
    • ef(可选):查询的有效范围(Efficient Search)。它控制搜索的速度和准确性之间的权衡。较高的值会提高搜索准确性,但会增加搜索时间。
    • ef_search(可选):查询期间的最大搜索次数。它控制搜索的时间和资源消耗。较高的值会增加搜索时间,但可能提高搜索结果的准确性。
  • limit(可选):返回结果的最大数量。默认为 10。
  • offset(可选):结果偏移量,用于分页。默认为 0。
  • with_payload(可选):是否返回结果的负载信息。
    • True:返回搜索结果中的所有载荷数据。
    • False:不返回任何载荷数据。
    • Sequence[str]:指定要返回的特定载荷字段列表。
  • with_vectors(可选):是否返回结果的向量信息。
  • score_threshold(可选):结果的得分阈值。只返回得分高于或等于阈值的结果。默认为 None,表示不应用阈值。
  • append_payload(可选):是否将负载信息追加到搜索结果中。默认为 True。
  • consistency(可选):读一致性选项。可以是 types.ReadConsistency 类型的对象,用于指定读操作的一致性级别。默认为 None。
  • **kwargs:其他可选参数。

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]这种向量,那和我的业务数据怎么关联呢???

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/286070.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【排序】堆排序(C语言实现)

文章目录 前言1. 堆排序1.1 堆排序的思想1.2 堆排序的实现 2. 为什么向下调整而不是向上调整 前言 本章主要会讲堆排序的实现过程以及向上调整和向下调整的时间复杂度&#xff0c;在学习本章前&#xff0c;需要对堆、以及向上调整和向下调整有一个了解&#xff0c;如果不了解的…

【CISSP学习笔记】5. 安全架构和工程

该知识领域涉及如下考点&#xff0c;具体内容分布于如下各个子章节&#xff1a; 使用安全设计原理来研究、实施与管理工程过程理解安全模型的基本概念&#xff08;例如 Biba、Star Model、Bell-LaPadula 等模型&#xff09;基于系统安全要求选择控制措施理解信息系统 (IS) 的安…

Nginx多ip部署多站点

目录 1.修改网卡配置信息 2.修改主要配置文件nginx.conf 1.修改网卡配置信息 1)来到网卡配置文件存放目录下 cd /etc/sysconfig/network-scripts/ 2)对 ifcfg-ens33 文件进行配置修改前先进行备份 cp ifcfg-ens33 ifcfg-ens33.default 3)先修改成最小配置&#xff0c;使用 d…

QT音频编程实战项目(二)

接上一篇 我们在实现完槽函数的定义后&#xff0c;我们应该将这些槽函数和对应的信号连接起来 接着将每个控件都对应转到槽进行实现&#xff1a; 这个是对打开文件呢个控件转到槽的具体操作&#xff1a; 首先通过QDir::homePath()获得用户的主目…

CCNP课程实验-05-Comprehensive_Experiment

目录 实验条件网络拓朴 基础配置实现IGP需求&#xff1a;1. 根据拓扑所示&#xff0c;配置OSPF和EIGRP2. 在R3上增加一个网段&#xff1a;33.33.33.0/24 (用Loopback 1模拟) 宣告进EIGRP&#xff0c;并在R3上将EIGRP重分布进OSPF。要求重分布进OSPF后的路由Tag值设置为666&…

java工作流详解

什么是工作流&#xff1f; 工作流&#xff1a;两个或两个以上的人&#xff0c;为了共同的目标&#xff0c;连续的以串行或并行的方式去完成某一业务。 业务&#xff1a;工作流所指业务涵盖了与经营相关的活动。 串行或并行&#xff1a;业务中的步骤也许以一步接着一步的方式…

YOLOv8改进:IoU系列篇 | Shape-IoU关注边界框本身的形状和尺度来计算损失 | 2023年12月最新IoU改进

🚀🚀🚀本文改进: 提出了一种新颖的Shape-IoU,小目标检测实现涨点,更加关注边界框本身的形状和尺度来计算损失 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.Shape-IoU原理介绍 论文:https://ar…

【ps】如何给人偶添加衣服

使用PS工具扣出人物 使用编辑-变形-操控变型 、

Vue3-27-路由-路径参数的简单使用

什么是路径参数 在路由配置中&#xff0c;可以将【参数】放在【路由路径】中&#xff0c; 从而实现&#xff0c;同一个 路由&#xff0c;同一个组件&#xff0c;因路径参数不同&#xff0c;可以渲染出不同的内容。特点 &#xff1a; 1、当携带不同路径参数的路由相互跳转时&am…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…

二叉搜索树介绍以及实现

二叉树无论是在实际运用还是面试题中&#xff0c;都是一种十分热门的数据结构&#xff0c;而二叉搜索树则是进阶版的二叉树&#xff0c;在map和set中也有应用。 什么是二叉搜索树 二叉搜索树又叫二叉排序树&#xff0c;它可以是一颗空树&#xff0c;又或者是有以下三个特点的…

用简单的方式理解串行主从通信方式(适用于LEU与TCC等外部设备之间的通信)

串行通信方式 数据按位序传送&#xff0c;最少需要两根通道&#xff08;如RS485、CAN总线、以太网&#xff09;。 优点&#xff1a;成本低&#xff0c;适合远距离通信。 缺点&#xff1a;速度慢、效率低。 注&#xff1a;以上特征为相较于并行通信方式。 主从通信方式 以RS4…

skimage图像处理(全)

文章目录 一、简介二、安装三、模块简介&#xff1a;API reference四、项目实战4.1、2D图像处理4.1.1、打印图像属性4.1.2、读取 / 显示 / 保存图像&#xff1a;skimage.io.imread() skimage.io.imshow() skimage.io.imsave()4.1.3、颜色空间转换&#xff1a;skimage.color.r…

轻松搞定软件开发:找对软件开发公司的流程与注意事项!

随着数字化时代的来临&#xff0c;软件开发在企业和个人生活中扮演着越来越重要的角色&#xff0c;然而&#xff0c;如何找到一家合适的软件开发公司却成为了一个令人头疼的问题。 本文将为你详细解读找软件开发公司的流程&#xff0c;以及在选择过程中需要注意的事项&#xf…

十大排序的个人总结之——冒泡排序、插入排序

同样&#xff0c;这两几乎也是被淘汰了的算法&#xff0c;尽管它们是稳定的&#xff0c;但是时间复杂度没人喜欢&#xff0c;了解一下就好&#xff0c;没啥好说的&#xff0c;注意最后一句话就行了 一&#xff0c;冒泡排序 1. 算法步骤 共n-1趟&#xff0c;谁两敢冒泡就换了…

C++ 不能用作全局变量名或给定 C 语言的链接

错误&#xff1a; C 不能用作全局变量名或给定 C 语言的链接 解决方案&#xff1a; 先抽自己两巴掌。 问问自己main函数作为一个函数&#xff0c;后面有没有添加&#xff08;&#xff09;&#xff1f; 如果没有&#xff0c;建议再给自己两巴掌。

解决Golang WriteHeader设置后,Content-Type失效的问题

场景 最近笔者在研究web框架过程中&#xff0c;发现了一个响应类型的问题&#xff0c;困扰许久&#xff0c;原因就是设置了响应状态码后&#xff0c;然后设置响应类型为application/json。在实际请求后&#xff0c;响应类型变成了text/plain; charsetutf-8格式。 问题解决&…

梳理Langchain-Chatchat-UI接口文档

在 Langchain-Chatchat v0.1.17 版本及以前是有前后端分离的 Vue 项目的&#xff0c;但是 v0.2.0 后就没有了。所以本文使用的是 Langchain-Chatchat v0.1.17 版本中的 Vue 项目。经过一番折腾终于将 Langchain-Chatchat v0.1.17 版本前端 Vue 接口和 Langchain-Chatchat v0.2.…

YOLOv8改进 | 注意力篇 | ACmix自注意力与卷积混合模型(提高FPS+检测效率)

一、本文介绍 本文给大家带来的改进机制是ACmix自注意力机制的改进版本&#xff0c;它的核心思想是&#xff0c;传统卷积操作和自注意力模块的大部分计算都可以通过1x1的卷积来实现。ACmix首先使用1x1卷积对输入特征图进行投影&#xff0c;生成一组中间特征&#xff0c;然后根…

vim学习记录

目录 历史记录前言相关资料配置windows互换ESC和Caps Lock按键 基本操作替换字符串 历史记录 2024年1月2日, 搭建好框架,开始学习; 前言 vim使用很久了,但是都是一些基本用法,主要是用于配置Linux,进行一些简单的编写文档和程序.没有进行过大型程序开发,没有达到熟练使用的程…