一、环境准备

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

端口说明:

端口协议作用
19530gRPC向Milvus插入向量、查询向量、管理集合等操作
9091HTTP状态监控、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),查询时只搜索部分聚类。

流程:

  1. 数据被划分为多个 cluster(nlist)
  2. 查询时只访问部分 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)
  • ✅ 查询速度快
  • ❌ 内存占用高

对比

索引类型召回率速度内存适用场景
FLAT100%小数据
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)

流程:

  1. 先召回 TopK(Milvus / ES)
  2. 使用 rerank 模型重新排序

👉 常见方式:

  • Cross Encoder
  • RRF(融合排序)
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐