手元の環境でも、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.2 | 2.7426 | 9.8503 | 36.4273 |
Milvus 2.4.0-rc.1 | 4.12922 | 5.05126 | 7.5851 |
OpenSearch 2.12.0 | 1.7942 | 11.9092 | 38.9887 |
Qdrant 1.8.2 | 0.447572 | 0.626644 | 1.22407 |
Vespa 8.319.9 | 1.9656 | 2.2667 | 4.6405 |
Weaviate 1.24.4 | 5.71823 | 6.6501 | 11.8378 |
今回、安定して速いのは、Qdrantでした。Vespaももっとチューニングとかすれば、もう少し改善するかもしれません。Lucene系は取得件数が増えるほど、劣化する現象がありますが、毎回見る現象ですね。
この結果は、参考までにという感じで、search-ann-benchmarkをcloneすれば、手元の環境でも実行できると思うので、興味があればお試しください。その他、補足的なコメントをまとめておくと、
- 設定をチューニングすれば、改善余地はあるかも
- HNSWで同じような設定値にはしているが、この辺もデータ数などによって、見直したほうが良いかも
- 量子化を適用したものもありますが、結果の精度も比較したい
- PG Vectorなど、対象にできていないものも追加したい
- 実行結果は自動で収集して、一覧できるようにしたい
という感じで、まだまだツッコミどころもあったりするので、気になるところはプルリクとかもらえると嬉しいです。