テキスト エンベディングはテキストデータをベクトル表現したもので、類似したアイテムを見つけるためにさまざまな方法で使用されます。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
エンべディング モデルのバージョン
テキスト エンベディングを更新する
エンベディングを更新する場合や、データをリアルタイムで取り込む場合は、UPDATE
(GoogleSQL と PostgreSQL)ステートメントを使用します。
前の例の 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
エンべディング モデルのバージョン
次のステップ
- Vertex AI ベクトル検索を使用して、意味的に類似しているアイテムを検索する方法を学びます。
- 機械学習とエンベディングの詳細については、エンベディングに関するクラッシュ コースをご覧ください。