適用対象: SQL Server 2025 (17.x) プレビュー
Azure SQL Database
Azure SQL Managed Instance
SQL データベース
ベクトルは、一部のデータに関する情報を表すことができる数値 (通常は浮動小数点数) の順序付けられた配列です。 たとえば、画像をピクセル値のベクターとして表したり、テキストの文字列を ASCII 値のベクターとして表したりできます。 データをベクトルに変換するプロセスを「ベクター化」と呼びます。
注
- プレビューでのベクターのサポートは変更される可能性があります。 オンライン サービスのサービス レベル アグリーメント (SLA) のプレビュー使用条件を必ず読んでください。
- ベクター機能は、 Always-up-to-date ポリシーを使用して構成された Azure SQL Managed Instance で使用できます。
埋め込み
埋め込みは、データの重要な特徴量を表すベクトルです。 埋め込みは、多くの場合、ディープ ラーニング モデルを使用して学習され、機械学習と AI モデルは埋め込みを機能として利用します。 埋め込みでは、同様の概念間のセマンティック類似性を把握することもできます。 たとえば、単語 person
と human
の埋め込みを生成する場合、これらの単語は意味的に似ているため、埋め込み (ベクトル表現) の値も似ていることが予想されます。
Azure OpenAI は、テキスト データから埋め込みを作成するためのモデルが特色となります。 このサービスは、テキストをトークンに分割し、OpenAI によって事前トレーニングされたモデルを使用して埋め込みを生成します。 詳細については、「 Azure OpenAI を使用した埋め込みの作成」を参照してください。
埋め込みを生成したら、SQL Server データベースに格納できます。 これにより、埋め込みを表すデータと共に格納したり、ベクター検索クエリを実行して同様のデータ ポイントを検索したりできます。
ベクター検索
ベクター検索とは、特定のクエリ ベクターに似たデータセット内のすべてのベクターを検索するプロセスを指します。 したがって、 human
単語のクエリ ベクターは、データセット全体で同様のベクトルを検索するため、同様の単語を検索します。この例では、 person
単語が近い一致として検索されます。 この近接度 (距離) は、コサイン距離などの距離メトリックを使用して測定されます。 ベクトルが近いほど、似ています。
SQL Server には、 ベクター データ型を介したベクターの組み込みサポートが用意されています。 ベクターは最適化されたバイナリ形式で格納されますが、便宜上 JSON 配列として公開されます。 ベクターの各要素は、単精度 (4 バイト) の浮動小数点値を使用して格納されます。 データ型と共に、ベクターを操作するための専用の関数があります。 たとえば、 VECTOR_DISTANCE 関数を使用して 2 つのベクトル間の距離を見つけることができます。 この関数は、指定した距離メトリックに基づいて、2 つのベクトル間の距離を持つスカラー値を返します。
ベクターは通常、浮動小数点の配列として管理されるため、ベクターの作成は JSON 配列を ベクター データ型にキャストするだけで実行できます。 たとえば、次のコードは JSON 配列からベクターを作成します。
SELECT
CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS v1,
CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;
または、暗黙的なキャストを使用する
DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;
ベクターを JSON 配列に変換する場合も同様です。
DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT
CAST(@v AS NVARCHAR(MAX)) AS s,
CAST(@v AS JSON) AS j
正確な検索とベクトルの距離 (最も近い近傍)
厳密な検索 (k-Nearest Neighbor (k-NN) 検索とも呼ばれます) では、特定のベクトルとデータセット内の他のすべてのベクトルとの間の距離を計算し、結果を並べ替え、指定した距離メトリックに基づいて最も近い近傍を選択します。 このメソッドは、最も近い近傍の正確な取得を保証しますが、特に大規模なデータセットでは、計算負荷が高い場合があります。
ベクトル距離関数は、ベクトル間の近接度を測定するために使用されます。 一般的な距離メトリックには、ユークリッド距離、コサイン類似性、ドット積が含まれます。 これらの関数は、k-NN 検索を実行し、正確な結果を確保するために不可欠です。
正確な最近傍 (ENN) ベクトル検索では、指定した距離メトリックに基づいて最も近い近傍の取得を保証するために、すべてのインデックス付きベクトルに対して包括的な距離計算が実行されます。 この方法は正確ですが、リソースを集中的に使用するため、精度が最も重要な小規模なデータセットやシナリオに適しています。
SQL Database エンジンでは、 VECTOR_DISTANCE 関数を使用して k-NN 検索を実行できます。これにより、ベクトル間の距離を効率的に計算でき、最も近い近傍の取得が容易になります。
次の例では、k-NN を実行して、 content_vector
テーブルに格納されている最も類似したベクトルの上位 10 個を特定のクエリ ベクター @qv
に返す方法を示します。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) AS distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance
検索するベクターが多くない場合は、正確な検索を使用することをお勧めします (一般的な推奨事項として 50,000 個未満のベクター)。 検索述語によって近隣検索に使用するベクターの数が 50,000 個以下に減る限り、テーブルにはさらに多くのベクターを含めることができます。
近似ベクトル インデックスとベクトル検索 (近似最近傍)
特定のクエリ ベクターに近いすべてのベクトルを識別するには、クエリ ベクターとテーブルに格納されているベクトルの間の距離を計算するための多くのリソースが必要です。 特定のクエリ ベクターに近いベクトルをすべて検索するには、テーブルの完全なスキャンと CPU 使用率の大幅な増加が含まれます。 これは "K-Nearest Neighbors" または "KNN" クエリと呼ばれ、最も近い "k" ベクトルを返します。
ベクターは、ユーザー クエリに応答する AI モデルの同様のデータを検索するために使用されます。 これには、ドット (内部) 積、コサイン類似性、ユークリッド距離などの距離メトリックを使用して、クエリ ベクターに最も近い "k" ベクトルについてデータベースにクエリを実行する必要があります。
KNN クエリはスケーラビリティに苦労することが多く、多くの場合、速度を大幅に向上させるために、精度 (特に再現率) をトレードオフできます。 このメソッドは、近似最近傍 (ANN) と呼ばれます。
リコールは、ベクトルや埋め込みを使用している、または使用を計画しているすべてのユーザーにとってなじみのある重要な概念です。 実際、再現率は、完全な検索で返される正確な最も近い近傍と比較して、アルゴリズムによって識別される近似最近傍の割合を測定します。 したがって、アルゴリズムが行っている近似の品質を適切に測定できます。 完全な再現率は近似を含まないため、1になります。
AI アプリケーションの場合、トレードオフは非常に妥当です。 ベクター埋め込みは既に概念に近いため、再現率が 1 に近い場合、ANN を使用しても結果に大きな影響はありません。 これにより、返される結果は KNN の結果とよく似ていますが、パフォーマンスが大幅に向上し、リソース使用量が大幅に削減されます。これは、運用データベースにとって非常に有益です。
ベクター インデックスを参照するときに使用される "index" という用語は、リレーショナル データベースで使用するインデックスとは異なる意味を持つ点を理解することが重要です。 実際、ベクトル インデックスは近似結果を返します。
MSSQL エンジンでは、ベクター インデックスは DiskANN アルゴリズムに基づいています。 DiskANN は、グラフを作成して、すべてのインデックス付きベクターをすばやく移動し、特定のベクターに最も近い一致を見つけることに依存します。 DiskANN は、限られた計算リソースを使用して大量のベクター データのインデックス作成と検索を行うグラフ ベースのシステムです。 SSD と最小限のメモリを効率的に使用して、メモリ内インデックスよりも大幅に多くのデータを処理します。一方、1 秒あたりのクエリ数 (QPS) が高く待機時間が短く、メモリ、CPU、I/O の使用量と検索パフォーマンスのバランスが確保されます。
近似最近傍アルゴリズム検索は、最初に CREATE VECTOR INDEX T-SQL コマンドを使用してベクター インデックスを作成してから、 VECTOR_SEARCH T-SQL 関数を使用して近似検索を実行できます。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT
t.id, s.distance, t.title
FROM
VECTOR_SEARCH(
TABLE = [dbo].[wikipedia_articles_embeddings] AS t,
COLUMN = [content_vector],
SIMILAR_TO = @qv,
METRIC = 'cosine',
TOP_N = 10
) AS s
ORDER BY s.distance