步骤 5 (可选):查看信息流的详细信息 (控制台) - Amazon Lex V1

如果您使用的是 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

  1. 用户:我想要订些花。

    1. 客户端 (控制台) 将向 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 函数会启动这些属性。

    2. 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 信息。

    3. 此时,所有槽值均为空值。Lambda 函数没有任何内容需要验证。Lambda 函数会向 Amazon Lex 返回以下响应:

      { "sessionAttributes": {}, "dialogAction": { "type": "Delegate", "slots": { "PickupTime": null, "FlowerType": null, "PickupDate": null } } }

      有关响应格式的信息,请参阅 响应格式

      请注意以下几点:

      • dialogAction.type — 通过将此值设置为 Delegate,Lambda 函数会将决定下一个操作的责任委派给 Amazon Lex。

        注意

        如果 Lambda 函数在用户数据验证中检测到任何内容,它会指示 Amazon Lex 下一步操作,如接下来的几个步骤所示。

    4. 根据 dialogAction.type,Amazon Lex 将决定下一步操作。由于没有一个槽得到填充,它将决定引出 FlowerType 槽的值。它将选择此槽的其中一个值引出提示(“您想要订哪种类型的花?”),并将以下响应发送回客户端:

      包含 FlowerType 槽的请求的 JSON 数据。

      客户端将显示响应中的消息。

  2. 用户:玫瑰

    1. 客户端将向 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 将保留为空。

    2. 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 插槽更新为“玫瑰”。

    3. 根据 DialogCodeHookinvocationSource 值,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 选择下一步操作。

       

    4. 根据 dialogAction.type,Amazon Lex 选择下一步操作。Amazon Lex 知道它需要更多插槽数据,因此它将根据意图配置选择下一个具有最高优先级的未填充插槽 (PickupDate)。Amazon Lex 会根据意图配置,针对这个插槽选择一个值引发提示消息(“您想要在哪天收到玫瑰?”),然后向客户端发送回以下响应:

      发送到客户端来请求 PickupData 槽的 JSON 数据。

      客户端在响应中显示消息 –“What day do you want the roses to be picked up?”。

  3. 用户:明天

    1. 客户端将向 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 将提供用户输入,然后客户端会将会话属性传递回服务。

    2. 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 函数。

    3. 根据 DialogCodeHookinvocationSource 值,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 选择下一步操作。

    4. 根据 dialogAction.type,Amazon Lex 选择下一步操作。Amazon Lex 知道它需要更多插槽数据,因此它将根据意图配置选择下一个具有最高优先级的未填充插槽 (PickupTime)。Amazon Lex 会根据意图配置,针对这个插槽选择一项提示消息(“在 2017 年 1 月 5 日的什么时间配送玫瑰?”),并将以下响应发送回客户端:

      用来请求 PickupTime 槽的 JSON 数据。

      客户端会显示响应中的消息(“在 2017 年 1 月 5 日的什么时间配送玫瑰?”)

  4. 用户:下午 4 点

    1. 客户端将向 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

    2. 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

    3. 根据 DialogCodeHookinvocationSource 值,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 选择下一步操作。

    4. 此时,Amazon Lex 知道它具有所有插槽数据。此目的配置有确认提示。因此,在履行意图之前,Amazon Lex 将向用户发送以下响应来请求确认:

      要求确认订单的 JSON 数据。

      客户端只显示响应中的消息并等待用户响应。

  5. 用户:是

    1. 客户端将向 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" } }
    2. 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

    3. 此时,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

    4. Amazon Lex 将查看 fulfillmentState,并将以下响应发送回客户端。

      然后,Amazon Lex 将向客户端返回以下信息:

      用于确认提示的 JSON 数据。

      请注意:

      • dialogState — Amazon Lex 将此值设置为 fulfilled

      • message — 与 Lambda 函数提供的消息相同。

      客户端将显示消息。

  6. 现在,再次测试自动程序。要建立新的 (用户) 上下文,请选择测试窗口中的 Clear 链接。现在提供 OrderFlowers 目的的无效槽数据。此时,Lambda 函数将执行数据验证,将无效的插槽数据值重置为空值,并要求 Amazon Lex 提示用户提供有效数据。例如,请尝试以下操作:

    • “茉莉花”作为鲜花类型 (它不是一种受支持的鲜花类型)。

    • “昨天”作为您想要取花的日期。

    • 下单后,输入另一种鲜花类型,而不是回复“yes”来确认订单。作为响应,Lambda 函数将更新会话属性中的 Price,以维护鲜花订单的滚动合计。

    Lambda 函数还将执行履行活动。

下一个步骤

步骤 6:更新目的配置以添加表达 (控制台)