Vertex AI テキスト エンべディングを取得する

テキスト エンベディングはテキストデータをベクトル表現したもので、類似したアイテムを見つけるためにさまざまな方法で使用されます。Google 検索を完了するたびに、またはオンライン ショッピングでおすすめが表示されるたびに操作します。テキスト エンベディングを作成すると、自然テキストのベクトル表現が浮動小数点数の配列として生成されます。つまり、すべての入力テキストに数値表現が割り当てられます。2 つのテキストのベクトル表現間の数値距離を比較することで、アプリケーションは、テキストとテキストで表されるオブジェクトの類似性を判断できます。

Vertex AI テキスト エンベディング API を使用すると、生成 AI を使用してテキスト エンベディングを作成できます。このチュートリアルを使用すると、Spanner に保存されたデータと、textembedding-gecko モデルなどの Vertex AI エンベディング モデルのテキスト エンベディングを生成できます。

エンベディングの詳細については、テキスト エンベディングの取得をご覧ください。

目標

このチュートリアルでは、以下の方法について学習します。

  • DDL ステートメントを使用して、Vertex AI の textembedding-gecko モデルを Spanner スキーマに登録します。
  • SQL クエリを使用して登録済みモデルを参照し、Spanner に保存されたデータからエンベディングを生成します。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Spanner
  • Vertex AI

Spanner の費用の詳細については、Spanner の料金ページをご覧ください。

Vertex AI の費用の詳細については、Vertex AI の料金のページをご覧ください。

テキスト エンベディングを生成し保存する

使用するモデルによっては、エンベディングの生成に時間がかかることがあります。パフォーマンス重視のワークロードでは、読み取り / 書き込みトランザクションでエンベディングを生成しないようにすることをおすすめします。代わりに、次の SQL の例を使用して、読み取り専用トランザクションでエンベディングを生成します。

GoogleSQL

Spanner にテキスト エンベディング モデルを登録する

GoogleSQL では、ML.PREDICT 関数でモデルを使用する前に、モデルを登録する必要があります。Spanner データベースに textembedding-gecko モデルを登録するには、次の DDL ステートメント実行します。

CREATE MODEL MODEL_NAME
INPUT(content STRING(MAX))
OUTPUT(
  embeddings
    STRUCT<
      statistics STRUCT<truncated BOOL, token_count FLOAT64>,
      values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
  endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION'
);

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

  • MODEL_NAME: エンべディング モデルの名前
  • PROJECT: Vertex AI エンドポイントをホストするプロジェクト
  • LOCATION: Vertex AI エンドポイントのロケーション
  • MODEL_VERSION: textembedding-gecko エンベディング モデルのバージョン

Spanner では適切な権限が自動的に付与されます。権限がない場合は、モデル エンドポイントのアクセス制御を確認してください。

スキーマの検出と検証は、生成 AI モデルでは使用できません。モデルのスキーマに一致する INPUT 句と OUTPUT 句を指定する必要があります。Gecko モデルの完全なスキーマについては、テキスト エンベディングの取得をご覧ください。

テキスト エンベディングを生成する

エンベディングを生成するには、次の SQL を使用してテキストを直接 ML.PREDICT 関数に渡します。

SELECT embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT "A product description" as content)
);

テーブルに保存されているデータのエンベディングを生成するには、次の SQL を使用します。

SELECT id, embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT id, description as content FROM Products)
);

テキスト エンベディングを保存する

読み取り専用トランザクションでエンベディングを生成したら、Spanner に保存して運用データで管理できるようにします。エンベディングを保存するには、読み取り / 書き込みトランザクションを使用します。

パフォーマンスの影響が小さいワークロードの場合、読み取り / 書き込みトランザクションで次の SQL を使用してエンベディングを生成して挿入できます。

CREATE TABLE Products(
  id INT64 NOT NULL,
  description STRING(MAX),
  embeddings ARRAY<FLOAT32>,
) PRIMARY KEY(id);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, embeddings.values
FROM ML.PREDICT(
  MODEL MODEL_NAME,
  (SELECT @Description as content)
);

PostgreSQL

テキスト エンベディングを生成する

エンベディングを生成するには、次の SQL を使用してテキストを直接 spanner.ML_PREDICT_ROW 関数に渡します。

SELECT
  spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    '{"instances": [{"content": "A product description"}]}'::jsonb
  ) ->'predictions'->0->'embeddings'->'values';

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

  • PROJECT: Vertex AI エンドポイントをホストするプロジェクト
  • LOCATION: Vertex AI エンドポイントのロケーション
  • MODEL_VERSION: textembedding-gecko エンベディング モデルのバージョン

テーブルに保存されているデータのエンベディングを生成するには、次の SQL を使用します。

SELECT id, spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
  ) -> `predictions`->0->`embeddings`->`values``
FROM Products;

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

  • PROJECT: Vertex AI エンドポイントをホストするプロジェクト
  • LOCATION: Vertex AI エンドポイントのロケーション
  • MODEL_VERSION: textembedding-gecko エンベディング モデルのバージョン

テキスト エンベディングを保存する

読み取り専用トランザクションでエンベディングを生成したら、Spanner に保存して運用データで管理できるようにします。エンベディングを保存するには、読み取り / 書き込みトランザクションを使用します。

パフォーマンスの影響が小さいワークロードの場合、読み取り / 書き込みトランザクションで次の SQL を使用してエンベディングを生成して挿入できます。

CREATE TABLE Products (
  id INT8 NOT NULL,
  description TEXT,
  embeddings REAL[],
  PRIMARY KEY(id)
);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', @Description)))
  ) -> 'predictions'->0->'embeddings'->'values'
));

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

  • PROJECT: Vertex AI エンドポイントをホストするプロジェクト
  • LOCATION: Vertex AI エンドポイントのロケーション
  • MODEL_VERSION: textembedding-gecko エンベディング モデルのバージョン

テキスト エンベディングを更新する

エンベディングを更新する場合や、データをリアルタイムで取り込む場合は、UPDATEGoogleSQLPostgreSQL)ステートメントを使用します。

前の例の Products テーブルを更新するには、次の SQL を使用します。

GoogleSQL

UPDATE Products
SET
  description = @description,
  embeddings = (SELECT embeddings.values
                  FROM ML.PREDICT(MODEL MODEL_NAME, (SELECT @description as content))
              )
WHERE id = @id;

以下を置き換えます。

  • MODEL_NAME: エンべディング モデルの名前

PostgreSQL

UPDATE
  Products
SET
  description = $1,
  embeddings = spanner.FLOAT32_ARRAY(
    spanner.ML_PREDICT_ROW(
      'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
      JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', $1)))
    ) -> 'predictions'->0->'embeddings'->'values')
WHERE
  id = $2;

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

  • PROJECT: Vertex AI エンドポイントをホストするプロジェクト
  • LOCATION: Vertex AI エンドポイントのロケーション
  • MODEL_VERSION: textembedding-gecko エンベディング モデルのバージョン

次のステップ