并非所有 HNSW 指数都是平等的

并非所有 HNSW 索引都一样克服主要的 HNSW 挑战以提高 AI 生产工作负载的效率照片由 Talha Riaz 在 Pexels 上拍摄分层可导航小世界 (HNSW) 算法以其在大规模数据搜索中的效率和准确性而闻名,使其成为搜索任务和 AI/LLM 应用程序(如 RAG)的热门选择。但是,设置和维护 HNSW 索引本身也存在一系列挑战。让我们来探索这些挑战,提供一些克服它们的方法,甚至看看我们如何通过解决其中一个问题来一石二鸟。内存消耗由于其嵌入的分层结构,HNSW 的主要挑战之一是其高内存使用率。但很少有人意识到内存问题超出了存储初始索引所需的内存。这是因为,随着 HNSW 索引的修改,存储节点及其连接所需的内存会进一步增加。这将在后面的部分中进行更深入的解释。内存意识很重要,因为您需要的数据内存越多,计算(搜索)数据所需的时间就越长,并且维护工作负载的成本就越高。构建时间照片由 Andrea De Santis 在 Unsplash 上拍摄在创建索引的过程中,节点会根据它们与图上其他节点的距离添加到图中。对于每个节点,都会在图中的每一层保存其最近邻居的动态列表。这个过程涉及它

来源:走向数据科学

重建索引

照片由 Robin Jonathan Deutsch 在 Unsplash 上拍摄
照片由 Robin Jonathan Deutsch 在 Unsplash 上拍摄
Robin Jonathan Deutsch Unsplash

重建 HNSW 索引是使用 HNSW 在生产工作负载中最耗费资源的方面之一。与传统数据库不同,在传统数据库中,只需删除表中的一行即可处理数据删除,而在矢量数据库中使用 HNSW 通常需要完全重建才能保持最佳性能和准确性。

为什么需要重建?

由于其分层图结构,HNSW 本质上不是为频繁变化的动态数据集设计的。添加新数据或删除现有数据对于维护更新数据至关重要,尤其是对于旨在提高搜索相关性的 RAG 等用例。

大多数数据库都采用“硬”删除和“软”删除的概念。硬删除会永久删除数据,而软删除会将数据标记为“待删除”并在稍后删除。软删除的问题在于,待删除的数据在被永久删除之前仍会占用大量内存。这在使用 HNSW 的矢量数据库中尤其成问题,因为内存消耗已经是一个重大问题。

HNSW 会创建一个图,其中节点(矢量)根据它们在矢量空间中的接近度进行连接,在 HNSW 图上进行遍历就像跳过列表一样。为了支持这一点,图的层被设计成某些层只有很少的节点。当删除矢量时,尤其是那些在图中充当关键连接器的节点很少的层上的矢量时,整个 HNSW 结构可能会变得支离破碎。这种碎片化可能会导致节点(或层)与主图断开连接,从而需要重建整个图,或者至少会导致搜索效率下降。