AlloyDB と Vertex AI Agent Builder を使用してスマート ショッピング アシスタントを構築する - パート 1

1. 概要

急速に進化する小売業界において、パーソナライズされたショッピング エクスペリエンスを実現しながら卓越したカスタマー サービスを提供することが重要です。お客様からの質問に回答し、商品の検索をサポートし、検索結果をカスタマイズするように設計された、ナレッジドリブンのチャット アプリケーションの作成について、技術的な観点から説明します。この革新的なソリューションは、データ ストレージに AlloyDB、コンテキスト理解に自社アナリティクス エンジン、関連性の検証に Gemini(大規模言語モデル)、インテリジェントな会話型アシスタントの迅速な起動に Google のエージェント ビルダーを組み合わせています。

課題: 現代の小売店の顧客は、即座の回答と、個々の好みに合った商品のおすすめを期待しています。従来の検索方法では、このようなレベルのパーソナライズを実現できないことがよくあります。

解決策: Google のナレッジドリブン チャット アプリケーションは、この課題に正面から取り組んでいます。小売データから得られた豊富なナレッジベースを活用して、顧客の意図を理解し、インテリジェントに応答し、関連性の高い結果を提供します。

作成するアプリの概要

このラボ(パート 1)では、次の作業を行います。

  1. AlloyDB インスタンスを作成して e コマース データセットを読み込む
  2. AlloyDB で pgvector 拡張機能と生成 AI モデル拡張機能を有効にする
  3. 商品の説明からエンベディングを生成する
  4. ユーザーの検索テキストに対してリアルタイムで cosine 類似度検索を実行する
  5. サーバーレス Cloud Run Functions にソリューションをデプロイする

ラボの 2 番目のパートでは、Agent Builder の手順について説明します。

要件

  • ブラウザ(ChromeFirefox など)
  • 課金を有効にした Google Cloud プロジェクト

2. アーキテクチャ

データフローの詳細: データがシステム内をどのように移動するかを詳しく見てみましょう。

取り込み:

最初のステップは、小売データ(在庫、商品説明、顧客インタラクション)を AlloyDB に取り込むことです。

アナリティクス エンジン:

分析エンジンとして AlloyDB を使用して、次の処理を行います。

  1. コンテキストの抽出: エンジンは AlloyDB に保存されているデータを分析し、商品、カテゴリ、顧客行動などの関係を把握します。
  2. エンベディングの作成: ユーザーのクエリと AlloyDB に保存されている情報の両方に対して、エンベディング(テキストの数学的表現)が生成されます。
  3. ベクトル検索: エンジンは類似性検索を実行し、クエリ エンベディングを商品の説明、レビュー、その他の関連データのエンベディングと比較します。これにより、最も関連性の高い 25 個の「最近傍」が特定されます。

Gemini の検証:

これらの回答候補は、評価のために Gemini に送信されます。Gemini は、それらが本当に関連性があり、ユーザーと共有しても安全かどうかを判断します。

レスポンス生成:

検証されたレスポンスは JSON 配列に構造化され、エンジン全体がサーバーレスの Cloud Run 関数にパッケージ化され、エージェント ビルダーから呼び出されます。

会話型の操作:

Agent Builder は、レスポンスを自然言語形式でユーザーに提示し、双方向の会話を容易にします。この部分については、フォローアップ ラボで説明します。

3. 始める前に

プロジェクトを作成する

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
  3. Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。

Cloud Shell を有効にするボタンの画像

  1. Cloud Shell に接続したら、次のコマンドを使用して、認証が完了していることと、プロジェクトがプロジェクト ID に設定されていることを確認します。
gcloud auth list
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
  1. プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <YOUR_PROJECT_ID>
  1. 必要な 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 を使用します。clustersを使用して、データベースやログなどのすべてのリソースを保持します。各クラスタには、データへのアクセス ポイントを提供するプライマリ インスタンスがあります。テーブルには実際のデータが保持されます。

AlloyDB クラスタ、インスタンス、ecommerce データセットを読み込むテーブルを作成しましょう。

クラスタとインスタンスを作成する

  1. Cloud コンソールで AlloyDB ページに移動します。Cloud コンソールのほとんどのページは、コンソールの検索バーを使用して簡単に見つけることができます。
  2. そのページで [クラスタを作成] を選択します。

f76ff480c8c889aa.png

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

538dba58908162fb.png

  1. デフォルトのネットワークを選択すると、次のような画面が表示されます。[接続の設定] を選択します。
    7939bbb6802a91bf.png
  2. [自動的に割り当てられた IP 範囲を使用する] を選択し、[続行] をクリックします。情報を確認したら、[CREATE CONNECTION] を選択します。768ff5210e79676f.png
  3. ネットワークが設定されたら、クラスタの作成を続行できます。[クラスタを作成] をクリックして、クラスタの設定を完了します。

e06623e55195e16e.png

インスタンス ID を「shopping-instance"」に変更してください。

クラスタの作成には 10 分ほどかかります。正常に完了すると、次のような画面が表示されます。

24eec29fa5cfdb3e.png

5. データの取り込み

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

847e35f1bf8a8bd8.png

インスタンスの作成が完了するまで待つ必要があります。準備ができたら、クラスタの作成時に作成した認証情報を使用して AlloyDB にログインします。PostgreSQL の認証には、次のデータを使用します。

  • ユーザー名: 「postgres
  • データベース: 「postgres
  • パスワード: 「alloydb

AlloyDB Studio で認証が正常に完了すると、エディタに SQL コマンドが入力されます。最後のウィンドウの右側にあるプラス記号を使用して、複数のエディタ ウィンドウを追加できます。

91a86d9469d499c4.png

必要に応じて、[実行]、[フォーマット]、[クリア] の各オプションを使用して、エディタ ウィンドウに AlloyDB のコマンドを入力します。

拡張機能を有効にする

このアプリの作成では、拡張機能 pgvectorgoogle_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) );

上記のコマンドが正常に実行されると、データベース内のテーブルが表示されます。スクリーンショットの例を以下に示します。

908e33bbff58a6d.png

データを取り込む

このラボでは、この SQL ファイルに約 200 件のレコードのテストデータがあります。id, category, sub_category, uri, imagecontent が含まれます。他のフィールドは、ラボの後半で入力します。

そこから 20 行の挿入ステートメントをコピーし、空白のエディタタブに貼り付けて、[実行] を選択します。

テーブルの内容を表示するには、[エクスプローラ] セクションを開き、apparels という名前のテーブルが表示されるまで展開します。省略記号(⋮)を選択すると、テーブルに対してクエリを実行するオプションが表示されます。新しいエディタタブで SELECT ステートメントが開きます。

b31ece70e670ab89.png

権限を付与

次のステートメントを実行して、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」、「на берегу океана」などです。これらの用語はすべて見た目は異なりますが、意味的な意味や機械学習の用語では、埋め込みが非常に近いはずです。

データとコンテキストの準備ができたので、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;

次のように、クエリ内のサンプルテキストのエンベディング ベクトルが返されます。これは浮動小数点数の配列のように見えます。

c69c08d085389f74.png

注: 無料枠で新しく作成された Google Cloud プロジェクトでは、エンベディング モデルに対して 1 秒あたりに許可されるエンベディング リクエストの数に関して、割り当ての問題が発生する可能性があります。ID のフィルタクエリを使用して、エンベディングの生成時に 1 ~ 5 件のレコードを選択することをおすすめします。

8. ベクトル検索を実行する

テーブル、データ、エンベディングがすべて準備できたので、ユーザーの検索テキストのリアルタイム ベクトル検索を実行しましょう。

お客様から次のような質問を受けたとします。

「女性用トップス、ピンクのカジュアル、純綿のみを希望します。」

一致する値は、次のクエリを実行して見つけることができます。

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;

このクエリを詳しく見てみましょう。

このクエリでは、

  1. ユーザーの検索テキストは「I want women's tops, pink casual only pure cotton.」です。
  2. モデル text-embedding-004 を使用して、embedding() メソッドでエンベディングに変換しています。このステップは、テーブル内のすべてのアイテムにエンベディング関数を適用した最後のステップとよく似ています。
  3. <=>」は、COSINE SIMILARITY 距離メソッドの使用を表します。使用可能なすべての類似性測定については、pgvector のドキュメントをご覧ください。
  4. エンベディング方法の結果をベクトル型に変換し、データベースに保存されているベクトルと互換性を持たせています。
  5. LIMIT 5 は、検索テキストの最近傍を 5 つ抽出することを表します。

結果は次のようになります。

4193a68737400535.png

検索結果を見ると、検索テキストにかなり近い一致が見つかります。色を変更して、結果がどのように変化するかを確認してみてください。

注意事項:

ScaNN インデックスを使用して、このベクトル検索結果のパフォーマンス(クエリ時間)、効率、レコールを向上させたいとします。インデックスを使用する場合と使用しない場合の結果の違いを比較するには、こちらのブログの手順をご覧ください。便宜上、インデックス作成手順を以下に示します。

  1. クラスタ、インスタンス、コンテキスト、エンベディングはすでに作成されているため、次のステートメントを使用して ScaNN 拡張機能をインストールするだけです。

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

  1. 次に、インデックス(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 はデータポイント数の平方根に近い値にする必要があります)。

  1. 次のクエリを使用して、インデックスが作成されているかどうかを確認します。

SELECT * FROM pg_stat_ann_indexes;

  1. インデックスを使用しないときに使用したのと同じクエリを使用してベクトル検索を実行します。

select * from apparels

ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))

LIMIT 20

上記のクエリは、ラボの手順 8 で使用したものと同じです。これで、フィールドがインデックスに登録されました。

  1. インデックスありとインデックスなし(インデックスを削除)の両方で、単純な検索クエリを使用してテストします。

white tops for girls without any print

インデックスに登録されたエンベディング データに対するベクトル検索クエリの上の検索テキストにより、高品質の検索結果と効率性が実現されます。インデックスを使用すると、効率が大幅に向上します(実行時間: ScaNN なしで 10.37 ms、ScaNN ありで 0.87 ms)。このトピックについて詳しくは、こちらのブログをご覧ください。

9. LLM を使用した一致検証

次に進んで、アプリケーションに最適な一致を返すサービスを作成する前に、生成 AI モデルを使用して、これらの候補の回答が本当に関連性があり、ユーザーと共有しても安全かどうかを確認しましょう。

インスタンスが Gemini 用に設定されていることを確認する

まず、クラスタとインスタンスで Google ML 統合がすでに有効になっているかどうかを確認します。AlloyDB Studio で次のコマンドを実行します。

show google_ml_integration.enable_model_support;

値が [オン] と表示されている場合は、次の 2 つの手順をスキップして、AlloyDB と Vertex AI モデルの統合の設定に直接進みます。

  1. AlloyDB クラスタのプライマリ インスタンスに移動し、[プライマリ インスタンスを編集] をクリックします。

456ffdf292d3c0e0.png

  1. [詳細設定オプション] の [フラグ] セクションに移動します。次のように、google_ml_integration.enable_model_support flag が「on」に設定されていることを確認します。

6a59351fcd2a9d35.png

[オン] に設定されていない場合は、[オン] に設定して [インスタンスを更新] ボタンをクリックします。この処理には数分かかります。

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 の今後の呼び出しで問題が発生する可能性があるため、gemini-1.5 モデルへの古い参照を削除し、上記の CALL ステートメントで再度作成して、関数 ml_predict_row に対する grant execute を再度実行する必要があります。

回答の評価

次のセクションでは、クエリからのレスポンスが妥当であることを確認するために、1 つの大きなクエリを使用しますが、このクエリは理解しにくい場合があります。各要素とそれらがどのように組み合わされるかについて、後ほど詳しく説明します。

  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 つの行が含まれ、各行には次の列が含まれます。

  • literature
  • content
  • user_text
  1. 回答の有効性を判断するために、複雑なクエリを使用して、回答を評価する方法を説明します。xyz テーブルの user_textcontent をクエリの一部として使用します。
"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."
  1. このクエリを使用して、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;
  1. predict_row は結果を JSON 形式で返します。コード「-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"」は、その JSON から実際のテキストを抽出するために使用されます。返される実際の JSON を確認するには、このコードを削除します。
  2. 最後に、LLM フィールドを取得するには、x テーブルから抽出します。
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. これは、次のように 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-004',
             'I want womens tops, pink casual only pure cotton.')::vector
         LIMIT
           5 ) AS xyz ) AS X;

それでもまだ難しいと思われるかもしれませんが、少し理解が深まったのではないでしょうか。結果には、一致があるかどうか、一致率、評価の説明が表示されます。

Gemini モデルではストリーミングがデフォルトでオンになっているため、実際のレスポンスは複数行に分散されます。14e74d71293b7b9.png

10. アプリケーションをウェブに移行する

このアプリをウェブに移行する準備はできていますか?Cloud Run Functions を使用してこのナレッジ エンジンをサーバーレスにするには、次の手順を行います。

  1. Google Cloud コンソールの Cloud Run Functions に移動して、新しい Cloud Run 関数を作成するか、リンク https://console.cloud.google.com/functions/add を使用します。
  2. 環境として [Cloud Run 関数] を選択します。関数名「retail-engine」を指定し、リージョンとして「us-central1」を選択します。[認証] を [未認証の呼び出しを許可] に設定し、[次へ] をクリックします。ランタイムとして [Java 17]、ソースコードとして [インライン エディタ] を選択します。
  3. デフォルトでは、エントリ ポイントは「gcfv2.HelloHttpFunction」に設定されます。Cloud Run Functions の HelloHttpFunction.javapom.xml のプレースホルダ コードを、Java ファイルXML のコードにそれぞれ置き換えます。
  4. Java ファイルの $PROJECT_ID プレースホルダと AlloyDB 接続認証情報を実際の値に変更してください。AlloyDB の認証情報は、この Codelab の開始時に使用したものと同じです。異なる値を使用している場合は、Java ファイルで同じ値を変更してください。
  5. [デプロイ] をクリックします。

デプロイしたら、Cloud Functions の関数が AlloyDB データベース インスタンスにアクセスできるように、VPC コネクタを作成します。

重要なステップ:

デプロイが開始されると、Google の Cloud Run Functions コンソールに関数が表示されます。新しく作成した関数(retail-engine)を検索してクリックし、[編集] をクリックして、次のように変更します。

  1. [ランタイム、ビルド、接続、セキュリティの設定] に移動します。
  2. タイムアウトを 180 秒に増やす
  3. [接続] タブに移動します。

4e83ec8a339cda08.png

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

8126ec78c343f199.png

  1. VPC コネクタの名前を指定し、リージョンがインスタンスと同じであることを確認します。[ネットワーク] の値はデフォルトのままにして、[サブネット] を [カスタム IP 範囲] に設定し、10.8.0.0 などの使用可能な IP 範囲を指定します。
  2. [スケーリング設定を表示] を開き、構成が次のように正確に設定されていることを確認します。

7baf980463a86a5c.png

  1. [作成] をクリックすると、このコネクタが下り(外向き)設定に表示されます。
  2. 新しく作成したコネクタを選択します。
  3. すべてのトラフィックをこの VPC コネクタ経由でルーティングするように選択します。
  4. [次へ]、[デプロイ] の順にクリックします。

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 .

結果は次のようになる

88bc1ddfb5644a28.png

これで、AlloyDB データでエンベディング モデルを使用して類似ベクトル検索を実行するのは、これほど簡単です。

会話型エージェントの構築

エージェントは、このラボのパート 2 で作成します。

12. クリーンアップ

このラボのパート 2 を完了する場合は、この手順をスキップしてください。この手順を行うと、現在のプロジェクトが削除されます。

この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

13. 完了

これで、AlloyDB、pgvector、ベクトル検索を使用して類似検索を正常に実行しました。AlloyDBVertex AIベクトル検索の機能を組み合わせることで、コンテキスト検索とベクトル検索をアクセスしやすく、効率的で、真に意味に基づくものにするための大きな一歩を踏み出しました。このラボの次のパートでは、エージェントの構築手順について説明します。