エンベディングを生成する

このページでは、AlloyDB を大規模言語モデル(LLM)ツールとして使用し、LLM に基づいてベクトル エンベディングを生成する方法について説明します。

AlloyDB Omni で ML モデルを使用する方法については、生成 AI アプリケーションを構築するをご覧ください。

AlloyDB では、Vertex AI でホストされている LLM を使用して、テキスト文字列をエンベディングに変換できます。エンベディングは、特定のテキストの意味を数値ベクトルとして表したモデル表現です。Vertex AI によるテキスト エンベディングのサポートの詳細については、テキスト エンベディングをご覧ください。

始める前に

AlloyDB でエンベディングを生成するには、次の要件を満たしていることを確認してください。

リージョンの制約事項

エンベディングは、Vertex AI の生成 AI が利用可能なリージョンで生成できます。リージョンの一覧については、Vertex AI の生成 AI のロケーション をご覧ください。

AlloyDB の場合は、クエリを実行する AlloyDB クラスタと Vertex AI モデルの両方が同じリージョンにあることを確認します。

必要なデータベース拡張機能

  • AlloyDB データベースに google_ml_integration 拡張機能がインストールされていることを確認します。

    CREATE EXTENSION google_ml_integration;
    

    この拡張機能は AlloyDB に含まれています。クラスタ内の任意のデータベースにインストールできます。

  • google_ml_integration.enable_model_support データベース フラグを off に設定します。

モデルへのアクセスを設定する

AlloyDB データベースからエンベディングを生成するには、テキスト エンベディング モデルを使用するように AlloyDB を構成する必要があります。

クラウドベースの textembeddings-gecko モデルを使用するには、データベースを Vertex AI と統合する必要があります。

データベース ユーザーにエンベディングの生成権限を付与する

データベース ユーザーに、embedding 関数を実行して予測を実行する権限を付与します。

  1. psql クライアントをインスタンスに接続するの説明に従って、psql クライアントをクラスタのプライマリ インスタンスに接続します。

  2. psql コマンド プロンプトで、データベースに接続して権限を付与します。

    \c DB_NAME
    
    GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;
    

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

    • DB_NAME: 権限を付与するデータベースの名前

    • USER_NAME: 権限を付与するユーザーの名前

エンベディングを生成する

AlloyDB には、テキストをベクトル エンベディングに変換する関数があります。このエンベディングをベクトルデータとしてデータベースに保存し、必要に応じて pgvector 関数を使用してクエリを実行します。

AlloyDB を使用してエンベディングを生成するには、google_ml_integration 拡張機能が提供する embedding() 関数を使用します。

SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');

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

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

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

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

    Vertex AI で textembedding-gecko 英語モデルのいずれかを使用している場合は、モデル バージョンに記載されているバージョンタグのいずれかを指定します(例: textembedding-gecko@003)。

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

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

次の例では、textembedding-gecko 英語モデルのバージョン 003 を使用して、指定されたリテラル文字列に基づいてエンベディングを生成します。

SELECT embedding('textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

エンベディングを保存する

google_ml_integration 拡張機能を使用して生成されたエンベディングは、real 値の配列として実装されます。生成されたエンベディングは、pgvector 拡張関数の入力として渡されます。

この値をテーブルに保存するには、real[] 列を追加します。

ALTER TABLE TABLE ADD COLUMN EMBEDDING_COLUMN real[DIMENSIONS];

エンベディングを格納する列を作成したら、同じテーブルの別の列にすでに格納されている値に基づいてデータを入力できます。

UPDATE TABLE SET EMBEDDING_COLUMN = embedding('MODEL_IDVERSION_TAG', SOURCE_TEXT_COLUMN);

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

  • TABLE: テーブル名

  • EMBEDDING_COLUMN: エンベディング列の名前

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

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

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

    Vertex AI で textembedding-gecko 英語モデルのいずれかを使用している場合は、モデル バージョンに記載されているバージョンタグのいずれかを指定します(例: textembedding-gecko@003)。

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

  • SOURCE_TEXT_COLUMN: エンベディングに変換するテキストを格納する列の名前

embedding() 関数を使用してテキストをベクトルに変換することもできます。ベクトルを pgvector 最近傍演算子 <-> に適用し、意味的に最も類似したエンベディングを含むデータベース行を見つけます。

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

  CREATE EXTENSION google_ml_integration;
  CREATE EXTENSION IF NOT EXISTS vector;

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

モデル バージョン タグを使用してエラーを回避する

選択したエンベディング モデルの安定版を常に使用することを強くおすすめします。ほとんどのモデルでは、バージョンタグは明示的に設定されています。

モデルのバージョンタグを指定せずに embedding() 関数を呼び出すことは、構文的には可能ですが、エラーが発生しやすくなります。

Vertex AI Model Garden でモデルを使用するときにバージョンタグを省略すると、Vertex AI はモデルの最新バージョンを使用します。これは最新の安定版ではない可能性があります。使用可能な Vertex AI モデル バージョンの詳細については、モデル バージョンをご覧ください。

特定の Vertex AI モデル バージョンは、特定のテキスト入力に対して常に同じ embedding() レスポンスを返します。embedding() の呼び出しでモデル バージョンを指定しないと、新しい公開モデル バージョンによって、特定の入力に対する返されるベクトルが突然変更され、アプリでエラーやその他の予期しない動作が発生する可能性があります。

このような問題を回避するため、常にモデル バージョンを指定してください。

トラブルシューティング

ERROR: Model not found for model_id

エラー メッセージ

embedding() 関数または google_ml.embedding() 関数を使用してエンベディングを生成しようとすると、次のエラーが発生します。

ERROR: 'Model not found for model_id:

  • google_ml_integration 拡張機能をアップグレードしてから、エンベディングの生成をもう一度お試しください。

    ALTER EXTENSION google_ml_integration UPDATE;
    

    拡張機能を削除してから再作成することもできます。

    DROP extension google_ml_integration;
    CREATE EXTENSION google_ml_integration;
    
  • google_ml.embedding() 関数を使用してエンベディングを生成する場合は、モデルが登録されており、クエリで正しい model_id を使用していることを確認してください。

次のステップ