本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。
原文链接:小白学 RAG:Milvus 介绍与使用教程
什么是Milvus?
Milvus 是一款高性能、高扩展性的开源向量数据库,专为处理海量向量数据的实时召回而设计。它基于 FAISS、Annoy、HNSW 等向量搜索库构建,核心功能是解决稠密向量相似度检索的问题。Milvus 不仅支持基本的向量检索,还提供数据分区分片、数据持久化、增量数据摄取、标量向量混合查询、time travel 等功能,同时优化了向量检索的性能,以满足各种向量检索场景的应用需求。
Milvus 的架构设计采用了云原生技术,支持存储与计算分离,使得计算节点可以横向扩展。它由四个层次组成:接入层(Access Layer)、协调服务(Coordinator Service)、执行节点(Worker Node)和存储服务(Storage)。这种分层设计使得各个组件相互独立,可以独立扩展和容灾,从而提高了系统的弹性和灵活性。
Milvus 支持多种部署模式,包括轻量级的 Milvus Lite、单机服务器部署的 Milvus Standalone,以及可部署在 Kubernetes 集群上的 Milvus Distributed。这些部署模式使得 Milvus 能够适应不同规模的数据和应用场景。
Milvus基础使用
在 Milvus 中,定义集合(Collection)的模式(Schema)是一个重要的步骤,因为它决定了如何存储和检索数据。根据您的描述,您想要创建一个集合,其中主键(Primary Key)和向量字段(Vector Field)使用默认名称("id" 和 "vector"),并且使用余弦相似度(COSINE)作为度量类型(Metric Type)。
-
导入环境
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")
-
创建Collection
if client.has_collection(collection_name="demo_collection"):
client.drop_collection(collection_name="demo_collection")
client.create_collection(
collection_name="demo_collection",
dimension=768, # The vectors we will use in this demo has 768 dimensions
)
-
创建测试数据
import random
# Text strings to search from.
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
# Use fake representation with random vectors (768 dimension).
vectors = [[random.uniform(-1, 1) for _ in range(768)] for _ in docs]
data = [
{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
for i in range(len(vectors))
]
print("Data has", len(data), "entities, each with fields: ", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))
-
插入数据
res = client.insert(collection_name="demo_collection", data=data)
print(res)
-
查询数据
# This will exclude any text in "history" subject despite close to the query vector.
res = client.search(
collection_name="demo_collection",
data=[[random.uniform(-1, 1) for _ in range(768)]],
filter="subject == 'history'",
limit=2,
output_fields=["text", "subject"],
)
print(res)
Milvus 特性
Milvus 支持的大多数向量索引类型都使用近似最近邻搜索(ANNS),包括:
-
HNSW:HNSW 是一种基于图的索引,最适合对搜索效率有高需求的场景。还有 GPU 版本 GPU_CAGRA,感谢 Nvidia 的贡献。
-
FLAT:FLAT 最适合在小型、百万规模的数据集上寻求完全精确和准确的搜索结果。还有 GPU 版本 GPU_BRUTE_FORCE。
-
IVF_FLAT:IVF_FLAT 是一种基于量化的索引,最适合寻求准确性和查询速度之间理想平衡的场景。还有 GPU 版本 GPU_IVF_FLAT。
-
IVF_SQ8:IVF_SQ8 是一种基于量化的索引,最适合在磁盘、CPU 和 GPU 内存资源非常有限的情况下显著减少资源消耗的场景。
-
IVF_PQ:IVF_PQ 是一种基于量化的索引,最适合即使牺牲准确性也要追求高查询速度的场景。还有 GPU 版本 GPU_IVF_PQ。
-
SCANN:SCANN 在向量聚类和产品量化方面与 IVF_PQ 类似。它们的区别在于产品量化的实现细节和使用 SIMD(单指令/多数据)进行高效计算。
-
DiskANN:基于 Vamana 图,DiskANN 支持在大型数据集中进行高效搜索。
用于浮点嵌入的广泛使用的度量包括:
-
余弦相似度(Cosine):这是一种归一化的内积,通常用于文本相似度搜索(自然语言处理,NLP)。
-
欧几里得距离(L2):这种度量通常用于计算机视觉(CV)领域。
-
内积(IP):这种度量通常用于自然语言处理(NLP)领域。用于二进制嵌入的广泛使用的度量包括:
-
汉明距离(Hamming):这种度量通常用于自然语言处理(NLP)领域。
-
杰卡德相似度(Jaccard):这种度量通常用于分子相似度搜索领域。
Milvus 架构
Milvus 采用存储和计算分离的共享存储架构,实现计算节点的横向扩展。遵循数据平面和控制平面分离的原则,Milvus 包括四个层次:接入层、协调服务、工作节点和存储。这些层在扩展或灾难恢复方面是相互独立的。
遵循数据平面和控制平面分离的原则,Milvus 由四个层次组成,这些层次在扩展性和灾难恢复方面是相互独立的。
1. 接入层
接入层由一组无状态代理组成,是系统的前端层和用户的端点。它验证客户端请求并减少返回的结果:
-
代理本身是无状态的。它使用负载均衡组件(如 Nginx、Kubernetes Ingress、NodePort 和 LVS)提供统一的服务地址。
-
由于 Milvus 采用大规模并行处理(MPP)架构,代理聚合并后处理中间结果,然后返回最终结果给客户端。
2. 协调服务
协调服务分配任务给工作节点,并作为系统的大脑。它承担的任务包括集群拓扑管理、负载均衡、时间戳生成、数据声明和数据管理。
协调服务有三种类型:根协调器(root coord)、数据协调器(data coord)和查询协调器(query coord)。
-
根协调器(root coord):根协调器处理数据定义语言(DDL)和数据控制语言(DCL)请求,例如创建或删除集合、分区或索引,以及管理时间戳 Oracle(TSO)和时间滴答发行。
-
查询协调器(query coord):查询协调器管理查询节点的拓扑和负载均衡,以及从增长段到封闭段的交接。
-
数据协调器(data coord):数据协调器管理数据节点和索引节点的拓扑,维护元数据,并触发刷新、压缩、索引构建和其他后台数据操作。
3. 工作节点
工作节点是系统的执行单元。工作节点遵循协调服务的指令,执行来自代理的数据操作语言(DML)命令。由于存储和计算的分离,工作节点是无状态的,可以在 Kubernetes 上部署时促进系统的扩展和灾难恢复。工作节点有三种类型:
-
查询节点:查询节点通过订阅日志代理检索增量日志数据并将其转化为增长段,从对象存储中加载历史数据,并在向量和标量数据之间进行混合搜索。
-
数据节点:数据节点通过订阅日志代理检索增量日志数据,处理变更请求,并将日志数据打包成日志快照并存储在对象存储中。
-
索引节点:索引节点构建索引。索引节点不需要驻留在内存中,可以使用无服务器框架实现。
4. 存储
存储是系统的骨干,负责数据持久性。它包括元存储、日志代理和对象存储。
-
元存储:元存储存储集合模式、消息消费检查点等元数据的快照。由于存储元数据要求极高的可用性、强一致性和事务支持,Milvus 选择 etcd 作为元存储。Milvus 还使用 etcd 进行服务注册和健康检查。
-
对象存储:对象存储存储日志快照文件、标量和向量数据的索引文件以及中间查询结果。Milvus 使用 MinIO 作为对象存储,并可以在 AWS S3 和 Azure Blob 等流行且成本效益高的存储服务上轻松部署。然而,对象存储具有较高的访问延迟,并按查询次数收费。为提高性能和降低成本,Milvus 计划在基于内存或 SSD 的缓存池上实现冷热数据分离。
-
日志代理:日志代理是一个支持回放的发布订阅系统。它负责流数据持久化和事件通知,并确保在工作节点从系统故障中恢复时增量数据的完整性。Milvus 集群使用 Pulsar 作为日志代理;Milvus 独立使用 RocksDB 作为日志代理。此外,日志代理可以轻松替换为 Kafka 等流数据存储平台。
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。