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 管理界面直观查看集合状态、索引状态和检索结果

相关页面