在亿级嵌入向量场景下,传统内存索引如 HNSW 内存消耗过高,无法经济扩展。Milvus 的 DiskANN 磁盘索引基于 Vamana 图,仅需原始数据 1/10 内存,即可实现 HNSW 1/3-1/2 性能,支持 L2/IP 度量,适用于 NVMe SSD 环境。通过混合多向量过滤(稠密 + 稀疏 + 标量)和 Kubernetes 云原生分片,构建低成本、高可用 ANN 搜索引擎。
DiskANN 核心优势在于将索引置于磁盘,内存仅缓存 PQ 码表与热点节点。构建时,IndexNode 从 MinIO 拉取 segment 数据(默认 max 2GB),预处理后本地生成索引文件,包括原始向量与邻接表(1.5-2 倍磁盘占用)。搜索流程:加载 PQ(1/8 数据内存)、warmup 采样点、beamwidth=4 IO 迭代扩展 search_list(默认 100),召回率 >95% 时延迟 <10ms(千万级数据)。参数调优示例:在 milvus.yaml 设置 DiskIndex.MaxDegree=56(图度数,召回↑构建时间↑)、SearchListSize=100(候选列表)、PQCodeBudgetGBRatio=0.125(码表内存)、BeamWidthRatio=4(IO/CPU 比)。限制:float 向量(16-32768 维,推荐 ≤1024)、Ubuntu 18.04+、queryNode.enableDisk=true。相比 HNSW,DiskANN Build 需 1.7x segment 内存,否则分块合并性能降 50%。
混合多向量过滤提升召回精度,支持同一 collection 存储稠密(BERT 等)、稀疏(BM25/SPLADE)向量与标量(JSON/int/string)。搜索时,定义多向量字段(如 dense_embedding dim=768、sparse_embedding)、metric_type="L2/IP",结合 expr="category=='news' AND timestamp > 2025-01-01" 过滤。Milvus 2.5+ 融合全文搜索(BM25),hybrid_search () 参数:dense_weight=0.7、sparse_weight=0.3、rerank=true。示例代码:
from pymilvus import MilvusClient
client = MilvusClient(uri="milvus://localhost:19530")
res = client.hybrid_search(
collection_name="embeddings",
dense=[query_dense],
sparse=[query_sparse],
limit=10,
expr="user_id == 123",
output_fields=["text", "score"]
)
多向量场景下,RAG 召回更全面:稠密语义 + 稀疏关键词 + 标量元数据,QPS 达 5k(16 核机)。
云原生分片利用 Kubernetes 部署,实现存储 / 计算分离:Proxy(接入)、QueryNode(搜索,replicas=3)、DataNode(写入)、IndexNode(构建)。分片基于主键哈希,默认 2 VChannels/segment,水平扩展 QueryNode 应对读重载。HA 通过 replicas(data/replica=2)、coordinator_ha 实现。Helm 部署参数:--set dataNode.replicas=4 --set indexNode.resources.requests.memory=32Gi(Build 需求)。监控:Prometheus 采集 qps、latency、disk_io(NVMe IOPS>100k)、cache_hit(>80%)、segment_sealed(<1k)。分片策略:调大 dataCoord.segment.diskSegmentMaxSize=4GB 减 segment 数,提升图算法效率。
落地清单:
- 环境:K8s 1.25+、NVMe SSD(IOPS 500k+)、Milvus 2.4+ Helm install。
- Schema:fields=[id(INT64 primary), dense(FLOAT_VECTOR,768), sparse(SPARSE_VECTOR), metadata(JSON)],enable_dynamic_field=true。
- 索引:client.create_index ("dense", {"index_type":"DISKANN", "metric_type":"L2"});稀疏用 INVERTED。
- 插入:batch_size=1M,preload_collection () 热加载。
- 查询:search_list=40(召回 / 延迟平衡)、topk=100、annsp=2(GPU 时)。
- 运维:Birdwatcher 调试、Attu GUI、PromQL alert ("disk_io> 80%")。
- 回滚:切换 HNSW(drop_index + create_index),A/B 测试召回 @10 >90%。
风险:高 IO 场景下 SATA SSD 延迟翻倍,回滚至 IVF_PQ;动态数据多用 growing segment,compaction_interval=10min。参数基准:1 亿向量,QPS 2k、P99 15ms、内存 64GB / 节点。
资料来源:Milvus GitHub(https://github.com/milvus-io/milvus),官方文档 DiskANN/Hybrid Search 章节。
(正文 1250 字)