Milvus 从环境搭建到检索优化
一、环境准备
1. 基础环境
- Windows 11
- Docker Desktop(开启 WSL2)
2. GPU 环境(可选)
nvidia-smi
Docker GPU 测试:
docker run --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu22.04 nvidia-smi
输出如下:
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.102.01 Driver Version: 581.57 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA GeForce RTX 4060 Ti On | 00000000:01:00.0 On | N/A |
| 0% 40C P3 14W / 160W | 3712MiB / 8188MiB | 26% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 35 G /Xwayland N/A |
+-----------------------------------------------------------------------------------------+
二、Milvus 2.6.2 部署
1. 创建目录
D:\environment\Docker\milvus
2. docker-compose.yml
在目录下创建 docker-compose.yml:
version: '3.5'
services:
etcd:
container_name: milvus-etcd
image: quay.io/coreos/etcd:v3.5.5
environment:
- ETCD_AUTO_COMPACTION_MODE=revision
- ETCD_AUTO_COMPACTION_RETENTION=1000
command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls=http://0.0.0.0:2379
ports:
- "2379:2379"
minio:
container_name: milvus-minio
image: minio/minio:RELEASE.2023-03-20T20-16-18Z
environment:
MINIO_ACCESS_KEY: minioadmin
MINIO_SECRET_KEY: minioadmin
command: server /data
ports:
- "9000:9000"
milvus:
container_name: milvus-standalone
image: milvusdb/milvus:v2.6.2
command: ["milvus", "run", "standalone"]
environment:
ETCD_ENDPOINTS: etcd:2379
MINIO_ADDRESS: minio:9000
ports:
- "19530:19530"
- "9091:9091"
depends_on:
- etcd
- minio
3. 启动 Milvus
docker-compose up -d
4. 验证
docker ps
端口说明:
| 端口 | 协议 | 作用 |
|---|---|---|
| 19530 | gRPC | 向Milvus插入向量、查询向量、管理集合等操作 |
| 9091 | HTTP | 状态监控、Prometheus 采集指标、一些管理 UI 或 HTTP API |
三、Milvus 核心概念
在使用 Milvus 之前,需要先理解其核心数据结构,这对于后续索引选择和查询优化非常重要。
1. Collection(集合)
Collection 可以理解为关系型数据库中的“表”。
- 用于存储向量数据及其相关字段
- 每个 Collection 都有固定的 Schema(字段定义)
- 一般包含:
- 主键(ID)
- 向量字段(Vector)
- 业务字段(如文本、来源等)
👉 类比:
- MySQL → Table
- Elasticsearch → Index
- Milvus → Collection
2. Field(字段)
Field 是 Collection 中的列定义,常见类型包括:
INT64:主键FLOAT_VECTOR:向量字段(核心)VARCHAR:文本字段
其中最重要的是向量字段,例如:
"embedding": {
"type": "FLOAT_VECTOR",
"dim": 1024
}
👉 这里的 dim 表示向量维度,必须和 embedding 模型一致。
3. Segment(数据分片)
Segment 是 Milvus 的底层存储单元。
可以理解为:
Collection 并不是一个整体存储,而是被拆分成多个 Segment
特点:
- 数据写入时先进入 growing segment
- 达到一定大小后转为 sealed segment
- 查询时会在多个 segment 上并行执行
索引是构建在 segment 级别,而不是 collection 级别
4. Index(索引)
Milvus 的索引用于加速向量相似度搜索。
本质上解决的问题是:
在海量向量中,如何快速找到最相似的 TopK?
不同索引的核心区别在于:
- 精度(Recall)
- 查询速度
- 内存占用
常见索引类型:
- FLAT(精确搜索)
- IVF(聚类加速)
- HNSW(图结构)
5.GUI
官方GUI链接:https://github.com/zilliztech/attu/releases
四、向量索引类型详解
在 Milvus 中,不同索引决定了检索性能与精度的平衡。
1. FLAT(暴力检索)
原理
对所有向量逐一计算距离(全量扫描)。
特点
- ✅ 召回率:100%(最准确)
- ❌ 速度慢(数据量大时不可用)
适用场景
- 数据量小
- 精度要求极高(评估/测试)
2. IVF(倒排索引)
原理
先对向量进行聚类(KMeans),查询时只搜索部分聚类。
流程:
- 数据被划分为多个 cluster(nlist)
- 查询时只访问部分 cluster(nprobe)
核心参数
nlist(建索引时)- 聚类数量
- 越大 → 更精细 → 更慢构建
- 数据量小于10万时,建议设置为100-500,百万级数据推荐设置为1000~3000
nprobe(查询时)- 查询多少个 cluster
- 越大 → 召回率更高,但更慢
- 一般设置为 nlist 的 1%~10%
IVF 的核心思想是:用空间换时间,通过减少搜索范围提升性能。
3. HNSW(图索引)
原理
构建多层“近邻图”,通过图遍历找到最相似向量。
核心参数
M- 每个节点连接的边数
- 越大 → 精度高,但内存大
- 通常为12-36,较大数据集需要更高的M值获得可接受的召回率
efConstruction- 构建图时的搜索深度
ef(查询参数)- 查询时遍历深度
- 越大 → 更准但更慢
- 一般设置为 topK 的 2~5 倍,比如 topK=10 时,efSearch 设置为 50 左右
官方默认参数:M=16,efConstruction=200
特点
- ✅ 高召回率(接近 FLAT)
- ✅ 查询速度快
- ❌ 内存占用高
对比
| 索引类型 | 召回率 | 速度 | 内存 | 适用场景 |
|---|---|---|---|---|
| FLAT | 100% | 慢 | 高 | 小数据 |
| IVF | 中 | 快 | 中 | 大规模 |
| HNSW | 高 | 很快 | 高 | 高性能检索 |
五、查询机制与核心参数
Milvus 查询本质是:
给定一个向量,找到最相似的 TopK 个向量
1. TopK
- 返回最相似的 K 条数据
- K 越大 → 查询时间越长
2. 距离度量(Metric Type)
常见三种:
L2(欧式距离,两个向量在空间中的“直线距离”)IP(内积,本质是计算两个向量的“方向一致性 + 长度”)COSINE(余弦相似度)
必须和 embedding 模型匹配,否则效果会很差
3. IVF 查询参数
nprobe- 控制搜索范围
- 越大 → 召回率更高
4. HNSW 查询参数
ef- 控制搜索深度
- 越大 → 更准
查询参数(nprobe / ef)本质上是在控制“搜索范围”,从而在性能 vs 召回率之间做权衡。
六、如何提升召回率
在实际项目(特别是 RAG)中,召回率直接决定效果上限。
1. 调整查询参数
- IVF → 提高
nprobe - HNSW → 提高
ef
👉 最直接有效的方法
2. 选择合适索引
- 高精度 → HNSW
- 大规模 → IVF
3. 提升向量质量(最重要)
- 使用更强的 embedding 模型(如 bge-m3)
- 优化文本切分(chunk)
- 清洗数据
4. 混合检索(推荐 )
结合:
- Elasticsearch(关键词)
- Milvus(向量)
👉 提升:
- 召回覆盖率
- 语义 + 精确匹配
5. 重排(Rerank)
流程:
- 先召回 TopK(Milvus / ES)
- 使用 rerank 模型重新排序
👉 常见方式:
- Cross Encoder
- RRF(融合排序)
更多推荐




所有评论(0)