深入理解 Milvus:新一代向量数据库的基础技术与实战指南
一、什么是 Milvus?
Milvus 是一个开源的向量数据库,专门设计用于存储和检索大规模的高维向量数据。无论是图像、视频、音频还是文本,通过将这些数据转换为向量,Milvus 都能通过近似最近邻搜索(Approximate Nearest Neighbor,ANN)算法进行高效的检索。该数据库广泛应用于各类需要快速检索相似数据的应用场景中。
Milvus 的主要特点:
- 高性能检索:支持亿级别向量数据的存储和检索,每秒可处理数百万次查询。
- 分布式扩展:Milvus 采用分布式架构,能够横向扩展,满足大规模、高并发的应用需求。
- 多索引支持:提供多种近似最近邻搜索索引,包括 IVF、HNSW 和 ANNOY,能够灵活适应不同的场景和数据集。
- 多语言 API:支持 Python、Java、Go 等多种语言客户端以及 RESTful API,极大方便了集成与开发。
二、Milvus 的核心架构
Milvus 的架构设计充分考虑了向量检索的高效性和可扩展性。它的核心模块包括存储引擎、查询引擎、元数据管理以及分布式架构,确保了大规模数据处理的能力。
1. 存储引擎
Milvus 的存储引擎负责管理向量数据和元数据的持久化。它支持多种存储后端,包括本地文件系统、Amazon S3 和 MinIO。通过采用分布式存储机制,Milvus 确保数据存储的可靠性和高可用性。
- 本地存储:适合测试和小规模项目。
- 云存储:例如 Amazon S3 和 MinIO,适用于大规模应用和需要高可用性的生产环境。
2. 查询引擎
Milvus 的查询引擎是其核心功能模块,支持快速的向量检索。该引擎支持 GPU 加速和 CPU 并行计算,通过多线程处理,极大提升了检索速度。
- ANN 搜索:Milvus 支持近似最近邻搜索(ANN),这种搜索方式能够在保持高精度的同时显著提高检索速度,尤其适用于高维向量数据。
- 向量压缩:通过向量压缩算法,Milvus 能够有效减少存储开销并加快检索。
3. 元数据管理
元数据管理负责管理向量数据集的结构、索引以及元数据。通过分布式元数据存储方案,Milvus 保证了在分布式环境中的数据一致性。
- 元数据持久化:通过 etcd 等分布式数据库管理元数据,确保高可用性和一致性。
- 负载均衡:支持自动数据分片和负载均衡,优化系统资源使用。
4. 分布式架构
Milvus 的分布式架构支持多个节点协作处理大规模数据检索请求,确保高可用性和数据一致性。
- 分布式检索:在大规模场景中,Milvus 能够在多个节点上并行处理查询请求,大幅提升查询效率。
- 水平扩展:随着数据量的增加,可以通过增加节点来扩展系统,避免性能瓶颈。
三、Milvus 的索引技术
Milvus 提供了多种索引类型,以适应不同的向量数据检索需求和应用场景。每种索引有其特定的应用优势,用户可以根据数据规模、维度及查询需求选择合适的索引。
1. IVF(Inverted File Index,倒排文件索引)
IVF 索引通过将向量数据划分为若干簇,然后在检索时只在部分簇中搜索以减少计算量,从而提高查询效率。IVF 适用于中等规模的数据集,特别是在存储空间有限的情况下非常高效。
- 优点:占用空间较小,检索速度较快。
- 应用场景:适用于中等规模、高维度的向量数据,常用于图像、音频等相似性检索。
2. HNSW(Hierarchical Navigable Small World)
HNSW 是一种基于图的索引算法,通过构建多层图结构来实现高效的近似最近邻搜索。它能够在超大规模数据集上表现出色,尤其适用于维度较高的数据集。
- 优点:检索速度极快,适合大规模高维数据。
- 应用场景:适用于亿级向量数据集,常用于图像搜索和推荐系统。
3. ANNOY(Approximate Nearest Neighbors Oh Yeah)
ANNOY 基于树状结构构建索引,它通过随机选择数据点来划分空间,快速进行最近邻搜索。ANNOY 在小规模数据集上能够实现快速响应。
- 优点:索引构建速度快,查询速度非常快。
- 应用场景:适用于小到中等规模数据集,对响应时间要求高的应用场景,如实时推荐和个性化广告推送。
四、Milvus 的应用场景
Milvus 在多个行业中展现了卓越的性能,其高效的向量检索能力让它成为各类 AI 应用不可或缺的组成部分。以下是几个典型的应用场景:
1. 图像和视频搜索
在图像和视频搜索中,数据通常被编码为向量表示,通过 Milvus 的近似最近邻搜索,可以快速找到与输入图像或视频最相似的对象。这在电商中的“以图搜图”、社交媒体中的内容推荐都有广泛应用。
- 实例:用户上传一张商品图片,系统在数据库中查找相似的商品,提供购买建议。
2. 推荐系统
Milvus 能够根据用户的行为数据生成向量表示,从而快速找到相似用户或物品,实现高效的个性化推荐。例如,电影推荐系统可以通过向量化用户观看的影片数据,推荐相似类型的影片。
- 实例:流媒体平台根据用户的历史观看数据,向其推荐个性化内容。
3. 自然语言处理(NLP)
在 NLP 中,文本通常被转换为词向量或句向量。通过 Milvus 可以在大量文本数据中进行相似性搜索,找到与查询文本语义相近的其他文本。这在智能问答、文档检索和机器翻译等领域都有广泛的应用。
- 实例:在智能客服系统中,Milvus 可以帮助快速找到与用户问题相似的历史对话记录,提高自动回复的准确性。
4. 生物信息学
Milvus 也被应用于基因数据的向量化处理,通过向量检索相似的基因片段,帮助科学家快速找到相似基因或蛋白质结构。这在疾病研究和药物开发中起着重要作用。
五、如何开始使用 Milvus
以下是一个快速上手 Milvus 的步骤指南,帮助你快速体验它的强大功能:
1. 安装 Milvus
Milvus 提供了多种安装方式,其中最简单的是通过 Docker 进行安装。使用以下命令可以快速启动 Milvus 实例:
方式一:
curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.shbash standalone_embed.sh start方式二:
wget https://github.com/milvus-io/milvus/releases/download/v2.4.10/milvus-standalone-docker-compose.yml -O docker-compose.ymlsudo docker compose up -dCreating milvus-etcd ... done
Creating milvus-minio ... done
Creating milvus-standalone ... donesudo docker compose downsudo rm -rf volumes
此命令会启动 Milvus 服务,暴露必要的端口,用于客户端与 Milvus
进行交互。
2. 创建数据集
创建 Milvus 数据集的过程非常简单。首先,定义数据集的结构,然后创建并初始化数据集。以下示例展示了如何创建一个包含向量字段的简单数据集:
from pymilvus import Collection, FieldSchema, CollectionSchema, DataType# 定义字段
fields = [FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128)
]# 定义数据集
schema = CollectionSchema(fields=fields, description="example collection")
collection = Collection(name="example_collection", schema=schema)
3. 插入数据并创建索引
插入向量数据到数据集后,为加速检索需要为 embedding
字段创建索引:
import numpy as np# 生成随机向量数据
data = [np.random.randint(0, 10000, size=(1000,)), # 生成 1000 个 idnp.random.random((1000, 128)).astype(np.float32) # 生成 1000 个 128 维的向量
]# 向数据集中插入数据
collection.insert(data)# 创建 IVF_FLAT 索引
index_params = {"index_type": "IVF_FLAT","params": {"nlist": 128}
}
collection.create_index(field_name="embedding", index_params=index_params)
4. 执行向量检索
检索过程使用向量查询,以下示例展示了如何基于输入向量进行相似性搜索:
query_vectors = np.random.random((5, 128)).astype(np.float32)# 查找最相似的向量
results = collection.search(query_vectors, anns_field="embedding", param={"nprobe": 10}, limit=5)# 输出结果
for result in results:print(f"Top 5 most similar IDs: {result.ids}")print(f"Distances: {result.distances}")
通过此检索操作,您可以获取到与查询向量最相似的向量 ID 及其相似度距离。
六、Milvus 性能优化建议
为了在实际项目中获得最佳的 Milvus 性能,以下是几个优化建议:
-
选择合适的索引类型:根据数据规模和查询性能需求,选择合适的索引类型。例如,HNSW 适合大规模高维数据,而 IVF 则适合中等规模的数据。
-
调整 nprobe 参数:
nprobe
是 IVF 索引中的一个重要参数,决定了检索时查询簇的数量。适当增大nprobe
能提高检索精度,但会牺牲一定的查询速度。 -
利用 GPU 加速:在处理大规模数据时,启用 GPU 可以显著提升检索速度。特别是对高维向量数据,GPU 并行计算能力能够大幅提高系统性能。
-
合理分区和负载均衡:在大规模分布式场景中,合理的数据分区和负载均衡可以确保系统的高效运行。Milvus 支持通过分片将数据分布到多个节点,从而实现水平扩展。
七、Milvus 的生态系统
Milvus 不仅作为一款向量数据库功能强大,还构建了一个丰富的生态系统。通过与其他 AI 工具和库的集成,Milvus 能够提供更广泛的向量处理和检索能力。
-
Towhee:Towhee 是一个开源的向量数据处理库,能够无缝集成 Milvus,帮助用户构建向量处理和检索的完整流水线。
-
FAISS 集成:Milvus 支持与 Facebook 开发的 FAISS 索引库集成,为用户提供更多的索引选择,进一步提升检索性能。
-
与 AI 工具的集成:Milvus 可以与主流的机器学习框架(如 TensorFlow、PyTorch)无缝集成,允许开发者将模型的向量化输出直接存储到 Milvus 中,便于后续的检索和分析。
八、常见问题与解答
1. Milvus 的典型应用场景有哪些?
Milvus 广泛应用于需要处理大规模向量数据的场景,如图像检索、推荐系统、自然语言处理、生物信息学等。
2. 如何选择合适的索引?
选择索引时应根据数据规模、维度和查询速度要求进行选择。IVF 适合中等规模数据,HNSW 更适合大规模高维数据,ANNOY 则在对响应速度要求较高的小规模数据场景下表现出色。
3. Milvus 是否支持分布式部署?
是的,Milvus 支持分布式架构,能够扩展到多节点,以应对大规模数据存储和检索的需求。
4. Milvus 的 GPU 支持如何?
Milvus 支持 GPU 加速查询,通过利用 GPU 的并行计算能力,可以显著提升大规模数据集的检索性能。
九、结语
Milvus 是一款专为大规模向量检索设计的高性能开源数据库,已经在多个行业中展现了其强大的应用潜力。无论是图像搜索、推荐系统,还是自然语言处理,Milvus 都能够提供高效、可靠的向量检索解决方案。本文通过详细介绍 Milvus 的核心技术、应用场景和使用方法,帮助你快速掌握并应用这一强大的工具。
随着数据规模的不断增长,Milvus 的应用前景将愈加广阔,它也将继续在 AI 领域扮演重要角色。
延伸阅读与参考:
- Milvus 官方文档
- Towhee 向量数据处理库
- FAISS 向量检索库
相关文章:
深入理解 Milvus:新一代向量数据库的基础技术与实战指南
一、什么是 Milvus? Milvus 是一个开源的向量数据库,专门设计用于存储和检索大规模的高维向量数据。无论是图像、视频、音频还是文本,通过将这些数据转换为向量,Milvus 都能通过近似最近邻搜索(Approximate Nearest N…...

Maven教程——从入门到入坑
第1章 为什么要使用Maven 1.1 获取第三方jar包 开发中需要使用到的jar包种类繁多,获取jar包的方式都不尽相同。为了查找一个jar包找遍互联网,身心俱疲。不仅如此,费劲心血找到的jar包里有的时候并没有你需要的那个类,又或者有…...
研究生深度学习入门的十天学习计划------第九天
第9天:深度学习中的迁移学习与模型微调 目标: 理解迁移学习的核心概念,学习如何在实际应用中对预训练模型进行迁移和微调,以应对不同领域的任务。 9.1 什么是迁移学习? 迁移学习(Transfer Learning&#…...
perl的学习记录——仿真regression
1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。…...
【Go】go连接clickhouse使用TCP协议
离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么 🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time&q…...

Emlog-Pro访问网站时需要密码验证插件
插件介绍 EmlogPro访问网站密码验证插件,为你的网站添加输入密码访问网站功能,在应用中的场景往往运用在为内部或是个人使用的页面里面,在访问的时候可以提示输入密码,做隐私保护。 下载地址: Emlog-Pro访问网站时需…...

Apache ShardingSphere数据分片弹性伸缩加解密中间件
Apache ShardingSphere Apache ShardingSphere 是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。 软件背景 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding…...

Django+Vue家居全屋定制系统的设计与实现
目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者&…...

如何把自动获取的ip地址固定
在大多数网络环境中,设备通常会自动从DHCP服务器获取IP地址。这种动态分配IP的方式虽然灵活方便,但在某些特定场景下,我们可能需要将设备的IP地址固定下来,以确保网络连接的稳定性和可访问性。本文将详细介绍如何把自…...
Java应用的数据库死锁问题分析与解决
Java应用的数据库死锁问题分析与解决 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 数据库死锁是多线程环境中常见的问题,尤其是在复杂的事务处理和数据访问中。死锁发生时&#x…...
ImportError: cannot import name ‘DglNodePropPredDataset‘ from ‘ogb.nodepropp
ImportError: cannot import name DglNodePropPredDataset from ogb.nodepropp 问题: 在跑深度学习时引入这个模块一直报错不能引入, 但看环境相关的包都安装好了,就是读取不到,时间还白白浪费。 解决办法 from ogb.nodeproppr…...
基于SSM(Spring、SpringMVC、MyBatis)框架的高校信息管理系统
基于SSM(Spring、SpringMVC、MyBatis)框架的高校信息管理系统是一个典型的Java Web应用开发项目。这类系统通常需要处理大量的学生、教师及课程信息,并提供相应的管理功能。下面是一个简化的设计方案,旨在帮助你理解如何构建这样的…...

C++第一节入门
一、历史 C是在C上继承拓展的! java是一家公司(甲骨文)借鉴C生成的! C#是微软借鉴java生成的! 二、命名空间 当我们定义一个名叫rand的变量,但是由于stdlib头文件里面有个函数跟rand重名!因此…...

全能型 AI 的崛起:未来的市场宠儿还是昙花一现?
近日,OpenAI 宣布将在秋季推出代号为“草莓”的新一代 AI 模型。这款 AI 被描述为全能型,从处理复杂的数学问题到应对主观性强的营销策略,它的能力可以覆盖多个领域。听起来像是科技界的“万能钥匙”,无论面对什么问题,…...

如何在PPT中插入已经绘制好的excel表格数据
1、新建一个演示文稿 2、点击“插入—对象” 3、点击“由文件创建—浏览” 4、浏览选择电脑上所处理好的excel表格数据 5、这样就可将excel表格数据插入PPT中...

微积分直觉:隐含微分
目录 一、介绍 二、梯子问题 三、结论 四、一个额外的例子 一、介绍 让我们想象一个半径为 5 的圆,以 xy 平面为中心。现在假设我们想在点 (3,4) 处找到一条切线到圆的斜率。 好吧,为了做到这一点,我们必须非常接近圆和…...
Matlab自学笔记三十五:表table数据与外部文件的读入和写出
1.首先新建一个表变量t xingming{zhangsan;lisi;wangwu}; xuehao{1001;1002;1003}; chengji[89 95;90 87;88 84]; ttable(xingming,xuehao,chengji) 2.把表t的数据写出到student.txt writetable(t,student.txt) %使用writetable函数写出数据到txt文件 3.从student.txt文…...

闯关leetcode——3.Longest Substring Without Repeating Characters
大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/longest-substring-without-repeating-characters/description/ 内容 Given a string s, find the length of the longest substring without repeating characters. Example 1: Input: s “abc…...
Android Radio2.0——公告注册及监听(三)
前面文章内容介绍了 Radio 相关功能的设置,我们知道可以通过设置来监听不同内容的广播公告,但是在开启对应功能的同时,还需要先注册对应公告监听,这里我们就来看一下广播公告监听的注册流程。 一、注册公告 1、接口封装 private final AtomicBoolean mHasRegisterTa = n…...

【C++】类和对象(三)再探构造函数|static成员函数|友元函数|内部类|匿名对象|对象拷贝时的编译优化
欢迎来到HarperLee的学习笔记! 一、再探构造函数 初始化列表:构造函数初始化的第二种方式(第一种是使用函数体内赋值)。使用方式:以一个冒号:开始,用逗号,分隔数据成员列表,每个成员变量后面跟…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...