1. 概要
今日のペースの速い小売業界では、パーソナライズされたショッピング体験を実現しながら、優れたカスタマー サービスを提供することが最も重要です。このセッションでは、顧客からの質問への回答、プロダクトの発見のガイド、検索結果のカスタマイズを行うように設計されたナレッジ ドリブン チャット アプリケーションの作成について、技術的な観点から説明します。この革新的なソリューションは、データ ストレージ用の AlloyDB、コンテキスト理解用の社内分析エンジン、関連性の検証用の Gemini(大規模言語モデル)、インテリジェントな会話アシスタントを迅速にブートストラップするための Google の Agent Builder の機能を組み合わせています。
課題: 現代の小売業のお客様は、独自の好みに合った回答やおすすめ商品を即座に求めています。従来の検索方法では、このレベルのパーソナライズを実現できないことがよくあります。
解決策: 知識主導型のチャット アプリケーションは、この課題に正面から取り組んでいます。小売データから得られた豊富なナレッジベースを活用して、顧客の意図を理解し、インテリジェントに応答して、関連性の高い結果を提供します。
作成するアプリの概要
このラボ(パート 1)では、次の作業を行います。
- AlloyDB インスタンスを作成して e コマース データセットを読み込む
- AlloyDB で pgvector と生成 AI モデルの拡張機能を有効にする
- 商品説明からエンベディングを生成する
- ユーザーの検索テキストに対してコサイン類似度検索をリアルタイムで実行する
- サーバーレスの Cloud Run functions にソリューションをデプロイする
ラボの後半では、エージェント ビルダーの手順について説明します。
要件
2. アーキテクチャ
データフロー: データがシステム内をどのように移動するかを詳しく見てみましょう。
取り込み:
最初のステップは、小売データ(在庫、商品説明、顧客とのやり取り)を AlloyDB に取り込むことです。
Analytics Engine:
AlloyDB を分析エンジンとして使用して、次の処理を行います。
- コンテキスト抽出: エンジンは AlloyDB に保存されているデータを分析し、必要に応じて商品、カテゴリ、顧客行動などの関係を把握します。
- エンベディングの作成: ユーザーのクエリと AlloyDB に保存されている情報の両方に対して、エンベディング(テキストの数学的表現)が生成されます。
- ベクトル検索: エンジンは類似性検索を実行し、クエリ エンベディングと商品説明、レビュー、その他の関連データのエンベディングを比較します。これにより、最も関連性の高い「最近傍」が 25 個特定されます。
Gemini の検証:
これらの回答候補は、評価のために Gemini に送信されます。Gemini は、その情報がユーザーと共有するのに本当に適切で安全かどうかを判断します。
回答の生成:
検証済みのレスポンスは JSON 配列に構造化され、エンジン全体が Agent Builder から呼び出されるサーバーレスの Cloud Run 関数にパッケージ化されます。
会話型の操作:
Agent Builder は、自然言語形式でユーザーにレスポンスを表示し、双方向の対話を促進します。この部分は、フォローアップ ラボで説明します。
3. 始める前に
プロジェクトを作成する
- Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
- Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
- Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。
![[Cloud Shell をアクティブにする] ボタンの画像](https://codelabs.developers.google.com/static/smart-shop-agent-alloydb/img/7875ca05ca6f7cab.png?hl=ja)
- Cloud Shell に接続したら、次のコマンドを使用して、すでに認証済みであることと、プロジェクトがプロジェクト ID に設定されていることを確認します。
gcloud auth list
- Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
- プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <YOUR_PROJECT_ID>
- 必要な API を有効にします。
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudfunctions.googleapis.com \
aiplatform.googleapis.com
gcloud コマンドの代わりに、コンソールで各プロダクトを検索するか、こちらのリンクを使用することもできます。
API が見つからない場合は、実装中にいつでも有効にできます。
gcloud コマンドとその使用方法については、ドキュメントをご覧ください。
4. データベースの設定
このラボでは、小売データを保持するデータベースとして AlloyDB を使用します。クラスタを使用して、データベースやログなどのすべてのリソースを保持します。各クラスタには、データへのアクセス ポイントを提供するプライマリ インスタンスがあります。テーブルには実際のデータが格納されます。
e コマース データセットが読み込まれる AlloyDB クラスタ、インスタンス、テーブルを作成しましょう。
クラスタとインスタンスを作成する
- Cloud コンソールの AlloyDB ページに移動します。Cloud コンソールでほとんどのページを簡単に見つけるには、コンソールの検索バーを使用して検索します。
- このページで [クラスタを作成] を選択します。

- 次のような画面が表示されます。次の値を使用してクラスタとインスタンスを作成します。
- クラスタ ID: 「
shopping-cluster」 - password: "
alloydb" - PostgreSQL 15 互換
- リージョン: 「
us-central1」 - ネットワーキング: 「
default」

- デフォルトのネットワークを選択すると、次のような画面が表示されます。[接続の設定] を選択します。

- [自動的に割り当てられた IP 範囲を使用する] を選択して、[続行] をクリックします。情報を確認したら、[接続を作成] を選択します。

- ネットワークを設定したら、クラスタの作成を続行できます。[CREATE CLUSTER] をクリックして、次のようにクラスタの設定を完了します。

インスタンス ID を「shopping-instance"」に変更してください。
クラスタの作成には 10 分ほどかかります。成功すると、次のような画面が表示されます。

5. データの取り込み
次に、店舗に関するデータを含むテーブルを追加します。AlloyDB に移動し、プライマリ クラスタと AlloyDB Studio を選択します。

インスタンスの作成が完了するまで待つ必要がある場合があります。作成されたら、クラスタの作成時に作成した認証情報を使用して AlloyDB にログインします。PostgreSQL の認証には次のデータを使用します。
- ユーザー名: 「
postgres」 - データベース: 「
postgres」 - パスワード: 「
alloydb」
AlloyDB Studio への認証が成功すると、エディタに 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 が含まれます。他のフィールドはラボで後ほど入力します。
そこから 20 行の挿入ステートメントをコピーし、空白のエディタタブに貼り付けて、[実行] を選択します。
テーブルの内容を確認するには、[エクスプローラ] セクションを開き、apparels というテーブルが表示されるまで展開します。三点リーダー(⋮)を選択して、テーブルのクエリ オプションを表示します。SELECT ステートメントが新しいエディタタブで開きます。

権限を付与
次のステートメントを実行して、embedding 関数に対する実行権限をユーザー postgres に付与します。
GRANT EXECUTE ON FUNCTION embedding TO postgres;
AlloyDB サービス アカウントに Vertex AI ユーザーロールを付与する
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. コンテキスト
AlloyDB インスタンス ページに戻ります。
エンベディングを作成するには、context(単一のフィールドに含めるすべての情報)が必要です。これを行うには、商品紹介文(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 を実行して、商品説明のエンベディングを embedding フィールドのテーブルに追加します。使用できるエンベディング モデルは多数あります。Vertex AI の text-embedding-004 を使用しています。プロジェクト全体で同じエンベディング モデルを使用してください。
注: 以前に作成した既存の Google Cloud プロジェクトを使用している場合は、textembedding-gecko などの古いバージョンのテキスト エンベディング モデルを引き続き使用する必要がある場合があります。
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
apparels テーブルをもう一度見て、エンベディングを確認します。変更を確認するには、SELECT ステートメントを再実行してください。
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
次のように、クエリ内のサンプル テキストのエンベディング ベクトル(浮動小数点数の配列)が返されます。

注: 無料枠で新しく作成された Google Cloud プロジェクトでは、Embedding モデルに対して 1 秒あたりに許可されるエンベディング リクエストの数に関して割り当ての問題が発生する可能性があります。ID のフィルタ クエリを使用して、エンベディングを生成しながら 1 ~ 5 件のレコードを選択的に選択することをおすすめします。
8. ベクトル検索を実行する
テーブル、データ、エンベディングの準備が整ったので、ユーザーの検索テキストに対してリアルタイムのベクトル検索を実行しましょう。
ユーザーが次のように質問したとします。
「レディースのトップス、ピンク、カジュアル、コットン 100% のみ。」
次のクエリを実行すると、この一致を確認できます。
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
このクエリを詳しく見てみましょう。
このクエリでは、
- ユーザーの検索テキストは「レディースのトップス、ピンク、カジュアル、コットン 100% のみ」です。
- モデル
text-embedding-004を使用して、embedding()メソッドでエンベディングに変換しています。このステップは、テーブル内のすべてのアイテムにエンベディング関数を適用した最後のステップと似ています。 - 「
<=>」は、コサイン類似度距離メソッドの使用を表します。使用可能な類似度指標については、pgvector のドキュメントをご覧ください。 - エンベディング メソッドの結果をベクトル型に変換して、データベースに保存されているベクトルと互換性を持たせています。
- LIMIT 5 は、検索テキストの最近傍を 5 つ抽出することを表します。
結果は次のようになります。

結果を見ると、検索テキストとかなり近い一致が見つかっています。色を変更して、結果がどのように変化するかを確認してください。
注意事項:
ここで、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 のラボで使用したクエリと同じです。ただし、フィールドのインデックスが作成されました。
- インデックスあり(インデックスを削除)とインデックスなしで、簡単な検索クエリを使用してテストします。
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」に設定されていることを確認します。

[オン] に設定されていない場合は、[オン] に設定して [インスタンスを更新] ボタンをクリックします。この手順には数分かかります。
AlloyDB と Vertex AI モデルの統合
これで AlloyDB Studio に接続し、次の DML ステートメントを実行して、AlloyDB から Gemini モデルへのアクセスを設定できます。プロジェクト ID は、指定された場所に指定します。コマンドを実行する前に構文エラーの警告が表示されることがありますが、コマンドは正常に実行されます。
まず、次の図に示すように Gemini 1.5 モデル接続を作成します。次のコマンドの $PROJECT_ID は、Google Cloud プロジェクト ID に置き換えてください。
CALL
google_ml.create_model( model_id => 'gemini-1.5',
model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
model_provider => 'google',
model_auth_type => 'alloydb_service_agent_iam');
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;
注: 既存の Google Cloud プロジェクトと、しばらく前に作成された AlloyDB の既存のクラスタ/インスタンスを使用している場合は、gemini-1.5 モデルへの古い参照を削除し、上記の CALL ステートメントで再度作成する必要があります。また、gemini-1.5 の今後の呼び出しで問題が発生した場合は、関数 ml_predict_row で grant execute を再度実行する必要があります。
回答の評価
次のセクションでは、クエリからのレスポンスが妥当であることを確認するために、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-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
このクエリの出力は、ユーザーのクエリに関連する最も類似した 5 行になります。新しいテーブル 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-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
まだ難しそうに見えるかもしれませんが、少しは理解できたのではないでしょうか。結果には、一致するかどうか、一致率、レーティングの説明が表示されます。
Gemini モデルではデフォルトでストリーミングが有効になっているため、実際のレスポンスは複数の行にまたがっています。
10. アプリケーションをウェブに移行する
このアプリをウェブに移行する準備はできましたか?次の手順に沿って、Cloud Run Functions を使用して Knowledge Engine Serverless を作成します。
- Google Cloud コンソールの Cloud Run 関数に移動して、新しい Cloud Run 関数を作成するか、リンク(https://console.cloud.google.com/functions/add)を使用します。
- [環境] で [Cloud Run functions] を選択します。関数名「retail-engine」を指定し、リージョンとして「us-central1」を選択します。[認証] を [未認証の呼び出しを許可] に設定し、[次へ] をクリックします。ランタイムとして [Java 17] を選択し、ソースコードとして [インライン エディタ] を選択します。
- デフォルトでは、エントリ ポイントは「
gcfv2.HelloHttpFunction」に設定されます。Cloud Run 関数のHelloHttpFunction.javaとpom.xmlのプレースホルダ コードを、それぞれ Java ファイルと XML のコードに置き換えます。 - Java ファイルで $PROJECT_ID プレースホルダと AlloyDB 接続認証情報を値に変更してください。AlloyDB の認証情報は、この Codelab の開始時に使用したものです。異なる値を使用している場合は、Java ファイルで同じ値を指定してください。
- [デプロイ] をクリックします。
デプロイが完了したら、Cloud Functions が AlloyDB データベース インスタンスにアクセスできるように、VPC コネクタを作成します。
重要な手順:
デプロイを開始すると、Google の Cloud Run Functions コンソールで関数を確認できるようになります。新しく作成した関数(retail-engine)を検索してクリックし、[編集] をクリックして、次の項目を変更します。
- [ランタイム、ビルド、接続、セキュリティの設定] に移動する
- タイムアウトを 180 秒に増やします
- [接続] タブに移動します。

- [上り(内向き)設定] で、[すべてのトラフィックを許可する] が選択されていることを確認します。
- [下り(外向き)設定] で、[ネットワーク] プルダウンをクリックし、[新しい VPC コネクタを追加] オプションを選択して、ポップアップ表示されるダイアログ ボックスに表示される手順に沿って操作します。

- VPC コネクタの名前を指定し、リージョンがインスタンスと同じであることを確認します。[ネットワーク] の値はデフォルトのままにし、[サブネット] を [カスタム IP 範囲] に設定して、使用可能な IP 範囲(10.8.0.0 など)を指定します。
- [SHOW SCALING SETTINGS] を展開し、構成が次のとおりに設定されていることを確認します。

- [作成] をクリックすると、このコネクタが下り(外向き)設定に表示されます。
- 新しく作成したコネクタを選択します。
- すべてのトラフィックがこの VPC コネクタ経由でルーティングされるようにします。
- [次へ]、[デプロイ] の順にクリックします。
11. アプリケーションをテストする
更新された Cloud Functions がデプロイされると、次の形式でエンドポイントが表示されます。
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
次のコマンドを実行して、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://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
結果は次のようになる

これで、AlloyDB データでエンベディング モデルを使用して類似性ベクトル検索を実行するのは、これほど簡単です。
会話エージェントを構築する
エージェントは、このラボのパート 2 で構築します。
12. クリーンアップ
このラボのパート 2 を完了する予定がある場合は、この手順をスキップしてください。この手順を行うと、現在のプロジェクトが削除されます。
この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
- Google Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
13. 完了
おめでとうございます!AlloyDB、pgvector、ベクトル検索を使用して類似性検索を正常に実行しました。AlloyDB、Vertex AI、ベクトル検索の機能を組み合わせることで、コンテキスト検索とベクトル検索をアクセス可能で効率的かつ真に意味主導型にするという点で、大きな進歩を遂げました。このラボの次のパートでは、エージェントの構築手順について説明します。