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

1. 概要

今日の目まぐるしく変化する小売業界では、パーソナライズされたショッピング エクスペリエンスを提供しながら、優れたカスタマー サービスを提供することが何よりも重要です。顧客からの質問に回答し、商品検索を誘導し、検索結果をカスタマイズするために設計された知識ベースのチャット アプリケーションを作成する技術的プロセスをご紹介します。この革新的なソリューションは、データ ストレージ用の AlloyDB、コンテキスト理解のための社内分析エンジン、関連性の検証のための Gemini(大規模言語モデル)、インテリジェントな会話アシスタントを迅速にブートストラップする Google の Agent Builder の能力を組み合わせた革新的なソリューションです。

課題: 現代の小売業のお客様は、自分の好みに沿った回答や商品のレコメンデーションを即座に期待しています。従来の検索方法では、多くの場合、このレベルのパーソナライゼーションは提供できません。

ソリューション: この課題に正面から取り組む、Google の知識ベースのチャット アプリケーションです。小売データから得られた豊富なナレッジベースを活用して、顧客の意向を把握し、インテリジェントに対応し、非常に関連性の高い結果を提供します。

作成するアプリの概要

このラボ(パート 2)では、次のことを行います。

  1. Vertex AI Agent Builder エージェントを構築する
  2. AlloyDB ツールとエージェントを統合する

要件

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

2. アーキテクチャ

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

取り込み:

小売データ(在庫、商品説明、顧客とのやり取り)が継続的に AlloyDB に読み込まれます。

分析エンジン:

分析エンジンとして AlloyDB を使用して、以下のことを行います。

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

Gemini Validation:

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

回答の生成:

検証済みのレスポンスは JSON 配列に構造化され、エンジン全体が、Agent Builder から呼び出されるサーバーレスの Cloud Run 関数にパッケージ化されます。

上記の手順は、ラボのパート 1 ですでに説明されています。

スマート ショッピング アシスタントを強化するナレッジドリブンな分析エンジンの構築に関する技術的な詳細についてもご説明しました。次は、Agent Builder のマジックを活用して、このエンジンを会話インターフェースで活用する方法を見ていきましょう。パート 2 を開始する前に、エンドポイント URL が準備されていることを確認してください。次のステップは、このラボで取り上げます。

会話でのやり取り:

Agent Builder は、自然言語形式でレスポンスをユーザーに提示し、やり取りを容易にします。

3. 始める前に

プロジェクトを作成する

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
  3. Cloud Shell を使用します。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 コマンドの代わりに、コンソールで各プロダクトを検索するか、こちらのリンクを使用することもできます。

まだ実装されていない API がある場合は、実装中にいつでも有効にできます。

gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

重要な注意事項: これを完了するには、ラボのパート 1 が完了していることを確認してください。

4. エージェントの作成

Agent Builder の概要

Agent Builder は、会話エージェントを迅速かつ効率的に作成できるようにする強力なローコード ツールです。ダイアログ フローの設計、ナレッジベースの統合、外部 API への接続のプロセスが効率化されます。ここでは、Agent Builder を使用して、パート 1 で作成した Cloud Functions の関数のエンドポイントにシームレスに接続します。これにより、ショッピング アシスタントが小売ナレッジベースにアクセスし、顧客のクエリにインテリジェントに応答できるようになります。

エージェントの作成

アパレル商品に関するユーザーの質問に答えるため、この新しいエージェントを作成してみましょう。

  1. まず、Agent Builder プラットフォームにログインします。API を有効にするように求められたら、[続行] をクリックして API をアクティブにします。
  2. [CREATE APP] をクリックします。エージェントにわかりやすい名前を付けます(例:「Retail Shopping Assistant」)を入力します。
  3. [App Type] で [Agent] を選択します。

462bb48664e9a14e.png

  1. をタップします。エージェントにわかりやすい名前を付けます(「Retail Shopping Assistant」など)。リージョンを us-central1 に設定します

10eceef44b1600d1.png

  1. エージェントの詳細を入力します。
  2. エージェント名を「Retail Shopping Agent」に変更します。
  3. 以下の「目標」を追加します。
You are a shopping assistant agent! Your job is to help the customer search for their ideal apparels, allow them to add items to their cart, remove items from their cart, and review items in their cart. Once a user is done searching, open the search results in a user friendly html page.

537a87a842aae897.png

  1. この時点で保存し、ここでは指示は空白のままにします。
  2. ナビゲーション メニューの [ツール] をクリックし、[作成] をクリックします。

2ffae953bbad38e5.png

ツール名を入力: Retail Shopping Tool

ツールの説明を入力:

This tool refers to the dataset in the backend as the context information for product inventory. It takes as input the user's search text summarized by the agent and matches with the most appropriate list of items and returns as an array of items.

スキーマ(YAML 形式の OpenAPI)を入力します。

ここでは、バックエンド エンドポイントを使用してエージェントを強化します。以下の OpenAPI 仕様をコピーし、山かっこで囲まれた URL プレースホルダを Cloud Functions エンドポイントに置き換えます。

openapi: 3.0.0
info:
 title: AlloyDB Product Matcher
 description: A Cloud Function to query AlloyDB for product matches based on user search text.
 version: 1.0.0
servers:
 - url: <<https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/alloy-gem>>
paths:
 /:
   post:
     summary: Find matching products based on search text.
     operationId: apparelSearch
     requestBody:
       description: JSON object containing the search text.
       required: true
       content:
         application/json:
           schema:
             type: object
             properties:
               search:
                 type: string
                 description: The user's search query for product matching.
     responses:
       '200':
         description: Successful response with a JSON array of matching products.
         content:
           application/json:
             schema:
               type: array
               items:
                 type: object
                 properties:
                   id:
                     type: string
                     description: Product ID.
                   category:
                     type: string
                     description: Product category.
                   sub_category:
                     type: string
                     description: Product sub-category.
                   uri:
                     type: string
                     description: Product URI or URL.
                   description:
                     type: string
                     description: Product description.
                   literature:
                     type: object
                     description: JSON object containing match information from the ML model.
                     properties:
                       MATCH:
                         type: string
                         description: Whether the product matches the search query (YES/NO).
                       PERCENTAGE:
                         type: string
                         description: Percentage of match.
                       DIFFERENCE:
                         type: string
                         description: Description of differences between the search and product.
       '500':
         description: Internal server error.

他の設定はデフォルト値のままにして、[保存] をクリックします。

  1. 「ツール」を追加したいので、この時点でエージェントに戻ります。エージェントの「Instructions」に追加します。手順のプレースホルダに以下を追加します(フローの定義ではインデントが重要です)。
- Greet the user and answer their question to the best of your knowledge.
- Summarize the user's request and ask them to confirm that you understood correctly.
   - Check if the request has details like gender, color, material, style and other key apparel details already.
   - If not, seek clarifying details.
   - If the search request is very broad, then ask the user to narrow down the request with specific details that you believe could be personal preferences.
   - Once all the necessary details are met, summarize your final understanding of the request with the user.
- Use ${TOOL: Retail Shopping Tool} to help the user with their task.
- If the request has unrelated input text, gracefully convey that you don't have information on that topic.
- Do not give product availability information outside the source that is provided to you in ${TOOL: Retail Shopping Tool}.
- Do not assist with any information unless you are certain that you know the answer and it is grounded in the source of truth.
- Thank the user for their business and say goodbye.

ツールが「小売ショッピング ツール」であることを確認します。[使用可能なツール] でエージェントを再度保存します。

5. エージェントをテストする

右側のペインに [Preview Agent] セクションが表示され、エージェントをテストできます。

以下のスクリーンショットからわかるように、私はユーザーとして挨拶し、青写真付きの白いシャツをリクエストしてチャットを開始しました。

63ac3ef6d1f0f614.png

JSON レスポンスは次のようになります。

acf3cb0e2be2ed91.png

これは、AlloyDB の類似度検索を処理する Cloud Functions の関数からの未加工の JSON 結果です。これで、これでエージェントの対応は完了です。

6. 会話フローの例

この時点で、ダイアログ(会話)エージェントのフローをテストして反復処理できます。

User: I'm looking for women's boots for winter. 

Agent: (OpenAPI call to Cloud Function that works with AlloyDB Similarity Search) 

Cloud Function: (Processes query, returns JSON array) 

Agent: Based on your preferences, here are some options: [Product 1, Product 2, Product 3]. Would you like to see more details about any of these?

User: No, That is all. Bye!

Agent: Have a good day!

少数ショット プロンプト

ここで、会話エージェントでの結果を画像やリンクを含む特定のグラフィック形式で表示したいとします。そのためには、少数ショット プロンプトとも呼ばれる会話の例を使用します。

つまり、エージェント ビルダーにいくつかの例を追加して、結果の形式に一貫性を持たせる必要があります。

エージェントをテストする」の前のスクリーンショットの 1 つを使用します。セクションがある場合、エージェントからのレスポンスは「承知しました。青いプリントの白いシャツを探している...」そのレスポンスに移動するか、エージェントの右側のペインから新しいテスト用の会話を作成します。

  1. [Enter User Input] 欄に以下を入力します。セクション:

dc8c010c36400e64.png

次のようなレスポンスが表示されます。

e31d9f53bf5564c8.png

また、API エンドポイントから返された JSON 配列も表示されます。

  1. 次に、プレビュー セクションのマージンからエージェント名(下の画像のように赤い目盛りでハイライト表示されたもの)をクリックすると、チャット プレビュー セクションのすべてのタブがハイライト表示されます。[サンプルを保存] をクリックします。をクリックします。アプリバーは次のようになります。

1e0a9f6815f63bf9.png

  1. 表示名を「Response with images」にして会話を保存します。[作成]をクリックします
  2. 次に、上の画像で黒い目盛りでハイライト表示されている回答タブに移動し、「黄色のサンダルを探しています。間違いございませんか?」次のように置き換えます。
I see you are looking for yellow sandals. Here are a few options for you:
<!DOCTYPE html>
<html>
<body>

<h2>Featured Sandals</h2>

<table style="overflow-x: auto; white-space: nowrap;">
    <tr>
        <td>
            <img src="https://assets.myntassets.com/v1/images/style/properties/d27dbd8e9666b9af2d72fbfde315f76d_images.jpg" alt="Yellow sandals from Estd. 1977" width="300">
        </td>
        <td>
            <img src="https://assets.myntassets.com/v1/images/style/properties/b7a479fe5f56457e930541a789c5df68_images.jpg" alt="Yellow sandals from Gliders" width="300">
        </td>
        <td>
            <img src="https://assets.myntassets.com/v1/images/style/properties/b6c813734b29b89d1055fd000ea50743_images.jpg" alt="Yellow sandals from Rocia" width="300">
        </td>
        <td>
            <img src="https://assets.myntassets.com/v1/images/style/properties/ee0e918c229e76e0e7e61712e9d2ecb3_images.jpg" alt="Yellow flip flops from Numero Uno" width="300">
        </td>
        <td>
            <img src="https://assets.myntassets.com/v1/images/style/properties/5bdd4c9e739205e28ee134ff7849bc60_images.jpg" alt="Yellow flip flops from Numero Uno" width="300">
        </td>
    </tr>
</table>

</body>
</html>
  1. [保存] をクリックします。表示されます。

会話のバリエーションやフローを変えて、必要な数の例についてこのプロセスを繰り返します。

ユーザー入力でテストしてみましょう。

450166a929645353.png

その他の種類のレスポンス:

be8908c99cd33730.png

以上です。小売アプリ用の会話エージェントを作成し、テストすることができました。

7. 導入と統合

エージェントに問題がなければ、Agent Builder の統合を使用して、さまざまなチャネルに簡単にデプロイできます。ウェブサイトに埋め込んだり、一般的なメッセージング プラットフォームと統合したり、専用のモバイルアプリを作成したりすることができます。また、Agent Builder API をウェブ クライアント アプリケーションで直接使用することもできます。これについては、こちらのブログで説明しています。

8. クリーンアップ

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

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

9. 完了

これで、カスタムビルドの分析エンジンの力を Agent Builder の直感的なインターフェースと統合することで、パーソナライズされたエクスペリエンスを提供し、質問に正確に回答し、最終的に顧客満足度と売上を向上させるスマートな小売ショッピング アシスタントを構築しました。AlloyDBVertex AIベクトル検索の機能を組み合わせることで、Google はコンテキスト検索とベクトル検索をアクセス可能で、効率的で、真の意味にドリブンかつエージェント型にするために、大きな飛躍を遂げました。