在线购买门店自提:Bonjour Meal - 第 1 部分 - 使用入门

1. 简介

637766505206e0a1.png c604dca3ca211399.png

上次更新日期:2022 年 5 月 11 日

欢迎使用 Business Messages!

此 Codelab 介绍了如何与Business Messages集成,以便客户通过 Google 搜索和 Google 地图与您管理的商家建立联系。您可能是一家希望直接与 Business Messages 集成的企业,也可能是一家独立软件供应商,正在为合作企业构建即时通讯解决方案,或者您可能只是偶然发现了 Business Messages,想在这个平台上尝试一下。

无论您为何来到这里,此 Codelab 都是一个绝佳的起点。完成本教程后,您将拥有第一个可供用户互动的数字助理。在进行一些润色后,如果您准备好在 Business Messages 上发布,就有可能吸引数百万客户。

怎样才算是优秀的数字客服?

Business Messages 是一个对话平台,可在移动设备上提供类似应用的体验,让消费者无需安装其他应用即可与商家联系。数字客服是客户与之互动的逻辑部分。该逻辑由部署在云端或您的基础架构中的 Web 应用进行管理。您完全可以自行决定如何回复用户。优秀的代理会提供背景信息来设定预期,让客户保持参与度,并提供功能来支持用户的需求。

构建内容

在此 Codelab 中,您将为一家名为 Bonjour Meal 的虚构公司在 Business Messages 上构建一个数字代理。此数字客服人员会回答一些简单的问题,例如“你们几点关门?”或“我可以在线购买吗?”。

在此 Codelab 中,您的用户将能够通过数字代理购买商品、将用户引导至付款处理方以收取款项,然后安排在实体店内自提虚构商品。

在本 Codelab 中,您的应用将实现下列功能:

  • 通过建议内容信息卡回答问题
  • 引导用户提出您的数字客服可以回答的问题
  • 提供丰富的对话功能,让用户保持对话参与度

883b5a7f9f266276.png

学习内容

  • 如何在 Google Cloud Platform 中的 App Engine 上部署 Web 应用。或者,您也可以使用 ngrok 公开测试本地应用。
  • 如何通过 Web 应用网络钩子配置 Business Messages 账号以接收用户消息
  • 如何使用 Business Messages API 发送卡片、轮播界面和对话建议等丰富功能
  • Business Messages 如何发送您的消息

本 Codelab 主要介绍如何构建您的第一个数字代理。

所需条件

  • 注册免费的 Business Communications 开发者账号
  • 访问我们的开发者网站,获取相关说明
  • 搭载 Android 5 及更高版本的 Android 设备或安装了 Google 地图应用的 iOS 设备
  • 具有 Web 应用编程方面的经验
  • 已连接到互联网!

2. 准备工作

启用 API

在本 Codelab 中,由于我们要使用 Django 应用,因此将依赖 Cloud Build API 将应用部署到 App Engine。或者,如果您使用的是 ngrok,则无需启用 Cloud Build API。

如需启用 Cloud Build API,请执行以下操作:

  1. 在 Google Cloud 控制台中打开 Cloud Build API
  2. 点击启用

创建服务账号

您需要创建服务账号才能访问 Business Communications API 和 Business Messages API。按照文档中的步骤在 Business Communications Developer Console 中创建服务账号

部署 Django Python EchoBot 初始代码

在终端中,使用以下命令将 Django Echo Bot 代码示例克隆到项目的工作目录中:

$ git clone https://github.com/google-business-communications/bm-bonjour-meal-django-starter-code

将为相应服务账号创建的 JSON 凭据文件复制到示例的“resources”文件夹中,并将这些凭据重命名为“bm-agent-service-account-credentials.json”。

bm-bonjour-meal-django-starter-code/bonjourmeal-codelab/step-1/resources/bm-agent-service-account-credentials.json

在终端中,导航到示例的“step-1”目录。

在终端中运行以下命令以部署示例:

$ gcloud config set project PROJECT_ID*
$ gcloud app create
$ gcloud app deploy
  • PROJECT_ID 是您用于向相应 API 注册的项目的 ID。

请记下最后一个命令输出的内容中已部署应用的网址:

Deployed service [default] to [https://PROJECT_ID.appspot.com]

您刚刚部署的起始代码包含一个 Web 应用,该应用具有用于从 Business Messages 接收消息的 webhook。该应用会将消息回显给用户,并可展示对话界面中提供的一些丰富功能。

配置网络钩子

现在,您的服务已部署完毕,接下来您将使用应用的网址在 Business Communications 开发者控制台账号设置页面中设置网络钩子网址。

网络钩子网址将是应用的网址 +“/callback/”。例如,它可能类似于以下网址:https://PROJECT_ID.appspot.com/callback/

前往 Business Communications 控制台的账号设置页面。在右上角导航栏下方,您应该会看到自己的 GCP 项目名称。如果您看到下拉菜单,请务必选择您的 GCP 项目。

填写技术联系人详细信息,然后使用已部署应用的 Webhook 网址更新 Webhook

ceb66c905ded40be.png

点击 GCP 项目参考旁边的保存

3. 创建您的第一个代理

使用 Business Communications 开发者控制台

在 Business Communications 控制台中,点击左上角的徽标返回控制台信息中心,然后点击创建代理。您可以在创建代理的同时创建品牌。为代理类型选择 Business Messages,并确保合作伙伴信息正确无误。

品牌中,输入您要创建的品牌的名称。品牌是您合作的商家,消费者可以通过对话与代理互动。在代理名称中,指定您希望用户在 Business Messages 对话中看到的名称。对于虚构的 Bonjour Meal,Bonjour Rail 是管理 Bonjour Meal 餐厅的铁路公司。因此,我将“Bonjour Rail”指定为品牌,“Bonjour Meal”指定为代理。

代理是代表品牌的对话实体。

88a9798e6546eb4e.png

点击创建代理,然后让控制台发挥一些神奇的功能。此请求需要几秒钟的时间才能向 Business Communications API 发出多个请求,以创建品牌和代理。您可以直接使用 Business Communications API 创建代理和品牌。请参阅文档,了解如何使用 curl 请求执行与控制台相同的操作。

进行首次对话

打开您刚刚创建的代理,系统会显示一个概览页面,您可以在其中开始查看代理的详细信息。查看Agent 的测试网址。这些网址用于在设备上调用对话界面。

f6bd8ded561db36f.png

您可以点击任一功能块来复制测试网址。当然,请复制您手头设备的测试网址以进行测试。以任意方式将复制的消息发送到您的设备。

在移动设备上,点按该链接会调用 Business Messages 代理启动器,并预先填充您的代理测试网址。

点按启动以调用代理的对话界面。

2bf9f282e09062de.png

与代理互动,了解它的功能。在大多数情况下,您会发现对话界面只会回显您的消息。向其发送“Hello, World!”之类的消息,您会看到代理将该消息发回给您。

部署的应用还包含一些逻辑,用于展示 Business Messages 中提供的丰富功能。

  • 如果您发送“卡片”,系统会调用复合信息卡
  • 如果您发送“内容信息卡”,系统会调用建议内容信息卡
  • 如果您发送“轮播”,系统会调用一组轮播复合信息卡

恭喜!这是您的代理与您进行的首次对话!

每项丰富的功能都可用于为与代理对话的人员提供更好的上下文。在富卡片中发送图形素材资源,以便更好地传达想法;或者使用建议芯片来引导对话。

更新欢迎辞并使用对话条状标签

我们来练习一下开发者控制台,看看如何修改代理的欢迎辞,以及如何利用建议内容信息条帮助用户进行沟通。

前往代理的概览页面,然后选择代理信息。向下滚动到欢迎辞和对话开场白部分。

4323f988216fa054.png

将欢迎辞(黄色输入字段)更新为:

欢迎使用 Bonjour Meal starter 代理。我可以回显您的消息,并向您展示该平台支持的一些丰富功能,不妨试试这些建议!

点击+ 添加开场白(如上图紫色框所示),添加开场白以调用建议内容信息条、轮播界面和卡片。您添加的对话启动器需要包含文本组件和 postbackData 组件。该文本会显示给用户,而 postBack 数据会发送到代理的 webhook。Webhook 会解析回传数据,并向用户发送相应的响应。906bc74668a1b215.png

修改后,控制台中的代理信息如下所示:

8e96b0a10edd20af.png

在控制台的右侧,您会看到代理的预览效果。请注意,欢迎消息会反映您刚刚更改的内容,以及下方的建议芯片。

这是一个很好的工具,可帮助您了解用户体验。您可以在构建代理和规划要支持的用户体验时使用它。

很遗憾,由于之前的对话数据缓存在 Business Messages 基础架构中,因此我们无法立即在对话中看到这些更改。缓存大约每 2 小时清除一次,因此您明天应该可以试用此功能。

在此期间,我们先来了解一下所有功能的运作方式。

4. 分析起始代码

源代码的概览

您部署的起始代码会将消息回显给用户,并且可以显示复合信息卡、轮播界面或建议内容信息条。让我们深入了解源代码,以便了解其运作方式。然后,我们会确定需要做出哪些更改。

起始代码是一个 Django 项目。在本 Codelab 系列的后续部分中,我们将使用 Google Datastore 来保留购物车和相关对话等数据。如果您之前没有使用过 Django,也不用担心,它非常简单明了,在此 Codelab 结束时,您将了解它的运作方式。

从宏观层面来看,Django 会将网址路由到视图,而视图逻辑会生成在浏览器中呈现的模板。我们来看看项目的 urls.py。

bm-django-echo-bot/bmcodelab/urls.py [第 31-37 行]

from django.urls import include, path
import bopis.views as bopis_views

urlpatterns = [
    path('', bopis_views.landing_placeholder),
    path('callback/', bopis_views.callback),
]

此处定义了两个路由,因此如果识别出这两个网址,Django 就可以执行相应逻辑。假设项目网址为 https://PROJECT_ID.appspot.com/,则项目知道的路由为:

  • https://PROJECT_ID.appspot.com/
  • https://PROJECT_ID.appspot.com/callback/

这两个网址路由都引用了 bopis/views.py 中的 bopis_views。我们来看看此文件中的内容。首先,我们来了解一下 bopis_views.landing_placeholder

bm-django-echo-bot/bonjourmeal-codelab/step-1/bopis/views.py [第 302-309 行]

... 
def landing_placeholder(request):
    return HttpResponse("<h1>Welcome to the Bonjour Meal Codelab</h1>
    <br/><br/>
    To message your Bonjour Meal agent, go to the Developer Console and retrieve
    the Test URLs for the agent you have created as described in the codelab
    <a href='https://codelabs.developers.google.com/codelabs/'>here</a>.")
...

当您的 Web 服务器收到指向项目根目录的 Web 请求时,会执行此逻辑。这里没有发生什么特别的事情:我们只是将包含一些 HTML 的 HTTPResponse 返回给发出请求的浏览器。因此,您确实可以打开项目的根网址,但由于该网址会将您带回此 Codelab,因此您无法在该网址上执行太多操作。

另一个网址会路由到 bopis/views.py 中名为 callback 的函数。下面我们来看看该函数。

bm-django-echo-bot/bopis/views.py [第 60-101 行]

...
def callback(request):
    """
    Callback URL. Processes messages sent from user.
    """
    if request.method == "POST":
        request_data = request.body.decode('utf8').replace("'", '"')
        request_body = json.loads(request_data)

        print('request_body: %s', request_body)

        # Extract the conversation id and message text
        conversation_id = request_body.get('conversationId')
        print('conversation_id: %s', conversation_id)

        # Check that the message and text body exist

        if 'message' in request_body and 'text' in request_body['message']:
            message = request_body['message']['text']

            print('message: %s', message)
            route_message(message, conversation_id)
        elif 'suggestionResponse' in request_body:
            message = request_body['suggestionResponse']['postbackData']

            print('message: %s', message)
            route_message(message, conversation_id)
        elif 'userStatus' in request_body:
            if 'isTyping' in request_body['userStatus']:
                print('User is typing')
            elif 'requestedLiveAgent' in request_body['userStatus']:
                print('User requested transfer to live agent')

        return HttpResponse("Response.")

    elif request.method == "GET":
        return HttpResponse("This webhook expects a POST request.")
...

此处的逻辑会解析请求正文中的 messagesuggestionResponse,并将该信息传递给名为 route_message 的函数,然后将 HttpResponse 返回给 Business Messages 基础架构,以确认收到消息。

这是一项重要功能。这部分逻辑是 Web 应用的网络钩子,用于接收与代理互动的用户发送的消息。您可以扩展 webhook,以将消息发送到 Dialogflow 等自动化工具,了解用户可能在说什么,并根据推理结果生成回复。您还可以转发消息,以便用户与人工客服联系。请参阅以下图表:

b10113f9d037e6a5.png

Business Messages 会将消息内容作为 JSON 载荷发送到您的网络钩子,然后由网络钩子将消息路由到人工客服或某些逻辑以作为聊天机器人进行响应。在本例中,该路由机制为 route_message。一起来看看吧

bm-django-echo-bot/bopis/views.py [第 105-122 行]

...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    else:
        echo_message(message, conversation_id)
...

此逻辑位开始检查用户收到的消息。首先,通过将所有字符转换为小写来对消息进行归一化处理。标准化后,它会检查消息是否为文件顶部定义的任何常量。

bm-django-echo-bot/bopis/views.py [第 40-42 行]

...
# Set of commands the bot understands
CMD_RICH_CARD = 'card'
CMD_CAROUSEL_CARD = 'carousel'
CMD_SUGGESTIONS = 'chips'
...

也就是说,聊天机器人会解析消息,查找其中是否包含我们在上一步的 Codelab 中放置到对话开场白 postback_data 中的任何字符串。如果上述字符串均未显示,则只需将消息传递给名为 echo_message 的函数,您可以想象该函数会回显消息。

发送消息

到目前为止,您应该已经了解 Web 应用如何接收消息。所有操作均通过 Webhook 完成。

但应用如何使用 Business Messages 向用户发送出站消息?

a9475b1da93a83e8.png

当您的基础架构回复用户时,您需要将回复发送到 Business Messages API,然后由该 API 将消息传递给用户。

Business Messages API 提供 Python、Node.js 和 Java 库。我们还提供了一个 REST API,如果您的基础架构所用的语言没有对应的库,您可以直接向该 API 发出请求。请参阅发送消息,了解如何使用 c网址 向特定对话 ID 发送消息。

在此 Codelab 中,我们将重点介绍如何使用已集成到 Bonjour Meal 起始代码中的 Python 客户端库,该起始代码已部署到您的 GCP 项目中的 App Engine,或通过 ngrok 在本地运行。

我们来看看 echo_message 函数,了解如何与 API 互动,以便将消息发送到 Business Messages。

bm-django-echo-bot/bopis/views.py [第 199-212 行]

...
def echo_message(message, conversation_id):
    '''
    Sends the message received from the user back to the user.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text=message)

    send_message(message_obj, conversation_id)
...

在此函数中,系统会使用传递到 echo_message 函数中的 message 变量实例化 BusinessMessagesMessage。实例化后,该对象会与对话 ID 一起传递给 send_message

bm-django-echo-bot/bopis/views.py [第 214-236 行]

...
def send_message(message, conversation_id):
    '''
    Posts a message to the Business Messages API, first sending
    a typing indicator event and sending a stop typing event after
    the message has been sent.

    Args:
        message (obj): The message object payload to send to the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        SERVICE_ACCOUNT_LOCATION,
        scopes=['https://www.googleapis.com/auth/businessmessages'])

    client = bm_client.BusinessmessagesV1(credentials=credentials)

    # Create the message request
    create_request = BusinessmessagesConversationsMessagesCreateRequest(
        businessMessagesMessage=message,
        parent='conversations/' + conversation_id)

    bm_client.BusinessmessagesV1.ConversationsMessagesService(
        client=client).Create(request=create_request)
...

send_message 函数所做的全部工作是使用您的服务账号凭据来验证您是否可以向相应对话发送消息、实例化 Business Messages 客户端,以及创建向指定 conversation ID 发送消息的请求。

复合功能也使用此 send_message 函数,但它们创建的消息专门用于复合信息卡、轮播界面和建议芯片。富卡片和轮播界面可能包含图形素材资源,而建议芯片具有 postback_data,以便回调逻辑能够正确解析它。

现在,我们已经了解了如何发送消息,接下来我们来研究一下示例如何发送复合信息卡、轮播界面和建议芯片。在下一部分中,我们将修改源代码以发送包含其中一些丰富功能的消息。

准备就绪后,我们来定制 Bonjour Meal 智能体。

5. 自定义代理

如果您一直按照此 Codelab 的说明操作,现在应该能看到我们漂亮的代理。

906bc74668a1b215.png

好吧,这并不太好看,实际上看起来有点空,而且不太能代表我们的业务。幸运的是,我们对支持智能体的代码有基础知识,并且拥有以任何方式自定义智能体所需的工具。

在本 Codelab 的其余部分,我们将通过以下方式扩展代理:

  • 包含实际徽标
  • 改进了欢迎辞
  • 提供营业时间信息
  • 告知用户即将推出在线购买商品功能
  • 使用对话建议芯片来促进对话

我们将利用 Business Communications 控制台来帮助我们更新徽标和欢迎辞,但您始终可以选择直接使用 Business Communications API 来完成相同的操作。然后,我们必须更新源代码,以发送适当的消息来提供有关营业时间的信息,并告知 Bonjour Meal 即将推出在线购物功能。完成后,我们将返回到 Business Communications 控制台,并创建对话建议芯片,以帮助引导对话走向数字助理支持的理想体验。

Business Communications 控制台中,选择您的代理,然后前往代理信息。我们需要更新商家徽标(如下方以黄色突出显示的部分所示)。

eb6b8ac6b62387ee.png

点击上传,然后选择要上传的图片或从网址导入图片。

请参阅文档中的徽标设计指南,了解我们建议的有关使用自有徽标的最佳实践。

我们来上传位于您在此 Codelab 开头克隆的源代码中的徽标。您可以在代码库的 ./assets/ 目录中找到它,该文件名为“bonjour_meal-logo.png”。您可以将文件拖动到网络浏览器中的模态框中,系统会显示一个轻量级编辑工具,用于调整图片质量和剪裁。调整图片分辨率和剪裁,使图片大小不超过 50KB 的限制。对图片满意后,点击蓝色圆圈中的对勾标记进行确认,然后点击模态框底部的选择

1856081f59623ae2.png

最后,点击代理机构信息页面右上角的保存。此项更改需要一段时间才能反映在您的设备上,因为代理信息缓存在我们的服务器中,并且应该在更改后两小时内可见。

更新欢迎辞

更新欢迎消息是我们在本 Codelab 中之前已经完成的操作。我们再来一次,但这次要配置更适合 Bonjour Meal 用户体验历程的欢迎辞。

在 Business Communications 控制台中,选择您的代理,然后进入代理信息。向下滚动,直至看到欢迎辞输入字段,您可以在其中更新消息。

6598fec47021136e.png

既然我们知道自己会添加对话开场白,就可以在欢迎辞中引用它们。在输入字段中,将其替换为以下文本:

“欢迎使用 Bonjour Meal。我是助理,可以帮助您解答可能遇到的有关 Bonjour Meal 的问题。请尝试以下部分选项。”

最后,点击代理机构信息页面右上角的保存。同样,由于我们的缓存机制,此更改需要一段时间才能反映出来,以确保一切顺利!

提供营业时间信息

为了向用户提供此信息,我们将使用 Business Messages API 向用户发送自定义消息。

您可能还记得,消息是在 views.pyroute_message 函数中解析的。该函数首先对字符串进行归一化处理,然后开始检查归一化后的消息是否与任何硬编码的参数匹配。为简单起见,我们添加一个额外的条件,用于检查归一化消息是否等于一个新常量(我们将其称为 CMD_BUSINESS_HOURS_INQUIRY,其中将包含值“business-hours-inquiry”)。如果条件的计算结果为 true,我们将调用名为 send_message_with_business_hours 的函数。

route_message 函数现在将如下所示:

bm-django-echo-bot/bopis/views.py

...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    else:
        echo_message(message, conversation_id)
...

为了让代码正常运行,我们还需要进行两项更改;第一项是定义 CMD_BUSINESS_HOURS_INQUIRY 以及其他常量,第二项是实际定义函数 send_message_with_business_hours 并使用 Business Messages API 发送消息。

我们先在文件顶部与其他常量声明一起定义该常量:

bm-django-echo-bot/bopis/views.py

...
# Set of commands the bot understands
CMD_RICH_CARD = 'card'
CMD_CAROUSEL_CARD = 'carousel'
CMD_SUGGESTIONS = 'chips'
CMD_BUSINESS_HOURS_INQUIRY = 'business-hours-inquiry'
...

现在,定义 send_message_with_business_hours。您可以按照适当的 Python 语法在文件中的任意位置定义此函数。由于此函数只是发送消息,与 echo_message 非常相似,因此您可以将其用作定义此函数的模板。

bm-django-echo-bot/bopis/views.py

...
def send_message_with_business_hours(conversation_id):

    message = '''Thanks for contacting us! The hours for the store are:\n
    MON 8am - 8pm\n
    TUE 8am - 8pm\n
    WED 8am - 8pm\n
    THU 8am - 8pm\n
    FRI 8am - 8pm\n
    SAT 8am - 8pm\n
    SUN 8am - 8pm
    '''

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text=message)

    send_message(message_obj, conversation_id)
...

这样一来,当用户发送“business-hours-inquiry”消息时,我们的机器人就应该能够回复这些营业时间。您可能会看到如下内容:

125802166995afd5.png

将源代码部署到 GCP 后,更改会立即生效。我们不会像缓存代理信息那样在 Google Cloud Platform 中缓存 Web 应用,因此您可以立即测试此体验。

虽然我们已经通过更改源代码取得了一些进展,但我们再进行一项修改,让用户可以询问有关在线购物的问题。数字助理会回复说,此功能尚未推出,但请稍后回来查看。

告知用户在线购物功能即将推出

我们将进行类似的修改,以便告知用户营业时间。这次,我们来将信息放置在富卡片中,并附上一张引人入胜的图片。

解析归一化消息,并检查一个名为 CMD_ONLINE_SHOPPING_INQUIRY 的常量的条件,该常量的值设置为“online-shopping-inquiry”,如果条件为 true,则调用 send_online_shopping_info_message

bm-django-echo-bot/bopis/views.py

...
# Set of commands the bot understands
CMD_RICH_CARD = 'card'
CMD_CAROUSEL_CARD = 'carousel'
CMD_SUGGESTIONS = 'chips'
CMD_BUSINESS_HOURS_INQUIRY = 'business-hours-inquiry'
CMD_ONLINE_SHOPPING_INQUIRY = 'online-shopping-inquiry'
...
...
...
def route_message(message, conversation_id):
    '''
    Routes the message received from the user to create a response.

    Args:
        message (str): The message text received from the user.
        conversation_id (str): The unique id for this user and agent.
    '''
    normalized_message = message.lower()

    if normalized_message == CMD_RICH_CARD:
        send_rich_card(conversation_id)
    elif normalized_message == CMD_CAROUSEL_CARD:
        send_carousel(conversation_id)
    elif normalized_message == CMD_SUGGESTIONS:
        send_message_with_suggestions(conversation_id)
    elif normalized_message == CMD_BUSINESS_HOURS_INQUIRY:
        send_message_with_business_hours(conversation_id)
    elif normalized_message == CMD_ONLINE_SHOPPING_INQUIRY:
        send_online_shopping_info_message(conversation_id)
    else:
        echo_message(message, conversation_id)
...

现在来定义 send_online_shopping_info_message。我们希望以包含图片的富卡片形式发送此消息,因此我们复制 send_rich_card 函数,将其用作定义 send_online_shopping_info_message 的模板。

首先,我们应更新后备文本,使其包含适当的消息。如果设备因某种原因无法接收富卡片,系统会使用回退文本。接下来,我们应更新 BusinessMessagesRichCard 以包含相关标题、说明、建议和媒体字段。我们的函数应如下所示:

bm-django-echo-bot/bopis/views.py

...
def send_online_shopping_info_message(conversation_id):
    fallback_text = ('Online shopping will be available soon!')

    rich_card = BusinessMessagesRichCard(
        standaloneCard=BusinessMessagesStandaloneCard(
            cardContent=BusinessMessagesCardContent(
                title='Online shopping info!',
                description='Thanks for your business, we are located in SF near the Golden Gate Bridge. Online shopping is not yet available, please check back with us in a few days.',
                suggestions=[],
                media=BusinessMessagesMedia(
                    height=BusinessMessagesMedia.HeightValueValuesEnum.MEDIUM,
                    contentInfo=BusinessMessagesContentInfo(
                        fileUrl=SAMPLE_IMAGES[4],
                        forceRefresh=False
                    ))
                )))

    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        richCard=rich_card,
        fallback=fallback_text)

    send_message(message_obj, conversation_id)
...

棒极了!我们的数字代理现在可以回答用户有关网购的咨询。目前,我们的数字客服还不支持在线购物,因此我们会向用户显示一条消息,告知他们该功能即将推出。以下是用户咨询在线购物时,我们的数字客服人员的显示效果。

5cd63c57c1b84f9a.png

与我们之前所做的允许用户查询营业时间的更改一样,如果您使用的是 ngrok,则可以立即看到此更改;如果您将代码部署到 GCP App Engine,则可以尽快看到此更改。

在下一部分中,我们将使用对话开场白和建议芯片来引导对话走向理想的路径。

使用功能块引导对话

我们已对源代码进行了一些更改,并部署了更新后的数字助理,但我们绝不会要求用户输入“营业时间查询”或“网购信息”来查询商家信息。让我们更新对话开场白,以便在对话打开时,用户不仅会收到友好的欢迎辞,还会看到对话开场白。

前往 Business Communications 控制台,然后访问代理的代理信息页面。我们之前为“功能块”“卡片”和“轮播界面”定义了对话启动器。虽然这些功能仍然有效,但已不再与我们的业务功能相关。您可以保留这些内容,以便继续展示这些丰富的功能;也可以移除这些内容,以便您的数字代理专门显示 Bonjour Meal 业务的对话开场白。

我们将创建两个新的对话开场白。对于第一个,请将文本设置为“What are your business hours?”,并将回传数据设置为“business-hours-inquiry”。对于第二个对话发起器,请将 text 设置为“Can I make purchases here?”,并将 回传数据 设置为“online-shopping-info”。

结果应为以下屏幕截图所示的配置:

ef6e6888acea93e3.png

与在商务通信管理中心内进行的其他更改一样,此更改需要一段时间才能传播,之后您才能在移动设备上看到所产生的更改。

现在我们已经完成了对话开场白,接下来还需要一种方法来引导用户在对话开始后进入理想路径。在发送消息后,您可以使用情境化功能块引导用户使用数字助理的其他功能。因此,每当用户询问营业时间或在线购物时,我们都会发送一条消息,建议用户让代理执行其他操作。

在该函数的末尾,添加以下内容:

bm-django-echo-bot/bopis/views.py

...
def send_online_shopping_info_message(conversation_id):
...
    # at the end of the function, send a message with suggestions
    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text='Let us know how else we can help you:',
        fallback='Please let us know how else we can help you.',
        suggestions=[
            BusinessMessagesSuggestion(
                reply=BusinessMessagesSuggestedReply(
                text='Business hours',
                postbackData='business-hours-inquiry')
            ),
        ])

    send_message(message_obj, conversation_id)
...

# Let's do the same with the business hours
def send_message_with_business_hours(conversation_id):
...
    # at the end of the function, send a message with suggestions
    message_obj = BusinessMessagesMessage(
        messageId=str(uuid.uuid4().int),
        representative=BOT_REPRESENTATIVE,
        text='Let us know how else we can help you:',
        fallback='Please let us know how else we can help you.',
        suggestions=[
            BusinessMessagesSuggestion(
                reply=BusinessMessagesSuggestedReply(
                text='Can I purchase online?',
                postbackData='online-shopping-inquiry')
            ),
        ])

    send_message(message_obj, conversation_id)
...

请注意,BusinessMessagesSuggestion 中的文本字段限制为 25 个字符,如文档中所述。

通过更新对话发起方式并战略性地使用建议芯片,以下是一些预期用户体验的屏幕截图。

ef57695e2bacdd20.png

6. 恭喜

恭喜,您已成功构建您的第一个 Business Messages 数字代理!

您部署了一个 Web 应用来支持 Business Messages 上的数字助理,使用 Business Communications 控制台修改了该助理,并通过更改源代码来塑造数字助理的用户体验。

现在,您已了解构建互动式 Business Messages 体验所需的关键步骤,接下来可以探索更多令人兴奋的可能性。您可以扩展代理,使其支持目录查找或引入购物车来跟踪用户可能感兴趣的内容。您可以使用轮播界面展示菜单上的项目,并使用建议功能让用户选择感兴趣的项目。

以下是可能的效果预览。

57d2bb7b0ec38c81.png

如何打造出色的对话式体验?

优秀的智能客服会向用户提供情境信息,同时通过对话为用户提供功能,以便用户像平时通过电话甚至亲自与商家互动一样,积极参与并与商家互动。想想以下主题可能如何应用于您想与合作企业进行的对话。

提供背景信息并设定预期

提供情境信息的方式有很多种,例如明确说明您可以为用户提供哪些帮助,或者以用户可以产生共鸣的角色来介绍数字助理。在 Business Messages 中,成功的 Agent 会使用代表性头像来向用户展示对方正在与谁对话。

设定预期取决于您要打造的用户体验。例如,如果您的代理支持查找库存,请先告知用户库存可能不足,然后再提供答案。

向用户提供功能

消费者随时随地都在与商家互动。从查询订单状态到查询商品是否有货,Business Messages 都能支持复杂的用户互动。即使商家网站上提供了答案,许多用户仍会继续通过电话联系商家来获得解答。这样一来,商家就必须投入更多资源来处理来电量,尤其是在节假日期间。

保持用户互动度

提供对话接触点,让用户持续参与对话。在消息之间,您可以调用输入指示器,让用户知道您正在处理用户的答案。

借助输入指示器、建议内容信息条、富卡片和轮播界面等丰富的功能,您可以引导用户完成理想的用户体验,帮助他们完成特定任务,例如从商品菜单中订购商品。目的是减少商家电话线路的来电流量。

对话必须为用户提供功能。通过消息与商家联系的用户希望自己的问题能得到快速解答。在不理想的情况下,数字助理无法促成对话,这可能会导致用户体验不佳。幸运的是,我们可以采取一些方法来解决此问题,例如将对话转交给人工客服,我们将在未来的 Codelab 中介绍此方法。

后续操作

准备就绪后,请查看以下一些主题,了解您可以在 Business Messages 中实现哪些更复杂的互动

参考文档