このページでは、AlloyDB Omni を大規模言語モデル(LLM)ツールとして使用し、LLM に基づいてベクトル エンベディングを生成する方法について説明します。
AlloyDB Omni で ML モデルを使用する方法については、生成 AI アプリケーションを構築するをご覧ください。
AlloyDB Omni では、Vertex AI でホストされている LLM を使用して、テキスト文字列をエンベディングに変換できます。エンベディングとは、入力されたテキストの意味を数値ベクトルとして表したモデル表現です。Vertex AI によるテキスト エンベディングのサポートの詳細については、テキスト エンベディングをご覧ください。
始める前に
AlloyDB Omni でエンベディングを生成するには、次の要件を満たしていることを確認してください。
リージョンの制約事項
エンベディングは、Vertex AI の生成 AI が利用可能なリージョンで生成できます。使用可能なリージョンの一覧については、Vertex AI の生成 AI のロケーションをご覧ください。
AlloyDB Omni を使用する場合は、AlloyDB Omni クラスタとクエリ先の Vertex AI モデルの両方が、同じリージョン内にある必要があります。
必要なデータベース拡張機能
- AlloyDB Omni データベースに - google_ml_integration拡張機能がインストールされていることを確認します。- CREATE EXTENSION IF NOT EXISTS google_ml_integration;- この拡張機能は AlloyDB Omni に含まれています。クラスタ内の任意のデータベースにインストールできます。 
- google_ml_integration.enable_model_supportデータベース フラグを- offに設定します。
モデルへのアクセスを設定する
AlloyDB Omni データベースからエンベディングを生成する前に、テキスト エンベディング モデルと連携できるように AlloyDB Omni を構成する必要があります。
クラウドベースの text-embedding-005 モデルを使用するには、データベースを Vertex AI と統合する必要があります。
データベース ユーザーにエンベディングの生成権限を付与する
データベース ユーザーに embedding 関数を実行して予測を行う権限を付与します。
- psqlクライアントをインスタンスに接続するの説明に従って、- psqlクライアントをクラスタのプライマリ インスタンスに接続します。
- psql コマンド プロンプトで、データベースに接続して権限を付与します。 - \c DB_NAME GRANT EXECUTE ON FUNCTION embedding TO USER_NAME;- 次のように置き換えます。 - DB_NAME: 権限を付与するデータベースの名前 
- USER_NAME: 権限を付与するユーザーの名前 
 
エンベディングを生成する
AlloyDB Omni には、テキストをベクトル エンベディングに変換する関数があります。このエンベディングをベクトルデータとしてデータベースに保存し、pgvector 関数を使用してクエリを作成することもできます。
AlloyDB Omni を使用してエンベディングを生成するには、google_ml_integration 拡張機能が提供する embedding() 関数を使用します。
SELECT embedding( 'MODEL_IDVERSION_TAG', 'TEXT');
次のように置き換えます。
- MODEL_ID: クエリするモデルの ID。- Vertex AI Model Garden を使用している場合は、モデル ID として - text-embedding-005を指定します。これらは、AlloyDB Omni がテキスト エンベディングに使用できるクラウドベースのモデルです。詳細については、テキスト エンベディングをご覧ください。
- 省略可: - VERSION_TAG: クエリするモデルのバージョンタグ。タグの前に- @を付けます。- Vertex AI で - text-embedding英語モデルのいずれかを使用している場合は、モデル バージョンに記載されているバージョンタグのいずれかを指定します(例:- text-embedding-005)。- バージョンタグは常に指定することを強くおすすめします。バージョンタグを指定しない場合、AlloyDB は常に最新のモデル バージョンを使用します。これにより、予期しない結果が生じる可能性があります。 
- TEXT: ベクトル エンベディングに変換するテキスト。
次の例では、text-embedding 英語モデルのバージョン 005 を使用して、指定されたリテラル文字列に基づいてエンベディングを生成します。
SELECT embedding('text-embedding-005', '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 として - text-embedding-005を指定します。これらは、AlloyDB Omni がテキスト エンベディングに使用できるクラウドベースのモデルです。詳細については、テキスト エンベディングをご覧ください。
- 省略可: - VERSION_TAG: クエリするモデルのバージョンタグ。タグの前に- @を付けます。- Vertex AI で - text-embedding英語モデルのいずれかを使用している場合は、モデル バージョンに記載されているバージョンタグのいずれかを指定します(例:- text-embedding-005)。- バージョンタグは常に指定することを強くおすすめします。バージョンタグを指定しない場合、AlloyDB は常に最新のモデル バージョンを使用します。これにより、予期しない結果が生じる可能性があります。 
- SOURCE_TEXT_COLUMN: エンベディングに変換するテキストを格納する列の名前
類似性検索を実行する
embedding() 関数を使用してテキストをベクトルに変換することもできます。ベクトルを pgvector 最近傍演算子 <-> に適用し、意味的に最も類似したエンベディングを含むデータベース行を見つけます。
embedding() は real 配列を返すため、これらの値を pgvector 演算子で使用するには、embedding() 呼び出しを vector に明示的にキャストする必要があります。
  CREATE EXTENSION IF NOT EXISTS google_ml_integration;
  CREATE EXTENSION IF NOT EXISTS vector;
  SELECT * FROM TABLE
    ORDER BY EMBEDDING_COLUMN::vector
    <-> embedding('MODEL_IDVERSION_TAG', 'TEXT')::vector
    LIMIT ROW_COUNT
モデル バージョン タグを使用してエラーを回避する
選択したエンベディング モデルの安定版を常に使用することを強くおすすめします。ほとんどのモデルでは、バージョンタグを明示的に設定します。
モデルのバージョンタグを指定せずに embedding() 関数を呼び出すことは、構文的には可能ですが、エラーが発生しやすくなります。
Vertex AI Model Garden でモデルを使用するときにバージョンタグを省略すると、Vertex AI はモデルの最新バージョンを使用します。これは最新の安定版ではない可能性があります。使用可能な Vertex AI モデル バージョンの詳細については、モデル バージョンをご覧ください。
特定の Vertex AI モデル バージョンは、特定のテキスト入力に対して常に同じ embedding() レスポンスを返します。embedding() の呼び出しでモデル バージョンを指定しないと、新しい公開モデル バージョンによって、特定の入力に対して返されるベクトルが突然変更され、アプリでエラーやその他の予期しない動作が発生する可能性があります。
このような問題を回避するため、常にモデル バージョンを指定してください。
トラブルシューティング
エラー: model_id のモデルが見つからない
エラー メッセージ
embedding() 関数または google_ml.embedding() 関数を使用してエンベディングを生成しようとすると、次のエラーが発生します。
ERROR: 'Model not found for model_id:
推奨する修正:
- google_ml_integration拡張機能をアップグレードしてから、エンベディングの生成をもう一度試してください。- ALTER EXTENSION IF NOT EXISTS google_ml_integration UPDATE;- 拡張機能を削除して再作成することもできます。 - DROP extension google_ml_integration; CREATE EXTENSION google_ml_integration;
- google_ml.embedding()関数を使用してエンベディングを生成する場合は、モデルが登録されており、クエリで正しい- model_idを使用していることを確認します。