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