
在向量搜索的世界中,我们使用向量嵌入 (vector embeddings)——由机器学习模型 (Machine Learning models) 生成——来表示数据对象(文本、图像、音频等)。这里的关键思想是,语义上相似的嵌入彼此之间的距离更小。
我们可以使用向量距离函数 (vector distance functions),例如欧几里得距离或余弦距离,来确定这些对象是否与其他集合中的对象相似。但是,要做到这一点,我们需要比较查询向量与集合中的每个向量之间的距离。这种类型的计算很难扩展到数百万或数十亿个向量。
这就是我们拥有向量数据库 (Vector Databases)和向量库 (Vector Libraries) 的原因。它们都使用近似最近邻 (ANN) 算法来搜索向量,速度提高了几个数量级。您可以从“为什么向量搜索如此快速”中了解更多相关信息。
重要问题
那么,如果向量数据库和向量库都可以有效地搜索您的向量,它们之间的主要区别是什么?您应该在什么情况下选择其中一个?
向量库
向量库将向量嵌入存储在内存索引中,以便执行相似性搜索。大多数向量库具有以下特征:
- 它们只存储向量,
- 索引数据是不可变的,
- 导入期间的查询限制
仅存储向量
向量库仅存储向量嵌入,而不存储生成它们的关联对象。
当您运行查询时,向量库将响应相关的向量和对象 ID。这具有局限性,因为实际信息存储在对象中,而不是 ID 中。为了解决这个问题,您需要在二级存储中存储对象。然后,您可以使用查询返回的 ID 将它们与对象匹配,以理解结果。
不可变数据
向量库生成的索引是不可变的。这意味着一旦您导入数据并构建索引,就无法进行任何修改(没有新的插入、删除或更改)。要对索引进行任何更改,您需要从头开始重新构建它。
导入期间的查询限制
大多数向量库在导入数据时无法进行查询。需要先导入所有数据对象,然后才能构建索引。这对于需要导入数百万甚至数十亿个对象的应用程序来说可能是一个问题。
向量库示例
有很多库可供选择——Facebook Faiss、Spotify Annoy、Google ScaNN、NMSLIB 和 HNSWLIB。这些库允许用户使用 ANN 算法执行向量相似性搜索。
ANN 算法根据向量库的不同实现方式而有所不同。Faiss 使用聚类方法,Annoy 使用树,ScaNN 使用向量压缩。每种方法都有性能权衡,您可以根据您的应用程序和性能指标进行选择。
示例用例
向量库通常用于数据不发生变化的应用。例如,学术信息检索基准旨在测试在静态快照数据上的性能。将 ANN 索引插入到生产就绪型应用程序时,数据库提供了库中没有的许多吸引人的功能。

向量数据库
向量数据库与库的主要区别之一是能够存储和更新数据。向量数据库具有完整的CRUD(创建、读取、更新和删除)支持,可以解决向量库的限制。此外,数据库更侧重于企业级生产部署。
存储向量和对象
数据库可以存储数据对象和向量。由于两者都已存储,您可以将向量搜索与结构化过滤器结合使用。过滤器允许您确保最近的邻居与元数据中的过滤器匹配。这里有一篇文章介绍了过滤分层可导航小世界 (HNSW)搜索对召回率和延迟的影响。
CRUD 支持
向量数据库解决了向量库的一些限制。一个例子是在创建索引后能够添加、删除或更新索引中的条目。这在使用不断变化的数据时特别有用。
实时搜索
与向量库不同,数据库允许您在导入过程中查询和修改数据。
在您上传数百万个对象时,导入的数据仍然完全可访问和可操作,因此您无需等待导入完成即可开始使用已导入的内容。
请注意,您的查询不会返回尚未导入的任何对象,因为您无法查询您没有的内容。🤔
Weaviate
Weaviate 是一个开源向量数据库。如果您是 Weaviate 的新手,请查看快速入门指南。🙂
HNSW 图是 Weaviate 支持的第一个 ANN 算法实现。 这里有一个基准测试,用于衡量 Weaviate 的 ANN 性能,适用于不同的用例。
Weaviate 的构建旨在结合 ANN 算法的速度和功能与数据库的特性,例如备份、实时查询、持久性和复制(v1.17 版本的一部分)。Weaviate 可以通过 GraphQL、REST 和多种编程语言的客户端库进行访问。
示例用例
如果您的数据不断变化,向量数据库非常适合您的应用程序。您可以使用向量搜索引擎进行电子商务推荐、图像搜索、语义相似性等等。Weaviate 刚刚发布了一个新模块,它引入了一种通过绘制交叉引用图来表示用户兴趣的方式。有关此新功能的更多信息,请阅读 Connor Shorten 的这篇博客文章。
Weaviate 还在 GitHub 上提供许多示例用例。找到您最喜欢的示例,点个赞,然后尝试自己重现它!
功能比较 - 库与数据库
下表总结了向量库和数据库之间的差异。这绝不是功能的详尽列表,而且并非每个库或数据库都具有相同的特性。
| 功能 | 向量库 | 向量数据库 (以 Weaviate 为例) |
|---|---|---|
| 过滤(与向量搜索结合) | 否 | 是 |
| 可更新性 (CRUD) | 否(有些有,例如 hnswlib) | 是 |
| 增量导入,并发读取,同时导入 | 否(有些有,例如 hnswlib) | 是 |
| 存储对象和向量 | 否 | 是 |
| 速度 | 通常比完整的数据库更快 | 通常比纯库慢 |
| 性能优化 | 内存相似性搜索 | 端到端调用堆栈,包括:向量搜索、从持久存储检索对象、可选的反向索引过滤、网络请求等。 |
| 持久性、崩溃恢复 | 否 | 是 |
| 持久性 | 仅在显式快照时 | 立即(每次插入、更新或删除后) |
| 分片(即在多台机器之间分配数据集,并在查询时自动合并/聚合机器之间的结果) | 否(有一些第三方项目围绕现有库构建分片) | 是 |
| 复制 | 否 | 是(从 v1.17 开始) |
| 自动备份(即到云存储和从云存储) | 否 | 是 |
| 部署生态系统(Docker、K8s、Helm、SaaS) | 否(您必须自己构建它) | 是 |
| SDK / 语言客户端 | 否(尽管大多数都有 python 绑定) | 是(Python、Java、JS、Golang) |
| 执行 | 嵌入式(可以转换为独立服务,如果您围绕它构建一个简单的包装器应用程序) | 独立服务 |
| 与应用程序的通信 | 外部函数接口 (FFI) / 语言绑定 | 网络调用(HTTP、gRPC 等) |
| 多租户 | 否 | 是 |
| 存储对象的任意聚合 | 否 | 是 |
| 模块生态系统(例如,向量化、问答) | 否(必须自己构建它) | 是 |
| 混合 BM25 + 密集向量搜索 | 否 | 是(从 v1.17 开始) |
资源
如果您有兴趣了解更多关于向量数据库和向量库的信息,请查看以下资源
- 收听这个 播客,与 Meta AI 科学家 Matthijs Douze 和 Weaviate 的 Abdel Rodriguez、Etienne Dilocker 以及 Connor Shorten 一起讨论 Facebook Faiss、ANN 搜索的向量量化等等。
准备开始构建了吗?
请查看 快速入门教程,或使用 Weaviate Cloud (WCD) 的免费试用版构建令人惊叹的应用程序。