向量数据库对比:Weaviate、Milvus和Qdrant
RAG系统的成功在很大程度上取决于其高效地获取和处理海量信息的能力。向量数据库又在其中发挥了不可替代的作用,并构成了RAG系统的核心。向量数据库专门用于存储和管理高维向量数据,它们能把文本、图像、音频甚至视频转换为向量并存储(这一点将在后文中详细阐述)。RAG系统最终能实现的效果就取决于这些底层向量数据库的表现。
在众多向量数据库和向量库中,每个都有自己的一些特点,选择一个适合自己应用场景的也需要经过评估。本文中将深入探讨选择向量数据库用于RAG时需要考虑的关键因素,包括开源可用性、CRUD(增删查改)支持、分布式架构、副本支持、可扩展性、性能和持续维护等6方面。
目前,像Weaviate、Milvus、Qdrant、Vespa和Pinecone这样的专为向量设计的数据库在行业中极受关注。除此之外,还有一些诞生较早的向量库也又这种功能。本文还将对比各种向量库,如FAISS、HNSWLib、ANNOY,以及支持向量功能的SQL数据库,如pgvector和Supabase等。
利用Milvus实现的图片语义搜索1 向量库(FAISS、HNSWLib、ANNOY)
向量数据库与向量库的区别在于,向量库主要用于存储静态数据,其中索引数据是不可变的。这是因为向量库只存储向量嵌入,而不存储生成这些向量嵌入的关联对象。因此,与向量数据库不同,向量库不支持CRUD(创建、读取、更新、删除)操作。这意味着在FAISS或ANNOY等向量库中向现有索引添加新文档可能比较难做到。HNSWLib就是这个例外,它就有CRUD功能,同时独特地支持并发读写操作。但是它也难逃作为一个向量库的局限性,即不提供部署生态系统、复制实例的能力以及容错性。
2 全文搜索数据库(ElasticSearch,OpenSearch)
全文搜索数据库(例如ElasticSearch和OpenSearch)能支持比较全面的文本检索和高级分析功能。但是当涉及到执行向量相似性搜索和处理高维度数据时,它们与专门的向量数据库相比就不够强了。这些数据库往往需要与其他工具搭配使用才能实现语义搜索,因为它们主要依赖于倒排索引而不是向量索引。根据Qdrant的测试结果,Elasticsearch在与Weaviate、Milvus和Qdrant等向量数据库相比时,性能有所落后。
3 支持向量的SQL数据库(pgvector、Supabase、StarRocks)
像pgvector这样的SQL数据库通过它们的向量支持扩展,提供了一种将向量数据整合到现有数据存储系统中的方式,但与专用的向量数据库相比,它们也又一些明显的缺点。
最明显的缺点是,传统SQL数据库的关系模型与非结构化向量数据的本质之间存在不匹配。这种不匹配导致了涉及向量相似性搜索的操作效率低下,这类数据库在构建索引和处理大量向量数据时性能表现并不理想,详见ANN测试。此外,pgvector支持的向量维度上限(2000维)与像Weaviate这样的专用向量数据库相比显得较低,后者能够处理高达65535维的向量数据。在可扩展性和效率方面,专用向量数据库也更有优势。支持向量的SQL数据库扩展,例如pgvector,更适合于向量数据量较小(少于10万个向量)且向量数据仅作为应用程序的一个补充功能的场景。相反,如果向量数据是应用的核心,或者对可扩展性有较高要求,专用向量数据库就会是更合适的选择。
至于StarRocks,它是另一个运行在SQL框架之上的系统,它针对在线分析处理(OLAP)和在线事务处理(OLTP)场景进行了优化,但也没有专门针对向量相似性搜索进行优化。
4 支持向量的NoSQL数据库(Redis,MongoDB)
NoSQL数据库中新增加的向量支持功能尚属初级阶段,且尚未经过充分的测试验证。以Redis向量相似性搜索(VSS)为例,该功能刚于2022年4月对外发布,距今不足两年。Redis VSS虽然可以作为一个多功能数据库提供服务,但其并非专为向量相似性搜索而优化设计。
5 专用向量数据库(Pinecone、Milvus、Weaviate、Qdrant、Vald、Chroma、Vespa、Vearch)
专用向量数据库天生支持各种向量运算,如点积、余弦相似度等。这些数据库专为处理高维度数据而设计,能够应对大量查询请求,并能迅速完成向量间的相似性搜索。为了达到这些目标,它们采用了多种索引策略,通常基于近似最近邻(ANN)算法。这些算法需要在效率、存储空间占用和搜索准确性之间做权衡。比如,FLAT索引是一种不使用任何优化或近似技术的向量索引,意味着可以实现100%的召回率和精确度,但它也比其他类型的向量索引更慢且效率更低;相对而言,IVF_FLAT索引通过牺牲一些精确度,以换取更快的搜索速度;HNSW索引则在准确性和搜索速度之间提供了一个折中方案。
Pinecone是一个封闭源代码的向量数据库,由专业团队维护,其免费版本在可扩展性方面提供有限的功能。Chroma则是专门为音频数据设计的系统,但在处理文本数据方面并未进行特别优化。相较于其他主流的向量数据库,Chroma在综合性能基准测试方面的资料相对匮乏。由于Chroma在其0.4版本中采用SQLite作为文档存储方式,可能在可扩展性和效率上不及其他专为向量数据设计的存储方案。
Vearch和Vald在与Langchain的集成方面存在不足,这点对开发使用很不利。与Milvus等竞争者相比,它们的开发者社区规模较小,开源社区的维护也不够活跃。
因此,对于RAG来说,Weaviate、Milvus、Qdrant 和 Vespa可能是最好的几个选择。理论上来说,应该基于性能和可扩展性的基准测试(详见下文ANN Benchmarks ANN 基准测试)来选择最合适的系统。但是还有一些系统设计、功能特点也是需要对比的。下表就从这些方面进行了直观的对比。
数据库 | Qdrant | Weaviate | Milvus |
---|---|---|---|
开源且可自托管 | ✅ | ✅ | ✅ |
开源协议 | Apache-2.0 | BSD | Apache-2.0 |
开发语言 | Rust | Go | Go, C++ |
Github Stars | 17k | 9.2k | 26.2k |
首次发布时间 | 2021 | 2019 | 2019 |
SDK | Python, JS, Go, Java, .Net, Rust | Python, JS, Java, Go | Python, Java, JS, Go |
托管云服务 | ✅ | ✅ | ✅ |
内置文本嵌入 | ✅FastEmbed | ✅ | ❌ |
混合检索 | ❌ | ✅RRF*+RSF* | ✅表内多向量混合 |
元信息筛选 | ✅ | ✅ | ✅ |
BM25支持 | ❌ | ✅ | ✅ |
文本搜索 | ✅ | ✅ | ❌ |
单点多向量 | ✅ | ✅ | |
Tensor搜索 | ❌ | ❌ | ❌ |
Langchain集成 | ✅ | ✅ | ✅ |
Llama索引集成 | ✅ | ✅ | ✅ |
Geo地理信息搜索 | ✅ | ✅ | ❌ |
多租户支持 | ✅通过collections/metadata | ✅ | |
元信息和文档大小限制 | 无限制 | ||
最大维度 | 无限制 | 65535 | 32768 |
索引种类 | HNSW | HNSW | ANNOY, FAISS, HNSW, ScANN … |
流式索引 | ❌ | ||
稀疏向量支持 | ❌ | ❌ | ❌ |
临时索引支持(不含服务器) | ✅ | ❌ | |
分片 | |||
价格 | |||
Facets(带有计数的聚合) | ❌ | ✅ | |
内置图像嵌入 | ✅ | ||
推荐API | ✅ | ||
个性化 | |||
用户事件 | |||
调用内置LLM用于RAG | ✅Generative Search |
数据库 | Qdrant | Weaviate | Milvus |
---|---|---|---|
主观优点 | 1. 一个集合中可以存多种向量(图片、文字等) 2. 资源占用相当少 |
1. 性能相对不错 2. 支持内置嵌入 3. 支持文本搜索 4. GraphQL API 5. 支持S3备份 |
1. 官方支持的可视化操作界面 2. 较高的搜索准确率 3. 丰富的SDK 4. GPU加速 |
总结起来就是,Qdrant开销特别小,Weaviate支持向量搜索、对象存储和倒排索引的组合,Milvus性能最强、花活最多。
6 向量数据库的搜索方式对比
Milvus | Weaviate | Qdrant | |
---|---|---|---|
独特的搜索方式 | 多向量搜索 | BM25关键词搜索+混合搜索 | 关键词过滤应用于向量搜索 |
6.1 Milvus
Milvus支持两种类型的搜索,取决于集合中的向量字段数量:单向量搜索和多向量搜索。
单向量搜索使用search()方法,比较查询向量与集合中现有的向量,返回最相似实体的ID及其之间的距离,也可以选择性返回结果的向量值和元数据。
多向量搜索适用于有两个或更多向量字段的集合,通过hybrid_search()方法执行,该方法执行多个近似最近邻(ANN)搜索请求,并结合结果进行重排以返回最相关的匹配。(最新的2.4.x版本才支持,最多支持用10个向量搜索)
多向量搜索非常适用于需要高精度的复杂情况,特别是当一个实体可以通过多个不同的向量表示时。这适用于同一数据(如一个句子)通过不同嵌入模型处理,或当多模态信息(如个人的图像、指纹和声纹)转换成各种向量格式的情况。通过表范围内的“多路召回”,并给这些向量分配权重,它们的综合作用可以明显增加召回能力,并提高搜索结果的有效性。
其它基本的搜索操作:
- 基本搜索包括单向量搜索、批量向量搜索、分区搜索和带指定输出字段的搜索。
- 过滤搜索基于标量字段的过滤条件来细化搜索结果。
- 范围搜索找到与查询向量在特定距离范围内的向量。
- 分组搜索根据特定字段对搜索结果进行分组,以确保结果的多样性。
6.2 Weaviate
- 向量相似度搜索:涵盖一系列近似搜索方法,这类搜索寻找与查询向量表示最为相似的对象。
- 图像搜索:使用图像作为相似度搜索的输入。
- 关键词搜索:一个使用BM25F算法来排名结果的关键词搜索。
- 混合搜索:将BM25和相似度搜索结合起来对结果进行排名。
- 生成式搜索:使用搜索结果作为LLM的提示。
- 重新排序:使用重排序模块对检索到的搜索结果进行重新排序。
- 聚合:从结果集合中聚合数据。
- 过滤器:对搜索应用条件过滤。
6.3 Qdrant
支持的基本搜索操作:
- 按相关分数过滤
- 单次请求负载多个搜索操作
- 推荐API
- 分组操作
Qdrant支持的其它搜索方式:
Qdrant首先是一个向量搜索引擎,我们只在不影响向量搜索用例的情况下实现全文支持。这包括界面和性能。
Qdrant能做什么:
- 使用全文过滤器搜索
- 将全文过滤器应用于向量搜索(即,在具有特定单词或短语的记录中执行向量搜索)
- 做前缀搜索和语义即时搜索
Qdrant未来计划引入的功能:
- 支持稀疏向量,如在SPLADE或类似模型中使用的
Qdrant不打算支持的功能:
- BM25或其他非向量基础的检索或排名函数
- 内置本体论或知识图谱
- 查询分析器和其他NLP工具
- 相关性评分:
- 简单的关键词搜索通常基于词频:如果一个词在文档中出现,那么这个文档就被认为是相关的。这种方法可能只计算关键词的出现次数,并且所有关键词都被视为同等重要。
- BM25则采用更复杂的算法,不仅考虑词频,还考虑文档长度和词的逆文档频率(即在所有文档中的稀有程度)。这意味着BM25可以提供一个更为精细化的相关性评分,更好地反映查询与文档的匹配程度。
- 文档长度处理:
- 简单的关键词搜索可能不考虑文档的长度。这可能导致较长的文档(含有更多词语)被过分优先,仅仅因为它们有更多的机会包含关键词。
- BM25通过其算法内部的标准化过程考虑了文档的长度,避免了这种偏向性,确保了长短文档在相关性评分上的公平性。
- 查询词的重要性:
- 在简单的关键词搜索中,所有关键词可能被等同对待,无论它们的普遍性如何。
- BM25利用逆文档频率(IDF)来调整每个查询词的重要性。这意味着在较少文档中出现的词(更具唯一性的词)会给文档的相关性评分带来更大的影响。
- 参数调整:
- 简单关键词搜索通常没有太多的可配置参数来优化搜索结果。
- BM25提供了参数(如k1和b),允许对算法的敏感度进行细致调整,以适应不同类型的文本和搜索需求。
与简单的关键词搜索相比,BM25提供了一种更为复杂和精细化的方法来评估文档和查询之间的相关性,可以产生更准确、更符合用户期望的搜索结果。
目前比较困扰的是,有没有一种方案,既能获得向量数据库的语义搜索特性,又能获得传统关键词搜索的精准特性呢?
7 附录
7.1 ANN Benchmarks
基准测试会受到多种影响数据库性能的因素的干扰,如搜索类型(过滤搜索或常规搜索)、配置设置、索引算法、数据嵌入、硬件等。除了基准测试的性能表现,选用向量库更应当考虑到分布式能力、内存副本与缓存的支持、采用的索引算法、向量相似性搜索的能力(包括混合搜索、过滤以及多种相似性度量)、分片机制、集群方法、可扩展性潜力、数据一致性和系统的整体可用性等多个方面。
ANN-Benchmarks 是评估近似最近邻算法搜索性能的主要基准测试平台。在文本检索中,向量数据库在角度度量上的性能往往比其在欧几里得度量上的性能更为重要。这是因为角度度量对文本文档的语义相似性更为敏感,而欧几里得度量对文档的长度和规模更为敏感。因此,在考虑检索增强生成的上下文时,更需要关注评估向量数据库在跨越不同维度的角度数据集上的性能。
7.1.1 glove-100-angular
显而易见,Milvus在召回值低于0.95时有着最高的吞吐量。当召回值超过0.95,吞吐量的差距就缩小了。Vespa的构建时间最长。Weaviate和Milvus的构建时间相当,但Milvus略长一些。就索引大小而言,Weaviate的索引最小。尽管Milvus的索引最大,但它的索引也小于1.5GB(包含120万个向量的数据集,每个向量有100个维度)。7.1.2 nytimes-256-angular
这个数据集上的结果与glove-100-angular数据集的相似。Weaviate在这个数据集的构建时间最长、索引最小。Milvus的索引最大,但也仅有440MB(包含290,000个向量的数据集,每个向量有256个维度)。7.2 向量相似度指标
指标 | 描述 | 支持的数据库 |
---|---|---|
余弦距离 | 测量两个向量之间角度的余弦值 | pgvector, Pinecone, Weaviate, Qdrant, Milvus, Vespa |
欧几里得距离(L2) | 在多维空间中计算两个向量之间的直线距离 | pgvector, Pinecone, Qdrant, Milvus, Vespa |
内积(点积) | 计算向量对应分量的乘积之和 | pgvector, Pinecone, Weaviate, Qdrant, Milvus |
L2平方距离 | 两个向量之间的欧几里得距离的平方 | Weaviate |
汉明距离 | 测量每个维度上向量之间的差异数 | Weaviate, Milvus, Vespa |
曼哈顿距离 | 沿直角轴测量两个向量维度之间的距离 | Weaviate |
以下是每个指标的详细介绍,包括它们的相对优势、劣势,以及它们适合的使用场景。
7.2.1 余弦距离
余弦距离测量两个向量之间角度的余弦值,常用于处理归一化或凸集。
- 优点:主要考虑向量的方向,这使其非常适合于高维空间,例如文本比较,因为在该场景文档的长度不那么重要。
- 缺点:不适用于需要匹配向量维度的场景,例如在根据像素密度比较图像的嵌入时。如果数据没有形成凸集,可能无法提供准确的相似性度量。
余弦距离适用于文档分类、语义搜索、推荐系统以及任何涉及高维度和标准化数据的其他任务。在检索信息时,余弦距离通常用于衡量查询内容和文档向量之间的相似度,忽略它们的长度,但专注于语义含义。
7.2.2 欧氏距离 L2
欧氏距离计算多维空间中两个向量之间的直线距离,也叫二范数。
- 优点:直观、易于计算、对向量的大小和方向都敏感。
- 缺点:由于“维度灾难”,可能在高维空间中表现不佳。
适用于图像识别、语音识别、手写分析等场景。
7.2.3 内积
内积计算向量对应分量乘积的和,也叫n范数。
- 优点:计算速度快,能反映向量的大小和方向。
- 缺点: 除了对向量的方向敏感,还对向量的大小敏感
内积最经典的应用在推荐系统领域。在推荐系统中,内积可用于确定用户向量和物品向量之间的相似度,帮助预测用户对某物品的兴趣。内积适用于推荐系统、协同过滤、矩阵分解。
7.2.4 L2平方距离
两个向量之间的欧几里得距离的平方。
- 优点:惩罚向量元素之间的大差异,在某些情况可能有用。
- 缺点: 平方操作可能会扭曲距离,并且对异常值敏感。
L2平方距离特别适合用于个别维度的差异问题,比如在图像处理中,比较两张图片的不同。
7.2.5 汉明距离
测量每个维度上向量之间的差异数量。
- 优点:适用于比较二进制或分类数据。
- 缺点: 不适用与连续或者数值型数据
适用场景也比较特殊,比如错误检测与纠正(分类型数据);测量两条DNA链之间的遗传距离。
7.2.6 曼哈顿距离 L1
测量两个向量维度沿着直角轴之间的距离,也叫一范数。
- 优点: 比欧几里得距离更能抵抗异常值。
- 缺点:在几何意义上不如欧式距离直观。
适用于计算棋盘距离、物流规划中的最短路径问题。