セマンティック検索を理解する

完了

以下に示すセマンティック検索の基礎について確認しましょう。

  • 標準的な字句検索とどのように異なるか。
  • ベクトル埋め込みとは?
  • ベクトル データベースは何を行うのか?

標準的な字句検索、またはキーワード検索は、文字のマッチによってドキュメントのクエリを実行します。 たとえば、"light" というクエリが "bright light" というテキストとマッチするのは、light という文字がドキュメント内に現れるからです。

字句検索はあいまい一致を使用して拡張できます。たとえば、"lights" というクエリは、1 文字の欠落 (s, の不足や gh の入れ替わり) にも関わらず、"bright light" というテキストやミススペルの lihgts とマッチさせることができます。 あいまい一致やステミングなどの他の手法は有用ですが、この手法では同意語や意味的に似た言葉 (異なる言い回し、スラング、専門用語など) とのマッチを行う必要があります。字句検索で最も関連性の高い検索結果を提供するには、著者がメタデータまたはテキスト自体の中にキーワードを埋め込む必要があります (これは不自然なユーザー エクスペリエンスをもたらす可能性があります)。

セマンティック検索の話に入ります。 セマンティック検索は、文字の類似性を使用しません。 代わりに、単語やフレーズに含まれる概念の数値的表現を使用します。 これらの数値的表現は、埋め込みベクトルまたは単に埋め込みと呼ばれます。

2 つの埋め込みが数値的に近い場合、それらは意味的にも近いことになります。 この類似性は、正確なキーワードの選択や言い回しの影響を受けにくいため、キーワードの重複性のテストよりも汎用的です。

セマンティック検索を実行するには、最初にクエリの埋め込みベクトルを生成します。 次に、そのベクトルをベクトルのデータベースに対して比較します。 クエリの埋め込みに最も近い埋め込みは、クエリと最も意味的に近いドキュメントとなります。

ほとんどのリレーショナル データベースのユース ケースには、n 次元ベクトルの保存とそれらの間の数値的距離の計算は含まれていません。 効率的なセマンティック検索には、ベクトル データベース機能が必要です。

OpenAI Embeddings API を通して埋め込みベクトルになるドキュメントとクエリを表す図。これらのベクトルは、次にコサイン距離を使用して比較されます。

埋め込み

埋め込みは、セマンティクスの数値的表現です。 埋め込みは、n 次元ベクトル (n 個の数値の配列) として表現されます。 各次元は、埋め込みモデルによって決まる何らかのセマンティック性を表します。

2 つの埋め込みベクトルが同じ方向を指している場合、それらは "bright" や "sunny" などの類似した概念を表します。互いに離れた方向を指している場合は、"sad" や "happy" などの反対の概念を表します。埋め込みモデルの構造とトレーニング データによって、何が類似しており何が異なると見なされるのかが決まります。

埋め込みは、テキストだけでなく画像やオーディオなどのあらゆる種類のデータに適用できます。 重要な部分は、何らかのモデルまたは関数に基づいてデータを n 次元埋め込みベクトルに変換することです。 埋め込みの数値的類似性は、対応するデータの意味的類似性の代わりとなります。

2 つの n 次元ベクトル v1v2 の数値的類似性は、それらのドット積によって与えられ、v1·v2 と記述されます。 ドット積を計算するには、以下のように、各次元の値のペアごとに乗算を行い、その結果を合計します。

dot_product(v1, v2) = SUM(
 v1[0] * v2[0] +
 v1[1] * v2[1],
 ...,
 v1[n-1] * v2[n-1],
 v1[n] * v2[n]
)

埋め込みは単位ベクトル (長さ 1 のベクトル) であるため、ドット積はベクトル同士のコサイン類似性と等しく、-1 (完全に反対の方向) と 1 (まったく同じ方向) の間の値となります。 コサイン類似性が 0 であるベクトル同士は直交しており、意味的に無関係です。

n 次元空間は、それらを主成分分析 (PCA) を使用して 3 次元空間に投影することで、視覚化できます。 PCA は、ベクトルの次元数を減らすための標準的な手法です。 結果は、n 次元空間の簡略化された視覚的投影になります。 この方法でドキュメント埋め込みをレンダリングすると、類似性の高いドキュメントがクラスター内にグループ化される一方で、より異なるドキュメントは非常に離れた場所に位置することがわかります。

これらの定義を踏まえると、ドキュメント埋め込みのコレクションに対して、クエリのセマンティック検索を実行することは、以下のように数学的には簡単です。

  1. 言語モデルを使用してクエリ埋め込みを生成します。
  2. 各ドキュメントの事前計算された埋め込みに対して、クエリ埋め込みのドット積を計算します。
  3. ドット積を -1 から 1 の数値に並べ替えます。
  4. 最も関連性の高い (意味的に類似した) ドキュメントのスコアは最も高くなり、最も関連性の低い (意味的に異なる) ドキュメントのスコアは最も低くなります。

数学的には単純ですが、これはリレーショナル データベースにおいては単純またはパフォーマンスの高いクエリではありません。 この種のベクトル類似性クエリを保存して処理するには、ベクトル データベースを使用します。

ベクトル データベース

ベクトル データベースは、埋め込みなどの多次元ベクトルの保存と計算を最適化します。 特に、ベクトル データベースは、ベクトル類似性クエリを実行するための高速かつ正確なドット積計算を提供します。

ベクトル類似性検索には、以下のようないくつかのユース ケースがあります。

  • クエリ画像の埋め込みに類似した画像を検索する
  • 意味的にクエリ テキストに類似したドキュメントを検索する
  • レコメンデーション システム用に類似した機能と評価を持つ製品を検索する

セマンティック検索は、ベクトル データベースにクエリを実行して、保存されている各埋め込みに対するクエリ埋め込みの類似性を取得します。 その後、アプリケーションは埋め込みに対応するデータをフェッチできます。

選択候補となるネイティブ ベクトル データベースとデータベース拡張機能は多数存在します。 以下の Azure サービスは、ベクトル データベースのニーズを満たすのに役立つ可能性があります。