基准测试常见问题解答
我们是否存在偏见?
可能存在。即使我们努力做到客观,我们也不是所有现有向量数据库的使用专家。我们构建 Qdrant,因此对其了解最多。因此,我们可能忽略了不同向量搜索引擎中的一些重要调整。
然而,我们已尽力做到最好,反复查阅文档,尝试了不同配置的组合,并给予所有引擎同等的表现机会。如果您认为可以做得比我们更好,我们的**基准测试已完全开源,欢迎贡献**!
我们测量什么?
在决定使用哪个数据库时,需要考虑几个因素。当然,其中一些支持不同的功能子集,这可能是做出决定的关键因素。但总的来说,我们都关心搜索精度、速度以及实现这些所需的资源。
有一点很重要——**只有在精度相同时,才能比较向量数据库的速度**。否则,它们可能会通过提供不准确的结果来最大化速度,这是每个人都宁愿避免的。因此,我们的基准测试结果仅在特定的搜索精度阈值下进行比较。
我们如何选择硬件?
在我们的实验中,我们不关注指标的绝对值,而是关注不同引擎之间的相对比较。重要的是我们对所有测试使用了相同的机器。在启动不同引擎之间会擦除机器状态。
我们选择了一台普通机器,您可以轻松地从几乎任何云提供商那里租用。不需要额外的配额或自定义配置。
为什么不与 FAISS 或 Annoy 进行比较?
FAISS 等库为向量搜索实验提供了很棒的工具。但它们距离生产环境的实际使用还有很远的距离。如果您在生产环境中使用 FAISS,最好的情况是您永远不需要实时更新它。最坏的情况是,您必须在其周围构建自定义封装层来支持 CRUD 操作、高可用性、横向扩展、并发访问等等。
一些向量搜索引擎甚至在底层使用 FAISS,但搜索引擎不仅仅是一个索引算法。
不过,我们确实使用了与著名的ann-benchmarks 项目相同的基准数据集,因此出于任何实际原因,您可以调整您的预期。
为什么我们决定使用 Python 客户端进行测试
关于运行基准测试的最佳技术,目前没有共识。您可以自由选择 Go、Java 或 Rust 等系统。但我们使用 Python 进行此测试主要有两个原因
- 在生成嵌入向量时,您很可能会使用 Python 和基于 Python 的机器学习框架。
- 根据 GitHub 星标数,Python 客户端是所有引擎中最受欢迎的客户端之一。
从用户的角度来看,关键在于使用特定库(在大多数情况下是 Python 客户端)时感知到的延迟。没有人能够,甚至不应该仅仅因为使用某个特定的搜索工具而重新定义整个技术栈。这就是为什么我们决定主要关注数据库作者提供的官方 Python 库。这些库底层可能使用了不同的协议,但最终,我们并不关心数据是如何传输的,只要它最终到达目标位置即可。
有些向量数据库仅作为 SaaS 提供,因此我们无法在与测试其他系统相同的机器上对其进行测试。这使得比较不公平。这就是为什么我们纯粹专注于测试开源向量数据库,以便所有人都能轻松重现基准测试。
这并非最终列表,我们将继续对尽可能多的不同引擎进行基准测试。
如何重现基准测试?
源代码可在Github 上获取,其中包含一个 README.md
文件,描述了针对特定引擎运行基准测试的过程。
如何贡献?
我们将基准测试开源,因为我们相信它必须透明。我们可能配置某个引擎有误,或者只是效率不高。如果您认为可以帮助我们,请查看我们的基准测试仓库。