终止支持通知:2025年9月15日, AWS 我们将停止对Amazon Lex V1的支持。2025 年 9 月 15 日之后,您将无法再访问亚马逊 Lex V1 主机或 Amazon Lex V1 资源。如果您使用的是 Amazon Lex V2,请改为参阅 Amazon Lex 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表示它是一个PostTextAPI 请求 (而不是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 函数还将执行履行活动。
-