用户国营 发表于 2024-6-13 22:17:43

为AI而生的数据库:Milvus详解及实战

1 向量数据库

1.1 向量数据库的由来

在当今数字化期间,人工智能AI正敏捷改变着我们的生存和工作方式。从智能助手到自动驾驶汽车,AI正在成为各行各业的创新引擎。然而,这种AI的崛起也带来了一个关键的挑衅:如何有效地处置处罚和分析越来越丰富和复杂的数据。在这个背景下,向量数据库技能应运而生,为AI提供了强盛的加快引擎。
https://img-blog.csdnimg.cn/17fdcb81d64649c5b003a8bd5edf240f.jpeg

   AI期间的数据挑衅:随着AI应用范围的扩大,大量的数据涌入各个行业。图像、文本、音频等多种数据情势都成为了AI的输入。这些数据的特点是多模态、高维、复杂和关联性强。传统的关系型数据库虽然在一些场景中仍旧有用,但在处置处罚这种多模态、高维数据时显得力有未逮。因此,需要一种更适合AI应用需求的数据库技能,这就是向量数据库。

AI的加快引擎:向量数据库是一种专门为存储和检索向量数据而设计的数据库。它的核心思想是将数据映射到向量空间中,从而使得数据的相似性计算、聚类、分类和检索变得更加高效和精确。
向量数据库是专门用来存储和查询向量的数据库,其存储的向量来自于对文本、语音、图像、视频等的向量化。同传统数据库相比,向量数据库不但能够完成根本的CRUD(添加、读取查询、更新、删除)等操作,还能够对向量数据举行更快速的相似性搜刮
1.2 向量数据库对大模型的赋能

向量数据库拓展了大模型的边界,这种拓张包含两个方面,时间边界和空间边界:
   时间边界的扩展:向量数据库能够使得大模型LLM拥有“长期影象”。
如今的大模型(无论是NLP领域的GPT系列还是CV领域的ResNET系列)都是预先训练Pretrain的大模型,有着非常明晰的训练截止日Cut-off Date,这导致这些模型对于训练截止日之后发生的事变一无所知。而随着向量数据库的引入,其内部存储的最新的信息向量能够极大地拓展大模型的应用边界,向量数据库可以使得大模型保持准及时性,提高大模型的实用性,并使得大模型能够动态调整。因此向量数据库使得大模型具有了长期影象。
假设一个预训练的消息摘要模型在2021年底完成了训练,到了2023年,很多消息事件和趋势已经发生了变化。为了使大模型能够处置处罚这些新信息,可以使用向量数据库来存储和查询2023年的消息文章向量。
在保举体系中,预训练的大模型大概无法辨认新用户和新产物的特性,通过向量数据库,可以及时更新用户和产物的特性向量,从而使大模型能够根据最新的信息为用户提供更精准的保举。
此外,向量数据库还可以支持及时监测和分析。例如,在金融领域,预训练的股票预测模型大概无法获取训练截止日期之后的股票价格信息。通过将最新的股票价格向量存储在向量数据库中,大模型可以及时分析和预测将来股票价格走势。还有就是在客服领域,向量数据库将使得大模型可以追溯到对话的开始。
   空间边界的扩展:向量数据库能够帮忙办理如今企业界最担心的大模型泄露隐私的标题。
用户给出的Prompt大概会包含一些敏感信息。根据媒体报道,员工A用ChatGPT帮自己查一段代码的bug,而这段源代码与半导体设备丈量数据有关;员工B想用ChatGPT帮自己优化一段代码,就直接将与产量和良品率记录设备相关的一段代码输入了其中。
这些行为直接导致了三星关键数据的泄露,而ChatGPT本身其实也出现过隐私泄露事件,使得有一小部分的对话汗青/支付数据会被其他用户查看,这些数据都极为敏感,而通过本地部署,向量数据库能够在很大程度上办理这个标题。
向量数据库本地部署后可以存储企业有关的大量隐私数据,在本地部署或者专有云部署大模型后,通过特殊的Agent大模型可以在有保护的环境下访问向量数据库的隐私数据,进而可以在不向外网袒露公司的隐私的环境下,使得公司的业务得到大模型的助力。
1.3 向量数据库实现多模态搜刮

向量数据库自带多模态功能,这意味着它能够通过机器学习方法处置处罚和理解来自不同源的多种模态信息,如文本、图像、音频和视频等,数据向量化过程使得这些不同模态数据的内部隐蔽信息得以袒露,进而为多模态应用提供支持。
https://img-blog.csdnimg.cn/4acf4b1dd3294a74b3a2d6ddc579fb33.webp
 一个典型的应用场景是多语言搜刮,向量数据库支持跨语言的信息检索,用户可以使用英语、法语、中文等多种语言搜刮图书库,而无需事先对书名举行多语言翻译处置处罚。这得益于向量表示能够捕捉到语义相似性,使得来自不同语言的查询和内容能够相互匹配。
1.4 向量数据排名

https://img-blog.csdnimg.cn/036e07fd3d2545d08946441767a428bb.jpeg

2 Milvus数据库介绍

2.1 Milvus概述

Milvus 是一款云原生向量数据库,它具备高可用、高性能、易拓展的特点,用于海量向量数据的及时召回。
Milvus官网地址:Milvus
Milvus 基于FAISS、Annoy、HNSW 等向量搜刮库构建,核心是办理稠密向量相似度检索的标题。在向量检索库的基础上,Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量混淆查询、time travel 等功能,同时大幅优化了向量检索的性能,可满意任何向量检索场景的应用需求。通常,发起用户使用 Kubernetes 部署 Milvus,以获得最佳可用性和弹性。
Milvus 接纳共享存储架构,​存储计算完全分离​,计算节点支持横向扩展。从架构上来看,Milvus 遵循数据流和控制流分离,团体分为了四个条理,分别为接入层(access layer)、和谐服务(coordinator service)、实行节点(worker node)和存储层(storage)。各个条理相互独立,独立扩展和容灾。
https://img-blog.csdnimg.cn/dce4c6511d7949d79b34c470a95d8083.jpeg
Milvus 向量数据库能够帮助用户轻松应对海量非结构化数据(图片/视频/语音/文本)检索。单节点 Milvus 可以在秒内完成十亿级的向量搜刮,分布式架构亦能满意用户的水平扩展需求。
https://img-blog.csdnimg.cn/21df8334dd1e479b9f04b65d3eb15cd6.webp
milvus特点总结如下:


[*]高性能:性能高超,可对海量数据集举行向量相似度检索。
[*]高可用、高可靠:Milvus 支持在云上扩展,其容灾本领能够保证服务高可用。
[*]混淆查询:Milvus 支持在向量相似度检索过程中举行标量字段过滤,实现混淆查询。
[*]开发者友好:支持多语言、多工具的 Milvus 生态体系。
2.2 Milvus关键概念

非结构化数据:非结构化数据指的是数据结构不规则,没有同一的预界说数据模型,不方便用数据库二维逻辑表来表现的数据。非结构化数据包括图片、视频、音频、自然语言等,占所有数据总量的 80%。非结构化数据的处置处罚可以通过各种人工智能(AI)或机器学习(ML)模型转化为向量数据后举行处置处罚。
特性向量:向量又称为embedding vector,是指由 embedding 技能从离散变量(如图片、视频、音频、自然语言等各种非结构化数据)转变而来的连续向量。在数学表示上,向量是一个由浮点数或者二值型数据组成的 n 维数组。
通过现代的向量转化技能,比如各种人工智能(AI)或者机器学习(ML)模型,可以将非结构化数据抽象为 n 维特性向量空间的向量。这样就可以接纳近来邻算法(ANN)计算非结构化数据之间的相似度。
向量相似度检索:相似度检索是指将目标对象与数据库中数据举行比对,并召回最相似的结果。同理,向量相似度检索返回的是最相似的向量数据。近似近来邻搜刮(ANN)算法能够计算向量之间的距离,从而提拔向量相似度检索的速率。假如两条向量十分相似,这就意味着他们所代表的源数据也十分相似。
Collection-聚集:包含一组entity,可以等价于关系型数据库体系(RDBMS)中的表。
Entity-实体:包含一组 field。field 与现实对象相对应。field 可以是代表对象属性的结构化数据,也可以是代表对象特性的向量。primary key 是用于指代一个 entity 的唯一值。注意:你可以自界说primary key,否则 Milvus 将会自动天生primary key。如今Milvus 不支持primary key去重,因此有大概在一个collection内出现primary key类似的entity。
Field-字段:Entity 的组成部分。Field可以是结构化数据,例如数字和字符串,也可以是向量。注意:Milvus2.0现已支持标量字段过滤。而且,Milvus 2.0在一个聚会合只支持一个主键字段。
Milvus与关系型数据库的对应关系如下:
https://img-blog.csdnimg.cn/img_convert/abbb810a82fa10a8e94c2d9f703a001a.webp?x-oss-process=image/format,png
Partition-分区:分区是聚集(Collection)的一个分区。Milvus 支持将网络数据划分为物理存储上的多个部分。这个过程称为分区,每个分区可以包含多个段。
Segment-段:Milvus 在数据插入时,通过归并数据自动创建的数据文件。一个collection可以包含多个segment。一个segment可以包含多个entity。在搜刮中,Milvus会搜刮每个segment,并返回归并后的结果。
Sharding-分片:Shard是指将数据写入操作分散到不同节点上,使 Milvus 能充实使用集群的并行计算本领举行写入。默认环境下,单个Collection包含 2 个分片(Shard)。如今 Milvus 接纳基于主键哈希的分片方式,将来将支持随机分片、自界说分片等更加机动的分片方式。注意: 分区的意义在于通过划定分区淘汰数据读取,而分片的意义在于多台机器上并行写入操作。
索引:索引基于原始数据构建,可以提高对 collection 数据搜刮的速率。Milvus 支持多种索引类型。为提高查询性能,你可以为每个向量字段指定一种索引类型。如今,一个向量字段仅支持一种索引类型。切换索引类型时,Milvus 自动删除之前的索引。相似性搜刮引擎的工作原理是将输入的对象与数据库中的对象举行比较,找出与输入最相似的对象。索引是有效组织数据的过程,极大地加快了对大型数据集的查询,在相似性搜刮的实现中起着重要作用。对一个大规模向量数据集创建索引后,查询可以被路由到最有大概包含与输入查询相似的向量的集群或数据子集。在实践中,这意味着要捐躯肯定程度的准确性来加快对真正的大规模向量数据集的查询。
PChannel:PChannel 表示物理通道。每个 PChannel 对应一个日记存储主题。默认环境下,将分配一组 256 个 PChannels 来存储记录 Milvus 集群启动时数据插入、删除和更新的日记。
VChannel:VChannel 表示逻辑通道(虚拟通道)。每个聚集将分配一组 VChannels,用于记录数据的插入、删除和更新。VChannels 在逻辑上是分开的,但在物理上共享资源。
Binlog:binlog 是一个二进制日记,或者是一个更小的段单元,记录和处置处罚 Milvus 向量数据库中数据的更新和更改。 一个段的数据保存在多个二进制日记中。 Milvus 中的 binlog 分为三种:InsertBinlog、DeleteBinlog 和 DDLBinlog。
日记署理(Log broker):日记署理是一个支持回放的发布订阅体系。它负责流数据持久化、可靠异步查询的实行、事件通知和查询结果的返回。当工作节点从体系崩溃中恢复时,它还确保增量数据的完备性。
日记订阅者:日记订阅方通过订阅日记序列来更新本地数据,并以只读副本的情势提供服务。
日记序列(Log sequence):日记序列记录了在 Milvus 中更改聚集状态的所有操作。
正则化:正则化是指转换嵌入(向量)以使其范数便是1的过程。 假如使用内积 (IP) 来计算embeddings相似度,则必须对所有embeddings举行正则化。 正则化后,内积便是余弦相似度。
2.2 Milvus架构

https://img-blog.csdnimg.cn/17ce5c3a291f4a1baf2d664947bd035c.jpeg
 Milvus文档地址:Milvus doc
整个体系分为四个条理:


[*]接入层(Access Layer):体系的门面,由一组无状态 proxy 组成。对外提供用户连接的 endpoint,负责验证客户端哀求并归并返回结果。
[*]和谐服务(Coordinator Service):体系的大脑,负责分配任务给实行节点。和谐服务共有四种角色,分别为 root coord、data coord、query coord 和 index coord。
[*]实行节点(Worker Node):体系的四肢,负责完成和谐服务下发的指令和 proxy 发起的数据操作语言(DML)命令。实行节点分为三种角色,分别为 data node、query node 和 index node。
[*]存储服务 (Storage): 体系的骨骼,负责 Milvus 数据的持久化,分为元数据存储(meta store)、消息存储(log broker)和对象存储(object storage)三个部分。
各个条理相互独立,独立扩展和容灾。
2.2.1 接入层

接入层由一组无状态 proxy 组成,是整个体系的门面,对外提供用户连接的 endpoint。接入层负责验证客户端哀求并淘汰返回结果。


[*]Proxy 本身是无状态的,一般通过负载平衡组件(Nginx、Kubernetes Ingress、NodePort、LVS)对外提供同一的访问地址并提供服务。
[*]由于 Milvus 接纳大规模并行处置处罚(MPP)架构,proxy 会先对实行节点返回的中间结果举行全局聚合和后处置处罚后,再返回至客户端。
2.2.2 和谐服务

和谐服务是体系的大脑,负责向实行节点分配任务。它承担的任务包括集群拓扑节点管理、负载平衡、时间戳天生、数据声明和数据管理等。
和谐服务共有四种角色:


[*]Root coordinator(root coord):负责处置处罚数据界说语言(DDL)和数据控制语言(DCL)哀求。比如,创建或删除 collection、partition、index 等,同时负责维护中心授时服务 TSO 和时间窗口的推进。
[*]Query coordinator (query coord):负责管理 query node 的拓扑结构和负载平衡以及从 growing segment 移交切换到 sealed segment。Query node 中的 segment 只存在两种状态:growing 和 sealed,分别对应增量数据和汗青数据。
[*]Data coordinator (data coord):负责管理 data node 的拓扑结构,维护数据的元信息以及触发 flush、compact 等背景数据操作。
[*]Index coordinator (index coord):负责管理 index node 的拓扑结构,构建索引和维护索引元信息。
2.2.3 实行节点

实行节点是体系的四肢,负责完成和谐服务下发的指令和 proxy 发起的数据操作语言(DML)命令。由于采取了存储计算分离,实行节点是无状态的,可以配合 Kubernetes 快速实现扩缩容和故障恢复。
实行节点分为三种角色:


[*]Query node: Query node 通过订阅消息存储(log broker)获取增量日记数据并转化为 growing segment,基于对象存储加载汗青数据,提供标量+向量的混淆查询和搜刮功能。
[*]Data node: Data node 通过订阅消息存储获取增量日记数据,处置处罚更改哀求,并将日记数据打包存储在对象存储上实现日记快照持久化。
[*]Index node: Index node 负责实行索引构建任务。Index node不需要常驻于内存,可以通过 serverless 的模式实现。
2.3.4 存储服务

存储服务是体系的骨骼,负责 Milvus 数据的持久化,分为元数据存储(meta store)、消息存储(log broker)和对象存储(object storage)三个部分。
元数据存储:负责存储元信息的快照,比如:聚集 schema 信息、节点状态信息、消息消费的 checkpoint 等。元信息存储需要极高的可用性、强一致和事件支持,因此,etcd 是这个场景下的不二选择。除此之外,etcd 还承担了服务注册和健康检查的职责。
对象存储:负责存储日记的快照文件、标量/向量索引文件以及查询的中间处置处罚结果。Milvus 接纳 MinIO 作为对象存储,别的也支持部署于 AWS S3 和Azure Blob 这两大最广泛使用的低本钱存储。但是,由于对象存储访问延迟较高,且需要按照查询计费,因此 Milvus 将来计划支持基于内存或 SSD 的缓存池,通过冷热分离的方式提拔性能以低落本钱。
消息存储:消息存储是一套支持回放的发布订阅体系,用于持久化流式写入的数据,以及可靠的异步实行查询、事件通知和结果返回。实行节点宕机恢复时,通过回放消息存储保证增量数据的完备性。
如今,分布式版Milvus依靠 Pulsar 作为消息存储,单机版Milvus依靠 RocksDB 作为消息存储。消息存储也可以替换为 Kafka、Pravega 等流式存储。
整个 Milvus 围绕日记为核心来设计,遵循日记即数据的准则,因此在 2.0 版本中没有维护物理上的表,而是通过日记持久化和日记快照来保证数据的可靠性。
https://img-blog.csdnimg.cn/a53490b9f0074b65bfd4e1bd05d261ae.png
日记体系作为体系的主干,承担了数据持久化息争耦的作用。通过日记的发布订阅机制,Milvus 将体系的读、写组件解耦。一个极致简化的模型如上图所示,整个体系主要由两个角色构成,分别是消息存储(log broker)(负责维护”日记序列“)与“日记订阅者”。其中的“日记序列”记录了所有改变库表状态的操作,“日记订阅者”通过订阅日记序列更新本地数据,以只读副本的方式提供服务。 发布订阅机制还为体系在变动数据捕捉(CDC)和全面的分布式部署方面的可扩展性提供了空间。
2.3 milvus主要组件

Milvus 支持两种部署模式,单机模式(standalone)和分布式模式(cluster)。两种模式具备完全类似的本领,用户可以根据数据规模、访问量等因素选择适合自己的模式。Standalone 模式部署的 Milvus 暂时不支持在线升级为 cluster 模式。
2.3.1 单机版 Milvus

单机版 Milvus包括三个组件:


[*]Milvus 负责提供体系的核心功能。
[*]etcd 是元数据引擎,用于管理 Milvus 内部组件的元数据访问和存储,例如:proxy、index node 等。
[*]MinIO 是存储引擎,负责维护 Milvus 的数据持久化。
https://img-blog.csdnimg.cn/59da6d53b20e4808941114a61af5f1e8.jpeg
 
2.3.2 分布式版 Milvus

分布式版 Milvus 由八个微服务组件和三个第三方依靠组成,每个微服务组件可使用 Kubernetes 独立部署。
微服务组件


[*]Root coord
[*]Proxy
[*]Query coord
[*]Query node
[*]Index coord
[*]Index node
[*]Data coord
[*]Data node
第三方依靠


[*]etcd 负责存储集群中各组件的元数据信息。
[*]MinIO 负责处置处罚集群中大型文件的数据持久化,如索引文件和全二进制日记文件。
[*]Pulsar 负责管理近期更改操作的日记,输出流式日记及提供日记订阅服务。
https://img-blog.csdnimg.cn/5b9d07ca3caf440bb1571c432a338892.jpeg


 
 2.4 Milvus应用场景

使用Milvus向量数据库,可以快速搭建符合自己场景需求的向量相似度检索体系。Milvus 的使用场景如下所示:


[*]图片检索体系:以图搜图,从海量数据库中即时返回与上传图片最相似的图片。
[*]视频检索体系:将视频关键帧转化为向量并插入 Milvus,便可检索相似视频,或举行及时视频保举。
[*]音频检索体系:快速检索海量演讲、音乐、音效等音频数据,并返回相似音频。
[*]分子式检索体系:超高速检索相似化学分子结构、超结构、子结构。
[*]保举体系:根据用户行为及需求保举相关信息或商品。
[*]智能问答机器人:交互式智能问答机器人可自动为用户答疑解惑。
[*]DNA序列分类体系:通过对比相似 DNA 序列,仅需几毫秒便可精确对基因举行分类。
[*]文本搜刮引擎:帮助用户从文本数据库中通过关键词搜刮所需信息。
3 Milvus部署及使用

3.1 Milvus安装

wget https://github.com/milvus-io/milvus/releases/download/v2.2.13/milvus-standalone-docker-compose.yml -O docker-compose.yml

sudo docker-compose up -d

sudo docker-compose ps 通过命令查看显示信息如下:
      Name                     Command                  State                            Ports
--------------------------------------------------------------------------------------------------------------------
milvus-etcd         etcd -advertise-client-url ...   Up             2379/tcp, 2380/tcp
milvus-minio      /usr/bin/docker-entrypoint ...   Up (healthy)   9000/tcp
milvus-standalone   /tini -- milvus run standalone   Up             0.0.0.0:19530->19530/tcp, 0.0.0.0:9091->9091/tcp  验证连接:
docker port milvus-standalone 19530/tcp 停止Milvus
sudo docker-compose down 停止后删除数据
sudo rm -rfvolumes 3.2 Milvus可视化工具Attu

Attu地址:Attu
Milvus与Attu对应关系:
Milvus VersionRecommended Attu Image Versionv2.0.xv2.0.5v2.1.xv2.1.5v2.2.xv2.2.6 实行命令:
docker run -p 8000:3000-e MILVUS_URL={your machine IP}:19530 zilliz/attu:v2.2.6 启动docker后,在浏览器中访问“http://{your machine IP}:8000”,点击“Connect”进入Attu服务。连接方式用户名和密码。 
https://img-blog.csdnimg.cn/51a4ced5d9e849dca9668c60d5ec6ff0.png
 连接connect后,显示如下:https://img-blog.csdnimg.cn/67af7031f25e47aa95f92e3cee049244.png
 
3.3 通过python使用Milvus

安装pymilvus
pip install pymilvus==2.2.15
3.2.1 创建数据库

from pymilvus import connections, db

conn = connections.connect(host="192.168.1.156", port=19530)
database = db.create_database("sample_db") 切换和显示db
db.using_database("sample_db")
db.list_database() 3.2.2 创建collection

from pymilvus import CollectionSchema, FieldSchema, DataType
from pymilvus import Collection, db, connections

conn = connections.connect(host="192.168.1.156", port=19530)
db.using_database("sample_db")

m_id = FieldSchema(name="m_id", dtype=DataType.INT64, is_primary=True,)
embeding = FieldSchema(name="embeding", dtype=DataType.FLOAT_VECTOR, dim=768,)
count = FieldSchema(name="count", dtype=DataType.INT64,)
desc = FieldSchema(name="desc", dtype=DataType.VARCHAR, max_length=256,)
schema = CollectionSchema(
fields=,
description="Test embeding search",
enable_dynamic_field=True
)

collection_name = "word_vector"
collection = Collection(name=collection_name, schema=schema, using='default', shards_num=2) 通过Attu查看创建结果:
https://img-blog.csdnimg.cn/680edd62a31d4cd78d4c1611980840e2.png
https://img-blog.csdnimg.cn/dff8ebd232054454a4ef2f159e2ed5b1.png
3.2.3 创建索引

from pymilvus import Collection, utility, connections, db

conn = connections.connect(host="192.168.1.156", port=19530)
db.using_database("sample_db")

index_params = {
"metric_type": "IP",
"index_type": "IVF_FLAT",
"params": {"nlist": 1024}
}

collection = Collection("word_vector")
collection.create_index(
field_name="embeding",
index_params=index_params
)

utility.index_building_progress("word_vector")  通过Attu查看结果:
https://img-blog.csdnimg.cn/2ad44e9cbde247199ee315476bc5a74d.png
 索引方式:
https://img-blog.csdnimg.cn/c8a1926557cb4b159de35ce9fa017546.png


[*] FLAT:准确率高, 适合数据量小,暴力求解相似。
[*] IVF-FLAT:量化操作, 准确率和速率的平衡
[*] IVF: inverted file 先对空间的点举行聚类,查询时先比较聚类中心距离,再找到近来的N个点。
[*] IVF-SQ8:量化操作,disk cpu GPU 友好
[*] SQ8:对向量做标量量化,浮点数表示转为int型表示,4字节->1字节。
[*] IVF-PQ:快速,但是准确率低落,把向量切分成m段,对每段举行聚类;查询时,查询向量分端后与聚类中心计算距离,各段相加后即为最终距离。使用对称距离(聚类中心之前的距离)不需要计算直接查表,但是误差回更大一些。
[*]HNSW:基于图的索引,高效搜刮场景,构建多层的NSW。
[*]ANNOY:基于树的索引,高召回率
3.2.4 插入数据

from pymilvus import Collection, db, connections
import numpy as np

conn = connections.connect(host="192.168.1.156", port=19530)
db.using_database("sample_db")
coll_name = 'word_vector'

mids, embedings, counts, descs = [], [], [], []
data_num = 100
for idx in range(0, data_num):
    mids.append(idx)
    embedings.append(np.random.normal(0, 0.1, 768).tolist())
    descs.append(f'random num {idx}')
    counts.append(idx)

collection = Collection(coll_name)
mr = collection.insert()
print(mr) 运行结果:
(insert count: 100, delete count: 0, upsert count: 0, timestamp: 443639998144839682, success count: 100, err count: 0)
通过Attu查看:
https://img-blog.csdnimg.cn/79397852bc0d4d58acef6e195a38ff1d.png
3.2.5 检索数据

from pymilvus import Collection, db, connections
import numpy as np

conn = connections.connect(host="192.168.1.156", port=19530)
db.using_database("sample_db")
coll_name = 'word_vector'

search_params = {
    "metric_type": 'IP',
    "offset": 0,
    "ignore_growing": False,
    "params": {"nprobe": 16}
}

collection = Collection(coll_name)
collection.load()

results = collection.search(
    data=,
    anns_field="embeding",
    param=search_params,
    limit=16,
    expr=None,
    # output_fields=['m_id', 'embeding', 'desc', 'count'],
    output_fields=['m_id', 'desc', 'count'],
    consistency_level="Strong"
)
collection.release()
print(results.ids)
print(results.distances)
hit = results
print(hit.entity.get('desc'))
print(results)

运行结果如下:


random num 0
['["id: 0, distance: 0.7047597169876099, entity: {\'m_id\': 0, \'desc\': \'random num 0\', \'count\': 0}", "id: 93, distance: 0.5948767066001892, entity: {\'m_id\': 93, \'desc\': \'random num 93\', \'count\': 93}", "id: 77, distance: 0.54373699426651, entity: {\'m_id\': 77, \'desc\': \'random num 77\', \'count\': 77}", "id: 61, distance: 0.5294350981712341, entity: {\'m_id\': 61, \'desc\': \'random num 61\', \'count\': 61}", "id: 64, distance: 0.5216281414031982, entity: {\'m_id\': 64, \'desc\': \'random num 64\', \'count\': 64}", "id: 79, distance: 0.5035749673843384, entity: {\'m_id\': 79, \'desc\': \'random num 79\', \'count\': 79}", "id: 22, distance: 0.41662347316741943, entity: {\'m_id\': 22, \'desc\': \'random num 22\', \'count\': 22}", "id: 43, distance: 0.4026581346988678, entity: {\'m_id\': 43, \'desc\': \'random num 43\', \'count\': 43}", "id: 25, distance: 0.40143388509750366, entity: {\'m_id\': 25, \'desc\': \'random num 25\', \'count\': 25}", "id: 35, distance: 0.3841533362865448, entity: {\'m_id\': 35, \'desc\': \'random num 35\', \'count\': 35}"]']
3.2.6 删除数据

from pymilvus import Collection, db, connections

conn = connections.connect(host="192.168.1.156", port=19530)
db.using_database("sample_db")
coll_name = 'word_vector'

collection = Collection(coll_name)

ids =
temp_str = ', '.join(ids)
query_expr = f'm_id in [{temp_str}]'
result = collection.delete(query_expr)

print(result) 运行结果显示:
(insert count: 0, delete count: 10, upsert count: 0, timestamp: 443640854673883146, success count: 0, err count: 0)
为了检索提供性能,Milvus 中引入 bitset,当调用删除数据时,Milvus对数据举行软删除。软删除的向量仍旧存在于数据库中,但在向量相似性搜刮或查询期间不会被计算。位会合的每个位对应于一个索引向量。假如一个向量在位会合被标志为 1,则意味着该向量被软删除,而且在向量搜刮期间不会涉及该向量。 
4 总结

向量数据库技能是为AI而生的创新,它充实发挥了向量表示的优势,为多模态、高维、复杂数据的存储、检索和分析提供了高效办理方案。随着AI应用的不绝发展,向量数据库将成为推动AI加快创新的重要工具之一,为各行各业带来更高效、智能的办理方案。无疑,在这个AI驱动的期间,向量数据库必将继续发挥其重要作用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 为AI而生的数据库:Milvus详解及实战