使用 AlloyDB 和 Vertex AI Agent Builder 构建智能购物助理 - 第 2 部分

1. 概览

在当今快节奏的零售业态中,提供卓越的客户服务和打造个性化购物体验至关重要。我们将引导您打造一个知识驱动型聊天应用,带您体验技术之旅,该应用旨在回答客户问题、引导产品发现以及定制搜索结果。这一创新型解决方案结合了 AlloyDB(用于进行上下文理解的内部分析引擎)、用于验证相关性的 Gemini(大语言模型)和用于快速引导智能对话助理的 Google Agent Builder 的强大功能。

面临的挑战:现代零售客户希望能够根据自己的独特喜好即时提供解答和产品建议。传统的搜索方法通常无法提供这种级别的个性化。

解决方案:我们的知识驱动型聊天应用正着解决这一挑战。它利用从您的零售数据中提取的丰富知识库,了解客户意图、智能地做出响应,并提供高度相关的结果。

构建内容

在本实验(第 2 部分)中,您将:

  1. 构建 Vertex AI Agent Builder 代理
  2. 将 AlloyDB 工具与代理集成

要求

  • 一个浏览器,例如 ChromeFirefox
  • 启用了结算功能的 Google Cloud 项目。

2. 建筑

数据流:让我们来详细了解一下数据是如何在系统中移动的:

提取

零售数据(商品目录、产品说明、客户互动)会持续加载到 AlloyDB 中。

分析引擎

我们将使用 AlloyDB 作为分析引擎来执行以下操作:

  1. 上下文提取:引擎会分析 AlloyDB 中存储的数据,以了解产品、类别、客户行为等之间的关系(如适用)。
  2. 嵌入创建:系统会为用户查询和 AlloyDB 中存储的信息生成嵌入(文本的数学表示)。
  3. 向量搜索:引擎会执行相似度搜索,将查询嵌入与商品说明、评价和其他相关数据的嵌入进行比较。这将确定 25 个最相关的“最近邻”。

Gemini 验证

系统会将这些可能的回答发送给 Gemini 进行评估。Gemini 会确定与用户分享的内容是否确实相关且安全。

响应生成

经过验证的响应会构建为 JSON 数组,并且整个引擎会打包为可从 Agent Builder 调用的无服务器 Cloud Run 函数。

以上步骤已在本实验的第 1 部分 中介绍。

我们讨论了创建知识驱动型分析引擎(为我们的购物助理提供支持)的技术细节。现在,我们来看看我们如何利用 Agent Builder 的强大功能在对话界面中打造这个引擎。在开始第 2 部分之前,请确保您已准备好端点网址。接下来我们将在本实验中介绍下一个步骤:

对话式互动

Agent Builder 以自然语言格式向用户呈现响应,便于来回对话。

3. 准备工作

创建项目

  1. Google Cloud Console 的项目选择器页面上,选择或创建一个 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 命令,您还可以通过控制台搜索每个产品或访问此链接

如果遗漏了任何 API,您可以在实现过程中随时启用该 API。

如需了解 gcloud 命令和用法,请参阅文档

重要提示:此外,要完成此实验,请确保您已完成本实验的第 1 部分

4. 创建代理

隆重推出 Agent Builder

Agent Builder 是一款功能强大的低代码工具,使我们能够快速高效地创建对话式代理。它简化了设计对话流程、集成知识库和连接到外部 API 的流程。在本例中,我们将使用 Agent Builder 无缝连接到我们在第 1 部分中构建的 Cloud Functions 函数端点,使购物助理能够访问我们的零售知识库,并智能地响应客户查询。

构建代理

我们开始创建这个新的代理,用于回答用户针对服饰商品提出的问题。

  1. 首先登录 Agent Builder 平台。如果系统提示您激活 API,请直接点击“继续并激活 API”。
  2. 点击“创建应用”并为代理指定一个描述性名称(例如“Retail Shopping Assistant”)。
  3. 点击应用类型“代理”。

462bb48664e9a14e

  1. ,了解所有最新动态。为代理指定一个描述性名称,例如“Retail Shopping Assistant”并将区域设为 us-central1

10eceef44b1600d1

  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

  1. 在此处保存,暂时将说明留空。
  2. 然后,点击导航菜单中的“工具”,再点击“创建”。

2ffae953bbad38e5

输入工具名称: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 规范,并使用您的 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. 此时请返回到代理,因为我们想要添加“工具”添加到代理的“说明”部分将以下内容添加到说明占位符(请注意,缩进在定义流程时非常重要):
- 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.

确保“Retail Shopping Tool”选择“可用工具”部分,然后重新保存该代理。

5. 测试代理

在右侧窗格中,您应该会看到“预览代理”部分,您可以通过此部分测试代理。

如下面的屏幕截图所示,我作为一名用户向您问好,并开始聊天,请求购买带蓝印花的白色衬衫:

63ac3ef6d1f0f614

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. 在“输入用户输入”框中输入以下内容部分:

dc8c010c36400e64.png

您将看到如下响应:

e31d9f53bf5564c8.png

您还将看到 API 端点返回的 JSON 数组。

  1. 现在,点击预览部分边缘的“Agent Name”(客服人员名称,如下图所示,用红色对勾突出显示),聊天预览部分中的所有标签页都会突出显示。现在点击“保存示例”图标。应用栏如下所示:

1e0a9f6815f63bf9

  1. 使用显示名称“回复(含图片)”保存对话或类似名称,然后点击“创建”。
  2. 现在,前往上图中以黑色对勾突出显示的“Response”标签页,然后替换“我明白了。您正在买黄色凉鞋。对吗?”替换为:
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

下面是一些其他类型的响应:

be8908c99cd33730.png

大功告成。我们已经为零售应用成功创建并测试了对话代理。

7. 部署和集成

对代理感到满意后,您可以使用 Agent Builder 的集成来轻松将其部署到各种渠道。您可以将其嵌入自己的网站、与热门即时通讯平台集成,甚至开发专门的移动应用。我们还可以直接在 Web 客户端应用中使用 Agent Builder API,我们在本博客中对此做了介绍。

8. 清理

为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往管理
  2. 资源页面。
  3. 在项目列表中,选择要删除的项目,然后点击删除
  4. 在对话框中输入项目 ID,然后点击关停以删除项目。

9. 恭喜

恭喜!通过将我们定制的分析引擎的强大功能与 Agent Builder 的直观界面集成在一起,我们打造了一款智能零售购物助理,它可以提供个性化体验、准确回答问题,并最终提高客户满意度和销售额。我们通过结合 AlloyDBVertex AIVector Search 的功能,向前迈进了一大步,使上下文搜索和矢量搜索变得易于访问、高效、真正意义驱动和代理!