ベクトル検索の性能比較一覧

codelibs/search-ann-benchmark でANNでのベクトル検索プロダクトの性能を確認できるようにしているけど、GitHub Actionsで実行している結果をここで一覧できるようにしました。GitHub Actionsで実行した結果を一日一回収集して、そのページにまとめて簡単に確認できるようにした感じです。

上位10件と上位100件を取得した場合の平均応答時間と精度になります。ここで言う精度というのは、近似的な近傍検索なので、上位K件が期待するものとは限らないので、厳密な距離計算をしたときに得られるK件と比較してどれだけ一致しているか?というPrecision@Kの値です。10件取得して、正解と9件しか一致していなければ、0.9のようになります。

応答速度と精度のバランスが取れるように各種設定を調整していますが、実行しているコードはGitHubに置いてあるので、より良い値があれば、プルリクなどいただければと思います。一応、HNSWで統一してあるので、mやefなどのパラメーターは一緒にしてあります。

Qdrantが安定して、速さを保っている感じで、ElasticsearchやOpenSearchのLucene系は着実に追い上げてきている感じです。ただ、Lucene系は取得件数が多くなると、他と比べて、応答速度の劣化が大きいです。PGVectorは量子化対応されないと、応答時間での差は埋めるのはしばらく難しい気がします。

という感じで、ベクトル検索まわりの調査等々をしてきて、いろいろと知見はあるので、何かあれば、CodeLibs, Inc.までご相談いただければと。

ANN検索プロダクトの速度比較

手元の環境でも、ANN検索ができるオープンソースプロダクトの検索について、応答時間を比較してみる。この分野は、進化が速いので、現時点での参考くらいにしかならないと思いますが…。

比較を簡単に実行できるようにcodelibs/search-ann-benchmarkを作成しているが、GitHub Actionsで実行した結果をまとめてみる。

利用するデータは、768次元の10万件のベクトルをHNSWでインデクシングして、1万件のクエリーを投げて、平均応答時間を出すようにしてます。1回の検索で10件, 100件, 400件を取得した場合の応答時間です。GitHub Actionsでの実行環境は以下のとおりです。

  • OS: Ubuntu 22.04.4 LTS
  • CPU Model: AMD EPYC 7763 64-Core Processor
  • Memory: 15981 MB
  • Docker: 24.0.9

実行結果は以下でした。

10件100件400件
Elasticsearch 8.12.22.74269.850336.4273
Milvus 2.4.0-rc.14.129225.051267.5851
OpenSearch 2.12.01.794211.909238.9887
Qdrant 1.8.20.4475720.6266441.22407
Vespa 8.319.91.96562.26674.6405
Weaviate 1.24.45.718236.650111.8378
ベクトル検索の平均応答時間(ミリ秒)

今回、安定して速いのは、Qdrantでした。Vespaももっとチューニングとかすれば、もう少し改善するかもしれません。Lucene系は取得件数が増えるほど、劣化する現象がありますが、毎回見る現象ですね。

この結果は、参考までにという感じで、search-ann-benchmarkをcloneすれば、手元の環境でも実行できると思うので、興味があればお試しください。その他、補足的なコメントをまとめておくと、

  • 設定をチューニングすれば、改善余地はあるかも
  • HNSWで同じような設定値にはしているが、この辺もデータ数などによって、見直したほうが良いかも
  • 量子化を適用したものもありますが、結果の精度も比較したい
  • PG Vectorなど、対象にできていないものも追加したい
  • 実行結果は自動で収集して、一覧できるようにしたい

という感じで、まだまだツッコミどころもあったりするので、気になるところはプルリクとかもらえると嬉しいです。