Spotify Engineeringは最近、近似最近傍(ANN)検索ライブラリであるVoyagerをオープンソース化した。VoyagerはHNSW(hierarchical navigable small worlds)アルゴリズムに基づいており、Spotifyの以前のANNライブラリAnnoyよりも10倍高速である。
Spotifyは、Discover Weeklyなどの音楽推薦機能にANNを使用している。彼らは2013年にANN検索を行うためにAnnoyを開発したが、10年経った今、現在の規模ではもはやうまく機能しないことがわかった。その理由の一つは、基礎となるアルゴリズムにある。Annoyはツリー分割アルゴリズムを使用しているが、Voyagerはより新しいHNSW法を使用している。VoyagerはAnnoyよりも4倍、HNSWの一般的な実装であるhnswlibよりも16倍少ないメモリしか使わない。Spotifyスタッフの機械学習エンジニアであり、Voyagerの貢献者であるPeter Sobot氏によると、次のようになる。
Voyagerは、HNSWによる精度とスピードの向上と、JavaとPythonの両方で十分にテストされ、十分に文書化され、量産可能なバインディングを兼ね備えている。Voyagerの哲学は、PythonでもJavaでも、誰でも自分のアプリケーションに最近傍インデックス検索を追加できる、揺るぎない安定した量産可能なライブラリを提供することである。
Spotifyのレコメンデーション機能は、機械学習アルゴリズムを使って曲やトラックの埋め込みを計算することから始まる。プレイリストの中で2つの曲が一緒に表示される頻度が高ければ高いほど、埋め込み空間の中でより近くにマッピングされる。ユーザーもまた、彼らが聴くトラックに基づいてこの空間にマッピングされる。ユーザーが好きそうな曲を推薦するために、SpotifyはANN検索を使って、埋め込み空間内のユーザーの位置に近いトラックを見つける。オーディオデータの埋め込みを計算することで、ANNは本質的に同じオーディオを持つトラックを特定できる。
Spotify の規模では、迅速に検索することが困難になってきている。埋め込みベクトルは何千次元もあり、カタログには何百万ものトラックが含まれている。Annoyがもはや十分なパフォーマンスを提供できないことが明らかになったとき、Spotifyのエンジニアは既存のオープンソースのhnswlibで実験を行ったが、"問題にぶつかった"。そのコアコードにはバグがあり、Spotifyのエンジニアは修正できなかった。彼らはまた、よりシンプルなAPIを求めていた。これがVoyagerの開発につながった。Voyagerは、Spotifyのプロダクション・インフラのニーズを念頭に置いて設計されている。
特に、Voyagerは高速かつ軽量に設計されている。APIにはJavaとPythonのバインディングがあるが、ライブラリ自体にはJavaの依存性はなく、PythonにはNumPyしか必要ない。このライブラリーは、LinuxとMacOSのインテルマシンとARMマシンの両方で動作し、インテルマシンのWindowsでも動作する。
『Hacker News』のユーザーは、Voyagerを前身のAnnoyと比較しながら議論した。
すぐに役立つ最大の違いは、Annoyは読み取り専用のインデックス・ファイルを使用する(ドキュメントによると、「ツリーが作成されると、アイテムを追加できない」)のに対し、Voyagerはいつでも
.add_item
を呼び出せることだ。
Sobot氏はXのVoyagerに関するスレッドにこう返信している。
Voyagerは、組み込み可能で超軽量、高速なベクトル検索ライブラリだと思っている。適切なベクターデータベースにあるような豪華さはないが、Voyagerは依存関係もゼロで、重さも300KBほどだ。
VoyagerのソースコードはGitHubで公開されている。VoyagerはANN-Benchmarksページに投稿されているが、ベンチマークはまだ実行されていない。