在大模型时代RAGRetrieval-Augmented Generation检索增强生成已经成为知识问答、智能客服、企业知识库等场景的标配方案。而 RAG 的核心正是向量数据库。本文将带你系统了解开源分布式向量数据库 Milvus从架构、核心概念到索引选型一文掌握。一、为什么是 MilvusMilvus 是由 Zilliz 开源的分布式向量数据库专为大规模向量检索场景设计。在众多向量数据库Faiss、Chroma、Weaviate、Pinecone 等中Milvus 凭借以下优势成为生产环境的主流选择优势说明高性能检索支持十亿级向量毫秒级响应弹性扩展计算与存储分离按需扩缩容生态完善全面对接 LangChain、LlamaIndex、Dify 等主流 RAG 框架多索引支持FLAT、IVF、HNSW、SCANN、DISKANN 等全家桶云原生容器化部署K8s 友好二、Milvus 架构总览Milvus 采用高度解耦的分层架构每一层都可以独立扩展整体架构如下图所示整体可以拆解为四大组件① Proxy接入层客户端 SDK 的入口负责请求路由、负载均衡、结果聚合无状态可水平扩展② Coordinator协调层集群大脑负责元数据管理、负载均衡、节点注册处理 DDL建表、建索引、DCL权限类请求③ Workers执行层Streaming Nodes处理实时数据流的写入Query Nodes负责向量检索查询Data Nodes负责数据持久化、索引构建、Compaction④ Durable Storage存储层Meta Storageetcd存放集群元信息WAL预写日志Pulsar / Kafka / Woodpecker保证写入可靠性Object StorageMinIO / S3 / 阿里 OSS / GCS存放向量数据和索引文件这种无状态计算 共享存储的架构是 Milvus 能够弹性扩展、应对海量数据的关键。三、核心概念速览在动手之前先建立基本的概念模型。可以把 Milvus 类比为关系型数据库Milvus 概念类比 MySQL说明Database数据库逻辑隔离单元多租户场景常用Collection表向量数据的容器有固定 SchemaField列主键、向量字段、标量字段Entity行一条完整数据记录Partition分区集合的子集加速查询Index索引加快向量检索的核心1. Database数据库组织和管理数据的逻辑单元用于不同应用或租户的数据隔离。2. Collection集合向量数据存放的容器相当于关系数据库的表所有向量按业务存储在 Collection 里每个 Collection 有固定的 Schema增删改查都基于 Collection 操作3. Field字段一个 Collection 包含三类字段主键字段必须唯一标识一条数据向量字段必须需指定维度dim标量字段可选int / string / bool 等用于过滤4. Entity实体一行完整记录 主键 ID 向量 标量字段。5. Vector向量一组浮点数数组例如[0.1, 0.2, 0.3, ..., 0.768]。由 Embedding 模型如 BGE、OpenAI text-embedding将文本、图片、音频转换得到。常见维度768、1024、1536。6. Partition分区分区是 Collection 的子集。创建 Collection 时会默认生成_default分区。合理使用分区可以缩小扫描范围、显著加速查询例如按租户、按时间分区。7. Index索引没有索引的向量检索 全表暴力扫描对百万级数据基本不可用。索引的设计是 Milvus 的核心下一节我们重点展开。四、索引选型Milvus 的核心战场Milvus 提供了多种索引类型每种都有自己的设计哲学和适用场景。下面逐一拆解。1. FLAT —— 暴力精准型原理保留原始向量查询时与每个向量逐一比对没有任何近似。特点精度 100%但速度最慢。适用小数据集10 万以内、对精度要求极高的场景。# 建立索引 index_params.add_index( field_nameyour_vector_field_name, # 向量字段名 index_typeFLAT, # 索引类型 index_namevector_index, metric_typeL2, # L2 距离 params{} # FLAT 不需要额外参数 ) # 在索引上搜索 res MilvusClient.search( collection_nameyour_collection_name, anns_fieldvector_field, data[[0.1, 0.2, 0.3, 0.4, 0.5]], # 查询向量 limit3, # TopK search_params{params: {}} )2. IVF_FLAT —— 分桶聚类型原理先用 K-Means 把向量聚类成nlist个桶查询时只搜索最相近的nprobe个桶。形象比喻如果把向量比作书籍IVF 就是把书按类别放到不同书架上。查询时不再翻遍整个图书馆只去最相关的几个书架。nlist分多少书架nprobe查多少书架特点速度快、精度可控是最常用、最平衡的索引。适用百万级常规业务。# 建立索引 index_params.add_index( field_nameyour_vector_field_name, index_typeIVF_FLAT, index_namevector_index, metric_typeL2, params{ nlist: 64, # nlist 越大分区越多单桶数据少 → 查得快但可能漏 } ) # 在索引上搜索 search_params { params: { nprobe: 10, # nprobe 越大越准但越慢越小越快但容易漏 } } res MilvusClient.search( collection_nameyour_collection_name, anns_fieldvector_field, data[[0.1, 0.2, 0.3, 0.4, 0.5]], limit3, search_paramssearch_params )3. IVF_SQ8 —— 压缩省内存型原理在 IVF_FLAT 基础上对向量做标量量化Scalar Quantization压缩每个浮点数从 32bit 压缩到 8bit。特点内存占用减少4 倍精度略有损失通常 2%。适用海量数据、内存吃紧的场景。# 建立索引 index_params.add_index( field_nameyour_vector_field_name, index_typeIVF_SQ8, index_namevector_index, metric_typeL2, params{ nlist: 64, } ) # 在索引上搜索 search_params {params: {nprobe: 8}} res MilvusClient.search( collection_nameyour_collection_name, anns_fieldvector_field, data[[0.1, 0.2, 0.3, 0.4, 0.5]], limit10, search_paramssearch_params )4. HNSW —— 图结构最强型原理构建一张分层导航小世界图Hierarchical Navigable Small World。每个向量节点与若干邻居相连查询时从顶层稀疏图开始跳跃式搜索逐层下钻到底层。形象比喻像现实中的高速路网先走高速跨城市再走国道跨区最后走小路到门口。特点查询最快、精度最高但内存占用大、构建慢。适用在线高并发、低延迟接口、内存充裕的场景。# 建立索引 index_params.add_index( field_nameyour_vector_field_name, index_typeHNSW, index_namevector_index, metric_typeL2, params{ M: 64, # 每个节点的最大邻居数 efConstruction: 100 # 构建索引时考虑的候选邻居数 } ) # 在索引上搜索 search_params { params: { ef: 10, # 搜索时考虑的邻居数越大越准越慢 } } res MilvusClient.search( collection_nameyour_collection_name, anns_fieldvector_field, data[[0.1, 0.2, 0.3, 0.4, 0.5]], limit10, search_paramssearch_params )5. SCANN —— 全能均衡型原理谷歌出品集 IVF 量化 图索引于一身像 IVF 一样粗分区缩小搜索范围像 SQ8 一样量化压缩控制内存在分区内部构建小型图结构精细检索最后通过reorder_k用原始向量重排序找回精度特点速度、精度、内存三者最平衡。适用高召回场景、推荐系统、语义搜索。# 建立索引 index_params.add_index( field_nameyour_vector_field_name, index_typeSCANN, index_namevector_index, metric_typeL2, params{ with_raw_data: True, # 是否存储原始向量用于精确重排序 } ) # 在索引上搜索 search_params { params: { reorder_k: 10, # 重排序阶段细化的候选数量 nprobe: 8 # 搜索的分区数 } } res MilvusClient.search( collection_nameyour_collection_name, anns_fieldvector_field, data[[0.1, 0.2, 0.3, 0.4, 0.5]], limit10, search_paramssearch_params )6. DISKANN —— 磁盘级低成本型原理把向量本体存放在SSD 磁盘上内存中只保留导航图结构。用磁盘换容量。特点内存极省依赖高速 SSD速度略弱于 HNSW远超 IVF 系列。适用超大规模向量库十亿级以上、低成本扩容场景。⚠️ 注意Milvus 默认禁用 DISKANN需要在配置中开启。# milvus.yaml 配置 common: DiskIndex: MaxDegree: 56 # 每个向量最多连多少邻居 SearchListSize: 100 # 搜索时的候选数 PQCodeBudgetGBRatio: 0.125 # 向量压缩比例压到 1/8 SearchCacheBudgetGBRatio: 0.1 # 内存缓存预算 BeamWidthRatio: 4 # 磁盘读取并发度索引选型速查表业务场景推荐索引关键理由数据量小10万、追求绝对精准FLAT暴力比对无损常规业务百万级向量IVF_FLAT平衡好用工业常青海量向量内存紧张IVF_SQ8量化压缩省内存在线高并发接口低延迟HNSW速度精度双高吃内存海量数据高召回需求SCANN全能选手工程友好十亿级向量低成本扩容DISKANNSSD 换内存性价比之王五、相似度量Metric Type索引解决了怎么查得快度量方式解决了怎么定义相似。Milvus 支持三种主流度量度量方式含义数值规律适用场景L2欧氏距离向量空间直线距离越小越相似通用图像特征IP内积向量关联程度越大越相似推荐系统、未归一化向量COSINE余弦向量方向夹角不关注长度越大越相似文本语义检索最常用 经验文本 RAG 场景默认用 COSINEBGE、OpenAI 等主流 Embedding 模型都是基于余弦相似度训练的。六、向量检索Search有了向量、索引和度量方式检索流程就非常清晰了业务请求 → 文本/图片 → Embedding 模型 → 查询向量 ↓ Milvus按度量方式在索引中比对 ↓ 返回 Top-K 最相似结果一次典型的 RAG 检索流程用户提问Milvus 支持哪些索引通过 BGE 模型把问题转成 1024 维向量Milvus 在 Collection 中检索 Top-5 相似文档片段把检索结果拼到 Prompt 中喂给大模型大模型基于上下文生成最终答案七、写在最后Milvus 作为生产级向量数据库的代表其核心价值在于架构层面解耦设计支撑弹性扩展算法层面索引全家桶覆盖各类场景生态层面与 RAG 工具链深度集成对于刚入门 RAG 的开发者建议的学习路径从 IVF_FLAT 起步 → 数据量上来切 HNSW → 真海量场景再考虑 SCANN / DISKANN更深入的研究推荐直接阅读官方文档 https://milvus.io/docs/zh/如果这篇文章对你有帮助欢迎点赞、收藏、转发三连。