向量数据库产品横向对比

#dbms #ann

最近对向量数据库做了一些调研,这篇文章是结果的汇总,涵盖目前能找到的大部分具备向量检索能力的开源和商业产品。信息来源主要是各个产品公开的用户文档,不确定的地方标注了“?”。

数据模型

数据库数据模型多向量字段向量类型标量类型Schema-Free主键
Milvus表 + 向量float(4B)/binaryint/float/booluint64
vearch表 + 向量Yfloatstring/integer/long/float/doublestring
阿里云 ADB表 + 向量Y?float参考 MySQL/PG 类型
pgvector表 + 向量Yfloat(4B)参考 PG 类型
ES文档 + 向量Yfloat参考 ES 类型Ystring
Pinecone文档 + 向量float标量字段保存在 JsonYstring
qdrant文档 + 向量float标量字段保存在 JsonYuint64/UUID
vespa文档 + 向量Yfloat/int支持类型较多,参考文档string
weaviate文档 + 向量float支持类型较多,参考文档Y1UUID
vald向量floatN/AN/Astring

索引类型

向量相似性度量

数据库余弦L2(欧式)内积JaccardHammingL1(曼哈顿)PoincareLorentz其他
MilvusYYYYYY2
vearchYY
阿里云 ADB3YYY
pgvectorYYY
ESYYY
PineconeYYY
qdrantYYY
vespaYYY
weaviateYY4
vald5YYYYYYYY

索引算法

数据库FLATIVFSQ8PQHNSWRHNSWANNOYNSG
MilvusYYYYYYY?6
vearchYYYY
阿里云 ADB7YY
pgvectorY
ESY
Pinecone8
qdrantY
vespaY
weaviateY
vald9

查询

数据库brute-force10混合检索多向量查询sortaggregation
MilvusYY?11
vearchYYY12Y
阿里云 ADBYY?YY
pgvector?Y?YY
ES13Y
PineconeY
qdrantY
vespaY
weaviateY
vald

其他功能

数据库GPU标量索引特征提取多名字空间分布式托管服务开源Time Travel
MilvusYY14YYYY
vearchYYYYY
阿里云 ADBYY15YYY
pgvectorYYY
ESYYYY
PineconeYY
qdrantYYYY
vespaYYYY
weaviateYYYYYY
valdYY

总结

从产品形态上来看,大部分产品都是在表或者文档的基础上增加向量索引功能,真正把向量作为 first class citizen 的并不多。Milvus 算一个,Pinecone 和 qdrant 勉强可以算是,vald 虽然只存储向量,但是从产品成熟度上来讲差得还比较多。

在相似性度量方面,使用频率最高的是余弦、内积和欧式距离三种。索引算法中最常用的是基于图的 HNSW,因为它对数据的更新更友好,所以更适用于数据库产品。但是 HNSW 对存储空间的占用比较大,如果要把索引放在内存来提升查询性能的话,就不能不考虑这个问题。

在查询能力上,向量和标量的混合检索是一个很重要的功能。大部分产品都会在一定程度上提供支持,在以向量为 first class citizen 的产品中,通常是以属性过滤的形式,对向量查询的结果进行二次筛选。而其他产品(比如 Elastic Search)中,可能是根据标量字段进行检索,再用 brute force 的方式对向量字段进行排序。根据 Milvus 的论文,这两种方式它都是支持的,执行时会根据代价选择最合适的查询方式。

另外一个值得关注的功能是多向量查询,Milvus 在它的论文里特别强调了多向量查询的重要性,用了一节的内容来讨论这个问题。不过我对这个问题有点疑问。在需要多个向量的场景里,是不是可以把多个向量拼接成一个大的向量,转换成单向量的索引和查询来解决?

在其他一些能力上,我认为 GPU 加速是非常值得关注的。GPU 本身就是非常适合进行向量计算的,用它来加速向量索引的构建和查询,应该都有不错的效果。


  1. Weaviate 支持 auto-schema,可以不用手动创建 schema。 ↩︎

  2. Milvus 还支持 Tanimoto、SuperStructure、Subsctructure 三种相似性度量,都是用于衡量化学物质的相似性。 ↩︎

  3. ADB-PostgresQL 文档说只有 L2 距离支持索引查询,内积和汉明距离只支持暴力搜索。 ↩︎

  4. vespa 支持 Geodegree 相似性度量,也就是两个经纬度坐标之间的距离,这里是球面距离,而非平面上的欧式距离。 ↩︎

  5. vald 支持的相似性度量需要在服务配置中指定,不能动态变更。 ↩︎

  6. 这篇知乎文章上介绍说支持 NSG,但文档里没找到。 ↩︎

  7. 从文档来看,ADB 似乎是把 PQ 和 HNSW 两种算法结合在一起来使用了。 ↩︎

  8. Pinecone 文档没有给出使用的索引算法。 ↩︎

  9. vald 底层使用雅虎开源的 NGT 库,使用的算法为自己发表的ONNG、PANNG、ANNGT、ANNG 等。 ↩︎

  10. FLAT 索引等同于暴力搜索。其他索引算法都是有精度损失的,暴力搜索虽然慢,但是可以保证精度 100%。 ↩︎

  11. 论文里说支持,但是文档里没有。根据官网文档,Collection 只支持一个向量字段,不可能做多向量查询。根据这个 issue,多向量字段应该是新版本禁掉了。 ↩︎

  12. 多个向量字段同时查询,结果是各自查询结果的交集。 ↩︎

  13. 从文档看,knn search api 是不支持跟其他字段混合检索的,但是在普通查询中可以用 dense_vector 字段给文档打分,采用的是 brute force 检索方式。多向量查询也可以用自定义打分函数的方式实现。 ↩︎

  14. 根据论文中的说明,Milvus 的标量属性是以列存方式存储的,按值排序的,相当于索引了。 ↩︎

  15. 示例中有用到一些特征提取函数,不确定是否已经集成在产品里,但是可以支持注册用户自定义函数进行特征提取。 ↩︎