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

milvus-logo
LFAI
  • Home
  • Blog
  • 目的別ベクターデータベースが必要な理由と時期

目的別ベクターデータベースが必要な理由と時期

  • Engineering
August 29, 2023
James Luan

この記事はAIAIに掲載されたものを許可を得て再掲載しています。

ChatGPTやその他の大規模言語モデル(LLM)の人気の高まりは、Milvusや Zilliz Cloudのような専用のベクトルデータベース、FAISSのようなベクトル検索ライブラリ、従来のデータベースと統合されたベクトル検索プラグインなど、ベクトル検索テクノロジーの台頭に拍車をかけている。しかし、ニーズに合った最適なソリューションを選ぶのは難しいものです。高級レストランとファーストフードチェーンのどちらを選ぶかのように、適切なベクター検索テクノロジーを選択するかは、ニーズと期待次第である。

この記事では、ベクター検索とその機能の概要を説明し、さまざまなベクター検索テクノロジーを比較し、専用に構築されたベクターデータベースを選ぶことが重要である理由を説明します。

ベクトル検索とは何か?

ベクトル検索は、ベクトル類似性検索とも呼ばれ、高密度なベクトルデータの膨大なコレクションの中から、与えられたクエリベクトルと最も類似している、または意味的に関連している上位k個の結果を検索する技術である。

類似検索を行う前に、ニューラルネットワークを活用して、テキスト、画像、動画、音声などの非構造化データを埋め込みベクトルと呼ばれる高次元数値ベクトルに変換する。例えば、事前に訓練されたResNet-50畳み込みニューラルネットワークを使って、鳥の画像を2,048次元のエンベッディングのコレクションに変換することができます。ここでは、最初の3つと最後の3つのベクトル要素を列挙する:[0.1392, 0.3572, 0.1988, ..., 0.2888, 0.6611, 0.2909]

A bird image by Patrice Bouchard Patrice Bouchardによる鳥の画像

埋め込みベクトルを生成した後、ベクトル検索エンジンは、入力クエリーベクトルとベクトルストアのベクトル間の空間距離を比較します。空間的に近ければ近いほど、似ていることになります。

Embedding arithmetic 埋め込み演算

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

機械学習ライブラリ

機械学習ライブラリを使うのが、ベクトル検索を実装する最も簡単な方法だ。例えば、PythonのNumPyを使えば、20行以下のコードで最近傍アルゴリズムを実装できる。

import numpy as np

# Function to calculate euclidean distance
def euclidean_distance(a, b):
return np.linalg.norm(a - b)

# Function to perform knn
def knn(data, target, k):
# Calculate distances between target and all points in the data
distances = [euclidean_distance(d, target) for d in data]
# Combine distances with data indices
distances = np.array(list(zip(distances, np.arange(len(data)))))

# Sort by distance
sorted_distances = distances[distances[:, 0].argsort()]

# Get the top k closest indices
closest_k_indices = sorted_distances[:k, 1].astype(int)

# Return the top k closest vectors
return data[closest_k_indices]

100個の2次元ベクトルを生成し、ベクトル[0.5, 0.5]の最近傍を見つけることができる。

# Define some 2D vectors
data = np.random.rand(100, 2)

# Define a target vector
target = np.array([0.5, 0.5])

# Define k
k = 3

# Perform knn
closest_vectors = knn(data, target, k)

# Print the result
print("The closest vectors are:")
print(closest_vectors)

PythonのNumPyのような機械学習ライブラリは、低コストで大きな柔軟性を提供します。しかし、いくつかの制限がある。例えば、少量のデータしか扱えず、データの永続性が保証されていない。

NumPyや他の機械学習ライブラリをベクトル検索に使うことをお勧めするのは、以下のような場合だけだ:

  • 素早くプロトタイプを作成する必要がある。
  • データの永続性を気にしない。
  • データサイズが100万以下で、スカラーフィルタリングを必要としない。
  • 高いパフォーマンスを必要としない。

ベクトル検索ライブラリ

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

以下は、FAISSに基づくベクトル探索の例のコードです:

import numpy as np
import faiss

# Generate some example data
dimension = 64 # dimension of the vector space
database_size = 10000 # size of the database
query_size = 100 # number of queries to perform
np.random.seed(123) # make the random numbers predictable

# Generating vectors to index in the database (db_vectors)
db_vectors = np.random.random((database_size, dimension)).astype('float32')

# Generating vectors for query (query_vectors)
query_vectors = np.random.random((query_size, dimension)).astype('float32')

# Building the index
index = faiss.IndexFlatL2(dimension) # using the L2 distance metric
print(index.is_trained) # should return True

# Adding vectors to the index
index.add(db_vectors)
print(index.ntotal) # should return database_size (10000)

# Perform a search
k = 4 # we want to see 4 nearest neighbors
distances, indices = index.search(query_vectors, k)

# Print the results
print("Indices of nearest neighbors: \n", indices)
print("\nL2 distances to the nearest neighbors: \n", distances)

FAISSのようなベクトル検索ライブラリは使いやすく、数百万のベクトルを扱う小規模な本番環境でも十分に高速です。量子化やGPUを利用し、データの次元を小さくすることで、クエリのパフォーマンスを向上させることができます。

しかし、これらのライブラリは本番環境で使用する場合、いくつかの制限があります。例えば、FAISSはリアルタイムのデータ追加・削除、リモートコール、多言語、スカラーフィルタリング、スケーラビリティ、ディザスタリカバリをサポートしていません。

さまざまなタイプのベクトルデータベース

ベクターデータベースは、上記のライブラリーの制限に対処するために登場し、プロダクションアプリケーションにより包括的で実用的なソリューションを提供している。

戦場では4種類のベクトルデータベースが利用可能である:

  • ベクトル検索プラグインを組み込んだ既存のリレーショナル・データベースまたはカラム型データベース。PG Vectorはその一例である。
  • 従来の転置インデックス型検索エンジンで、高密度のベクトルインデックスをサポートしているもの。ElasticSearchはその一例である。
  • ベクトル検索ライブラリ上に構築された軽量ベクトルデータベース。Chromaがその例。
  • 目的に特化したベクターデータベース。このタイプのデータベースは、ボトムアップのベクトル検索用に特別に設計され、最適化されている。分散コンピューティング、ディザスタリカバリ、データ永続化など、より高度な機能を提供する。Milvusがその主な例である。

すべてのベクターデータベースが同じように作られているわけではありません。それぞれのスタックには独自の利点と制限があり、用途によって向き不向きがある。

私が他のソリューションよりも特化したベクターデータベースを好むのは、ベクターデータベースが最も効率的で便利なオプションであり、多くのユニークな利点を提供するからである。以下のセクションでは、Milvusを例にして、私が好む理由を説明します。

専用ベクターデータベースの主な利点

Milvusはオープンソースの分散型専用ベクターデータベースで、何十億もの埋め込みベクターの保存、インデックス作成、管理、検索が可能です。また、LLM検索拡張生成のための最も一般的なベクトルデータベースの一つでもあります。Milvusは、他のベクターデータベースと異なる多くのユニークな利点を持っています。

データの永続性と費用対効果の高いストレージ

データ損失を防ぐことはデータベースの最低条件であるが、多くのシングルマシンや軽量ベクトルデータベースはデータの信頼性を優先していない。対照的に、Milvusのような目的に特化した分散ベクターデータベースは、ストレージと計算を分離することで、システムの耐障害性、スケーラビリティ、データの永続性を優先しています。

さらに、近似最近傍(ANN)インデックスを利用するほとんどのベクトルデータベースは、ANNインデックスを純粋にメモリにロードするため、ベクトル検索を実行するために多くのメモリを必要とする。しかし、Milvusはディスクインデックスをサポートしており、インメモリインデックスの10倍以上のコスト効率でストレージを利用することができる。

最適なクエリパフォーマンス

特化したベクトルデータベースは、他のベクトル検索オプションと比較して最適なクエリ性能を提供します。例えば、Milvusはベクトル検索プラグインよりもクエリ処理が10倍高速です。Milvusは、より高速なベクトル検索のために、KNNブルータル検索アルゴリズムの代わりにANNアルゴリズムを使用しています。さらに、インデックスをシャード化することで、データ量の増加に伴うインデックス構築にかかる時間を短縮している。このアプローチにより、Milvusは数十億のベクトルをリアルタイムでデータ追加・削除しながら容易に扱うことができる。対照的に、他のベクトル検索アドオンは、データ量が数千万以下で、追加や削除の頻度が低いシナリオにしか適していません。

MilvusはGPUアクセラレーションにも対応している。社内テストによると、GPUアクセラレーションによるベクトルインデックス作成は、数千万件のデータを検索する際に10,000 QPS以上を達成することができ、これはシングルマシンのクエリパフォーマンスにおいて、従来のCPUインデックス作成よりも少なくとも10倍高速です。

システムの信頼性

多くのアプリケーションは、低クエリレイテンシと高スループットを必要とするオンラインクエリにベクトルデータベースを使用しています。このようなアプリケーションでは、分単位でのシングルマシンフェイルオーバーが要求され、クリティカルなシナリオではリージョンをまたいだディザスタリカバリが必要な場合もあります。Raft/Paxosをベースとした従来のレプリケーション戦略では、リソースの浪費が深刻で、データの事前シャーディングを支援する必要があり、信頼性が低い。これに対してMilvusは、K8sメッセージキューを活用した分散アーキテクチャにより高可用性を実現し、リカバリ時間の短縮とリソースの節約を実現している。

運用性と監視性

エンタープライズユーザにより良いサービスを提供するためには、ベクターデータベースは操作性と観測性を向上させるためにエンタープライズレベルの様々な機能を提供する必要があります。Milvusは、K8s OperatorやHelm chart、docker-compose、pip installなど複数のデプロイ方法をサポートしており、さまざまなニーズを持つユーザーが利用できるようになっています。また、MilvusはGrafana、Prometheus、Lokiをベースとしたモニタリングとアラームシステムを提供し、観測性を向上させている。分散型クラウドネイティブアーキテクチャを採用したMilvusは、マルチテナント分離、RBAC、クォータ制限、ローリングアップグレードをサポートする業界初のベクターデータベースです。これらのアプローチにより、Milvusの管理と監視がよりシンプルになります。

Milvusを10分で始める3つのステップ

ベクトルデータベースの構築は複雑な作業ですが、それを使うのはNumpyとFAISSを使うのと同じくらい簡単です。AIに不慣れな学生でも、Milvusをベースとしたベクトル検索をわずか10分で実装することができます。スケーラブルで高性能なベクトル検索サービスを体験するには、以下の3つのステップに従ってください:

Like the article? Spread the word

続けて読む