ベクトル データベース
ベクター データベースは、データをベクター形式、つまりデータ ポイントの数値配列として格納および管理するツールです。
ベクターを使用することで、ベクター類似性検索、量子化、クラスタリングなどの高度な手法によりベクターを比較および分析できるようになり、複雑なクエリや分析が可能になります。 従来のデータベースは、データ分析でますます一般的になっている高次元データを処理するのに適していません。 いっぽうベクター データベースは、テキスト、画像、音声などの高次元データをベクターとして表して処理するように設計されています。 ベクター データベースは、機械学習、自然言語処理、画像認識など、大規模なデータセットのパターンや類似点の特定を目的とするタスクに役立ちます。
この記事では、ベクター データベースの背景について説明し、Microsoft Fabric のリアルタイム インテリジェンスで Eventhouse をベクター データベースとして使用する方法について概念的に説明します。 実際の例については、「Tutorial: Eventhouse をベクター データベースとして使用する」を参照してください。
重要な概念
ベクター データベースでは、次のような基本概念を使用します。
ベクトルの類似性
ベクター類似性は、2つ以上のベクターが互いにどのように異なる (または類似している) かを示す尺度である。 ベクター類似性検索は、データセット内の類似ベクターを見つけるのに使用する手法である。 ベクターは、ユークリッド距離やコサイン類似性などの距離メトリックを使用して比較する。 2 つのベクター間の距離が近いほど、類似性は高い。
埋め込み
埋め込みは、ベクター データベース内でベクター形式でデータを表すのに使用する一般的な方法です。 埋め込みは、単語、テキスト ドキュメント、画像などのデータの数学的表現であり、そのセマンティックな意味をキャプチャするように設計されています。 埋め込みは、データを分析してその主な特徴を表す数値セットを生成するアルゴリズムを使用して作成されます。 たとえば、単語の埋め込みは、その単語の意味、コンテキスト、および他の単語との関係を表すことができます。 埋め込みを作成するプロセスはシンプルです。 標準の Python パッケージ (spaCy、sent2vec、Gensim など) を使用して作成することもできますが、大規模言語モデル (LLM) では、セマンティック テキスト検索向けに最高品質の埋め込みを生成します。 たとえば、Azure OpenAI の埋め込みモデルにテキストを送信するとベクター表現を生成するので、これを格納して分析することができます。 詳細については、「Azure OpenAI Service での埋め込みについて理解する」を参照してください。
一般的なワークフロー
ベクター データベースを使用するための一般的なワークフローは次のとおりです。
- データの埋め込み: 埋め込みモデルを使用してデータをベクター形式に変換します。 たとえば、OpenAI モデルを使用してテキスト データを埋め込むことができます。
- ベクターの格納: 埋め込まれたベクターをベクター データベースに格納します。 埋め込みデータを Eventhouse に送信して、ベクターを格納および管理できます。
- クエリの埋め込み: 格納されたデータの埋め込みに使用するのと同じ埋め込みモデルを使用して、クエリ データをベクター形式に変換します。
- ベクターのクエリ: ベクター類似性検索を使用して、クエリに類似したデータベース内のエントリを検索します。
ベクター データベースとしての Eventhouse
ベクター類似性検索のコアとなるのは、ベクター データを格納してインデックス化し、クエリできるようにする機能です。 Eventhouse は、特にリアルタイムの分析と探索を必要とするシナリオにおいて、大量のデータを処理および分析するのに適したソリューションで、ベクターの格納や検索に非常に優れています。
次のコンポーネントを使用すると、Eventhouse をベクター データベースとして使用できます。
- 動的データ型。配列やプロパティ バッグなどの非構造化データを格納できます。 したがって、ベクター値を格納する際にはデータ型の使用をお勧めします。 元のオブジェクトに関連するメタデータをテーブル内の個別の列として格納することで、ベクター値をさらに拡張できます。
- エンコード型
Vector16
は浮動小数点のベクターを 16 ビット精度で格納するように設計されており、既定の 64 ビットではなくBfloat16
を使用します。 このエンコード型は、ML ベクター埋め込みの格納時に推奨されます。エンコード型の使用により格納要件が 4 分の 1 に減り、series_dot_product() や series_cosine_similarity() などのベクター処理関数が桁違いに高速化されます。 - series_cosine_similarity関数。Eventhouse に格納されているベクター上でベクター類似性検索を実行できます。
スケーリング向けに最適化
ベクター類似性検索の最適化の詳細については、ブログを参照してください。
パフォーマンスと結果の検索時間を最大化するには、次の手順に従います。
- 埋め込み列のエンコードをベクトル係数の 16 ビット エンコード (既定の 64 ビットではなく) である Vector16 に設定します。
- 次の手順で行う、プロセッサごとに少なくとも 1 つのシャードを持つすべてのクラスター ノードに埋め込みベクター テーブルを格納します。
- シャーディング ポリシーの ShardEngineMaxRowCount を変更して、シャードあたりの埋め込みベクターの数を制限します。 シャーディング ポリシーでは、ノードごとに複数のエクステントを持つすべてのノード上のデータが分散されるため、検索で使用可能なすべてのプロセッサを使用できます。
- 統合ポリシーのRowCountUpperBoundForMergeを変更します。 インジェスト後のマージ エクステントを抑制するには、統合ポリシーが必要です。
最適化手順の例
次の例では、1M ベクトルを格納するために静的ベクター テーブルが定義されています。 埋め込みポリシーは Vector16 として定義され、シャーディング ポリシーと統合ポリシーはベクター類似性検索用にテーブルを最適化するように設定されます。 ここでは、クラスターに 20 個のノードがあり、それぞれに 16 個のプロセッサがあるとします。 テーブルのシャードには、最大 1000000/(20*16)=3125 行が含まれている必要があります。
次の 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
前の手順で作成および定義したテーブルにデータを取り込みます。