Elasticsearch 很棒,但矢量数据库才是未来?

科技   2024-11-19 23:59   北京  

导读:专用矢量数据库通过将 Sparse-BM25 算法和语义搜索统一在一个高效的操作中,其性能优于双系统设置。

几十年来,以 Elasticsearch 为经典案例的关键字匹配(也被称为全文搜索)一直是企业搜索和推荐引擎等信息检索系统的默认选择项。

随着人工智能搜索技术的进步,开发者们开始转向语义搜索,使系统能够理解用户查询背后的含义和意图。嵌入模型和矢量数据库已成为这一转变的核心。

语义搜索通过将数据表示为向量嵌入,超越了关键字匹配,提供了对搜索意图的更细致入微的理解,并将应用程序从检索增强生成(RAG) 转变为多模态搜索。

在实践中,有效的信息检索系统既需要语义理解,也需要精确的关键字匹配。例如,用户希望搜索结果显示与他们的搜索查询相关的概念,同时尊重查询中使用的文字,例如特殊术语和名称,并返回精确匹配的结果。

由密集向量驱动的语义搜索有助于理解含义(例如知道“car”和“automobile”是相同的),而传统的全文搜索可提供用户期望的精确结果(例如找到“Python 3.9”的精确匹配)。因此,许多组织正在采用混合搜索方法,结合两种方法的优势,以平衡灵活的语义相关性和可预测的精确关键字匹配。

混合搜索之挑战


实现混合搜索的一种常见方法是使用专门构建的矢量数据库(如开源Milvus)进行高效且可扩展的语义搜索,同时使用传统搜索引擎(如 Elasticsearch 或 OpenSearch)进行全文搜索。


虽然这种方法可以产生良好的效果,但也带来了新的复杂性。管理两个不同的搜索系统意味着要处理单独的基础设施、配置和维护任务,这会增加运营负担,并增加出现潜在集成问题的可能性。


混合搜索的统一解决方案将带来许多的优势:

  • 减少基础设施维护:管理一个系统而非两个系统可大幅降低运营复杂性,节省时间和资源。这也意味着减少上下文切换和掌握两组不同 API 的脑力开销。

  • 整合数据管理:统一的表结构允许您存储密集(基于矢量)和稀疏(基于关键字)数据以及共享元数据标签。使用两个独立的系统需要存储两次元数据标签,以便双方能够进行元数据过滤。

  • 简化查询:单个请求可以执行语义和全文搜索任务,无需对单独的系统进行两次 API 调用。

  • 增强的安全性和访问控制:统一的方法可以实现更直接、更强大的安全管理,因为所有访问控制都可以在矢量数据库内集中管理,从而增强安全合规性和一致性。

  • 统一向量方法简化混合搜索

  • 在语义搜索中,机器学习模型根据文本的含义将文本“嵌入”为高维空间中的点(称为密集向量) 。具有相似语义的文本在此空间中彼此更接近。例如,“苹果”和“水果”在此空间中可能比“苹果”和“汽车”更接近。这使我们能够通过使用近似最近邻 (ANN)算法计算每个点之间的距离来快速找到语义相关的文本。

  • 该方法还可以应用于全文搜索,通过将文档和查询编码为稀疏向量。在稀疏向量中,每个维度代表一个术语,值表示每个术语在文档中的重要性。


文档中不存在的术语的值为零。由于任何给定文档通常只使用词汇表中所有可能术语的一小部分,因此大多数术语不会出现在文档中。这意味着生成的向量是稀疏的——它们的大部分值为零。例如,在常用于评估信息检索任务的 MS-MARCO 数据集中,虽然有大约 900 万份文档和 100 万个唯一术语,但搜索系统通常会将这个庞大的集合分成更小的部分,以便于管理。

即使在词汇表包含数十万个词条的细分级别,每篇文档通常也只包含不到 100 个词条,这意味着每个向量的 99% 以上的值都是零。这种极度稀疏性对于我们高效存储和处理这些向量的方式具有重要意义。

可以利用这种稀疏模式来优化搜索性能,同时保持准确性。最初为密集向量设计的向量数据库可以适应有效地处理这些稀疏向量。

例如,开源向量数据库厂商 Milvus 刚刚发布了使用 Sparse-BM25 的原生全文搜索支持,Sparse- BM25 是 Elasticsearch 和其他全文搜索系统使用的BM25 算法的稀疏向量实现。Sparse-BM25 通过以下方式解锁基于近似的全文搜索优化:

  • 具有数据修剪的高效检索算法:通过应用基于启发式的修剪来丢弃段索引中具有最低稀疏向量值的文档并忽略搜索查询中的低值稀疏向量,向量数据库可以显著减少索引大小并以最小的质量损失优化性能。

  • 解锁进一步的性能优化:将词频表示为稀疏向量而不是反向索引可以实现更多基于向量的优化。这些包括:

    • 与暴力扫描相比,图形索引可以实现更有效的搜索。

    • 乘积量化(PQ)/标量量化(SQ)进一步减少内存占用。


除了这些优化之外,Sparse-BM25 实现还继承了高性能矢量数据库 Milvus 的几个系统级优势:

  • 高效的底层实现和内存管理:Milvus 的核心向量索引引擎采用 C++ 实现,比 Elasticsearch 等基于 Java 的系统提供更高效的内存管理。与基于 JVM 的方法相比,仅这一点就节省了数 GB 的内存占用。

  • 支持 MMap:与 Elasticsearch 使用 page-cache 在内存和磁盘上存储索引类似,当索引超出可用内存时,Milvus 支持内存映射(MMap)来扩展内存容量。


为什么传统搜索堆栈在矢量搜索方面表现不佳


Elasticsearch 是为传统倒排索引而构建的,因此很难针对密集向量搜索进行优化。影响是显而易见的:即使只有 100 万个向量,Elasticsearch 也需要 3770 毫秒 (ms) 才能返回搜索结果,而 Milvus 只需 6 毫秒 — 相差 600 倍。这种性能差距在规模上进一步扩大,Elasticsearch 的 Java/JVM 实现难以与基于 C++/Go 的向量数据库的可扩展性相匹配。


此外,Elasticsearch 缺乏关键的向量搜索功能,例如基于磁盘的索引 (DiskAnn、MMap)、优化的元数据过滤和范围搜索。


VectorDBBench 基准测试结果

结论


以 Milvus 为代表的向量数据库有望超越 Elasticsearch,成为混合搜索的统一解决方案。通过整合密集向量搜索和优化的稀疏向量技术,向量数据库提供了卓越的性能、可扩展性和效率。


此种统一方法简化了基础架构,减少了内存占用并增强了搜索功能,使其成为高级搜索需求的未来。因此说来,矢量数据库提供了一种无缝结合语义和全文搜索的综合解决方案,其性能优于 Elasticsearch 等传统搜索系统。

作者:场长

来源:

https://github.com/zilliztech/VectorDBBench#what-is-vectordbbench

相关阅读:


21CTO
21CTO(21CTO.com),开发者的学习与服务平台。提供高品质文章、课程与训练营、招聘等产品。
 最新文章