🚀 Zilliz Cloudを無料で試す、完全管理型のMilvus—10倍の高速パフォーマンスを体験しよう!今すぐ試す>>

milvus-logo
LFAI
  • Home
  • Blog
  • ベクターデータベース、ベクター検索ライブラリ、ベクター検索プラグインの比較

ベクターデータベース、ベクター検索ライブラリ、ベクター検索プラグインの比較

  • Engineering
November 09, 2023
Frank Liu

ベクターデータベース101へようこそ!

ChatGPTやその他の大規模言語モデル(LLM)の急増は、Milvusや Zilliz Cloudのような特殊なベクターデータベースやFAISSのようなライブラリ、従来のデータベースに統合されたベクター検索プラグインを特徴とするベクター検索テクノロジーの成長を牽引してきました。

前回のシリーズ記事では、ベクターデータベースの基礎について掘り下げました。この記事では、ベクターデータベース、ベクター検索プラグイン、ベクター検索ライブラリを比較しながら、ベクター検索の複雑な領域を探求し続けます。

ベクトル検索は、ベクトル類似性検索とも呼ばれ、高密度なベクトルデータの膨大なコレクションの中から、与えられたクエリベクトルと最も類似している、または意味的に関連している上位k個の結果を検索するテクニックです。類似検索を行う前に、ニューラルネットワークを活用して、テキスト、画像、動画、音声などの非構造化データを埋め込みベクトルと呼ばれる高次元の数値ベクトルに変換する。埋め込みベクトルを生成した後、ベクトル検索エンジンは、入力されたクエリーベクトルとベクトルストア内のベクトルとの空間的距離を比較する。空間距離が近ければ近いほど、両者は類似していることになる。

PythonのNumPyのような機械学習ライブラリ、FAISSのようなベクトル検索ライブラリ、従来のデータベース上に構築されたベクトル検索プラグイン、MilvusやZilliz Cloudのような特殊なベクトルデータベースなど、複数のベクトル検索技術が市場に出回っている。

ベクターデータベースとベクター検索ライブラリの比較

特殊化されたベクターデータベースだけが類似検索のスタックではない。ベクトルデータベースが登場する以前は、FAISS、ScaNN、HNSWなど多くのベクトル検索ライブラリがベクトル検索に使われていました。

ベクトル検索ライブラリは、高性能なプロトタイプのベクトル検索システムを素早く構築するのに役立ちます。FAISSを例にとると、FAISSはオープンソースで、効率的な類似性検索と高密度ベクトルクラスタリングのためにMeta社によって開発された。FAISSはあらゆるサイズのベクトルコレクションを扱うことができ、メモリに完全にロードできないようなものでも扱うことができる。さらに、FAISSは評価とパラメータチューニングのためのツールを提供する。C++で書かれているにもかかわらず、FAISSはPython/NumPyインターフェースを提供する。

しかし、ベクトル検索ライブラリは、マネージド・ソリューションというよりは、単なる軽量ANNライブラリであり、機能も限られている。データセットが小さく限定的であれば、これらのライブラリは非構造化データ処理には十分であり、本番稼動しているシステムでも十分である。しかし、データセットのサイズが大きくなり、より多くのユーザーが参加するようになると、スケールの問題を解決するのはますます難しくなる。さらに、これらのデータベースはインデックスデータの変更を許さず、データのインポート中にクエリを実行することもできない。

対照的に、ベクトル・データベースは、非構造化データの保存と検索にとってより最適なソリューションである。ベクターデータベースは、数百万から数十億のベクターを保存し、同時にリアルタイムの応答を提供することができます。

さらに、Milvusのようなベクトルデータベースは、構造化/半構造化データに対して、クラウドナティビティ、マルチテナンシー、スケーラビリティなど、より使いやすい機能を備えている。これらの特徴は、このチュートリアルをより深く掘り下げるにつれて明らかになっていくだろう。

ベクターデータベースは本格的なサービスであるのに対し、ANNライブラリーは開発中のアプリケーションに統合されることを前提としている。この意味で、ANNライブラリは、ベクトル・データベースがApache Luceneの上に構築されているのと同じように、その上に構築されている多くのコンポーネントの一つである。

この抽象化がなぜ重要なのか、その一例を示すために、ベクトル・データベースに新しい非構造化データ要素を挿入してみましょう。これはmilvusではとても簡単です:

from pymilvus import Collectioncollection = Collection('book')mr = collection.insert(data)

たった3行のコードです。FAISSやScaNNのようなライブラリでは、残念ながら、特定のチェックポイントでインデックス全体を手動で再作成することなく、これを簡単に行う方法はありません。仮にそれができたとしても、ベクター検索ライブラリは、ベクターデータベースの最も重要な機能であるスケーラビリティとマルチテナンシーを欠いている。

ベクターデータベースと従来のデータベース用ベクター検索プラグインの比較

ベクター検索ライブラリとベクターデータベースの違いがわかったところで、ベクターデータベースとベクター検索プラグインの違いを見てみよう。

従来のリレーショナルデータベースや、Clickhouse やElasticsearch のような検索システムには、ベクトル検索プラグインが組み込まれているものが増えてきている。例えば、Elasticsearch 8.0には、restful APIエンドポイント経由で呼び出せるベクトル挿入とANN検索機能が含まれている。ベクトル検索プラグインの問題は昼夜の別なく明らかだろう。これらのソリューションはエンベッディング管理とベクトル検索に対してフルスタックのアプローチを取っていない。代わりに、これらのプラグインは既存のアーキテクチャの上に拡張することを意図しているため、制限があり最適化されていない。従来のデータベースの上で非構造化データ・アプリケーションを開発することは、リチウム電池と電気モーターをガソリン車のフレーム内に収めようとするようなもので、あまり良いアイデアとは言えない!

その理由を説明するために、ベクターデータベースが実装すべき機能のリスト(最初のセクション)に戻ってみよう。ベクター検索プラグインには、チューナビリティとユーザーフレンドリーなAPI/SDKという2つの機能が欠けている。引き続き Elasticsearch の ANN エンジンを例にして説明します。他のベクトル検索プラグインも非常に似たような動作をしているので、これ以上詳しくは説明しません。Elasticsearch はdense_vector データフィールド型によるベクトルの保存をサポートしており、knnsearch endpoint を使ったクエリが可能です:

PUT index
{
"mappings": {
  "properties": {
    "image-vector": {
      "type": "dense_vector",
      "dims": 128,
      "index": true,
      "similarity": "l2_norm"
    }
  }
}
}


PUT index/_doc
{
"image-vector": [0.12, 1.34, ...]
}
GET index/_knn_search
{
"knn": {
  "field": "image-vector",
  "query_vector": [-0.5, 9.4, ...],
  "k": 10,
  "num_candidates": 100
}
}

Elasticsearch の ANN プラグインは1つのインデックスアルゴリズムのみをサポートしています:HNSW として知られている Hierarchical Navigable Small Worlds です(マルチバースの普及に関しては、この作成者はマーベルよりも先を行っていたと思いたいです)。その上、L2/ユークリッド距離だけが距離メトリックとしてサポートされている。しかし、本格的なベクトルデータベースであるMilvusと比較してみよう。pymilvus を使う:

>>> field1 = FieldSchema(name='id', dtype=DataType.INT64, description='int64', is_primary=True)
>>> field2 = FieldSchema(name='embedding', dtype=DataType.FLOAT_VECTOR, description='embedding', dim=128, is_primary=False)
>>> schema = CollectionSchema(fields=[field1, field2], description='hello world collection')
>>> collection = Collection(name='my_collection', data=None, schema=schema)
>>> index_params = {
       'index_type': 'IVF_FLAT',
       'params': {'nlist': 1024},
       "metric_type": 'L2'}
>>> collection.create_index('embedding', index_params)
>>> search_param = {
       'data': vector,
       'anns_field': 'embedding',
       'param': {'metric_type': 'L2', 'params': {'nprobe': 16}},
       'limit': 10,
       'expr': 'id_field > 0'
   }
>>> results = collection.search(**search_param)

Elasticsearch と Milvusはどちらもインデックスの作成、埋め込みベクトルの挿入、最近傍探索を行うメソッドを持っていますが、Milvus の方がより直感的なベクトル検索 API を持っており(ユーザー向けの API が優れている)、より幅広いベクトルインデックス+距離メトリックをサポートしている(チューナビリティが優れている)ことはこれらの例から明らかです。Milvusはまた、将来的にはより多くのベクトルインデックスをサポートし、SQLライクなステートメントによるクエリーを可能にし、チューナビリティとユーザビリティの両方をさらに向上させる予定である。

私たちは今、かなりの量のコンテンツを吹っ飛ばした。Milvusがベクトル検索プラグインよりも優れているのは、Milvusがベクトルデータベースとしてゼロから構築されたため、より豊富な機能と非構造化データに適したアーキテクチャを実現しているからである。

様々なベクター検索テクノロジーから選ぶには?

すべてのベクターデータベースが同じように作られているわけではなく、それぞれが特定のアプリケーションに対応するユニークな特徴を持っています。ベクター検索ライブラリやプラグインはユーザーフレンドリーで、何百万ものベクターを扱う小規模なプロダクション環境を扱うのに理想的です。データサイズが小さく、基本的なベクター検索機能が必要なだけであれば、これらのテクノロジーで十分です。

しかし、何億ものベクターを扱い、リアルタイムのレスポンスが要求されるデータインテンシブなビジネスには、専用のベクターデータベースが最適です。例えば、Milvusは何十億ものベクトルを楽々と管理し、電光石火のクエリー速度と豊富な機能を提供します。さらに、Zillizのようなフルマネージドソリューションは、運用上の課題から解放され、コアビジネス活動に専念できるため、さらに有利です。

ベクターデータベース101コースをもう一度ご覧ください。

  1. 非構造化データ入門
  2. ベクターデータベースとは?
  3. ベクターデータベース、ベクター検索ライブラリ、ベクター検索プラグインの比較
  4. Milvus入門
  5. Milvusクイックスタート
  6. ベクトル類似検索入門
  7. ベクターインデックスの基礎と反転ファイルインデックス
  8. スカラー量子化と積量子化
  9. 階層的航行可能小世界(HNSW)
  10. 近似最近傍探索(ANNOY)
  11. プロジェクトに適したベクトルインデックスの選択
  12. DiskANNとVamanaアルゴリズム

Like the article? Spread the word

続けて読む