如果您使用的是 Amazon Lex V2,请改为参阅 Amazon Lex V2 指南。
如果您使用的是 Amazon Lex V1,我们建议您将机器人升级到 Amazon Lex V2。我们不再向 V1 添加新功能,强烈建议使用 V2 以获得全新的机器人。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
管理消息
当您创建自动程序时,您可以配置您希望自动程序发送给客户端的说明性或信息性消息。考虑以下示例:
-
您可以为自动程序配置以下说明提示:
I don't understand. What would you like to do?
Amazon Lex 在不理解用户意图时会将此消息发送到客户端。
-
假设您要创建自动程序来支持名为
OrderPizza
的目的。对于披萨订单,您希望用户提供信息,如披萨尺寸、配料和馅饼皮类型。您可以配置以下提示:What size pizza do you want? What toppings do you want? Do you want thick or thin crust?
在 Amazon Lex 确定用户订购披萨的意图后,它会向客户端发送这些消息,从而从用户那里获取信息。
本节介绍如何在自动程序配置中设计用户交互。
消息类型
消息可以是提示或声明。
-
提示通常是一个问题,并且需要用户响应。
-
声明是信息性的。它不需要响应。
消息可以包括对槽、会话属性和请求属性的引用。在运行时,Amazon Lex 将这些引用替换为实际值。
要引用已设置的槽值,请使用以下语法:
{SlotName
}
要引用会话属性,请使用以下语法:
[SessionAttributeName
]
要引用请求属性,请使用以下语法:
((RequestAttributeName
))
消息可以同时包括槽值、会话属性和请求属性。
例如,假设您在自动程序的 OrderPizza 目的中配置了以下消息:
"Hey [FirstName], your {PizzaTopping} pizza will arrive in [DeliveryTime] minutes."
此消息同时引用槽 (PizzaTopping
) 和会话属性 (FirstName
和 DeliveryTime
)。在运行时,Amazon Lex 将这些占位符替换为值,并且向客户端返回以下消息:
"Hey John, your cheese pizza will arrive in 30 minutes."
要在消息中包括方括号 ([]) 或大括号 ({}),请使用反斜杠 (\) 转义字符。例如,以下消息包括大括号和方括号:
\{Text
\} \[Text
\]
返回到客户端应用程序的文本如下所示:
{Text
} [Text
]
有关会话属性的信息,请参阅运行时 API 操作 PostText 和 PostContent。有关示例,请参阅 预订旅程。
Lambda 函数还可以生成消息并将它们返回到 Amazon Lex 以发送给用户。如果您在配置意图时添加 Lambda 函数,则可以动态创建消息。通过在配置机器人时提供消息,您无需在 Lambda 函数中构造提示。
配置消息的上下文
在创建机器人时,您可以在不同的上下文中创建消息,如机器人中的说明提示、有关插槽值的提示以及来自意图的消息。Amazon Lex 在每个上下文中选择适当的消息来返回给您的用户。您可以为每个上下文提供一组消息。如果您这样做,Amazon Lex 会从组中随机选择一条消息。您也可以指定消息的格式或将消息组合在一起。有关更多信息,请参阅受支持的消息格式。
如果您具有与意图关联的 Lambda 函数,则可以覆盖您在构建时配置的任何消息。但使用其中任何消息无需 Lambda 函数。
自动程序消息
您可以使用说明提示和会话结束消息配置您的机器人。在运行时,如果 Amazon Lex 不了解用户的意图,则会使用说明提示 。您可以配置 Amazon Lex 在发送会话结束消息之前请求澄清的次数。您可以在 Amazon Lex 控制台的错误处理部分配置机器人级别消息,如下图所示:
借助 API,您可以通过设置 PutBot 操作中的 clarificationPrompt
和 abortStatement
字段来配置消息。
如果您将 Lambda 函数与意图结合使用,则 Lambda 函数可能会返回指示 Amazon Lex 询问用户意图的响应。如果 Lambda 函数没有提供此类消息,则 Amazon Lex 会使用说明提示。
槽提示
您必须为目的中所需的每个槽指定至少一条提示消息。在运行时,Amazon Lex 将使用其中一条消息来提示用户为此插槽提供值。例如,对于 cityName
槽,下面是有效的提示:
Which city would you like to fly to?
您可以使用控制台为每个槽设置一个或多个提示。您还可以使用 PutIntent 操作创建多组提示。有关更多信息,请参阅消息组。
响应
在控制台中,使用 Responses (响应) 部分为您的自动程序构建令人愉快的动态对话。您可以为响应创建一个或多个消息组。在运行时,Amazon Lex 通过从每个消息组选择一条消息来构建响应。有关消息组的更多信息,请参阅消息组。
例如,您的第一个消息组可能包含不同的问候语:“Hello”(您好)、“Hi”(嗨) 和“Greetings”(问候)。第二个消息组可能包含不同形式的介绍:“I am the reservation bot”(我是预订自动程序) 和“This is the reservation bot”(这是预订自动程序)。第三个消息组可能传达自动程序的功能:“I can help with car rentals and hotel reservations”(我可以帮忙租车和预订宾馆)、“You can make car rentals and hotel reservations”(您可以租车和预订宾馆) 和“I can help you rent a car and book a hotel”(我可以帮您租车和预订宾馆)。
Lex 使用每个消息组中的消息在对话中动态构建响应。例如,一种交互可能如下所示:
另一种交互可能如下所示:
在任一情况下,用户都可以使用新目的进行响应,如 BookCar
或 BookHotel
目的。
您可以将自动程序设置为在响应中询问后续问题。例如,对于前面的交互,您可以使用以下问题创建第四个消息组:“Can I help with a car or a hotel?”(我可以帮忙租车或预订宾馆吗?)、“Would you like to make a reservation now?”(您是否要立即预订?) 和“Is there anything that I can do for you?”(我能为您做些什么吗?)。对于包括“No”(不) 作为响应的消息,您可以创建跟进提示。下图提供了一个示例。
要创建跟进提示,请选择 Wait for user reply (等待用户回复)。然后键入在用户说“No”(不) 时要发送的一条或多条消息。当您创建响应以用作跟进提示时,还必须指定对语句的回答是“No”(不) 时的适当语句。有关示例,请参阅下图:
要使用 API 将响应添加到目的,请使用 PutIntent
操作。要指定响应,请设置 PutIntent
请求中的 conclusionStatement
字段。要设置跟进提示,请设置 followUpPrompt
字段并包括要在用户说“No”(不) 时发送的语句。您不能对同一目的同时设置 conclusionStatement
字段和 followUpPrompt
字段。
受支持的消息格式
当您使用 PostText 操作时,或当您将 PostContent 操作与设置为 text/plain;charset=utf8
的 Accept
标头结合使用时,Amazon Lex 支持以下格式的消息:
-
PlainText
— 消息包含 UTF-8 纯文本。 -
SSML
— 消息包含为语音输出设置格式的文本。 -
CustomPayload
— 消息包含为您的客户端创建的自定义格式。您可以定义负载以满足应用程序的需要。 -
Composite
— 消息是来自每个消息组的消息的集合。有关消息组的更多信息,请参阅消息组。
默认情况下,Amazon Lex 返回为特定提示定义的任一个消息。例如,如果您定义五个消息来引发插槽值,则 Amazon Lex 会随机选择其中一个消息并将其返回给客户端。
如果您希望 Amazon Lex 在运行时请求中向客户端返回特定类型的消息,请设置 x-amzn-lex:accept-content-types
请求参数。响应局限于所请求的一种或多种类型。如果有多个指定类型的消息,则 Amazon Lex 会随机返回一个消息。有关 x-amz-lex:accept-content-types
标头的更多信息,请参阅设置响应类型。
消息组
消息组 是一组对特定提示的合适响应。当您希望自动程序在对话中动态构建响应时,请使用消息组。当 Amazon Lex 向客户端应用程序返回响应时,它会从每个组中随机选择一个消息。您最多可以为每个响应创建五个消息组。每个组最多可以包含五个消息。有关在控制台中创建消息组的示例,请参阅响应。
要创建消息组,您可以使用控制台,也可以使用 PutBot、PutIntent 或 PutSlotType 操作来将组号分配给消息。如果您未创建消息组,或者仅创建了一个消息组,则 Amazon Lex 在 Message
字段中发送单个消息。仅当您在控制台中创建了多个消息组时,或当您使用 PutIntent 操作创建或更新目的时创建了多个消息组时,客户端应用程序才会在响应中获取多个消息。
在 Amazon Lex 发送组中的消息时,响应的 Message
字段包含一个包含消息的转义的 JSON 对象。以下示例显示包含多个消息的 Message
字段的内容。
注意
为方便阅读,为此示例设置了格式。响应不包含回车符 (CR)。
{\"messages\":[
{\"type\":\"PlainText\",\"group\":0,\"value\":\"Plain text
\"},
{\"type\":\"SSML\",\"group\":1,\"value\":\"SSML text
\"},
{\"type\":\"CustomPayload\",\"group\":2,\"value\":\"Custom payload
\"}
]}
您可以设置消息的格式。格式可以是以下格式之一:
-
PlainText – 消息是纯 UTF-8 文本。
-
SSML – 消息是语音合成标记语言 (SSML)。
-
CustomPayload – 消息采用您指定的自定义格式。
要控制 PostContent
和 PostText
操作在 Message
字段中返回的消息的格式,请设置 x-amz-lex:accept-content-types
请求属性。例如,如果您将标头设置为以下内容,您将在响应中仅收到纯文本和 SSML 消息:
x-amz-lex:accept-content-types: PlainText,SSML
如果您请求特定消息格式,但消息组没有包含该格式的消息,则会出现 NoUsableMessageException
异常。当您使用消息组按类型对消息进行分组时,请勿使用 x-amz-lex:accept-content-types
标头。
有关 x-amz-lex:accept-content-types
标头的更多信息,请参阅设置响应类型。
响应卡
注意
响应卡不适用于 Amazon Connect 聊天。但是,有关类似功能,请参阅在聊天中添加交互式消息。
响应卡 包含一组对提示的适当响应。使用响应卡可为您的用户简化交互,并通过减少文本交互中的拼写错误来提高自动程序的准确度。您可以为 Amazon Lex 向客户端应用程序发送的每个提示发送一张响应卡。响应卡可以与 Facebook Messenger、Slack、Twilio 以及您自己的客户端应用程序结合使用。
例如,在出租车应用程序中,您可以在响应卡中配置一个“家”选项,并将值设置为用户的家庭地址。当用户选择此选项时,Amazon Lex 会收到输入文本形式的完整地址。参见下图:
您可以为以下提示定义响应卡:
-
结论语句
-
确认提示
-
跟进提示
-
拒绝语句
-
槽类型表达
您只能为每个提示定义一张响应卡。
可以在创建目的时配置响应卡,可以在构建时使用控制台或 PutIntent 操作定义静态响应卡。或者,也可以在运行时在 Lambda 函数中定义动态响应卡。如果同时定义了静态和动态响应卡,动态响应卡优先。
Amazon Lex 以客户端可以理解的格式发送响应卡。它可以针对 Facebook Messenger、Slack 和 Twilio 转换响应卡。对于其他客户端,Amazon Lex 会在 PostText 响应中发送一个 JSON 结构。例如,如果客户端是 Facebook Messenger,Amazon Lex 会将响应卡转换为通用模板。有关 Facebook Messenger 通用模板的更多信息,请参阅 Facebook 网站上的 Generic Template
响应卡只能配合 PostText 操作使用,不适用于 PostContent 操作。
定义静态响应卡
您可以在创建意图时使用 PutBot 操作或 Amazon Lex 控制台定义静态响应卡。静态响应卡与目的同时定义。当响应固定不变时,可以使用静态响应卡。假设您正在创建一个自动程序,它的一个目的包含与口味对应的槽。在定义这个口味槽时,您指定了提示,如下面的控制台屏幕截图所示:
在定义提示时,您可以选择关联一张响应卡并用 PutBot 操作或在 Amazon Lex 控制台中定义详细信息,如下例所示:
现在假设您已将自动程序与 Facebook Messenger 集成。用户可以单击按钮来选择口味,如下图所示:
要自定义响应卡的内容,您可以引用会话属性。在运行时,Amazon Lex 将这些引用替换为会话属性中合适的值。有关更多信息,请参阅设置会话属性。有关示例,请参阅 使用响应卡。
动态生成响应卡
要在运行时动态生成响应卡,请使用针对意图的初始化和验证 Lambda 函数。当响应是在运行时在 Lambda 函数中确定时,可以使用动态响应卡。响应用户输入时,Lambda 函数会生成一张响应卡并在响应的 dialogAction
部分返回它。有关更多信息,请参阅响应格式。
下面是 Lambda 函数中显示 responseCard
元素的部分响应。它会生成类似上一部分示例所示的用户体验。
responseCard: {
"version": 1,
"contentType": "application/vnd.amazonaws.card.generic",
"genericAttachments": [
{
"title": "What Flavor?",
"subtitle": "What flavor do you want?",
"imageUrl": "Link to image
",
"attachmentLinkUrl": "Link to attachment
",
"buttons": [
{
"text": "Lemon",
"value": "lemon"
},
{
"text": "Raspberry",
"value": "raspberry"
},
{
"text": "Plain",
"value": "plain"
}
]
}
]
}
有关示例,请参阅 安排预约。