概念介绍:Milvus 到底解决什么问题
概念介绍:Milvus 到底解决什么问题
Milvus 是一个开源的向量数据库,专门用来存储和检索由 embedding 模型生成的高维向量。传统数据库靠精确匹配找数据,比如 WHERE title = 'Milvus 教程';而向量数据库靠相似度找数据——把一段文字、一张图片、一段音频交给 embedding 模型变成一串浮点数,再让数据库找出「和这串数最接近的另外几串数」。这件事的学名叫近似最近邻检索(ANN,Approximate Nearest Neighbor)。
为什么需要「近似」?因为精确检索要把查询向量和库里每一条向量都算一遍距离,数据量上到百万、千万级时延迟无法接受。Milvus 的思路是提前为向量建索引,把向量空间划分成若干区域或组织成图结构,检索时只探查一小部分候选,用极小的精度损失换取数量级的延迟下降。这个「精度换速度」的旋钮,是后面所有索引参数(nlist、nprobe、ef 等)在调的东西。
在 RAG(检索增强生成)架构里,Milvus 承担的是召回层:用户提问先被 embedding 成向量,去 Milvus 里召回最相关的若干段文档,这些段落拼进 prompt 再交给大模型生成答案。召回层的质量直接决定最终答案的上限——召回错了,模型再强也答不对。所以选型时要关心的不是「数据库跑得多快」,而是「给定延迟预算,recall 能做到多少」。
另外要分清一件事:Milvus 只负责存向量、算距离、返回结果,它不做 embedding。生成向量的模型(比如各种文本 embedding、CLIP 之类的多模态模型)是独立的一环,必须在写入和查询两侧使用同一个模型、同一个版本、同一个维度,否则向量空间对不上,检索结果会完全错乱。
与 pgvector / Qdrant / Elasticsearch 向量检索的区别
这四者常被放在一起比较,但它们的定位差别很大,取舍主要看数据规模、团队技术栈和运维能力。
| 方案 | 定位 | 适合 | 不适合 |
|---|---|---|---|
| Milvus | 专用分布式向量数据库,存算分离 | 亿级向量、多租户、需要 GPU 索引、需要独立扩缩容 | 只有几万条向量的小项目,运维成本偏高 |
| pgvector | PostgreSQL 扩展,向量只是多一种列类型 | 已有 Postgres、数据量在千万级以内、想用 SQL 事务和 join 一起管 | 超大规模、需要多种索引类型和分布式水平扩展 |
| Qdrant | Rust 写的向量数据库,单二进制部署轻 | 中小规模、想要简单部署、过滤条件复杂 | 需要和大量关系型数据做关联查询 |
| Elasticsearch / OpenSearch | 搜索引擎加了向量字段(dense_vector) | 已经用 ES 做全文检索,想混合 BM25 与向量做混合排序 | 纯向量场景,资源占用和成本都不划算 |
一个常见的落地路径是:先用 pgvector 或 Milvus Lite 快速验证效果,确认召回的 recall 达标、业务价值成立之后,再迁移到 Milvus Standalone 或 Distributed 扛量。迁移成本主要在 schema 与索引参数的重建,向量本身是通用的 float 数组,搬起来不难。
核心术语表
Milvus 的数据模型和关系型数据库有不少同名但含义不同的概念,先把这张表看懂,后面看官方文档和 API 会顺很多。
| 术语 | 含义 | 动手时要注意的点 |
|---|---|---|
| collection | 一组向量的集合,概念上类似关系库里的表 | 建 collection 时就要确定向量维度与 schema,维度一旦定下不能改,改维度只能新建 collection 再导数据 |
| field | collection 里的一列,分为主键字段、向量字段、标量字段 | 主键可以是 INT64 或 VARCHAR;标量字段用于过滤,向量字段用于检索 |
| schema | 字段定义的整体描述,包含字段名、类型、是否主键、最大长度等 | 只有主键和向量字段是必需的,其余标量字段按业务加;开启动态字段后可以写 schema 里没定义的键 |
| index | 为向量字段(或标量字段)建立的加速结构 | 不建索引也能插入数据,但检索会退化成暴力扫描;建索引后要等 building 完成再查 |
| partition | collection 内部按业务维度切分的物理子集 | 检索时可以指定 partition_names 收窄范围,减少扫描量;分区数量不宜过多,否则元数据开销上升 |
| segment | Milvus 内部存储与检索的最小单元,数据写入后先落成 growing segment,再被 compaction 合并成 sealed segment | 频繁小批量写入会产生大量碎片 segment,拖慢查询,建议攒批写入 |
| consistency level | 读写一致性级别,决定查询能看到多新的数据 | Strong 保证读到最新,延迟高;Eventually 延迟低但可能漏掉刚写入的数据 |
| metric type | 度量两个向量「有多像」的数学方式,如 L2、IP、COSINE | 查询时的 metric type 必须和建索引时一致,否则结果无意义甚至直接报错 |

