テキスト エンベディングはテキストデータをベクトル表現したもので、類似したアイテムを見つけるためにさまざまな方法で使用されます。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 ベクトル検索を使用して、意味的に類似しているアイテムを検索する方法を学びます。
- 機械学習とエンベディングの詳細については、エンベディングに関するクラッシュ コースをご覧ください。