Skip to content

Milvus

Milvus 是一个开源向量数据库,专门为 AI 应用的相似度搜索设计。与关系型数据库按精确值匹配数据不同,向量数据库通过计算高维空间中向量的距离来寻找语义上最相似的结果——图像通过 CNN 编码成 512 维向量,文本通过 BERT 编码成 768 维向量,语义相似的实体在向量空间中距离更近,这就是向量检索的基础。

Milvus 采用存算分离架构,既支持大规模分布式集群部署,也提供单机轻量级版本(Milvus Lite)。它直接使用 gRPC 协议通信,不实现 SQL 语法,减少了解析开销,符合现代数据库的设计理念。Milvus 底层依赖 etcd 做元数据存储、MinIO/S3 做对象存储、Pulsar/Kafka 做消息队列,这些外部组件的组合使其架构清晰、易于水平扩展。

相似度度量

相似度度量衡量两个向量之间的接近程度,选择合适的度量直接影响检索精度。常见度量如下:

欧氏距离(L2 Distance)计算向量各维度差的平方和再开方:d(x,y)=i=1d(xiyi)2,值越小表示越相似,适合通用场景。

内积(Inner Product)计算向量各维度乘积之和:sim(x,y)=i=1dxiyi,值越大表示越相似,适合向量已经归一化的场景(此时内积等价于余弦相似度)。

余弦相似度(Cosine Similarity)计算向量夹角的余弦值:sim(x,y)=xyxy,值域 [-1, 1],越大越相似,适合文本检索场景,因为文本向量的模长可能与文档长度相关,而余弦相似度消除了模长的影响。

汉明距离(Hamming Distance)用于二值向量,计算两个向量不同维度的个数,值越小越相似,常用于指纹识别和哈希特征匹配。

Schema 设计

Milvus 引入了传统 SQL 数据库中没有的向量数据类型。在一个 Collection(类似关系数据库的表)中可以定义多个向量字段和标量字段,并支持动态 Schema。

Milvus 支持三大类型的字段。主键类型包括 Int64 和 VARCHAR,每个 Collection 必须有且仅有一个主键。标量类型覆盖数值型(BOOL、INT8、INT16、INT32、INT64、FLOAT、DOUBLE)、字符串型(VARCHAR,需预设 max_length)、数组型(Array<T>,如标签数组 ["C", "Python", "Embedded"])和 JSON 型(支持对 JSON 内部键值的逻辑查询)。

向量类型是 Milvus 的核心,包含

类型维度限制适用场景
FloatVector通常 128~32768最主流。用于存储 OpenAI、BGE、Gemini 等模型生成的浮点数嵌入。
Float16Vector半精度 (2 bytes)节省 50% 显存/内存,适合对精度不极度敏感的大规模检索。
BFloat16VectorBrain Float16专门为现代 AI 加速器(如 NVIDIA 显卡)优化的截断浮点格式。
BinaryVector位向量 (0/1)极速。常用于指纹识别、哈希特征或极轻量级的 Embedding。
SparseVector稀疏向量2026 热门。用于关键词匹配(BM25 向量化),实现语义+关键词的“混合搜索”。

Schema 设计的工程经验:主键选择 Int64 比 VARCHAR 性能更好,因为整数比较比字符串比较快且存储紧凑。标量字段不宜过多——Milvus 的标量过滤能力不如传统数据库,复杂的业务过滤条件更适合在应用层或使用外部数据库预处理。向量维度直接影响索引大小和搜索延迟,在精度允许的情况下,可以考虑对高维向量做降维处理(如 PCA)后再入库。