このページでは、Spanner で提供されているベクトル距離関数から選択し、ベクトル エンベディング間の類似度を測定する方法について説明します。
Spanner データからエンベディングを生成したら、ベクトル距離関数を使用して類似検索を実行できます。次の表に、Spanner のベクトル距離関数を示します。
関数 | 説明 | 数式 | 類似度の増加との関係 |
---|---|---|---|
ドット積 | 角度 \(\theta\) のコサインに、対応するベクトルの大きさを掛けます。 | \(a_1b_1+a_2b_2+...+a_nb_n\) \(=|a||b|cos(\theta)\) | 増加 |
コサイン距離 | コサイン距離関数は、1 からコサイン類似度を減算します(cosine_distance() = 1 - cosine similarity )。コサイン類似度は、2 つのベクトル間の角度 \(\theta\) のコサインを測定します。 |
1 - \(\frac{a^T b}{|a| \cdot |b|}\) | 減少 |
ユークリッド距離 | 2 つのベクトル間の直線距離を測定します。 | \(\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+...+(a_N-b_N)^2}\) | 減少 |
類似性測度の選択
すべてのベクトル エンベディングが正規化されているかどうかによって、類似性を見つけるために使用する類似性測度を決定できます。正規化されたベクトル エンベディングの大きさ(長さ)は正確に 1.0 です。
正規化されたデータ
すべてのベクトル エンベディングが正規化されたデータセットがある場合、3 つの関数はすべて同じセマンティック検索の結果を提供します。基本的に、各関数は異なる値を返しますが、それらの値は同じ方法で並べ替えられます。エンべディングが正規化されている場合、通常は DOT_PRODUCT()
が最も計算効率が優れていますが、ほとんどの場合、その差はごくわずかです。ただし、アプリケーションのパフォーマンスが重視される場合は、DOT_PRODUCT()
がパフォーマンスの調整に役立つことがあります。
正規化されていないデータ
ベクトル エンベディングが正規化されていないデータセットがある場合、関数としてのドット積は距離を測定しないため、DOT_PRODUCT()
を距離関数として使用するのは数学的には正しいものではありません。エンベディングの生成方法と優先する検索タイプに応じて、コサイン距離関数とユークリッド距離関数のいずれかで、もう一方の関数よりも主観的に優れた検索結果が生成される場合があります。
データが正規化されているかどうか不明
データが正規化されているかどうかが不明な場合に DOT_PRODUCT()
を使用する場合は、代わりに COSINE_DISTANCE()
を使用することをおすすめします。COSINE_DISTANCE()
は、正規化が組み込まれた DOT_PRODUCT()
に似ています。COSINE_DISTANCE()
を使用して測定された類似度は -1
~1
の範囲です。結果が 0
に近いほど、ベクトルが非常に類似していることを示します。
次のステップ
- k 最近傍探索を行ってベクトル検索を行う方法の詳細をご覧ください。
- Vertex AI ベクトル検索にエンベディングをエクスポートする方法をご覧ください。
- GoogleSQL の
COSINE_DISTANCE()
関数、EUCLIDEAN_DISTANCE()
関数、DOT_PRODUCT()
関数の詳細をご覧ください。 - PostgreSQL の
spanner.cosine_distance()
関数、spanner.euclidean_distance(), and spanner.dot_product()
関数の詳細をご覧ください。