Spotify开源Voyager:新一代近似最近邻搜索库
Spotify Engineering最近开源了Voyager,这是一个基于分层可导航小世界(HNSW)算法的近似最近邻(ANN)搜索库。Voyager比Spotify之前使用的ANN库Annoy快10倍,并且在内存使用上比Annoy少4倍,比另一个流行的HNSW实现hnswlib少16倍。
Voyager的背景与优势
Spotify使用ANN技术来支持其音乐推荐功能,如“Discover Weekly”。2013年,Spotify开发了Annoy用于执行ANN搜索,但随着数据规模的扩大,Annoy的性能已无法满足需求。Voyager采用更新的HNSW算法,显著提升了搜索速度和准确性。此外,Voyager提供了Java和Python的生产级绑定,旨在为用户提供一个稳定、可靠的库,方便在应用中添加最近邻索引查找功能。
Spotify的推荐系统
Spotify的推荐系统首先通过机器学习算法为歌曲或曲目计算嵌入(embeddings)。如果两个曲目经常出现在同一个播放列表中,它们的嵌入空间中的位置会非常接近。用户也会根据其听歌历史被映射到相同的嵌入空间中。为了推荐用户可能喜欢的歌曲,Spotify使用ANN搜索在嵌入空间中查找接近用户位置的曲目。此外,ANN还可用于去重任务,通过计算音频数据的嵌入,识别出音频内容几乎相同的曲目。
Voyager的开发动机
在Spotify的规模下,快速执行ANN搜索变得非常困难,因为嵌入向量具有数千个维度,且曲目库包含数百万首歌曲。当Annoy的性能不再满足需求时,Spotify工程师尝试了现有的开源库hnswlib,但遇到了核心代码中的bug,且API不够简洁。因此,他们决定开发Voyager,专门针对Spotify的生产基础设施需求进行设计。
Voyager的设计特点
Voyager被设计为快速且轻量级,其API支持Java和Python,但库本身没有Java依赖,并且仅需NumPy作为Python的依赖。Voyager支持在Linux、MacOS以及Windows(仅限Intel机器)上运行,并且兼容Intel和ARM架构。
社区反馈与讨论
在Hacker News上,用户讨论了Voyager,并将其与前身Annoy进行了比较。一个显著的改进是,Voyager允许在任何时候调用.add_item来添加新项目,而Annoy的索引文件是只读的。Voyager的开发者Peter Sobot也在X上表示,Voyager是一个可嵌入的、超轻量级的快速向量搜索库,虽然不具备完整向量数据库的所有功能,但它的零依赖和300kB的体积使其非常适用于特定场景。
开源与未来计划
Voyager的源代码已发布在GitHub上,并且已提交到ANN-Benchmarks页面,但目前尚未进行基准测试。Spotify计划继续优化和推广Voyager,使其成为更多应用场景中的首选ANN搜索库。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。