Milvus 快速入门

中文官网:https://milvus.io/docs/zh/overview.md

Milvus 简介

Milvus 是专为大规模向量数据设计的数据库,通过高效的近似最近邻(ANN)算法,让应用程序能在海量非结构化数据(图、文、音、视)中,快速找到相似的目标信息,是 AI 应用的必备数据底座。

【核心特点】

  • 开源项目:由 Zilliz 公司开发,现已捐赠给 Linux 基金会 LF AI & Data
  • 高性能:专门优化了向量存储和检索性能,支持十亿级向量规模
  • 多场景:支持多种部署形态(轻量版、单机版、分布式集群)

【名称由来】Milvus 一词来源于鹰科 Milvus 属(鸢属),象征着速度、敏捷和精准,正如 Milvus 向量数据库在海量向量数据中快速检索的能力。

Milvus 如何工作

  1. 数据向量化 (Embedding)

    利用 BERT、CLIP 等深度学习模型,将文本、图像、音频等非结构化数据“翻译”为机器可理解的高维向量,保留数据的语义特征。

  2. 向量存储 (Storage)

    将生成的海量高维向量安全存入 Milvus 数据库。支持大规模集群部署,提供高可用、高并发的读写能力,轻松应对数据的动态增减。

  3. 索引构建 (Indexing)

    自动为向量数据构建高性能索引(如 HNSW、IVF_FLAT)。通过索引优化,将全量比对的高复杂度降低,为后续的快速检索打下基础。

  4. 相似性搜索 (Search)

    输入查询向量,Milvus 利用索引进行近似最近邻 (ANN) 搜索,在海量数据中毫秒级返回最相似的结果,助力快速获取数据洞察。

image-20260715160500525

从图片中可以看到,一篇新闻被拆解成了多种数据,并分配了具体的类型(Type):

里面就有两种数据:

  1. 标量数据:article ID(int), title(string), tags(array), author info(json)。这是传统的结构化数据。

  2. 向量数据:title embedding(vector), summary embedding(vector), image embedding(vector)。这是通过 AI 模型转化后的高维数字。

Milvus 的作用:

  1. 打破数据孤岛,实现“异构统一存储”:

    如果没有 Milvus,你可能需要一个 MySQL 存标题和标签,再用一个专门的向量库存向量,还得写代码把它们关联起来。

    Milvus 的作用就是直接把这两者吞下去,统一管理。如图所示,它能原生处理 JSON(存作者信息)、Array(存标签)和 Vector(存文本/图片特征),让你维护一套数据库即可。

  2. 极速相似性检索(ANN Search)

    这是最核心的功能。当系统中有海量新闻时,Milvus 能将“查关键词”变成“算距离”

    比如你问:“给我找几张关于中央公园动物的有趣图片”。Milvus 会把这句话转成向量,然后在 image embedding那一列里,瞬间找出和这只乌龟图片“长得最像”的几张图,而不是笨拙地去数据库里搜文件名。

向量和 Embedding 概念

官网解释:https://milvus.io/zh/intro

向量嵌入是从机器学习模型中提取的数值表示,捕捉非结构化数据的语义含义。这些嵌入通过神经网络或变压器架构对数据中的复杂相关性进行分析,创建一个密集的向量空间,其中每个点对应于数据对象(如文档中的词)的“含义”。

这个过程将文本或其他非结构化数据转换为反映语义相似性的向量——在这个多维空间中,意义相关的词被放置得更近,从而实现一种称为“密集向量搜索”的搜索方式。这与依赖精确匹配和使用稀疏向量的传统关键词搜索形成对比。向量嵌入的发展,通常源于大型科技公司广泛训练的基础模型,使得搜索能够捕捉数据的本质,超越词汇或稀疏向量搜索方法的局限性。

image-20260715160738296

当然说简单一点,就是我们计算机只认数字:

因为计算机虽然看不懂“猫”和“狗”的意思,但它能计算 两组数字之间的距离

所以计算机把“宠物”、“猫”、“狗”都变成了数字坐标,在计算中发现,“猫”的坐标和“宠物”的坐标离得非常近。

那么有了这个理解之后:向量在 Milvus 里长什么样?

结合我们之前的“中央公园巨龟新闻”图来看,一篇文章在 Milvus 里是这样被拆解的:

image-20260715160833706

Milvus 厉害的地方在于,它能同时存这两样东西,并且用向量数据来进行 “智能找相似”

标量数据:article ID : 101 , title :”巨龟…” 这就是普通的文字和数字,方便人类阅读。

向量数据: Title Vector: [0.8, -0.2, …] 这是给机器看的“数字指纹”,用来算相似度。

1.3. Milvus 支持的向量类型

Milvus 支持的向量类型

  1. Float32

    标准浮点向量(最常用) 精度高,通用性强。绝大多数文本和图片模型都用这个。

  2. Float16 / BFloat16

    半精度浮点向量, 压缩版的Float32。牺牲一点点精度,换来体积减半,省钱又提速。

  3. Binary

    二进制向量 ,只有 0 和 1,适合某些特定的图像识别场景,速度最快。

安装 Milvus

三种部署形态

Milvus 提供三种主要的部署方式,满足不同场景的需求:

部署形态 特点 适用场景
Milvus Lite Python 库,无需服务,本地文件存储(windows不支持) 快速原型、学习、边缘设备
Milvus Standalone 单机服务器,Docker 容器 开发测试、中小规模生产
Milvus Distributed Kubernetes 集群,分布式架构 大规模生产,高可用场景

安装 Milvus Lite(推荐用于学习)

Milvus Lite 是最快上手的方式,只需要安装 Python 库即可。

不过就是milvus-lite官方尚不支持 Windows 操作系统

pip install pymilvus milvus-lite

验证安装是否成功:

import pymilvus
print(f"PyMilvus 版本: {pymilvus.__version__}")

from pymilvus import MilvusClient

# 测试 Milvus Lite 功能
client = MilvusClient(uri="./test_install.db")
print("Milvus Lite 连接成功!")

# 创建测试集合
client.create_collection(collection_name="test", dimension=128)
print("测试集合创建成功!")

# 清理
client.drop_collection(collection_name="test")
import os
if os.path.exists("./test_install.db"):
    os.remove("./test_install.db")
print("安装测试完成!")

安装 Milvus Standalone(单机版)

  1. 安装 Milvus Standalone(单机版)–windows

    本页演示如何使用 Docker Desktop for Windows 在 Windows 上运行 Milvus。

    前提条件

    在 Docker 中运行 Milvus

    Milvus 提供了一个安装脚本,可将其安装为 Docker 容器。在 Microsoft Windows 上安装 Docker Desktop 后,就可以在管理员模式下通过 PowerShell 或 Windows Command Prompt 以及 WSL 2 访问 Docker CLI。

    从 PowerShell 或 Windows 命令提示符

    如果你更熟悉 PowerShell 或 Windows Command Prompt,命令提示符如下。

    1. 在管理员模式下右击并选择以 管理员身份运行 ,打开 Docker Desktop。

    2. 下载安装脚本并将其保存为 standalone.bat

      C:\>Invoke-WebRequest https://raw.githubusercontent.com/milvus-io/milvus/refs/heads/master/scripts/standalone_embed.bat -OutFile standalone.bat
      
    3. 运行下载的脚本,将 Milvus 作为 Docker 容器启动。

      C:\>standalone.bat start
      Wait for Milvus starting...
      Start successfully.
      To change the default Milvus configuration, edit user.yaml and restart the service.
      

      运行安装脚本后

      • 名为Milvus-standalone的 docker 容器已在19530 端口启动。
      • 嵌入式 etcd 与 Milvus 安装在同一个容器中,服务端口为 2379 。其配置文件被映射到当前文件夹中的 embedEtcd.yaml
      • Milvus 数据卷映射到当前文件夹中的 volumes/milvus

      可以使用以下命令管理 Milvus 容器和存储的数据。

      # Stop Milvus
      C:\>standalone.bat stop
      Stop successfully.
      
      # Delete Milvus container
      C:\>standalone.bat delete
      Delete Milvus container successfully. # Container has been removed.
      Delete successfully. # Data has been removed.
      
  2. Docker Compose 部署(3 容器)

    如果你需要更完整的功能,可以使用 Docker 安装 Milvus Standalone。

    一种是linux推荐的方式(要提前安装好docker)

    如果是小白,完全安装linux和docker可以看这个课:https://www.mashibing.com/course/2911

    docker-compose up -d 中遇到问题(大概率):

    ! Image milvusdb/milvus:v2.6.17                  Interrupted                                                                                            21.1s
     ✘ Image minio/minio:RELEASE.2024-12-18T13-15-44Z Error failed to resolve reference "docker.io/minio/minio:RELEASE.2024-12-18T13-15-44Z": faile...       21.1s
    Error response from daemon: failed to resolve reference "docker.io/minio/minio:RELEASE.2024-12-18T13-15-44Z": failed to do request: Head "https://registry-1.docker.io/v2/minio/minio/manifests/RELEASE.2024-12-18T13-15-44Z": dial tcp 148.163.48.215:443: connect: connection refused
    

    另外这里需要配置Docker仓库私服设置

    设置 /etc/docker 下,创建一个 daemon.json 的文件,然后将下面的内容复制进去。

    {
            "features": {
              "containerd-snapshotter": true
            },
            "exec-opts": ["native.cgroupdriver=systemd"],
            "registry-mirrors":[
              "https://docker.m.daocloud.io",
              "https://docker.rainbond.cc",
              "https://docker.lmirror.top",
              "https://docker-0.unsee.tech",
              "https://docker.hlmirror.com"
           ]
    }
    
    # 1. 下载 docker-compose.yml 文件
    dnf install docker-compose-plugin -y
    wget https://github.com/milvus-io/milvus/releases/download/v2.6.17/milvus-standalone-docker-compose.yml -O docker-compose.yml
    
    # 2. 启动服务
    docker compose up -d
    
    # 3. 等待服务启动(约 1-2 分钟)
    docker-compose ps
    
    # 4. 验证连接
    # 在 Python 中使用 uri="http://localhost:19530" 连接
    

    image-20260715164529374

    安装成功:

    image-20260715165240145

    image-20260715165312749

    测试连接(外部使用 Attu 连接 Milvus

    image-20260715170221434

    image-20260715170304184

安装 Milvus Distributed(分布式版)

分布式版需要 Kubernetes 环境,适合大规模生产场景。

# 使用 Milvus Operator 部署
helm repo add milvus https://milvus-io.github.io/milvus-helm/
helm repo update

helm install my-milvus milvus/milvus \
    --set cluster.enabled=true \
    --set persistence.enabled=true

以上代码注意如下几点

  1. Milvus Lite 是最快上手的方式,数据会自动持久化到本地文件
  2. Milvus Standalone 需要 Docker 环境
  3. Milvus Distributed 需要 Kubernetes 集群
  4. 三种方式的 Python SDK API 完全一致,可以无缝切换

Attu 连接 Milvus

一款现代的、原生的 AI 管理工具,用于 Milvus 向量数据库。从单一实例连接多个 Milvus 集群——管理模式、探索数据、运行矢量搜索、监控健康状况,并通过内置 AI 代理自动化任务 https://github.com/zilliztech/attu ,安装执行命令:

docker run -d --name attu \
  -p 3000:3000 \
  -e MILVUS_ADDRESS=192.168.11.2:19530 \
  -v attu-data:/data \
  zilliz/attu:v3.0.0-beta.6

快速上手指南

# 1. 连接到本机 Standalone Milvus
from pymilvus import MilvusClient
import numpy as np

client = MilvusClient(uri="http://localhost:19530")  # 默认端口 19530

# 2. 创建集合(建议同时指定 metric_type,与后续索引保持一致)
client.create_collection("demo_collection", dimension=128, metric_type="L2")

# 3. 插入 1000 条随机向量数据
data = [{"id": i, "vector": np.random.rand(128).tolist()} for i in range(1000)]
client.insert("demo_collection", data)

# 4. 执行相似性搜索并打印结果 (Top 5)
res = client.search("demo_collection", [np.random.rand(128).tolist()], limit=5)
print([(r["id"], round(r["distance"], 4)) for r in res[0]])

Milvus 支持的向量类型

1. Float32 · 单精度浮点向量(默认首选)

  • 底层原理 :这是目前 AI 模型最常用的输出格式。每个维度的数据占用 4 个字节 ,能够保留极高的数值精度(大约小数点后 7 位有效数字)。
  • 适用场景通用型选手 。如果你做的是常规的文本检索、图像相似度匹配、推荐系统等,没有特别严苛的内存限制,请默认使用 Float32。它是稳定性和兼容性最好的方案。

2. Float16 / BFloat16 · 半精度浮点向量(降本增效)

  • 底层原理 :为了应对海量数据的存储压力,将每个维度的存储空间减半,仅占用 2 个字节
  • 适用场景高并发与显存瓶颈场景 。当你需要处理十亿级甚至百亿级的数据,或者你的服务器内存/显存非常紧张时,使用半精度可以大幅降低硬件成本,同时显著提升系统的吞吐量。
  • 注意 :牺牲一半空间会换来微小的精度损失,但在大多数非极致苛刻的 AI 场景下,这种损失对最终检索效果的影响微乎其微。

3. Binary · 二进制向量(极致轻量与极速)

  • 底层原理 :这是最硬核的玩法。它将向量压缩成由 0 和 1 组成的比特串(每个维度仅占用 1 bit),并利用汉明距离进行相似度计算。
  • 适用场景对实时性要求极高且数据维度极大的场景 。比如指纹/人脸识别(经过特殊哈希算法处理后)、大规模网页去重、实时推荐系统中的快速粗排。它的存储占用极低,且计算机计算二进制的速度远超浮点数,是追求极致性能的“特种兵”。
--- 本文结束 The End ---