ベクター データベースは、データをベクター形式、つまりデータ ポイントの数値配列として格納および管理するツールです。
ベクトルの類似性検索、量子化、クラスタリングなどの高度な手法を使用してベクトルを比較および分析できるため、ベクターを使用すると複雑なクエリや分析が可能になります。 従来のデータベースは、データ分析でますます一般的になっている高次元データを処理するのに適していません。 いっぽうベクター データベースは、テキスト、画像、音声などの高次元データをベクターとして表して処理するように設計されています。 ベクター データベースは、機械学習、自然言語処理、画像認識など、大規模なデータセットのパターンや類似点の特定を目的とするタスクに役立ちます。
この記事では、ベクター データベースの背景について説明し、Microsoft Fabric のリアルタイム インテリジェンスで Eventhouse をベクター データベースとして使用する方法について概念的に説明します。 実際の例については、「Tutorial: Eventhouse をベクター データベースとして使用する」を参照してください。
重要な概念
ベクター データベースでは、次のような基本概念を使用します。
ベクトルの類似性
ベクター類似性は、2つ以上のベクターが互いにどのように異なる (または類似している) かを示す尺度である。 ベクター類似性検索は、データセット内の類似ベクターを見つけるのに使用する手法である。 ユークリッド距離やコサイン類似性などの距離メトリックを使用して、ベクトルを比較します。 2 つのベクター間の距離が近いほど、類似性は高い。
埋め込み
埋め込みは、ベクター データベース内でベクター形式でデータを表すのに使用する一般的な方法です。 埋め込みは、単語、テキスト ドキュメント、画像などのデータの数学的表現であり、そのセマンティックな意味をキャプチャするように設計されています。 データを分析し、その主な特徴を表す数値のセットを生成するアルゴリズムを使用して、埋め込みを作成します。 たとえば、単語の埋め込みは、その単語の意味、コンテキスト、および他の単語との関係を表すことができます。 埋め込みを作成するプロセスはシンプルです。 標準の Python パッケージ (spaCy、sent2vec、Gensim など) を使用して作成できますが、大きな言語モデル (LLM) では、セマンティック テキスト検索用に最高品質の埋め込みを生成します。 たとえば、 Azure OpenAI の埋め込みモデルにテキストを送信すると、分析用に格納できるベクター表現が生成されます。 詳細については、「Azure OpenAI Service での埋め込みについて理解する」を参照してください。
一般的なワークフロー
ベクター データベースを使用するための一般的なワークフローは次のとおりです。
- データの埋め込み: 埋め込みモデルを使用してデータをベクター形式に変換します。 たとえば、OpenAI モデルを使用してテキスト データを埋め込むことができます。
- ベクターの格納: 埋め込まれたベクターをベクター データベースに格納します。 埋め込みデータを Eventhouse に送信して、ベクターを格納および管理できます。
- クエリの埋め込み: 格納されたデータの埋め込みに使用するのと同じ埋め込みモデルを使用して、クエリ データをベクター形式に変換します。
- ベクターのクエリ: ベクター類似性検索を使用して、クエリに類似したデータベース内のエントリを検索します。
ベクター データベースとしての Eventhouse
ベクター類似性検索の中核となるのは、ベクター データの格納、インデックス作成、クエリを実行する機能です。 Eventhouses は、特にリアルタイムの分析と探索を必要とするシナリオで、大量のデータを処理および分析するためのソリューションを提供します。 この機能により、Eventhouse はベクターの格納と検索に最適です。
Eventhouse の次のコンポーネントを使用すると、それをベクター データベースとして使用できます。
- 動的データ型。配列やプロパティ バッグなどの非構造化データを格納できます。 このデータ型を使用して、ベクター値を格納します。 元のオブジェクトに関連するメタデータをテーブル内の個別の列として格納することで、ベクター値をさらに拡張できます。
-
エンコード型
Vector16浮動小数点のベクトルを 16 ビット精度で格納するように設計されています。 このエンコードでは、既定の 64 ビットではなくBfloat16が使用されます。 このエンコードを使用して ML ベクター埋め込みを格納します。これは、ストレージ要件を 4 倍に減らし、series_dot_product() や series_cosine_similarity() などのベクター処理関数を桁違いに高速化するためです。 - series_cosine_similarity関数。Eventhouse に格納されているベクトルの上にベクターの類似性検索を実行するために使用できます。
スケーリング向けに最適化
ベクター類似性検索の最適化の詳細については、 ブログを参照してください。
パフォーマンスと結果の検索時間を最大化するには、次の手順に従います。
- 埋め込み列のエンコードをベクトル係数の 16 ビット エンコード (既定の 64 ビットではなく) である Vector16 に設定します。
- プロセッサごとに少なくとも 1 つのシャードを持つすべてのクラスター ノードに埋め込みベクター テーブルを格納します。 この目標を達成するには、次の手順に従います。
- シャーディング ポリシーの ShardEngineMaxRowCount を変更して、シャードあたりの埋め込みベクターの数を制限します。 シャーディング ポリシーでは、ノードごとに複数のエクステントを持つすべてのノード上のデータが分散されるため、検索で使用可能なすべてのプロセッサを使用できます。
- 統合ポリシーのRowCountUpperBoundForMergeを変更します。 インジェスト後のマージ エクステントを抑制するには、統合ポリシーが必要です。
最適化手順の例
次の例では、1M ベクトルを格納するための静的ベクター テーブルを定義します。 埋め込みポリシーを Vector16 として定義し、シャーディング ポリシーとマージ ポリシーを設定して、ベクターの類似性検索用にテーブルを最適化します。 この例では、クラスターに 20 個のノードがあり、各ノードに 16 個のプロセッサがあるとします。 テーブルのシャードには、最大 1,000,000/(20*16)=3,125 行が含まれている必要があります。
次の KQL コマンドを 1 つずつ実行して空のテーブルを作成し、必要なポリシーとエンコードを設定します。
.create table embedding_vectors(vector_id:long, vector:dynamic) // This is a sample selection of columns, you can add more columns .alter column embedding_vectors.vector policy encoding type = 'Vector16' // Store the coefficients in 16 bits instead of 64 bits accelerating calculation of dot product, suppress redundant indexing .alter-merge table embedding_vectors policy sharding '{ "ShardEngineMaxRowCount" : 3125 }' // Balanced data on all nodes and, multiple extents per node so the search can use all processors .alter-merge table embedding_vectors policy merge '{ "RowCountUpperBoundForMerge" : 3125 }' // Suppress merging extents after ingestion前の手順で作成および定義したテーブルにデータを取り込みます。