適用対象:SQL Server 2025 (17.x) プレビュー
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric Preview の SQL データベース
SQL Database エンジンは、あらゆる種類のデータを格納し、構造化および非構造化の任意の種類のクエリを実行し、そのデータに対してベクター検索を実行する機能を提供します。 これらのすべてのデータをまとめて検索する必要があり、アーキテクチャを複雑にする検索に別のサービスを使用したくないシナリオには適しています。
注
- ベクター機能は、 SQL Server 2025 または Always-up-to-date更新ポリシーで構成された Azure SQL Managed Instance で使用できます。
Vectors
ベクトルは、一部のデータに関する情報を表すことができる数値 (通常は浮動小数点数) の順序付けられた配列です。 たとえば、画像をピクセル値のベクターとして表したり、テキストの文字列を ASCII 値のベクターとして表したりできます。 データをベクターに変換するプロセスを「ベクター化」と呼びます。 SQL Server の ベクター データ型は、これらの数値配列を効率的に格納するように設計されています。
埋め込み
埋め込みとは、データの重要な特徴を表すベクトルです。 埋め込みは多くの場合、ディープ ラーニング モデルを使用して学習され、機械学習と 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) search とも呼ばれます) には、指定されたベクトルとデータセット内の他のすべてのベクトルとの間の距離を計算し、結果を並べ替え、指定した距離メトリックに基づいて最も近い近傍を選択する必要があります。 このメソッドは、最も近い近傍の正確な取得を保証しますが、特に大規模なデータセットでは、計算負荷が高い場合があります。
ベクトル距離関数は、ベクトル間の近接度を測定するために使用されます。 一般的な距離メトリックには、ユークリッド距離、コサイン類似性、ドット積が含まれます。 これらの関数は、k-NN 検索を実行し、正確な結果を確保するために不可欠です。
正確な最近傍 (ENN) ベクトル検索では、指定された距離メトリックに基づいて最も近い近傍の取得を保証するために、すべてのインデックス付きベクトルに対して包括的な距離計算が実行されます。 この方法は正確ですが、リソースを集中的に使用するため、精度が最も重要な小規模なデータセットやシナリオに適しています。
SQL Database エンジンでは、 VECTOR_DISTANCE 関数を使用して k-NN 検索を実行できます。これにより、ベクトル間の距離を効率的に計算でき、最も近い近傍の取得が容易になります。
次の例では、k-NN を実行して、 content_vector
テーブルに格納されている最も類似したベクトルの上位 10 個を特定のクエリ ベクター @qv
に返す方法を示します。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(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 個以下に減る限り、テーブルにはさらに多くのベクターを含めることができます。
近似ベクトル インデックスとベクトル検索 (近似最近傍)
注
近似ベクトル インデックスとベクター検索はプレビュー段階であり、現在は SQL Server 2025 (17.x) プレビューでのみ使用できます。
特定のクエリ ベクターに近いすべてのベクトルを識別するには、クエリ ベクターとテーブルに格納されているベクトルの間の距離を計算するための多くのリソースが必要です。 特定のクエリ ベクターに近いベクトルをすべて検索するには、テーブルの完全なスキャンと CPU 使用率の大幅な増加が含まれます。 これは、"K-nearest neighbors" または "k-NN" クエリと呼ばれ、最も近い "k" ベクトルを返します。
ベクターは、ユーザー クエリに応答する AI モデルの同様のデータを検索するために使用されます。 これには、ドット (内部) 積、コサイン類似性、ユークリッド距離などの距離メトリックを使用して、クエリ ベクターに最も近い "k" ベクトルについてデータベースにクエリを実行する必要があります。
K-NN クエリはスケーラビリティに苦労することが多く、多くの場合、大幅な速度向上のために精度 (特に再現率) をトレードオフできます。 このメソッドは、近似最近傍 (ANN) と呼ばれます。
リコールは、ベクトルや埋め込みを使用している、または使用を計画しているすべてのユーザーにとってなじみのある重要な概念です。 実際、再現率は、完全な検索で返される正確な最も近い近傍と比較して、アルゴリズムによって識別される近似最近傍の割合を測定します。 したがって、アルゴリズムが行っている近似の品質を適切に測定できます。 完全な再現率は近似を含まないため、1になります。
AI アプリケーションの場合、トレードオフは非常に妥当です。 ベクター埋め込みは既に概念に近いため、再現率が 1 に近い場合、ANN を使用しても結果に大きな影響はありません。 これにより、返される結果は k-NN の結果と非常によく似ていますが、パフォーマンスが大幅に向上し、リソース使用量が大幅に削減されます。これは、運用データベースにとって非常に有益です。
ベクター インデックスを参照するときに使用される "index" という用語は、リレーショナル データベースで使用するインデックスとは異なる意味を持つ点を理解することが重要です。 実際、ベクトル インデックスは近似結果を返します。
SQL Database エンジンでは、ベクター インデックスは DiskANN アルゴリズムに基づいています。 DiskANN は、グラフを作成して、すべてのインデックス付きベクターをすばやく移動し、特定のベクターに最も近い一致を見つけることに依存します。 DiskANN は、限られた計算リソースを使用して大量のベクター データのインデックス作成と検索を行うグラフ ベースのシステムです。 SSD と最小限のメモリを効率的に使用して、メモリ内インデックスよりも大幅に多くのデータを処理します。一方、1 秒あたりのクエリ数 (QPS) が高く待機時間が短く、メモリ、CPU、I/O の使用量と検索パフォーマンスのバランスが確保されます。
近似近接アルゴリズムの検索は、まず CREATE VECTOR INDEX T-SQL コマンドを使用してベクトル インデックスを作成してから、 VECTOR_SEARCH T-SQL 関数を使用して近似検索を実行します。
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(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