AnnoyとHNSWlibの比較:ベクトル検索に適したツールの選択
#はじめに
今日、ベクトル検索は、レコメンデーション・エンジン、画像検索システム、自然言語処理(NLP)タスクなど、様々な最新のAIアプリケーションを動かす基本的な要素となっている。キーワードマッチングに依存する従来の検索エンジンとは異なり、ベクトル検索はベクトルの類似性に基づいて情報を検索することを可能にし、画像、音声、テキスト埋め込みなどの非構造化データからより深い洞察を引き出す。
2つの傑出したベクトル検索ソリューションは、AnnoyとHNSWlibです。どちらも高速で効率的なベクトル検索のために設計されていますが、それぞれの長所やユースケースは異なるため、どちらを選ぶかは非常に重要です。このブログでは、主な違いを説明し、どちらがあなたのニーズに合っているかを判断するためのツールを提供します。
ベクター検索とは?
AnnoyとHNSWlib**の詳細について説明する前に、ベクトル検索について理解しておく必要があります。簡単に言うと、ベクトル検索、またはベクトル類似性検索は、与えられたクエリベクトルに最も近い高次元空間のベクトル(データ点)を見つけます。これらのベクトルは、多くの場合、機械学習モデルによって生成され、非構造化データ(例えば、文章の意味や画像の特徴)の本質を捉える。 ;
従来のデータベース](https://zilliz.com/blog/relational-databases-vs-vector-databases)のように、完全一致やフィルタリングに基づいて検索するのとは異なり、ベクトル検索は類似性に重点を置く。目標は、距離メトリック(ユークリッド距離や余弦類似度など)に基づいて、互いに「近い」ベクトルを見つけることです。例えば、ベクトルは自然言語処理(NLP)において単語や文章を表すことができ、ベクトル検索は最も意味的に類似した単語や文章を見つけるのに役立つ。推薦システムでは、ベクトル検索はユーザーの好みに最も近いアイテムを特定する。ベクトル検索は、retrieval augmented generation (RAG)、大規模言語モデル(LLMs)に余分な文脈情報を提供することでその出力を補強する技術、においても重要な役割を果たしている。
市場には、ベクトル検索を実行するための多くのソリューションがあります:
- AnnoyやHNSWlib. のようなベクトル検索ライブラリ**;
- Milvus](https://zilliz.com/what-is-milvus)、Zilliz Cloud (フルマネージドMilvus)のような目的別ベクトルデータベース。
- Chroma](https://zilliz.com/blog/milvus-vs-chroma)やMilvus Liteのような軽量ベクターデータベース。
- Apache Cassandra](https://zilliz.com/blog/apache-cassandra-vs-opensearch-a-comprehensive-vector-database-comparison)やpgvectorなどのトラディショナルなデータベース ベクトル検索アドオン付き **。
Annoyとは?概要
Annoy](https://zilliz.com/learn/approximate-nearest-neighbor-oh-yeah-ANNOY) (Approximate Nearest Neighbors Oh Yeah)は、Spotifyによって開発された軽量なオープンソースライブラリである。特に、大規模で読み込みの多いベクトル検索を扱うように設計されている。その主な利点は、メモリ消費を最小限に抑え、シンプルであることにあり、頻繁に変化しない静的なデータセットに最適である。
Annoyの検索アルゴリズムは、ベクトル空間をより小さな領域に分割する複数のランダムな射影木を構築することに基づいている。このアプローチは、結果が厳密ではなく近似であるため、正確さを犠牲にして高速な検索を可能にする。このトレードオフは、多くのアプリケーションで許容されるものである。なぜなら、速度の利点は精度のわずかな低下を上回るからである。
Annoyは、メモリ効率が優先される場合に理想的である。巨大なデータセットをディスクに保存でき、データセット全体をメモリにロードすることなく検索が可能になる。しかし、このことは、ベクターの追加や削除にはインデックス全体の再構築が必要であることを意味し、頻繁に変更されるデータがある場合には面倒なことになる。
要するに、Annoyは大規模で静的なデータセットと、高速でメモリ効率の良い検索に最適なのだ。しかし、データが頻繁に更新されたり、高い精度が要求される場合には、最適な選択肢ではないかもしれない。
HNSWlib とは?概要
HNSWlib (Hierarchical Navigable Small World Library) は、近似最近傍 (ANN) 検索用に設計された、高性能なグラフベースのライブラリです。その検索アルゴリズムは、ノードがベクトルを表し、エッジがそれらの間の近さを表す、階層的なグラフ構造を構築することに依存しています。HNSWlibはベクトル類似性検索タスクに広く利用されており、高次元ベクトルの大規模なデータセットからクエリベクトルに最も近いベクトル(または「近傍」)を見つけることを目的としています。
HNSWlib の主な強みの一つは 柔軟性 である。Annoy とは異なり、HNSWlib ではインデックス全体を再構築することなくデータセットを更新することができます。ベクトルを動的に追加・更新・削除できるので、 リアルタイムのアプリケーションや、 データが頻繁に変更されるシステムに適しています。
HNSWlib はその 正確さ でも知られています。グラフ構造をナビゲートすることで、Annoy のツリーベースの手法に比べて近似が少なく、高い精度で最近傍を見つけることができます。しかし、この精度はメモリ消費量とトレードオフの関係にあります-HNSWlib は階層グラフを保存するために、Annoy がツリーを保存するのに必要なメモリよりも多くのメモリを必要とします。
動的なデータセットを扱っていて、検索速度を犠牲にすることなく可能な限り高い精度が必要な場合は、HNSWlibの方が適している可能性が高い。しかし、非常に大きなデータセットでは、メモリ使用量の増加が制限要因になる可能性がある。
Annoy と HNSWlib の主な違い
検索方法
Annoyは、ランダムな射影木がベクトル空間を分割する、ツリーベースのアルゴリズムを使用します。検索は複数の木にまたがって行われるため、おおよその結果が得られます。ツリーの数が少ないと検索速度は速くなるが精度は低下し、ツリーの数が多いと速度は低下するが精度は向上する。
HNSWlibはグラフベースのアルゴリズムを使用し、階層的なグラフ構造に依存して最近傍を探索します。この探索プロセスは、近似の回数を最小化するためにグラフを走査するため、Annoy よりも正確です。HNSWlib のスモールワールドの特性により、2つのノード間の距離が短くなり、検索時間が高速になります。
検索手法の違いは、Annoy が高速な検索を提供する一方で、精度を犠牲にする可能性があることを意味する。一方、HNSWlib は特に動的なデータセットに対して精度を優先します。
データの取り扱い
Annoyは "write once, read many"モデルに従っている。一旦インデックスが構築されると、迅速な検索が可能になりますが、頻繁なデータ更新にはあまり適していません。ベクターの追加や削除が必要な場合は、インデックス全体を一から作り直す必要があり、時間がかかります。
HNSWlibは、動的データセットの処理に関しては、はるかに柔軟性があります。インデックスを再構築することなく、 ベクトルの更新、削除、追加ができるので、データが常に変化するようなリアルタイムの アプリケーションに適しています。
スケーラビリティとパフォーマンス
スケーラビリティの面では、Annoy は大規模なデータセットに適している。ディスク上にインデックスを保存できるため、利用可能なメモリよりも大きなデータセットも扱うことができる。しかし、スケーリングには代償が伴います-精度を向上させるためにより多くのツリーを構築すると、クエリ時間が長くなる可能性があります。
一方、HNSWlib は、小規模から中規模のデータセットに対して高速な検索時間を提供するが、メモリをより多く消費する。HNSWlib**は、動的な環境では優れた性能を発揮しますが、メモリ使用量が多いため、大規模なデータセットでは苦労するかもしれません。
柔軟性とカスタマイズ
Annoyの柔軟性は限られている。パフォーマンスを調整するために利用できる主なオプションは、検索するツリーの数と近傍の数を調整することです。これは、最小限のカスタマイズで、よりプラグアンドプレイのソリューショ ンを探している開発者にとって有利かもしれません。
HNSWlibはカスタマイズの余地がある。グラフの探索中に訪れる近傍の数などのパラメーターを微調整することができ、スピードと精度のトレードオフをよりコントロールすることができます。特定の最適化を必要とする複雑なユースケースには、 HNSWlib がより汎用的な選択肢となります。
統合とエコシステム
両ライブラリとも C++で書かれ、Pythonバインディングを提供している**ため、AIや機械学習のワークフローに適している。AnnoyはPythonベースのエコシステムと強い結びつきがあり、TensorFlowやPyTorchのような機械学習フレームワークとともに一般的に使用されている。
HNSWlibは新しいが、急速に人気を集めており、大規模な類似検索のためのFAISSのようなライブラリとの統合がある。どちらのツールもAIパイプラインに簡単に統合することができますが、HNSWlibの柔軟性は、より複雑なセットアップのために若干優位に立つかもしれません。
使いやすさ
Annoyのシンプルさは、その核となる強みの1つである。その最小限のAPIは、特に静的なデータセットのセットアップと使用を容易にしている。数行のコードでインデックスを構築し、検索を開始できる。しかし、より動的な環境では、その柔軟性のなさが欠点になるかもしれない。
HNSWlibは、調整可能なパラメーターの種類が多く、動的なデータセットを扱えるため、若干複雑である。HNSWlib**はより多くのセットアップを必要とするが、豊富なドキュメントとカスタマイズオプションにより、進化するデータセットを扱う開発者にとってはより堅牢なツールとなっている。
コストの考慮
Annoyはメモリフットプリントが小さく、ディスクベースのインデックスであるため、大規模なデータセットに対して費用対効果が高い。メモリに制約のある環境でも効率的に実行できるため、インフラコストを最小限に抑えることができる。
HNSWlibはメモリ使用量が多いため、特に大規模展開ではインフラコストが増加する可能性がある。しかし、検索速度と精度が最重要視される用途では、このコスト増は正当化できるかもしれない。
セキュリティ機能
Annoy も HNSWlib も、暗号化、認証、アクセス制御のような組み込みのセキュリ ティ機能を提供しません。特定の要件に応じて、これらはアプリケーションレベルで実装する必要があります。
Annoyを選ぶべきとき
Annoyは以下のような場合に適している:
- 非常に大きく、静的なデータセットを扱っていて、ほとんど変化しない。
- メモリ効率を優先し、インフラのRAMには限りがある。
- 完璧な精度よりもスピードが重要である。
- 必要に応じてインデックスを再構築する余裕がある。
一般的な使用例としては、大規模な推薦システム、静的なメディア検索システム、更新頻度が低いシナリオなどがあります。
HNSWlib を選ぶとき
HNSWlib は以下のような場合に適しています:
- データセットが動的で、頻繁に更新や削除がある。
- 検索に高い精度が必要な場合。
- グラフベースのアルゴリズムをサポートするメモリリソースがある。
- スピードと精度のトレードオフを柔軟に調整できることが重要。
リアルタイムアプリケーション、進化するデータ、NLPや高度なレコメンデーションエンジンなど検索精度が重要なユースケースに最適です。
ベクター検索ライブラリと専用ベクターデータベースの比較
AnnoyやHNSWlibのようなベクトル検索ライブラリと、Milvusのような目的別ベクトルデータベースは、どちらも高次元ベクトルデータの類似性検索問題を解決することを目的としていますが、その役割は異なります。  ;
Annoy、HNSWlib、Faissのようなベクトル検索ライブラリは、効率的な最近傍探索のタスクだけに焦点を当てています。これらのライブラリは、クエリベクトルに類似したベクトルを見つけるための軽量で高速なソリューションを提供し、小規模なシングルノード環境や、静的または中程度のサイズのデータセットを持つアプリケーションでよく使用されます。しかし、一般的に動的データの管理、永続性の提供、分散システム間でのスケーリングなどの機能が不足している。これらのライブラリを使用する開発者は、通常、データ管理、更新、スケーリングを手動で処理する必要があります。
一方、MilvusやZilliz Cloud(マネージドMilvus)のような目的別ベクターデータベースは、大規模なベクターデータ管理のために設計された包括的なシステムです。これらのデータベースは単純なベクトル検索にとどまらず、永続ストレージ、リアルタイム更新、分散アーキテクチャ、高度なクエリ機能などの機能を提供している。これらのデータベースは動的なデータセットをサポートし、データが頻繁に更新されるリアルタイムアプリケーションを容易に扱うことができます。さらに、ベクターデータベースには、ベクター検索と従来のフィルタリングやメタデータクエリを組み合わせるための統合サポートが含まれていることが多く、スケーラビリティ、高可用性、より複雑な検索機能を必要とする本番環境に最適です。
各ベクトル検索ソリューションの選択時期
ベクター検索ライブラリ**を選択する場合:
- 小規模から中規模の比較的静的なデータセットを持っている。
- インデックス作成と検索アルゴリズムを完全にコントロールしたい。
- 既存のシステムに検索を組み込み、インフラを管理できる。
目的別ベクターデータベース**を選択する場合:
- 分散システムで数十億ベクトルまで拡張する必要がある。
- データセットが頻繁に変更され、リアルタイムの更新が必要な場合。
- ストレージ、スケーリング、クエリの最適化を代行してくれるマネージドソリューションを好む。
まとめると、ベクトル検索ライブラリ は、スピードとメモリ効率が優先されるが、運用の複雑さは最小限の、よりシンプルで小規模なユースケースに最適である。これとは対照的に、目的別ベクターデータベース は、動的なデータ処理、スケーラビリティ、使いやすさが要求される大規模なプロダクショングレードのシステム向けに設計されており、多くの場合、複雑なアプリケーションを管理する開発者に大きな運用上のメリットをもたらします。
異なるベクトル検索ソリューションの評価と比較
さて、さまざまなベクトル検索ソリューションの違いはわかった。次の疑問は、検索アルゴリズムが正確な結果を確実に、しかも高速に返すにはどうすればいいか?様々なANNアルゴリズムの有効性を、特に規模に応じてどのように評価するか?
これらの質問に答えるには、ベンチマークツールが必要である。そのようなツールは数多くあるが、最も効率的なものとして2つが挙げられる:**ANNベンチマーク](https://zilliz.com/glossary/ann-benchmarks)とVectorDBBenchである;
ANNベンチマーク
ANN Benchmarks](https://zilliz.com/glossary/ann-benchmarks) (Approximate Nearest Neighbor Benchmarks)は、様々な近似最近傍(ANN)アルゴリズムの性能を評価・比較するために設計されたオープンソースプロジェクトです。高次元ベクトル探索のようなタスクで異なるアルゴリズムをベンチマークするための標準化されたフレームワークを提供し、開発者や研究者が様々なデータセットで探索速度、精度、メモリ使用量などのメトリクスを測定することを可能にします。ANN-Benchmarksを使うことで、Faiss、Annoy、HNSWlibなどのライブラリにあるようなアルゴリズムの速度と精度のトレードオフを評価することができます。
ANN Benchmarks GitHub リポジトリ: https://github.com/erikbern/ann-benchmarks
ANNベンチマークウェブサイト: https://ann-benchmarks.com/
ベクターDBBベンチ
VectorDBBenchは、高性能なデータ保存・検索システム、特にベクトルデータベースを必要とするユーザーのために設計されたオープンソースのベンチマークツールです。このツールにより、ユーザは独自のデータセットを用いてMilvusやZilliz Cloud(マネージドMilvus)などの異なるベクトルデータベースシステムの性能をテスト・比較し、ユースケースに最も適したものを決定することができる。VectorDBBenchはPythonで書かれており、MITオープンソースライセンスの下でライセンスされている。
VectorDBBenchのGitHubリポジトリ: https://github.com/zilliztech/VectorDBBench
VectorDBBench Leaderboard](https://zilliz.com/vector-database-benchmark-tool?database=ZillizCloud%2CMilvus%2CElasticCloud%2CPgVector%2CPinecone%2CQdrantCloud%2CWeaviateCloud&dataset=medium&filter=none%2Clow%2Chigh&tab=1)で、主流のベクトルデータベースの性能を簡単に見てみましょう。** ;
VectorDB評価のテクニックと洞察:
- ベンチマークベクターデータベースのパフォーマンス:テクニックと洞察](https://zilliz.com/learn/benchmark-vector-database-performance-techniques-and-insights)
- 任意のベクトルデータベースと代替データベースを比較する](https://zilliz.com/comparison)
VectorDB、GenAI、MLに関するその他のリソース
- ジェネレーティブAIリソースハブ|Zilliz](https://zilliz.com/learn/generative-ai)
- あなたのGenAIアプリのためのトップパフォーマンスAIモデル|Zilliz](https://zilliz.com/ai-models)
- RAGとは](https://zilliz.com/learn/Retrieval-Augmented-Generation)
- 大規模言語モデル(LLM)を学ぶ](https://zilliz.com/learn/ChatGPT-Vector-Database-Prompt-as-code)
- ベクトルデータベース101](https://zilliz.com/learn/what-is-vector-database)
- 自然言語処理(NLP)](https://zilliz.com/learn/introduction-to-natural-language-processing-tokens-ngrams-bag-of-words-models)
読み続けて

Our Journey to 35K+ GitHub Stars: The Real Story of Building Milvus from Scratch
Join us in celebrating Milvus, the vector database that hit 35.5K stars on GitHub. Discover our story and how we’re making AI solutions easier for developers.

Why AI Databases Don't Need SQL
Whether you like it or not, here's the truth: SQL is destined for decline in the era of AI.

Proactive Monitoring for Vector Database: Zilliz Cloud Integrates with Datadog
we're excited to announce Zilliz Cloud's integration with Datadog, enabling comprehensive monitoring and observability for your vectorDB deployments.
The Definitive Guide to Choosing a Vector Database
Overwhelmed by all the options? Learn key features to look for & how to evaluate with your own data. Choose with confidence.