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 に取り込むことです。
Analytics Engine:
AlloyDB を分析エンジンとして使用して、次の処理を行います。
- コンテキストの抽出: エンジンは AlloyDB に保存されているデータを分析し、必要に応じて商品、カテゴリ、顧客行動などの関係を把握します。
- エンベディングの作成: ユーザーのクエリと AlloyDB に保存されている情報の両方に対して、エンベディング(テキストの数学的表現)が生成されます。
- ベクトル検索: エンジンは類似性検索を実行し、クエリ エンベディングと商品説明、レビュー、その他の関連データのエンベディングを比較します。これにより、最も関連性の高い「最近傍」が 25 個特定されます。
Gemini の推奨事項:
画像バイト配列は、Vertex AI API を介して Gemini モデルに渡されます。このとき、トップスとボトムスのレコメンデーション候補のテキスト記述を求めるプロンプトも渡されます。
AlloyDB RAG とベクトル検索:
トップスに関する説明は、データベースのクエリに使用されます。クエリは、検索テキスト(ボトムスに合う Gemini モデルの推奨事項)をエンベディングに変換し、データベースに保存されているエンベディングに対してベクトル検索を実行して、最近傍(一致する結果)を見つけます。AlloyDB データベースのベクトル エンベディングは、再現率を高めるために ScaNN インデックスを使用してインデックス登録されます。
回答画像の生成:
検証済みのレスポンスは JSON 配列に構造化され、エンジン全体が Agent Builder から呼び出されるサーバーレスの 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 コンソールでほとんどのページを簡単に見つけるには、コンソールの検索バーを使用して検索します。
- [クラスタを作成] をクリックしてください。

- 次の値を使用してクラスタとインスタンスを作成します。
- クラスタ 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 への認証が成功すると、SQL コマンドが [エディタ] タブに入力されます。最初の [Editor] タブの右にあるプラス記号を使用して、複数の [Editor] ウィンドウを追加できます。

必要に応じて [実行]、[形式]、[クリア] オプションを使用して、エディタ ウィンドウに 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 が含まれます。他のフィールドはラボで後ほど入力します。
- AlloyDB Studio の新しいエディタタブで、SQL ファイルから 20 行の挿入ステートメントをコピーし、[RUN] をクリックします。
- [エクスプローラ] セクションを開き、
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(単一のフィールドに含めるすべての情報)が必要です。これを行うには、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」、「на берегу океана」などと呼ばれることがあります。これらの用語はすべて異なりますが、意味論的な意味、または ML 用語で言うと、埋め込みは互いに非常に近いものになります。
データとコンテキストの準備ができたので、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.」です。 - この検索テキストは、
embedding()メソッドとモデルtext-embedding-005を使用してエンベディングに変換されます。このステップは、テーブル内のすべての項目にエンベディング関数を適用した最後のステップと似ています。 - 「
<=>」は、コサイン類似度距離メソッドの使用を表します。使用可能な類似度指標については、pgvector のドキュメントをご覧ください。 - エンベディング メソッドの結果を vector データ型に変換して、データベースに保存されているベクトルと互換性を持たせています。
- 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~1,048,576 の任意の値に設定します。この値を決定する方法の詳細については、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
INDEXED エンベディング データに対するベクトル検索クエリの上記の検索テキストにより、高品質の検索結果と効率が得られます。インデックスを使用すると、効率が大幅に向上します(実行時間: ScaNN なしで 10.37 ミリ秒、ScaNN ありで 0.87 ミリ秒)。このトピックについて詳しくは、こちらのブログをご覧ください。
9. LLM による一致の検証
次に進んで、最適な一致をアプリケーションに返すサービスを作成する前に、生成 AI モデルを使用して、これらの潜在的な回答がユーザーと共有するのに本当に適切で安全かどうかを検証しましょう。
インスタンスが Gemini 用に設定されていることを確認する
- クラスタとインスタンスで
google_ml_integrationがすでに有効になっていることを確認します。AlloyDB Studio で、次のコマンドを実行します。
show google_ml_integration.enable_model_support;
値が 「on」と表示されている場合は、次の 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 行が含まれます。各行には次の列が含まれます。
literaturecontentuser_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;
- これは、次のように単一のクエリにまとめることができます。
警告: 上記のクエリを実行して中間結果を確認した場合は、
このクエリを実行する前に、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 関数に移動します。
https://console.cloud.google.com/run/create?deploymentType=function
- [構成] で、関数名を「retail-engine」に設定し、リージョンとして「us-central1」を選択します。
- [エンドポイント URL] で、ランタイムとして [Java 17] を選択します。
- [認証] で、[未認証の呼び出しを許可] を選択します。
- [コンテナ、ボリューム、ネットワーキング、セキュリティ] を開き、[ネットワーキング] タブをクリックします。
- [アウトバウンド トラフィック用の VPC に接続する] を選択し、[サーバーレス VPC アクセス コネクタを使用する] をクリックします。
- [ネットワーク] で、[新しい VPC コネクタを追加] をクリックします。サーバーレス VPC アクセス API がまだ有効になっていない場合は有効にします。
- コネクタの作成で、名前を
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 ファイルの内容に置き換えます。
- AlloyDB インスタンスとクラスタの詳細に従って、ファイル内の AlloyDbJdbcConnector の詳細を更新します。
$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を、先ほどホストした retail-engine アプリの URL に更新します。

GenerateImageSample.javaを開き、AlloyDB インスタンスが作成された場所に応じてプロジェクト ID とロケーションを更新します。

- すべてのファイルを保存します。
このアプリケーションを Cloud Run サーバーレス ランタイムにデプロイします。
13. アプリケーションをウェブに移行する
関連するプロジェクト、ロケーション、小売エンジン アプリの詳細を服装 Recommender 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 を使用している場合は、[拡張機能] をクリックし、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] に移動します。
- [サービス] で、デプロイした outfit recommender サービスをクリックします。retail-engine サービスと outfit-recommender サービスの両方が次のように表示されます。

- アプリケーション URL をクリックして、Recommender アプリの UI を開きます。

The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
デプロイされたアプリケーションは次のように表示されます。

アプリケーションの使用
アプリの使用を開始するには、次の手順を行います。
- [アップロード] をクリックして、衣料品の写真をアップロードします。
- 画像をアップロードしたら、[スタイル] をクリックします。アプリケーションは、画像をプロンプトとして使用し、小売データセットのエンベディングを含む retail-engine アプリのプロンプトに基づいて下部のオプションを生成します。
アプリは、スタイリングの推奨事項を含む画像に基づいて、プロンプトとともに画像候補を生成します。例: 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 モデルで使用してスタイリングの推奨事項を生成しました。