当前位置: 首页 > news >正文

深入理解 Milvus:新一代向量数据库的基础技术与实战指南

一、什么是 Milvus?

Milvus 是一个开源的向量数据库,专门设计用于存储和检索大规模的高维向量数据。无论是图像、视频、音频还是文本,通过将这些数据转换为向量,Milvus 都能通过近似最近邻搜索(Approximate Nearest Neighbor,ANN)算法进行高效的检索。该数据库广泛应用于各类需要快速检索相似数据的应用场景中。

Milvus 的主要特点:
  1. 高性能检索:支持亿级别向量数据的存储和检索,每秒可处理数百万次查询。
  2. 分布式扩展:Milvus 采用分布式架构,能够横向扩展,满足大规模、高并发的应用需求。
  3. 多索引支持:提供多种近似最近邻搜索索引,包括 IVF、HNSW 和 ANNOY,能够灵活适应不同的场景和数据集。
  4. 多语言 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 性能,以下是几个优化建议:

  1. 选择合适的索引类型:根据数据规模和查询性能需求,选择合适的索引类型。例如,HNSW 适合大规模高维数据,而 IVF 则适合中等规模的数据。

  2. 调整 nprobe 参数nprobe 是 IVF 索引中的一个重要参数,决定了检索时查询簇的数量。适当增大 nprobe 能提高检索精度,但会牺牲一定的查询速度。

  3. 利用 GPU 加速:在处理大规模数据时,启用 GPU 可以显著提升检索速度。特别是对高维向量数据,GPU 并行计算能力能够大幅提高系统性能。

  4. 合理分区和负载均衡:在大规模分布式场景中,合理的数据分区和负载均衡可以确保系统的高效运行。Milvus 支持通过分片将数据分布到多个节点,从而实现水平扩展。

七、Milvus 的生态系统

Milvus 不仅作为一款向量数据库功能强大,还构建了一个丰富的生态系统。通过与其他 AI 工具和库的集成,Milvus 能够提供更广泛的向量处理和检索能力。

  1. Towhee:Towhee 是一个开源的向量数据处理库,能够无缝集成 Milvus,帮助用户构建向量处理和检索的完整流水线。

  2. FAISS 集成:Milvus 支持与 Facebook 开发的 FAISS 索引库集成,为用户提供更多的索引选择,进一步提升检索性能。

  3. 与 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 被描述为全能型,从处理复杂的数学问题到应对主观性强的营销策略,它的能力可以覆盖多个领域。听起来像是科技界的“万能钥匙”,无论面对什么问题&#xff0c…...

如何在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的学习笔记! 一、再探构造函数 初始化列表:构造函数初始化的第二种方式(第一种是使用函数体内赋值)。使用方式:以一个冒号:开始,用逗号,分隔数据成员列表,每个成员变量后面跟…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

若依登录用户名和密码加密

/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...

【51单片机】4. 模块化编程与LCD1602Debug

1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...

用鸿蒙HarmonyOS5实现国际象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...

云原生时代的系统设计:架构转型的战略支点

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、云原生的崛起:技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深,传统的 I…...