Coggle数据科学 | 小白学 RAG:Milvus 介绍与使用教程

news2024/11/9 3:53:31

本文来源公众号“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 !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【阿一网络安全】如何让你的密码更安全?(三) - 散列函数

散列函数 散列函数(Hash Function,又称散列算法、哈希函数),是一种从任何一种数据中创建小的数字指纹的方法。 散列值 散列函数,把任意长的消息明文,压缩成摘要,使得数据量变小,将…

[数据集][目标检测]脊椎检测数据集VOC+YOLO格式1137张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1137 标注数量(xml文件个数):1137 标注数量(txt文件个数):1137 标注…

SpringBoot2:web开发常用功能实现及原理解析-上传与下载

文章目录 一、上传文件1、前端上传文件给Java接口2、Java接口上传文件给Java接口 二、下载文件1、前端从Java接口下载文件2、Java接口调用Java接口下载文件 一、上传文件 1、前端上传文件给Java接口 Controller接口 此接口支持上传单个文件和多个文件,并保存在本地…

基于小程序的教学辅助微信小程序设计+ssm(lw+演示+源码+运行)

教学辅助微信小程序 摘 要 随着移动应用技术的发展,越来越多的学生借助于移动手机、电脑完成生活中的事务,许多的传统行业也更加重视与互联网的结合,由于学生学习的压力越来越大,教学辅助是一个非常不错的教育平台,对…

人工智能(AI)领域各方向顶会和顶刊

在人工智能(AI)这个快速发展的领域,研究人员和从业者需要紧跟最新的研究动态和技术进展。顶级的会议和期刊是获取最新科研成果和交流思想的重要平台。以下是人工智能领域内不同方向的顶级会议和期刊概览。 顶级会议 人工智能基础与综合 A…

客厅无主灯设计:灯位布局与灯光灯具的和谐搭配

在现代家居设计中,客厅作为家庭活动的中心区域,其照明设计的重要性不言而喻。无主灯设计以其灵活多变、氛围营造独特的优势,逐渐成为客厅照明的热门选择。然而,如何合理规划灯位布局,并科学搭配灯光与灯具,…

20240913 每日AI必读资讯

AMD死战CUDA:我是一家软件公司 - AMD重大改变:重心将从硬件开发转向强调软件开发、API 和 AI 体验。 - 软件工程团队规模扩大了三倍,并且全力以赴投入软件开发 - AMD将自家已有5年历史的图形架构RDNA、计算架构CDNA重新整合在一起&#xf…

计算机毕业设计选题推荐-在线拍卖系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

2024年9月13日 十二生肖 今日运势

小运播报:2024年9月13日,星期五,农历八月十一 (甲辰年癸酉月庚辰日),法定工作日。 红榜生肖:猴、鼠、鸡 需要注意:牛、兔、狗 喜神方位:西北方 财神方位:…

windows10通过coursier安装scala

第一步:安装Java 参考菜鸟教程安装Java: https://www.runoob.com/java/java-environment-setup.html#win-install 第二步:安装coursier 进入https://www.scala-lang.org/download/ 如下图所示: 第三步、确定jdk对应的scala版本…

小琳AI课堂:MASS模型——革新自然语言处理的预训练技术

大家好,这里是小琳AI课堂。今天我们来聊聊一个在自然语言处理(NLP)领域非常热门的话题——MASS模型,全称是Masked Sequence to Sequence Pre-training for Language Generation。这是华为诺亚方舟实验室在2019年提出的一种创新模型…

cpp-httplib的下载和使用

cpp-httplib的下载和使用 1.httplib 简介2. httplib 使用2.1 协议接口2.2 双端接口2.3 实际使用 3. 对Server中的Handler回调函数进行分析4. 最后 1.httplib 简介 cpp-httplib(也称为 httplib)是一个基于 C 的轻量级 HTTP 框架,它提供了简单…

统一建模语言UML之类图(Class Diagram)(表示|关系|举例)

文章目录 1.UML2.Class Diagram2.1 类图的表示2.2 类间的关系2.2.1 关联2.2.2 聚合2.2.3 组合2.2.4 泛化(继承)2.2.5 实现(接口实现)2.2.6 依赖 2.3 类图的作用 参考:Class Diagram | Unified Modeling Language (UML)…

2024/9/12 数学“回头看”之R(a)与R(a※)、分布函数、概率密度的特点

注意!这是充分必要条件。 分布函数性质 概率密度性质:

如何使用Jmeter关联influxDB?

一、添加"添加后端监听器" 二、后端监听器实现选择,"org. apache. jmeter. visualizers. backend. influxdb.InfluxdbBackendlistenerClient" 三、修改"influxdbUrl:自己的主机、application:取一个项目名" 四、influxDB&…

SAP B1 学习笔记 - 易混淆字段名(持续更新中)

背景 在 SAP B1 的单据中,由于同一单据时常对应着多个后台表单,且后台表单内包含的字段信息往往远大于单据显示出来的,在配置时经常出现多个字段混淆、无系统信息提示字段名模糊的情况,这里总结常见的易混淆难查找的后台字段名。…

【MySQL】MySQL表的增删改查(进阶篇)——之查询操作(超级详解)

前言: 🌟🌟本期讲解关于MySQL表增删查改进阶篇,希望能帮到屏幕前的你。 🌈上期博客在这里:http://t.csdnimg.cn/8SiWF 🌈感兴趣的小伙伴看一看小编主页:http://t.csdnimg.cn/8SiWF ​…

SpringBoot父子工程搭建

SpringBoot父子工程搭建 1、父工程 1.1、创建父工程 1.2、移除无用文件 1.3、修改pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…

循环节,CF 314B - Sereja and Periods

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 314B - Sereja and Periods 二、解题报告 1、思路分析 如果 b 个 a 中出…

【Python报错已解决】AttributeError: ‘str‘ object has no attribute ‘read‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;直接使用字符串2.2 步骤…