ベクトル類似性検索を実行する

このドキュメントでは、pgvector 拡張機能を使用して AlloyDB for PostgreSQL でベクトル類似性検索を行う方法について説明します。ベクトル類似性検索(最近傍探索とも呼ばれます)を使用すると、指定されたクエリベクトルに最も類似したデータポイントをデータ内で見つけることができます。

エンベディングを保存してインデックスに登録した後、AlloyDB データベースに対して意味的に類似したベクトルをクエリできます。pgvector クエリ機能を使用して、エンベディング ベクトルの最近傍を見つけます。

ベクトル エンベディングの保存とインデックスの作成の詳細については、ベクトル エンベディングを保存するインデックスを作成するをご覧ください。

類似性検索を実行するには、テーブル、エンベディング列、距離関数、ターゲット エンベディング、返す行数を指定します。embedding() 関数を使用してテキストをベクトルに変換し、pgvector 演算子を使用してベクトルと保存されたエンベディングを比較することもできます。

エンベディング ベクトルの最近傍セマンティック ネイバーを見つけるには、次のサンプルクエリを実行します。ここでは、インデックスの作成時に使用した距離関数を設定します。

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
    LIMIT ROW_COUNT

次のように置き換えます。

  • TABLE: テキストを比較するエンベディングを含むテーブル。

  • EMBEDDING_COLUMN: 保存されたエンベディングを含む列。

  • DISTANCE_FUNCTION_QUERY: このクエリで使用する距離関数。インデックスの作成時に使用した距離関数に基づいて、次のいずれかを選択します。

    • L2 距離: <->

    • 内積: <#>

    • コサイン距離: <=>

  • EMBEDDING: 保存されているセマンティック ネイバーの中で最も近いものを見つけるエンベディング ベクトル。

  • ROW_COUNT: 返される行数。

    最良の一致が 1 つだけ必要な場合は、1 を指定します。

その他のクエリの例については、クエリをご覧ください。

embedding() 関数を使用してテキストをベクトルに変換することもできます。標準の pgvector PostgreSQL 拡張機能は AlloyDB 用にカスタマイズされており、vector と呼ばれます。ベクトルを pgvector 最近傍演算子のいずれか(L2 距離の <-> など)に適用して、意味的に最も類似したエンベディングを含むデータベース行を見つけます。

embedding()real 配列を返すため、これらの値を pgvector 演算子で使用するには、embedding() 呼び出しを vector に明示的にキャストする必要があります。

  CREATE EXTENSION IF NOT EXISTS google_ml_integration VERSION '1.2';
  CREATE EXTENSION IF NOT EXISTS vector;

  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
    LIMIT ROW_COUNT

次のように置き換えます。

  • MODEL_ID: クエリするモデルの ID。

    Vertex AI Model Garden を使用している場合は、モデル ID として text-embedding-005 を指定します。これらは、AlloyDB がテキスト エンベディングに使用できるクラウドベースのモデルです。詳細については、テキスト エンベディングをご覧ください。

  • 省略可: VERSION_TAG: クエリするモデルのバージョンタグ。タグの前に @ を付けます。

    Vertex AI で text-embedding-005 英語モデルのいずれかを使用している場合は、モデル バージョンに記載されているバージョンタグのいずれかを指定します。text-embedding-005

    バージョンタグを常に指定することを強くおすすめします。バージョンタグを指定しない場合、AlloyDB は最新のモデル バージョンを使用します。これにより、予期しない結果が生じる可能性があります。

  • TEXT: ベクトル エンベディングに変換するテキスト。

次のステップ