ベクター データベースは、データをベクター形式、つまりデータ ポイントの数値配列として格納および管理するツールです。
従来のデータベースは、データ分析でますます一般的になっている高次元データを処理するのに適していません。 いっぽうベクター データベースは、テキスト、画像、音声などの高次元データをベクターとして表して処理するように設計されています。 ベクター データベースは、機械学習、自然言語処理、画像認識など、大規模なデータセットのパターンや類似点の特定を目的とするタスクに役立ちます。
この記事では、ベクター データベースに関する背景情報を提供し、Microsoft Fabricの Real-Time Intelligence で Eventhouse をベクター データベースとして使用する方法について概念的に説明します。 実際の例については、「 チュートリアル: LLM 埋め込みで Eventhouse をベクター データベースとして使用する 」および 「チュートリアル: Eventhouse を SLM 埋め込みのあるベクター データベースとして使用する」を参照してください。
重要な概念
ベクター データベースでは、次のような基本概念を使用します。
ベクトルの類似性
ベクター類似性は、2つ以上のベクターが互いにどのように異なる (または類似している) かを示す尺度である。 ベクター類似性検索は、データセット内の類似ベクターを見つけるのに使用する手法である。 ユークリッド距離やコサイン類似性などの距離メトリックを使用して、ベクトルを比較します。 2 つのベクター間の距離が近いほど、類似性は高い。
埋め込み
埋め込みは、ベクター データベース内でベクター形式でデータを表すのに使用する一般的な方法です。 埋め込みは、単語、テキスト ドキュメント、画像などのデータの数学的表現であり、その意味をキャプチャします。 データを分析し、その主な特徴を表す数値のセットを生成するアルゴリズムを使用して、埋め込みを作成します。 たとえば、単語の埋め込みは、その単語の意味、コンテキスト、および他の単語との関係を表すことができます。 埋め込みは、ベクター データベース内でベクター形式でデータを表すのに使用する一般的な方法です。 埋め込みは、単語、テキスト ドキュメント、画像などのデータの数学的表現であり、その意味をキャプチャします。 データを分析し、その主な特徴を表す数値のセットを生成するアルゴリズムを使用して、埋め込みを作成します。 たとえば、単語の埋め込みは、その単語の意味、コンテキスト、および他の単語との関係を表すことができます。 Eventhouse では、KQL で埋め込みを直接生成するための 2 つのメソッドがサポートされています。
ai_embeddings プラグイン: 外部の Azure OpenAI エンドポイントを呼び出し、大きな言語モデル (LLM) を使用して埋め込みを生成します。 このメソッドは、最高品質の埋め込みを生成し、運用セマンティック検索ワークロードに最適です。
slm_embeddings_fl(): Kusto Python サンドボックス内で小規模言語モデル (SMM) をローカルで実行し、外部エンドポイントなしで埋め込みを生成します。 この方法では、OpenAI リソースAzure必要なく、埋め込みごとのコストは発生しません。
Azure OpenAI の埋め込みの詳細については、「Azure OpenAI Serviceの埋め込みについて」を参照してください。
埋め込み方法を選択する
次の表を使用して、シナリオに最適な方法を選択します。
| Consideration | ai_embeddings プラグイン (LLM) | slm_embeddings_fl() (SLM) |
|---|---|---|
| モデルの品質 | 最高品質; text-embedding-3-large などの Azure OpenAI モデルを使用 |
高品質。harrier-v1-270m、jina-v2-small、e5-small-v2 などのオープンソースのSLMを使用。 |
| 外部依存関係 | デプロイされた埋め込みモデルを持つ Azure OpenAI リソースが必要です | なし;モデルは、Python サンドボックス内でローカルに実行されます |
| コスト | Azure OpenAI の使用状況に基づく要求ごとの価格 | 埋め込みごとのコストなし |
| Throughput | Azure OpenAI レート制限に従います。バッチ処理と再試行ロジックが必要です | クラスター コンピューティング リソースによってのみ制限されます。クラスター サイズで自然にスケーリングする |
| セットアップ | Azure OpenAI のデプロイ、コールアウト ポリシーの構成、および ID の設定が必要です | Pythonプラグインが有効になっており、SLM アーティファクトが lakehouse にアップロードされている必要があります |
| コンテキストの最大長 | デプロイされたモデルによって異なります (たとえば、 text-embedding-3-largeの場合は 8,192 トークン) |
harrier-v1-270m では最大 32,768 トークン、jina-v2-small では 8,192 トークン、e5-small-v2 では 512 トークン |
| 最適な用途 | 埋め込みの品質が最も優先される運用セマンティック検索 | プライバシーに配慮が必要なワークフロー、迅速なプロトタイピング、大量バッチ埋め込み、または Azure OpenAI にアクセスできないシナリオ |
一般的なワークフロー
ベクター データベースを使用するための一般的なワークフローは次のとおりです。
- 埋め込みデータ: 埋め込みモデルを使用してデータをベクター形式に変換します。
- ベクターの格納: 埋め込まれたベクターをベクター データベースに格納します。 埋め込みデータを Eventhouse に送信して、ベクターを格納および管理できます。
- クエリの埋め込み: 格納されたデータの埋め込みに使用するのと同じ埋め込みモデルを使用して、クエリ データをベクター形式に変換します。
- ベクターのクエリ: ベクター類似性検索を使用して、クエリに類似したデータベース内のエントリを検索します。
ベクター データベースとしての Eventhouse
ベクター類似性検索の中核となるのは、ベクター データの格納、インデックス作成、クエリを実行する機能です。 Eventhouses は、特にリアルタイムの分析と探索を必要とするシナリオで、大量のデータを処理および分析するためのソリューションを提供します。 この機能により、Eventhouse はベクターの格納と検索に最適です。
Eventhouse の次のコンポーネントを使用すると、それをベクター データベースとして使用できます。
- 動的データ型。配列やプロパティ バッグなどの非構造化データを格納できます。 このデータ型を使用して、ベクター値を格納します。 元のオブジェクトに関連するメタデータをテーブル内の個別の列として格納することで、ベクター値をさらに拡張できます。
-
エンコード型
Vector16浮動小数点のベクトルを 16 ビット精度で格納するように設計されています。 このエンコードでは、既定の 64 ビットではなくBfloat16が使用されます。 このエンコードを使用してベクター埋め込みを格納します。これは、格納要件を 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前の手順で作成および定義したテーブルにデータを取り込みます。