ベクトル クエリの実行時、検索エンジンは類似のベクトルを検索して、検索結果に返される最適な候補を見つけます。 ベクター コンテンツのインデックスを作成した方法に応じて、関連する一致の検索は網羅的であるか、最も近い近傍に制限されて処理が高速化されます。 候補が見つかると、類似性メトリックを使用して、一致の強度に基づいて各結果にスコアを付けます。
この記事では、関連性のある一致を見つけるために使用されるアルゴリズムと、スコアリングに使用される類似性メトリックについて説明します。 また、検索結果が期待に沿っていない場合に関連性を向上させるヒントも提供します。
ベクトル検索で使用されるアルゴリズム
ベクター検索アルゴリズムには、次のものが含まれます。
- 完全なKニアレストネイバー (KNN)は、ベクトル空間全体のブルートフォーススキャンを実行します。
- 階層ナビゲーション可能なスモールワールド (HNSW) は、近似最近傍 (ANN) 検索を実行する。
クエリ内のインデックスまたはsearchableでsearchFieldsとしてマークされたベクター フィールドのみが、検索とスコアリングに使用されます。
網羅的な KNN について
完全な KNN は、データ ポイントのすべてのペア間の距離を計算し、クエリ ポイントの正確な k ニアレスト ネイバーを見つけます。 アルゴリズムはデータ ポイントの高速ランダム アクセスを必要としないため、KNN は ベクター インデックス サイズ クォータを使用しません。 ただし、これでは最近傍のグローバル セットが提供されます。
網羅的な KNN は計算負荷が高いため、小規模から中規模のデータセット、または精度の必要性がクエリ パフォーマンスの必要性を上回る場合に使用します。 もう 1 つのユース ケースは、 ANN アルゴリズムの再現率を評価するデータセットを構築することです。これは、完全な KNN を使用して、最も近い近隣ノードのグラウンド トゥルース セットを構築するために使用できるためです。
HNSW について
HNSW は、不明または揮発性のデータ分散を持つ高い再現率、低待機時間のアプリケーション向けに最適化された ANN アルゴリズムです。 インデックス作成中、HNSW は、データ ポイントを階層グラフに編成する追加のデータ構造を作成します。 クエリの実行中、HNSW はこのグラフ内を移動して最も関連性の高い一致を見つけ、効率的な最近隣検索を可能にします。
HNSW では、高速ランダム アクセスのためにすべてのデータ ポイントがメモリ内に存在する必要があります。この場合、 ベクター インデックス サイズ クォータが消費されます。 この設計は、検索精度と計算効率のバランスを取り、特に大規模なデータセットを検索する場合に HNSW をほとんどのシナリオに適しています。
HNSW には、検索アプリケーションのスループット、待機時間、および再現率を最適化するための調整可能な構成パラメーターがいくつか用意されています。 たとえば、HNSW を指定するフィールドでは、 クエリ要求 パラメーター "exhaustive": trueを使用した完全な KNN もサポートされます。 ただし、効率的な検索を可能にする追加のデータ構造が存在しないため、 exhaustiveKnn 用にインデックスが作成されたフィールドは HNSW クエリをサポートしていません。
ANN について
ANN は、ベクトル空間内の一致を検索するためのアルゴリズムのクラスです。 このクラスのアルゴリズムでは、さまざまなデータ構造またはデータパーティション分割方法を使用して、検索領域を大幅に削減し、クエリ処理を高速化します。
ANN アルゴリズムは精度を犠牲にしますが、近似最近傍のスケーラブルで高速な取得を提供するため、最新の情報取得アプリケーションでの精度と効率のバランスを取るのに最適です。 アルゴリズムのパラメーターを調整して、検索用途のリコール、待機時間、メモリ、ディスク フットプリントの要件を微調整できます。
Azure AI Search では、ANN アルゴリズムに HNSW が使用されます。
ニアレストネイバー検索のしくみ
ベクトル クエリは、同じ埋め込みモデルから生成されたベクトルで構成される埋め込み空間に対して実行されます。 一般に、クエリ要求内の入力値は、ベクトル インデックスに埋め込みを生成したのと同じ機械学習モデルにフィードされます。 出力は、同じ埋め込み空間内のベクトルです。 同様のベクトルが近接してクラスター化されるため、一致を見つけることは、クエリ ベクトルに最も近いベクトルを見つけ、関連するドキュメントを検索結果として返すのと同じです。
たとえば、クエリ要求がホテルに関する場合、モデルは、ホテルに関するドキュメントを表すベクトルのクラスター内のどこかに存在するベクトルにクエリをマップします。 類似度メトリックに基づいて、クエリに最も似ているベクトルを特定すると、最も関連性の高いドキュメントが決まります。
完全な KNN に対してベクトル フィールドのインデックスが作成されると、クエリは "all neighbors" に対して実行されます。 HNSW 用にインデックスが作成されたフィールドの場合、検索エンジンは HNSW グラフを使用して、ベクトル インデックス内のノードのサブセットを検索します。
HNSW グラフの作成
インデックス作成中、検索サービスは HNSW グラフを構築します。 HNSW グラフに新しいベクトルのインデックスを作成する目的は、効率的な最近隣検索をサポートする方法でグラフ構造に追加することです。 次の手順は、このプロセスをまとめたものです。
初期化: 空の HNSW グラフから開始するか、新しいインデックスでない場合は既存の HNSW グラフを使用します。
エントリ ポイント: これは階層グラフの最上位レベルであり、インデックス作成の開始点として機能します。
グラフへの追加: 階層レベルが異なると、グラフの細分性が異なり、レベルが高いほどグローバルになり、レベルが低いほど細かく表示されます。 グラフ内の各ノードは、ベクトル ポイントを表します。
各ノードは、近隣にある最大
m個のネイバーに接続されます。 これがmパラメーターです。efConstructionパラメーターは、候補の接続と見なされるデータ ポイントの数を制御します。 この動的リストは、アルゴリズムが考慮する既存のグラフ内の最も近いポイントのセットを形成します。efConstruction値が大きいほど、多くのノード数が考慮され、多くの場合、各ベクトルのローカル近傍が高密度になります。これらの接続では、構成された類似性
metricを使用して距離を決定します。 一部の接続は、さまざまな階層レベルで接続する "長距離" 接続であり、検索効率を向上させるショートカットをグラフに作成します。
グラフの枝刈りと最適化: これは、すべてのベクトルのインデックス作成後に発生する可能性があり、HNSW グラフのナビゲート性と効率が向上します。
クエリ時の HNSW グラフ内の移動
ベクトル クエリは、一致をスキャンするために階層グラフ構造内を移動します。 次の手順は、このプロセスをまとめたものです。
初期化: アルゴリズムは、階層グラフの最上位レベルで検索を開始します。 このエントリ ポイントには、検索の開始点として機能するベクトルのセットが含まれています。
トラバーサル: 次に、グラフ レベルをレベルごとに走査し、最上位レベルから下位レベルに移動します。 コサインの類似性など、構成された距離メトリックに基づいて、クエリ ベクターに近い候補ノードが選択されます。
枝刈り: 効率を向上させるために、アルゴリズムは、ニアレストネイバーを含む可能性が高いノードのみを考慮して、検索領域を刈り込みます。 候補候補の優先順位キューが維持され、検索が進むにつれて更新されます。 このキューの長さは、パラメーター
efSearchによって構成されます。絞り込み: アルゴリズムがより低く、より細かいレベルに移行すると、HNSW はクエリの近くでより多くの近隣を考慮します。 この考慮事項により、ベクトルの候補セットを絞り込み、精度を向上できます。
完了: 検索は、最も近い近隣ノードの必要な数が特定されたとき、または他の停止条件が満たされたときに完了します。 クエリ時間パラメーター
kは、この最も近い近隣ノードのこの必要な数を制御します。
類似性の測定に使用される類似性メトリック
アルゴリズムは、類似性を評価する候補ベクトルを検索します。 このタスクを実行するために、類似性メトリック計算では、候補ベクトルとクエリ ベクトルを比較し、類似性を測定します。 アルゴリズムは、見つかった最も類似したベクトルの順序付けされたセットを追跡します。これは、アルゴリズムが完了に達したときにランク付けされた結果セットを形成します。
| メトリック | 説明 |
|---|---|
cosine |
このメトリックは、2 つのベクトル間の角度を測定し、ベクターの長さの違いによる影響を受けません。 数学的には、2 つのベクトル間の角度を計算します。 コサインは Azure OpenAI 埋め込みモデルで使用される類似性メトリックであるため、Azure OpenAI を使用している場合は、ベクトル構成で cosine を指定します。 |
dotProduct |
このメトリックは、2 つのベクトルの各ペアの長さとそれらの間の角度の両方を測定します。 数学的には、ベクトルの大きさとそれらの間の角度の積を計算します。 正規化されたベクトルの場合、このメトリックは cosine の類似性と同じですが、パフォーマンスが若干高くなります。 |
euclidean |
(別名 l2 norm) このメトリックは、2 つのベクトル間のベクトル長の差を測定します。 数学的には、2 つのベクトルの差の l2ノルムである 2 つのベクトル間のユークリッド距離を計算します。 |
注
2 つ以上のベクトル クエリを並列で実行する場合、または同じ要求でベクトル クエリとテキスト クエリを組み合わせたハイブリッド検索を実行する場合は、逆ランク Fusion (RRF) が最終的な検索結果のスコア付けに使用されます。
ベクトル検索結果のスコア
各マッチにスコアが計算され、割り当てられます。 最も一致度の高い結果が、k 結果として返されます。
@search.score プロパティにスコアが含まれています。 次の表は、スコアが収まる範囲を示しています。
| 検索メソッド | パラメーター | スコアリング メトリック | Range |
|---|---|---|---|
| ベクトル検索 | @search.score |
コサイン | 0.333 - 1.00 |
cosineメトリックの場合、計算された@search.scoreはクエリ ベクターとドキュメント ベクターの間のコサイン値ではありません。 代わりに、Azure AI Search は変換を適用して、スコア関数が単調に減少するようにします。 スコア値は、類似性が悪くなるにつれて常に減少します。 この変換により、検索スコアをランク付け目的で使用できます。
類似性スコアにはいくつかの微妙な違いがあります:
- コサイン類似性は、2 つのベクトル間の角度のコサインとして定義されます。
- コサイン距離は
1 - cosine_similarityとして定義されます。
単調に減少する関数が作成されるように @search.score は 1 / (1 + cosine_distance) として定義されます。
合成値ではなくコサイン値が必要な場合は、数式を使用して検索スコアをコサイン距離に戻します。
double ScoreToSimilarity(double score)
{
double cosineDistance = (1 - score) / score;
return -cosineDistance + 1;
}
元のコサイン値を持たせておくと、低品質の結果をトリミングするためのしきい値を設定するカスタム ソリューションにおいて有用です。
関連性のチューニングに関するヒント
関連する結果が得られない場合は、 クエリ構成を変更してみてください。 ベクター クエリには、スコアリング プロファイルやフィールド、用語ブーストなど、特定のチューニング機能がありません。
さまざまな チャンク サイズと重複設定を 試してください。 チャンク サイズを大きくし、チャンク間のコンテキストまたは継続性を維持するのに十分な重複があることを確認します。
HNSW の場合は、近接グラフの内部構成を変更するさまざまなレベルの
efConstructionを試します。 既定値は 400 です。 範囲は 100 ~ 1,000 です。k結果を増やして、より多くの検索結果をチャット モデルに送信します (使用している場合)。セマンティック ランク付けを使用してハイブリッド クエリを試します。 ベンチマーク テストでは、この組み合わせが一貫して最も関連性の高い結果をもたらしました。