如果您使用的是 Amazon Lex V2,请改为参阅 Amazon Lex V2 指南。
如果您使用的是 Amazon Lex V1,我们建议您将机器人升级到 Amazon Lex V2。我们不再向 V1 添加新功能,强烈建议使用 V2 以获得全新的机器人。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
步骤 5 (可选):查看信息流的详细信息 (控制台)
本节介绍每个用户输入的客户端与 Amazon Lex 之间的信息流,包括 Lambda 函数的集成。
注意
本节假定客户端使用 PostText
运行时 API 向 Amazon Lex 发送请求,并显示相应的请求和响应详细信息。有关客户端和 Amazon Lex(客户端在其中使用 PostContent
API)之间的信息流示例,请参阅步骤 2a (可选):查看语音信息流的详细信息 (控制台) 。
如需关于 PostText
运行时 API 的更多信息以及关于以下步骤中所示的请求和响应的更多详情,请参阅 PostText。
-
用户:我想要订些花。
-
客户端 (控制台) 将向 Amazon Lex 发送以下 PostText 请求:
POST /bot/
OrderFlowers
/alias/$LATEST
/user/ignw84y6seypre4xly5rimopuri2xwnd
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "I would like to order some flowers", "sessionAttributes": {} }请求 URI 和正文都将向 Amazon Lex 提供信息:
-
请求 URI — 提供机器人名称 (
OrderFlowers
)、机器人别名 ($LATEST
) 和用户名称(用于标识用户的随机字符串)。后面的text
表示它是一个PostText
API 请求 (而不是PostContent
)。 -
请求正文 – 包括用户输入 (
inputText
) 和空sessionAttributes
。在客户端发出第一个请求时,没有会话属性。稍后,Lambda 函数会启动这些属性。
-
-
在
inputText
中,Amazon Lex 可检测意图 (OrderFlowers
)。此意图配置有 Lambda 函数作为代码挂钩,以用于用户数据初始化和验证。因此,Amazon Lex 将通过传递以下信息作为事件数据来调用该 Lambda 函数:{ "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "ignw84y6seypre4xly5rimopuri2xwnd", "sessionAttributes": {}, "bot": { "name": "OrderFlowers", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "OrderFlowers", "slots": { "PickupTime": null, "FlowerType": null, "PickupDate": null }, "confirmationStatus": "None" } }
有关更多信息,请参阅输入事件格式。
除了客户端发送的信息以外,Amazon Lex 还包含以下额外数据:
-
messageVersion
— Amazon Lex 当前只支持 1.0 版。 -
invocationSource
— 表明 Lambda 函数调用的目的。在本例中,它将执行用户数据初始化和验证。此时,Amazon Lex 知道用户没有提供所有插槽数据以履行意图。 -
将所有槽值设置为空值的
currentIntent
信息。
-
-
此时,所有槽值均为空值。Lambda 函数没有任何内容需要验证。Lambda 函数会向 Amazon Lex 返回以下响应:
{ "sessionAttributes": {}, "dialogAction": { "type": "Delegate", "slots": { "PickupTime": null, "FlowerType": null, "PickupDate": null } } }
有关响应格式的信息,请参阅 响应格式。
请注意以下几点:
-
dialogAction.type
— 通过将此值设置为Delegate
,Lambda 函数会将决定下一个操作的责任委派给 Amazon Lex。注意
如果 Lambda 函数在用户数据验证中检测到任何内容,它会指示 Amazon Lex 下一步操作,如接下来的几个步骤所示。
-
-
根据
dialogAction.type
,Amazon Lex 将决定下一步操作。由于没有一个槽得到填充,它将决定引出FlowerType
槽的值。它将选择此槽的其中一个值引出提示(“您想要订哪种类型的花?”),并将以下响应发送回客户端:客户端将显示响应中的消息。
-
-
用户:玫瑰
-
客户端将向 Amazon Lex 发送以下 PostText 请求:
POST /bot/
OrderFlowers
/alias/$LATEST
/user/ignw84y6seypre4xly5rimopuri2xwnd
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "roses", "sessionAttributes": {} }在请求正文中,
inputText
将提供用户输入。sessionAttributes
将保留为空。 -
Amazon Lex 解读当前意图的上下文中的
inputText
。服务会记住它已经向特定用户询问了关于FlowerType
槽的信息。它将更新当前意图中的插槽值,并调用具有以下事件数据的 Lambda 函数:{ "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "ignw84y6seypre4xly5rimopuri2xwnd", "sessionAttributes": {}, "bot": { "name": "OrderFlowers", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "OrderFlowers", "slots": { "PickupTime": null, "FlowerType": "roses", "PickupDate": null }, "confirmationStatus": "None" } }
请注意以下几点:
-
invocationSource
– 继续为DialogCodeHook
(我们只验证用户数据)。 -
currentIntent.slots
— Amazon Lex 已将FlowerType
插槽更新为“玫瑰”。
-
-
根据
DialogCodeHook
的invocationSource
值,Lambda 函数会执行用户数据验证。它会将roses
识别为有效的插槽值(并将Price
设置为会话属性),然后向 Amazon Lex 返回以下响应。{ "sessionAttributes": { "Price": 25 }, "dialogAction": { "type": "Delegate", "slots": { "PickupTime": null, "FlowerType": "roses", "PickupDate": null } } }
请注意以下几点:
-
sessionAttributes
— Lambda 函数已经将(玫瑰的)Price
添加为会话属性。 -
dialogAction.type
– 设置为Delegate
。用户数据是有效的,因此 Lambda 函数会指示 Amazon Lex 选择下一步操作。
-
-
根据
dialogAction.type
,Amazon Lex 选择下一步操作。Amazon Lex 知道它需要更多插槽数据,因此它将根据意图配置选择下一个具有最高优先级的未填充插槽 (PickupDate
)。Amazon Lex 会根据意图配置,针对这个插槽选择一个值引发提示消息(“您想要在哪天收到玫瑰?”),然后向客户端发送回以下响应:客户端在响应中显示消息 –“What day do you want the roses to be picked up?”。
-
-
用户:明天
-
客户端将向 Amazon Lex 发送以下 PostText 请求:
POST /bot/
OrderFlowers
/alias/$LATEST
/user/ignw84y6seypre4xly5rimopuri2xwnd
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "tomorrow", "sessionAttributes": { "Price": "25" } }在请求正文中,
inputText
将提供用户输入,然后客户端会将会话属性传递回服务。 -
Amazon Lex 会记住上下文(它正引发
PickupDate
插槽的数据)。在这个上下文中,它知道inputText
值用于PickupDate
槽。然后,Amazon Lex 将通过发送以下事件调用 Lambda 函数:{ "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "ignw84y6seypre4xly5rimopuri2xwnd", "sessionAttributes": { "Price": "25" }, "bot": { "name": "OrderFlowersCustomWithRespCard", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "OrderFlowers", "slots": { "PickupTime": null, "FlowerType": "roses", "PickupDate": "2017-01-05" }, "confirmationStatus": "None" } }
Amazon Lex 已经通过设置
PickupDate
值更新了currentIntent.slots
。另请注意,该服务会将sessionAttributes
传递到 Lambda 函数。 -
根据
DialogCodeHook
的invocationSource
值,Lambda 函数将执行用户数据验证。它会将PickupDate
插槽值识别为有效值,并向 Amazon Lex 返回以下响应:{ "sessionAttributes": { "Price": 25 }, "dialogAction": { "type": "Delegate", "slots": { "PickupTime": null, "FlowerType": "roses", "PickupDate": "2017-01-05" } } }
请注意以下几点:
-
sessionAttributes
– 无更改。 -
dialogAction.type
– 设置为Delegate
。用户数据是有效的,因此 Lambda 函数会指示 Amazon Lex 选择下一步操作。
-
-
根据
dialogAction.type
,Amazon Lex 选择下一步操作。Amazon Lex 知道它需要更多插槽数据,因此它将根据意图配置选择下一个具有最高优先级的未填充插槽 (PickupTime
)。Amazon Lex 会根据意图配置,针对这个插槽选择一项提示消息(“在 2017 年 1 月 5 日的什么时间配送玫瑰?”),并将以下响应发送回客户端:客户端会显示响应中的消息(“在 2017 年 1 月 5 日的什么时间配送玫瑰?”)
-
-
用户:下午 4 点
-
客户端将向 Amazon Lex 发送以下 PostText 请求:
POST /bot/
OrderFlowers
/alias/$LATEST
/user/ignw84y6seypre4xly5rimopuri2xwnd
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "4 pm", "sessionAttributes": { "Price": "25" } }在请求正文中,
inputText
将提供用户输入。客户端将在请求中传递sessionAttributes
。 -
Amazon Lex 了解上下文。它了解它正在引出
PickupTime
槽的数据。在此上下文中,它知道inputText
值用于PickupTime
插槽。然后,Amazon Lex 将通过发送以下事件调用 Lambda 函数:{ "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "ignw84y6seypre4xly5rimopuri2xwnd", "sessionAttributes": { "Price": "25" }, "bot": { "name": "OrderFlowersCustomWithRespCard", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "OrderFlowers", "slots": { "PickupTime": "16:00", "FlowerType": "roses", "PickupDate": "2017-01-05" }, "confirmationStatus": "None" } }
Amazon Lex 已经通过设置
PickupTime
值更新了currentIntent.slots
。 -
根据
DialogCodeHook
的invocationSource
值,Lambda 函数会执行用户数据验证。它会将PickupDate
插槽值识别为有效值,并向 Amazon Lex 返回以下响应。{ "sessionAttributes": { "Price": 25 }, "dialogAction": { "type": "Delegate", "slots": { "PickupTime": "16:00", "FlowerType": "roses", "PickupDate": "2017-01-05" } } }
请注意以下几点:
-
sessionAttributes
– 会话属性无更改。 -
dialogAction.type
– 设置为Delegate
。用户数据是有效的,因此 Lambda 函数会指示 Amazon Lex 选择下一步操作。
-
-
此时,Amazon Lex 知道它具有所有插槽数据。此目的配置有确认提示。因此,在履行意图之前,Amazon Lex 将向用户发送以下响应来请求确认:
客户端只显示响应中的消息并等待用户响应。
-
-
用户:是
-
客户端将向 Amazon Lex 发送以下 PostText 请求:
POST /bot/
OrderFlowers
/alias/$LATEST
/user/ignw84y6seypre4xly5rimopuri2xwnd
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "yes", "sessionAttributes": { "Price": "25" } } -
Amazon Lex 将解释确认当前意图的上下文中的
inputText
。Amazon Lex 了解用户希望继续完成订单。此时,Amazon Lex 将通过发送以下事件来调用 Lambda 函数以履行意图,这会在它发送给 Lambda 函数的事件中将invocationSource
设置为FulfillmentCodeHook
。Amazon Lex 也将confirmationStatus
设置为Confirmed
。{ "messageVersion": "1.0", "invocationSource": "FulfillmentCodeHook", "userId": "ignw84y6seypre4xly5rimopuri2xwnd", "sessionAttributes": { "Price": "25" }, "bot": { "name": "OrderFlowersCustomWithRespCard", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "OrderFlowers", "slots": { "PickupTime": "16:00", "FlowerType": "roses", "PickupDate": "2017-01-05" }, "confirmationStatus": "Confirmed" } }
请注意以下几点:
-
invocationSource
— 此时,Amazon Lex 将此值设置为FulfillmentCodeHook
,指示 Lambda 函数履行意图。 -
confirmationStatus
– 设置为Confirmed
。
-
-
此时,Lambda 函数履行
OrderFlowers
意图,并返回以下响应:{ "sessionAttributes": { "Price": "25" }, "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": "Thanks, your order for roses has been placed and will be ready for pickup by 16:00 on 2017-01-05" } } }
请注意以下几点:
-
dialogAction.type
– Lambda 函数将该值设置为Close
,指示 Amazon Lex 不要期待用户响应。 -
dialogAction.fulfillmentState
– 设置为“已完成”,并且包含要传达给用户的适当message
。
-
-
Amazon Lex 将查看
fulfillmentState
,并将以下响应发送回客户端。然后,Amazon Lex 将向客户端返回以下信息:
请注意:
-
dialogState
— Amazon Lex 将此值设置为fulfilled
。 -
message
— 与 Lambda 函数提供的消息相同。
客户端将显示消息。
-
-
-
现在,再次测试自动程序。要建立新的 (用户) 上下文,请选择测试窗口中的 Clear 链接。现在提供
OrderFlowers
目的的无效槽数据。此时,Lambda 函数将执行数据验证,将无效的插槽数据值重置为空值,并要求 Amazon Lex 提示用户提供有效数据。例如,请尝试以下操作:-
“茉莉花”作为鲜花类型 (它不是一种受支持的鲜花类型)。
-
“昨天”作为您想要取花的日期。
-
下单后,输入另一种鲜花类型,而不是回复“yes”来确认订单。作为响应,Lambda 函数将更新会话属性中的
Price
,以维护鲜花订单的滚动合计。
Lambda 函数还将执行履行活动。
-