Milvus
开源分布式向量数据库,支持稠密向量 + BM25 稀疏向量混合检索,是生产级 RAG 系统的主流基础设施选择
简介
Milvus 是一个开源的分布式向量数据库,专为大规模向量相似度搜索设计。它支持稠密向量(FloatVector)和稀疏向量(SparseFloatVector)的混合存储与检索,配合 RRF(Reciprocal Rank Fusion)融合策略,构成生产级 RAG 系统中最常见的”语义 + 关键词”混合检索方案。Milvus 2.5.x 版本是当前主力版本,提供 IVF_FLAT、HNSW 等多种索引类型,支持 COSINE、L2、IP 等多种距离度量。
关键信息
| 项目 | 内容 |
|---|---|
| 类型 | 开源向量数据库 |
| 当前版本 | 2.5.x |
| 核心能力 | 稠密向量 + 稀疏向量混合检索 |
| 索引类型 | IVF_FLAT、HNSW、IVF_SQ8 等 |
| 距离度量 | COSINE、L2、IP |
| 管理界面 | Attu(官方 Web UI) |
| 部署方式 | Docker Compose / Kubernetes / Zilliz Cloud |
核心特性
混合索引架构
Milvus 集合的典型字段设计:
rag_chunks 集合:
id - VarChar(主键)
document_id - VarChar(分区键,按文档隔离)
content - VarChar(原文文本)
dense_vector - FloatVector(稠密语义向量,dim=1024)
sparse_vector- SparseFloatVector(BM25 稀疏关键词向量)
chunk_index - Int64(分块序号)
metadata - JSON(headerPath、section_title 等)
doc_type - VarChar(文档类型,用于过滤)
source - VarChar(来源标识)
author - VarChar(作者标识)设计意图:稠密向量捕获语义相似性,稀疏向量补强关键词精确匹配;两者通过 RRF 融合是生产 RAG 的标准组合。
索引创建规则
# 正确写法:params 传对象
collection.create_index(
field_name="dense_vector",
index_params={
"index_type": "IVF_FLAT",
"metric_type": "COSINE",
"params": {"nlist": 1024} # ← 必须是 dict,不能 JSON.stringify
}
)关键陷阱:params 必须传 Python dict 对象,不能序列化为 JSON 字符串传给 extra_params,否则 Milvus Go 后端反序列化失败,索引静默未建——无报错,检索返回 0 条。
分区键设计
document_id 作为分区键(partition key),实现按文档隔离检索。上传同一文档时应复用 document_id,避免重复创建记录导致列表出现两条同名文档。
不同素材中的观点
来自 2026-05-31-woshipm-100rmb-production-rag:
- 天涯轩在 100 元 RAG 实验中使用 Milvus 2.5.x 作为向量存储层,配置稠密 1024 维 + BM25 稀疏向量的混合索引
- 最隐蔽的故障是向量维度不一致:Schema 写 3072 维但实际 Embedding 返回 1024 维,Milvus 不报错但检索静默返回 0 条
- 索引参数格式错误(JSON.stringify 给 extra_params)导致索引静默未建,排查耗时远超预期
- Milvus 直接 search Top5 分数范围 0.26–0.45(通义 v3),说明 COSINE 分数分布因模型而异,不能照搬海外模型阈值
实用信息
安装方式
# Docker Compose 一键启动
docker compose up -d # 包含 Milvus + etcd + MinIO + Attu 管理界面适用场景
- 生产级 RAG 系统:需要混合检索(语义 + 关键词)的知识库问答
- 大规模向量检索:百万级以上向量的高效 ANN 搜索
- 多格式文档入库:PDF/Word/Excel/HTML/Markdown 等混合格式的企业文档库
- 需要元数据过滤的检索:按文档类型、来源、作者等维度过滤检索范围
不适用场景
- 简单原型验证(可用 FAISS 或 ChromaDB 替代,更轻量)
- 纯关键词检索场景(传统数据库 + 全文索引更高效)
- 嵌入式 / Serverless 场景(Milvus 是分布式架构,Zilliz Cloud 提供 Serverless 版)
运维注意事项
- 启动时必须检查索引是否存在,避免”集合有数据但无索引”的静默失败
- 变更 Embedding 模型后必须 dropCollection 重建并重新入库,因为维度变更需要重建索引
- 建议配合 Attu 管理界面直观查看集合状态、索引状态和检索结果