向量数据库 Milvus 基础实践:从入门到上手

1. 引言

随着 AI 应用和大规模检索场景的普及,向量检索已成为技术栈中不可或缺的一环。无论是推荐系统、语义搜索,还是 RAG(检索增强生成)应用,都需要在海量高维向量中快速找到最相似的邻居。传统关系型数据库难以高效支撑这类相似度检索,于是向量数据库应运而生。

Milvus 是当前最流行的开源向量数据库之一,由 Zilliz 发起并维护,已加入 Linux Foundation AI & Data 基金会。它基于分布式架构设计,支持十亿级向量规模的存储与检索,并提供多种索引类型和相似度度量方式,是生产环境中落地向量检索的常用选择。

本文将从零开始,带你完成 Milvus 的安装部署、基础操作、索引构建与检索实践,帮助你快速上手这一核心组件。

2. 什么是向量数据库

在进入 Milvus 之前,先厘清向量数据库的基本概念。

2.1 向量与向量化

向量是一组有序的数值,通常以浮点数数组表示。在 AI 场景中,文本、图片、音频等非结构化数据经过神经网络模型(如 BERT、CLIP、ResNet)编码后,会得到一个固定维度的向量。这个向量在语义空间中保留了原始数据的特征:语义相近的内容,其向量距离也更近。

例如,一段描述"可爱的猫咪"的文本,经过 embedding 模型编码后得到一个 768 维的向量;另一段"cute cat"的文本编码后,其向量与前者在欧氏距离上非常接近。

2.2 向量检索的核心问题

向量检索的目标是:给定一个查询向量,在数据库中找出与之最相似的 K 个向量。这本质上是 KNN(K 最近邻)问题。当数据量达到百万、十亿级别时,精确的暴力扫描(brute force)在性能上不可接受,因此业界普遍采用 ANN(近似最近邻)算法,在召回率与检索速度之间取得平衡。

2.3 向量数据库与传统数据库的差异

维度 传统关系型数据库 向量数据库
数据模型 结构化表、行、列 向量 + 标量字段
核心操作 精确匹配、范围查询 相似度检索(Top-K)
索引 B+ 树、哈希索引 HNSW、IVF、PQ 等 ANN 索引
典型场景 事务处理、报表 语义搜索、推荐、RAG

3. Milvus 核心概念

在动手实践前,先熟悉 Milvus 的几个核心概念。

3.1 Collection(集合)

Collection 是 Milvus 中的基本数据组织单元,可以类比为关系型数据库中的"表"。一个 Collection 包含若干字段(Field),其中必须有一个主键字段和一个向量字段,还可以包含多个标量字段用于过滤。

3.2 Field(字段)

字段分为两类:

  • 标量字段 :如 id、title、category,支持过滤和标量查询。
  • 向量字段:存储浮点向量,需指定维度(dim)和相似度度量类型(metric type)。

3.3 Index(索引)

索引是加速向量检索的关键。Milvus 支持多种索引类型,常见的有:

  • FLAT:暴力扫描,精确但慢,适合小规模数据。
  • IVF_FLAT:基于倒排聚类的索引,先聚类再检索,速度快、召回较好。
  • HNSW:基于图的层级导航索引,检索性能优秀,适合大规模高维数据。
  • DISKANN:基于磁盘的图索引,适合内存无法容纳的超大规模数据。

3.4 Partition(分区)

Partition 是 Collection 内的逻辑分区,可用于按业务维度切分数据,提升过滤效率。例如按日期、地域分区。

3.5 Metric Type(度量方式)

Milvus 支持多种向量距离度量:

  • L2(欧氏距离):值越小越相似。
  • IP(内积):值越大越相似,常用于归一化向量。
  • COSINE(余弦相似度):值越大越相似,对向量模长不敏感。

4. 环境准备与安装部署

4.1 环境要求

  • Docker 与 Docker Compose(推荐方式)
  • 或 Kubernetes(生产环境)
  • 建议内存不低于 8GB

4.2 使用 Docker Compose 快速部署

Milvus 官方提供了 milvus-standalone 的 Docker Compose 配置。执行以下命令:

bash 复制代码
# 下载 standalone 部署配置文件
wget https://github.com/milvus-io/milvus/releases/download/v2.4.5/milvus-standalone-docker-compose.yml -O docker-compose.yml

# 启动 Milvus 及相关依赖(etcd、minio)
docker compose up -d

# 查看运行状态
docker compose ps

启动成功后,Milvus 默认监听 localhost:19530 端口。

4.3 安装 Python SDK

Milvus 提供了官方 Python SDK pymilvus,安装命令如下:

bash 复制代码
pip install pymilvus

5. 基础操作实践

下面通过 Python 代码演示 Milvus 的核心操作流程。

5.1 连接 Milvus

python 复制代码
from pymilvus import connections

# 连接到本地 Milvus 服务
connections.connect(alias="default", host="localhost", port="19530")
print("连接成功")

5.2 创建 Collection

python 复制代码
from pymilvus import CollectionSchema, FieldSchema, DataType, Collection

# 定义字段
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
]

# 创建 schema
schema = CollectionSchema(fields=fields, description="文本向量集合")

# 创建 collection
collection = Collection(name="text_demo", schema=schema)
print(f"Collection 已创建: {collection.name}")

5.3 插入数据

python 复制代码
import random

# 构造示例数据
data = [
    [i for i in range(100)],          # id
    [f"文本样本_{i}" for i in range(100)],  # title
    [[random.random() for _ in range(768)] for _ in range(100)],  # embedding
]

# 插入数据
collection.insert(data)
print("数据插入完成")

5.4 创建索引

python 复制代码
from pymilvus import Index

# 为向量字段创建 HNSW 索引
index_params = {
    "metric_type": "COSINE",
    "index_type": "HNSW",
    "params": {"M": 16, "efConstruction": 200},
}

collection.create_index(field_name="embedding", index_params=index_params)
print("索引创建完成")

5.5 加载 Collection 并检索

python 复制代码
# 加载 collection 到内存
collection.load()

# 构造查询向量
query_vector = [[random.random() for _ in range(768)]]

# 执行相似度检索
results = collection.search(
    data=query_vector,
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"ef": 64}},
    limit=5,
    output_fields=["title"],
)

# 打印检索结果
for hits in results:
    for hit in hits:
        print(f"id: {hit.id}, 距离: {hit.distance}, title: {hit.entity.get('title')}")

5.6 带标量过滤的混合检索

python 复制代码
# 在检索时通过 expr 过滤标量字段
results = collection.search(
    data=query_vector,
    anns_field="embedding",
    param={"metric_type": "COSINE", "params": {"ef": 64}},
    limit=5,
    expr='id > 50',
    output_fields=["title"],
)

6. 索引选择与调优建议

选择合适的索引类型对性能影响显著,这里给出一些经验性建议:

数据规模 推荐索引 说明
万级以下 FLAT 精确检索,实现简单
百万级 IVF_FLAT / IVF_SQ8 聚类加速,内存占用可控
千万级以上 HNSW 检索延迟低,召回率高
内存受限的超大规模 DISKANN 利用磁盘存储,成本更低

调优要点:

  • HNSW 的 M 值:越大召回率越高,但内存和构建时间也增加,一般取 16~32。
  • efConstruction:控制索引构建时的搜索范围,越大索引质量越高,构建越慢。
  • ef:查询时的搜索范围,越大召回越好、延迟越高,可按业务实时调整。

7. 常见问题与排查

7.1 连接失败

检查 Milvus 服务是否启动、端口是否正确:

bash 复制代码
docker compose ps
telnet localhost 19530

7.2 检索前未加载 Collection

Milvus 中 Collection 必须先 load() 才能执行检索,否则会报错。每次服务重启后需重新加载。

7.3 向量维度不一致

插入的向量维度必须与 Collection 定义时的 dim 一致,否则插入会失败。建议在数据写入前统一 embedding 模型的输出维度。

7.4 索引构建耗时较长

大规模数据构建索引耗时较长,属于正常现象。可通过调整 M、efConstruction 等参数在构建速度与检索质量之间取舍。

8. 总结

本文从向量数据库的基本概念出发,介绍了 Milvus 的核心设计,并通过 Docker Compose 完成了本地部署,使用 Python SDK 演示了建表、插入、建索引、检索等完整流程。Milvus 作为成熟的开源向量数据库,能够很好地支撑语义搜索、推荐系统和 RAG 等场景。

下一步,你可以尝试:

  • 接入真实 embedding 模型(如 OpenAI、BGE)替换随机向量;
  • 探索 Milvus 的 Partition、Alias、Dynamic Field 等进阶特性;
  • 结合 LangChain 或 LlamaIndex 搭建完整的 RAG 应用。

希望本文能帮助你顺利迈出向量检索实践的第一步。

相关推荐
数据最前线1 小时前
雪上加霜,Oracle向蓝色巨人最后的阵地发起挑战
数据库·oracle
于眠牧北1 小时前
Charles配置指定域名抓取和雷电模拟器中抓取APP接口配置
数据库·redis·缓存
福娃筱欢2 小时前
57014 canceling statement due to user request(金仓 KingbaseES)
数据库·kingbase·金仓数据库
ClouGence2 小时前
SAP HANA 数据同步遇到长事务,如何兼顾实时性与完整性?
数据库·后端
数据库小学妹2 小时前
数据库管理工具有哪些?2026主流工具分类与选型对照
数据库·数据库管理工具·数据库工具·信创数据库·数据库客户端
bingHHB2 小时前
销售订单同步实战:MES生产领料/补料→金蝶材料出库
数据库·集成测试
yexianglunbai2 小时前
冷备份与热备份的区别详解
数据库
ZhengEnCi2 小时前
SQL 与 NoSQL 本质差异完全指南:从数据模型到选型决策的深度剖析
数据库
龙腾AI白云2 小时前
数字孪生:与人工智能融合的技术图景
大数据·数据库·人工智能·知识图谱