この Codelab について
1. 概要
最適な服を見つけるだけでなく、最先端の生成 AI を統合してリアルタイムでスタイリングのアドバイスも提供するファッション アプリを想像してみてください。このセッションでは、AlloyDB のベクトル検索機能と Google の ScaNN インデックスを組み合わせて、組み合わせる服を超高速で検索し、ファッション レコメンデーションを即座に提供するアプリを構築した方法について説明します。
また、AlloyDB の ScaNN インデックスが複雑なクエリを最適化して、パーソナライズされたスタイルの候補を生成する方法についても説明します。また、強力な生成 AI モデルである Gemini と Imagen を使用して、クリエイティブなスタイリングのヒントを提供したり、パーソナライズされたルックを可視化したりすることもできます。このアプリケーション全体はサーバーレス アーキテクチャ上に構築されており、ユーザーにシームレスでスケーラブルなエクスペリエンスを提供します。
課題: このアプリは、パーソナライズされた服装の候補を提示することで、ファッションに迷うユーザーをサポートすることを目的としています。また、服装の計画による決断疲れを回避することもできます。
ソリューション: このコーディネート レコメンデーター アプリは、AlloyDB、生成 AI、サーバーレス テクノロジーの機能を活用しながら、ユーザーにインテリジェントでパーソナライズされた魅力的なファッション エクスペリエンスを提供するという問題を解決します。
作成するアプリの概要
このラボでは、次の作業を行います。
- AlloyDB インスタンスを作成して e コマース データセットを読み込む
- AlloyDB で pgvector 拡張機能と生成 AI モデル拡張機能を有効にする
- 商品の説明からエンベディングを生成する
- サーバーレス Cloud Run Functions にソリューションをデプロイする
- 画像を Gemini にアップロードして、画像の説明プロンプトを生成します。
- e コマース データセットのエンベディングと組み合わせたプロンプトに基づいて検索結果を生成します。
- 追加のプロンプトを追加してプロンプトをカスタマイズし、スタイルの推奨事項を生成します。
- サーバーレス Cloud Run Functions にソリューションをデプロイする
要件
2. アーキテクチャ
アプリのアーキテクチャの概要は次のとおりです。
以降のセクションでは、チュートリアルの流れについて説明します。
取り込み:
最初のステップは、小売データ(在庫、商品説明、顧客インタラクション)を AlloyDB に取り込むことです。
アナリティクス エンジン:
分析エンジンとして AlloyDB を使用して、次の処理を行います。
- コンテキストの抽出: エンジンは AlloyDB に保存されているデータを分析し、商品、カテゴリ、顧客行動などの関係を把握します。
- エンベディングの作成: ユーザーのクエリと AlloyDB に保存されている情報の両方に対して、エンベディング(テキストの数学的表現)が生成されます。
- ベクトル検索: エンジンは類似性検索を実行し、クエリ エンベディングを商品の説明、レビュー、その他の関連データのエンベディングと比較します。これにより、最も関連性の高い 25 個の「最近傍」が特定されます。
Gemini の推奨事項:
画像バイト配列は、Vertex AI API を介して Gemini モデルに渡されます。これには、トップスウェアのテキスト記述とボトムスウェアのレコメンデーションの候補を求めるプロンプトも含まれます。
AlloyDB RAG とベクトル検索:
トップウェアの説明は、データベースのクエリに使用されます。このクエリは、検索テキスト(ボトムウェアの一致に関する Gemini モデルからの推奨事項)をエンベディングに変換し、データベースに保存されているエンベディングに対してベクトル検索を実行して、最近傍(一致する結果)を検索します。AlloyDB データベース内のベクトル エンベディングは、再現率を高めるために ScaNN インデックスを使用してインデックス登録されます。
レスポンス画像の生成:
検証されたレスポンスは JSON 配列に構造化され、エンジン全体がサーバーレスの Cloud Run 関数にパッケージ化され、エージェント ビルダーから呼び出されます。
Imagen 画像生成:
ユーザーのスタイル設定プロンプト、ユーザーが選択した推奨事項、パーソナライズ リクエストが統合され、既存の画像を使用して Imagen 3 にプロンプトが送信されます。スタイル設定画像は、このプロンプトに基づいて Vertex AI API を使用して生成されます。
3. 始める前に
プロジェクトを作成する
- Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
- Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
- Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする](
)をクリックします。
- Cloud Shell に接続したら、次のコマンドを使用して、認証が完了していることと、プロジェクトがプロジェクト ID に設定されていることを確認します。
gcloud auth list
- 次のコマンドを実行して、今後の gcloud コマンドでプロジェクトが正しく識別されることを確認します。
gcloud config list project
- プロジェクトが設定されていない場合は、次のコマンドを使用して明示的に設定します。
gcloud config set project <YOUR_PROJECT_ID>
- 必要な API を有効にします。
リンクに沿って API を有効にします。
いずれかの API を有効にできなかった場合は、実装の過程でいつでも有効にできます。
gcloud コマンドとその使用方法の詳細については、ドキュメントをご覧ください。
4. データベースの設定
このラボでは、小売 e コマース データセットを保存するデータベースとして AlloyDB を使用します。クラスタを使用して、データベースやログなどのすべてのリソースを保存します。各クラスタには、データへのアクセス ポイントを提供するプライマリ インスタンスがあります。テーブルは、データを保存する実際のリソースです。
e コマース データセットを読み込む AlloyDB クラスタ、インスタンス、テーブルを作成しましょう。
クラスタとインスタンスを作成する
- Google Cloud コンソールで「AlloyDB」を検索します。Cloud コンソールのほとんどのページは、コンソールの検索バーを使用して簡単に見つけることができます。
- [クラスタを作成] をクリックしてください。
- 次の値を使用してクラスタとインスタンスを作成します。
- cluster id: "
shopping-cluster
" - password: "
alloydb
" - PostgreSQL 15 互換
- リージョン: 「
us-central1
」 - ネットワーキング: 「
default
」
- [ネットワーク] でデフォルト ネットワークを選択すると、次のオプションが表示されます。[接続の設定] をクリックして、デフォルトのネットワークを設定します。
- [自動的に割り当てられた IP 範囲を使用する] を選択し、[続行] をクリックします。情報を確認したら、[接続を作成] をクリックします。
デフォルト ネットワークの作成が完了するまで待ちます。
- [プライマリ インスタンスを構成する] で、インスタンス ID を「
shopping-instance"
」に設定します。
- [クラスタを作成] をクリックして、次のようにクラスタの設定を完了します。
5. データの取り込み
次に、店舗に関するデータを含むテーブルを追加します。インスタンスの作成が完了するまで待ちます。作成したら、クラスタの作成時に設定した認証情報を使用して AlloyDB にログインできます。
AlloyDB データベースに対して認証する
- Google Cloud コンソールで、[AlloyDB] に移動します。プライマリ クラスタを選択し、左側のナビゲーションで [AlloyDB Studio] をクリックします。
- AlloyDB データベースの認証に必要な次の詳細情報を入力します。
- ユーザー名: 「
postgres
」 - データベース: 「
postgres
」 - パスワード: 「
alloydb
」
AlloyDB Studio で認証が正常に完了すると、[Editor] タブに SQL コマンドが入力されます。最初のエディタタブの右側にあるプラス記号を使用して、複数のエディタ ウィンドウを追加できます。
AlloyDB のコマンドは、必要に応じて [実行]、[フォーマット]、[クリア] の各オプションを使用して、エディタ ウィンドウに入力します。
拡張機能を有効にする
このアプリの作成では、pgvector"
拡張機能と google_ml_integration"
拡張機能を使用します。
- pgvector 拡張機能を使用すると、ベクター エンベディングを保存して検索できます。
- google_ml_integration 拡張機能には、Vertex AI 予測エンドポイントにアクセスして SQL で予測を取得するために使用する関数が用意されています。
- 次の DDL を実行して、これらの拡張機能を有効にします。
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
- 次の SQL コマンドを実行して、拡張機能がインストールされているかどうかを確認します。
select extname, extversion from pg_extension;
テーブルを作成する
- 次の DDL ステートメントを使用してテーブルを作成します。
CREATE TABLE
apparels ( id BIGINT,
category VARCHAR(100),
sub_category VARCHAR(50),
uri VARCHAR(200),
image VARCHAR(100),
content VARCHAR(2000),
pdt_desc VARCHAR(5000),
embedding vector(768) );
上記のコマンドが正常に実行されると、
データベース。次の図は、その例を示しています。
データを取り込む
このラボでは、この SQL ファイルに約 200 件のレコードのテストデータがあります。id, category, sub_category, uri, image
と content
が含まれます。他のフィールドは、ラボの後半で入力します。
- SQL ファイルから 20 行の insert ステートメントを AlloyDB Studio の新しいエディタタブにコピーし、[実行] をクリックします。
apparels
という名前のテーブルが表示されるまで、エクスプローラ セクションを開きます。- メニュー アイコン [⋮]、[クエリ] の順にクリックします。新しいエディタタブで SELECT ステートメントが開きます。
- [実行] をクリックして、行が挿入されたことを確認します。
ユーザーに権限を付与する
AlloyDB 内からエンベディングを生成する権限を postgres
ユーザーに付与します。.
AlloyDB Studio で次のステートメントを実行して、embedding
関数の実行権限をユーザー postgres
に付与します。
GRANT EXECUTE ON FUNCTION embedding TO postgres;
AlloyDB サービス アカウントに Vertex AI ユーザーロールを付与する
Vertex AI のテキスト エンベディング モデルを使用して、AlloyDB サービス アカウントに対する Vertex AI ユーザーロールを持つエンベディングを生成します。
Google Cloud コンソールで、Cloud Shell ターミナル [] アイコンをクリックし、次のコマンドを実行します。
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
6. ビルド コンテキスト
エンベディングを作成するには、context
が必要です。つまり、1 つのフィールドに含めるすべての情報が必要です。これを行うには、商品の説明を作成し、apparels
テーブルの pdt_desc
列に保存します。
この例では、各商品に関するすべての情報を使用しますが、独自のデータを使用する場合は、ビジネスにとって有意義と思われる方法でデータをエンジニアリングしてください。
AlloyDB Studio の [エディタ] タブで、次のコマンドを実行して、pdt_desc
フィールドをコンテキスト データで更新します。
UPDATE
apparels
SET
pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
id IS NOT NULL;
この DML は、テーブルで使用可能なすべてのフィールドとその他の依存関係(ユースケースに存在する場合)の情報を使用して、単純なコンテキストの概要を作成します。より正確な情報の分類とコンテキストの作成を行うには、ビジネスにとって有意義と思われる方法でデータをエンジニアリングしてください。
7. コンテキストのエンベディングを作成する
コンピュータにとって、テキストを処理するよりも数値を処理するほうがはるかに簡単です。エンベディング システムは、テキストの表現方法や使用言語に関係なく、テキストをテキストを表す一連の浮動小数点数に変換します。
海辺の場所を説明することを考えてみましょう。たとえば、"on the water
、beachfront
、walk from your room to the ocean
、sur la mer
、на берегу океана
などです。これらの用語はすべて見た目は異なりますが、意味的な意味や機械学習の用語では、埋め込みは互いに非常に近いはずです。
データとコンテキストの準備ができたので、SQL を実行して、商品説明(pdt_desc
)列のエンベディングをテーブルのフィールド embedding
に追加します。使用できるエンベディング モデルはさまざまです。Vertex AI の text-embedding-005
を使用しています。
- AlloyDB Studio で次のコマンドを実行してエンベディングを生成し、保存されているデータのエンベディングで
pdt_desc
列を更新します。
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- 次のコマンドを実行して、エンベディングが生成されたことを確認します。
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
以下に、クエリのサンプルテキストのエンベディング ベクトルの例を示します。これは浮動小数点数の配列のように見えます。
8. ベクトル検索を実行する
テーブル、データ、エンベディングがすべて準備できたので、ユーザーの検索テキストのリアルタイム ベクトル検索を実行しましょう。
ユーザーの検索テキストが「pink color, casual, pure cotton tops for women
」であるとします。
このクエリに一致する値を検索するには、次の SQL クエリを実行します。
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
このクエリを詳しく見てみましょう。
このクエリでは、
- ユーザーの検索テキストは「
I want womens tops, pink casual only pure cotton.
」です。 - この検索テキストは、モデル
text-embedding-005
とともにembedding()
メソッドを使用してエンベディングに変換されます。このステップは、テーブル内のすべてのアイテムにエンベディング関数を適用した最後のステップとよく似ています。 - 「
<=>
」は、COSINE SIMILARITY 距離メソッドの使用を表します。使用可能な類似性測定方法については、pgvector のドキュメントをご覧ください。 - エンベディング方法の結果をベクトルデータ型に変換し、データベースに保存されているベクトルと互換性を持たせています。
- LIMIT 5 は、検索テキストの最近傍を 5 つ抽出することを表します。
次の例は、この SQL クエリのレスポンスの例を示しています。
検索結果を見ると、検索テキストにかなり近い一致が見つかります。色を変更して、結果がどのように変化するかを確認してみてください。
クエリ パフォーマンスのための AlloyDB ScaNN インデックス
ScaNN インデックスを使用して、このベクトル検索結果のパフォーマンス(クエリ時間)、効率、再現率を向上させたいとします。
ScaNN インデックスを使用する場合は、次の手順を試してください。
- クラスタ、インスタンス、コンテキスト、エンベディングはすでに作成されているため、次のステートメントを使用して ScaNN 拡張機能をインストールするだけです。
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- ScaNN インデックスを作成します。
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
上記の DDL では、
apparel_index
はインデックスの名前です。apparels
はテーブル名です。scann
はインデックス メソッドです。embedding
は、インデックスを付けるテーブル内の列です。cosine
は、インデックスで使用する距離メソッドです。54
は、このインデックスに適用するパーティションの数です。1 ~ 1048576 の任意の値に設定します。この値を決定する方法の詳細については、ScaNN インデックスをチューニングするをご覧ください。
ScaNN リポジトリの推奨事項に従い、データポイント数の平方根を使用しています。パーティショニングする場合、num_leaves
はデータポイント数の平方根に近い値にする必要があります。
- 次のクエリを使用して、インデックスが作成されているかどうかを確認します。
SELECT * FROM pg_stat_ann_indexes;
- インデックスを使用しないときに使用したのと同じクエリを使用してベクトル検索を実行します。
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
上記のクエリは、ラボの手順 8 で使用したものと同じです。ただし、このフィールドは ScaNN インデックスを使用してインデックスに登録されています。
- インデックスありとインデックスなしの両方で、単純な検索クエリを使用してテストします。インデックスなしでテストするには、インデックスを削除する必要があります。
white tops for girls without any print
インデックス登録されたエンベディング データに対するベクトル検索クエリの上の検索テキストにより、高品質の検索結果と効率性が得られます。インデックスを使用すると、効率が大幅に向上します(実行時間: ScaNN なしで 10.37 ms、ScaNN ありで 0.87 ms)。このトピックについて詳しくは、こちらのブログをご覧ください。
9. LLM を使用した一致検証
次に進んで、アプリケーションに最適な一致を返すサービスを作成する前に、生成 AI モデルを使用して、これらの候補の回答が本当に関連性があり、ユーザーと共有しても安全かどうかを確認しましょう。
インスタンスが Gemini 用に設定されていることを確認する
- クラスタとインスタンスで
google_ml_integration
がすでに有効になっていることを確認します。AlloyDB Studio で、次のコマンドを実行します。
show google_ml_integration.enable_model_support;
値が [オン] と表示されている場合は、次の 2 つのステップをスキップして、設定に直接進みます。
AlloyDB と Vertex AI モデルの統合。
- AlloyDB クラスタのプライマリ インスタンスに移動し、[プライマリ インスタンスを編集] をクリックします。
- [詳細な構成オプション] で [新しいデータベース フラグ] セクションを開き、
google_ml_integration.enable_model_support flag
が次のように「on
」に設定されていることを確認します。
3. 「
on
」に設定されていない場合は、「on
」に設定し、[インスタンスを更新] をクリックします。
この処理には数分かかります。
AlloyDB と Vertex AI モデルの統合
これで、AlloyDB Studio に接続して次の DML ステートメントを実行し、AlloyDB から Gemini モデルへのアクセスを設定できます。必要に応じて、プロジェクト ID を使用してください。コマンドを実行する前に構文エラーの警告が表示されることがありますが、問題なく実行されます。
- Google Cloud コンソールで、[AlloyDB] に移動します。プライマリ クラスタを選択し、左側のナビゲーションで [AlloyDB Studio] をクリックします。
- ここでは、
google_ml_integration
拡張機能でデフォルトで使用できるgemini-1.5-pro:generateContent
を使用します。 - アクセス用に構成されたモデルは、AlloyDB Studio で次のコマンドを使用して確認できます。
select model_id,model_type from google_ml.model_info_view;
- 次のコマンドを実行して、データベース ユーザーに ml_predict_row 関数を実行して Google Vertex AI モデルを使用して予測を実行する権限を付与します。
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
回答の評価
次のセクションでは、アプリケーションを Cloud Run に実際に移行するために、1 つの大きなクエリを使用しますが、クエリからのレスポンスが妥当であることを確認するために、クエリを理解するのが難しい場合があります。
最終的に使用する大きなクエリを構築する個々のセクションについて説明します。
- まず、データベースにリクエストを送信して、ユーザーのクエリに最も近い 5 つの一致を取得します。シンプルにするため、クエリをハードコードしていますが、後でクエリに挿入します。
apparels
テーブルの商品説明を追加し、2 つの新しいフィールドを追加します。1 つは説明とインデックスを組み合わせたフィールド、もう 1 つは元のリクエストと組み合わせたフィールドです。このデータは、一時テーブル名である xyz
というテーブルに保存されます。
CREATE TABLE
xyz AS
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' AS user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
このクエリの出力は、ユーザーのクエリに関連する最も類似した 5 つの行になります。使用者における Google 検索によるグラウンディングの使用には、
新しいテーブル xyz
には 5 つの行が含まれ、各行には次の列が含まれます。
literature
content
user_text
- 回答の有効性を判断するために、複雑なクエリを使用して、回答を評価する方法を説明します。
xyz
テーブルのuser_text
とcontent
をクエリの一部として使用します。
"Read this user search text: ', user_text,
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
- このクエリを使用して、
xyz
テーブル内の回答の「良さ」を確認します。良さとは、生成された回答が期待値にどれだけ近いかを示します。
CREATE TABLE
x AS
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
xyz;
predict_row
は結果を JSON 形式で返します。コード「-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"
」は、その JSON から実際のテキストを抽出するために使用されます。返される実際の JSON を確認するには、このコードを削除します。- 最後に、LLM フィールドを取得するには、x テーブルから抽出します。
SELECT
LLM_RESPONSE
FROM
x;
- これらは、次のように 1 つのクエリにまとめることができます。
警告: 上記のクエリを実行して中間結果を確認した場合、
このクエリを実行する前に、AlloyDB データベースから xyz
テーブルと x
テーブルを削除してください。
SELECT
LLM_RESPONSE
FROM (
SELECT
json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
request_body => CONCAT('{
"contents": [
{ "role": "user",
"parts":
[ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
} ]
}
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM (
SELECT
id || ' - ' || pdt_desc AS literature,
pdt_desc AS content,
'I want womens tops, pink casual only pure cotton.' user_text
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
大きなクエリは、前の手順で実行したすべてのクエリを組み合わせたものです。結果には、一致があるかどうか、一致率、レーティングの説明が表示されます。
Gemini モデルではデフォルトでストリーミングがオンになっているため、実際のレスポンスは複数行に分散されます。
10. アプリケーションをウェブに移行する
次に、このアプリケーションをホストして、インターネットからアクセスできるようにします。
Cloud Run 関数を作成する
- Google Cloud コンソールで、次のリンクを使用して Cloud Run Functions に移動します。
https://console.cloud.google.com/run/create?deploymentType=function
- [Configure] で、関数名を「retail-engine」に設定し、リージョンを「us-central1」に選択します。
- [エンドポイント URL] で、ランタイムとして [Java 17] を選択します。
- [認証] で、[未認証の呼び出しを許可] を選択します。
- [コンテナ、ボリューム、ネットワーキング、セキュリティ] を開き、[ネットワーキング] タブをクリックします。
- [アウトバウンド トラフィック用の VPC に接続する] を選択し、[サーバーレス VPC アクセス コネクタを使用] をクリックします。
- [ネットワーク] で、[新しい VPC コネクタを追加] をクリックします。Serverless VPC Access API がまだ有効になっていない場合は有効にします。
- [Create connector] で、名前を
alloydb-test-conn
に設定します。 - リージョンを
us-central
に設定します。 - [ネットワーク] の値はデフォルトのままにして、[サブネット] を [カスタム IP 範囲] に設定し、IP 範囲を 10.8.0.0 など使用可能なものにします。
- [スケーリングを表示] 設定を開き、[インスタンスの最小数] を 2、[インスタンスの最大数] を 3 に設定します。
- インスタンスのタイプとして [f1-micro] を選択します。次の図は、[コネクタを作成] のオプションを示しています。
- [作成] をクリックしてコネクタを作成します。
- [トラフィック ルーティング] で、[すべてのトラフィックを VPC にルーティングする] を選択します。
- [作成] をクリックして関数を作成します。
アプリケーションをデプロイする
関数が作成されたら、ソースを更新してアプリケーションを再デプロイします。
- Cloud Run で [サービス] タブをクリックし、[retail-engine] 関数をクリックします。
- [ソース] タブをクリックします。デフォルトの関数エントリ ポイントを「
gcfv2.HelloHttpFunction
」のままにします。 - HelloHttpFunction.java ファイルの内容を、この Java ファイルの内容に置き換えます。
- ファイル内の AlloyDbJdbcConnector の詳細を、AlloyDB インスタンスとクラスタの詳細に従って更新します。
$PROJECT_ID
は、AlloyDB クラスタとインスタンスのプロジェクト ID に置き換えます。
- pom.xml ファイルの内容を、この XML ファイルの内容に置き換えます。
- [保存して再デプロイ] をクリックして関数をデプロイします。
11. retail-engine アプリケーションをテストする
更新された Cloud Functions の関数がデプロイされると、次の形式のエンドポイントが表示されます。
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
Cloud Shell ターミナルから次のコマンドを実行してテストできます。
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
または、次のように Cloud Run 関数をテストすることもできます。
PROJECT_ID=$(gcloud config get-value project)
curl -X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
結果は次のようになる
AlloyDB データでエンベディング モデルを使用して類似ベクトル検索を実行したので、これらのエンベディングと画像を使用して、スタイル設定の候補を生成するプロンプトを使用するアプリケーションを作成できます。
12. コーディネートのおすすめフローを理解する
コーディネート レコメンデーション アプリは、AlloyDB 小売エンジン アプリケーションで作成したエンベディングと Gemini と Imagen を連携させて、ビジュアル コーディネートのスタイル設定オプションを生成するように構成されたスプリントブート アプリケーションです。また、カスタム プロンプトを追加して、おすすめを即興で作成することもできます。
たとえば、ワードローブにあるホットピンクのトップスの画像をこのアプリにアップロードします。[表示] をクリックすると、アプリコードで設定されたプロンプトと AlloyDB データベース内のエンベディングに基づいて、元の画像に一致する複数のオプションが生成されます。提案されたオプションが青いネックレスとどのように見えるかを確認したくなったので、その行にプロンプトを追加し、[スタイル] をクリックします。元の画像とおすすめの組み合わせを組み合わせて、最終的な画像が生成され、おそろいの服装が作成されます。
コーディネート レコメンデーション アプリの作成を開始する手順は次のとおりです。
- Cloud Run で retail-engine アプリを開き、アプリケーションの URL をメモします。これは、類似の候補を生成するために使用するエンベディング リポジトリです。
- IDE で、https://github.com/AbiramiSukumaran/outfit-recommender/ リポジトリのクローンを作成します。この演習では、Visual Studio Code IDE で手順を実施します。
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
アプリのディレクトリにある重要なファイルは次のとおりです。
src/main
: アプリケーション ファイルと HTML が存在するソース ディレクトリ。HelloWorldApplication.java
: Spring Boot アプリケーションのメイン エントリ ポイント。HelloWorldController.java
: コーディネート レコメンダー アプリケーションに関連する HTTP リクエストを処理する Spring Boot REST コントローラ。このファイルは、GET リクエストと POST リクエストを処理し、ユーザー プロンプトを処理し、画像を分析し、AlloyDB エンベディングとやり取りし、最終的なレスポンスを UI に返します。このコントローラは GenerateImageSample クラスを呼び出します。GenerateImageSample.java
: Vertex AI に接続し、ユーザー プロンプトをフォーマットし、Imagen モデルに API 呼び出しを行い、予測された画像をコントローラ クラスに返す画像生成クラスが含まれています。Resources
: このディレクトリには、アプリケーション UI の生成に必要な画像と HTML ファイルが含まれています。Pom.xml
: プロジェクトの依存関係と構成を定義します。
- Visual Studio Code で
HelloWorldController.java
を開き、AlloyDB インスタンスが作成される場所に応じて、プロジェクト ID とロケーションのインスタンスを更新します。
endpoint
を、先ほどホストした小売エンジン アプリの URL に更新します。
GenerateImageSample.java
を開き、AlloyDB インスタンスが作成される場所に応じてプロジェクト ID とロケーションを更新します。
- すべてのファイルを保存します。
このアプリケーションを Cloud Run サーバーレス ランタイムにデプロイします。
13. アプリケーションをウェブに移行する
関連するプロジェクト、ロケーション、小売エンジン アプリの詳細を衣装レコメンダーの Spring Boot アプリケーションに追加したので、アプリケーションを Cloud Run にデプロイできます。
Visual Code Studio ターミナルで gcloud run deploy
コマンドを使用して、アプリケーションをデプロイします。Visual Studio Code の場合は、Google Cloud Code 拡張機能をインストールして gcloud CLI の使用を開始できます。
アプリケーションをデプロイする手順は次のとおりです。
- IDE でクローンを作成したディレクトリを開き、ターミナルを起動します。Visual Code Studio の場合は、[Terminal] > [New Terminal] をクリックします。
- このドキュメントの手順に沿って gcloud CLI をインストールします。
- Visual Code Studio を使用している場合は、[Extensions] をクリックし、[Google Cloud Code] を検索して拡張機能をインストールします。
- IDE ターミナルで、次のコマンドを実行して Google アカウントを認証します。
gcloud auth application-default login
- プロジェクト ID を、AlloyDB インスタンスが配置されているプロジェクトと同じに設定します。
gcloud config set project PROJECT_ID
- デプロイ プロセスを開始します。
gcloud run deploy
Source code location
で Enter キーを押して、クローンを作成した GitHub ディレクトリを選択します。Service name
に、サービスの名前(outfit-recommender など)を入力し、Enter キーを押します。Please specify a region
に、AlloyDB インスタンスと retail-engine アプリケーションがホストされているロケーション(us-central1 の場合は 32 など)を入力し、Enter キーを押します。
Allow unauthenticated invocations to [..]
で「Y」と入力し、Enter キーを押します。
次の図は、アプリケーションのデプロイの進行状況を示しています。
14. コーディネート レコメンデーター アプリケーションをテストする
アプリケーションが Cloud Run に正常にデプロイされると、Google Cloud コンソールに次のようにサービスが表示されます。
- Google Cloud コンソールで、[Cloud Run] に移動します。
- [サービス] で、デプロイした服装レコメンダー サービスをクリックします。次のように、retail-engine サービスと outfit-recommender サービスの両方が表示されます。
- アプリケーションの URL をクリックして、レコメンダー アプリの UI を開きます。
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
デプロイされたアプリケーションは次のようになります。
アプリの使用
アプリケーションの使用を開始する手順は次のとおりです。
- [アップロード] をクリックして、衣料品の写真をアップロードします。
- 画像がアップロードされたら、[スタイル] をクリックします。アプリケーションは画像をプロンプトとして使用し、小売データセットのエンベディングを含む小売エンジン アプリのプロンプトに基づいて下部オプションを生成します。
アプリは、画像に基づいて画像の候補と、スタイリング レコメンデーションを含むプロンプトを生成します。例: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- この自動生成されたスタイルの推奨事項に追加のプロンプトを渡すことができます。例:
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
- [表示] をクリックして、最終的なスタイルを確認します。
15. クリーンアップ
この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の操作を行います。
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
16. 完了
これで、AlloyDB、pgvector、ベクトル検索を使用して類似検索を実行し、検索結果を強力な Imagen モデルと組み合わせて使用して、スタイリング レコメンデーションを生成しました。