資訊流程的詳細資訊 - Amazon Lex V1

如果您使用的是 Amazon Lex V2,請參閱 Amazon Lex V2 指南

 

如果您使用的是 Amazon Lex V1,我們建議您將機器人升級到 Amazon Lex V2。我們不再向 V1 添加新功能,強烈建議所有新的機器人使用 V2。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

資訊流程的詳細資訊

在本練習中,您使用 Amazon L BookTrip ex 主控台提供的測試視窗用戶端與 Amazon Lex 機器人進行對話。本節說明下列各項:

資料流程:預訂飯店意圖

本節說明在使用者每次輸入之後,會發生什麼情況。

  1. 使用者:「預訂飯店」

    1. 用戶端 (主控台) 傳送以下 PostText 請求給 Amazon Lex:

      POST /bot/BookTrip/alias/$LATEST/user/wch89kjqcpkds8seny7dly5x3otq68j3/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"book a hotel", "sessionAttributes":{} }

      請求 URI 和本文都向 Amazon Lex 提供信息:

      • 請求 URI — 提供機器人名稱 (BookTrip)、機器人別名 ($LATEST) 和使用者名稱。末尾的 text 表示其為 PostText API 請求 (而非 PostContent)。

      • 請求本文 – 包含使用者輸入 (inputText) 和空的 sessionAttributes。最初,這是一個空對象和 Lambda 函數首先設置會話屬性。

    2. 從中inputText,Amazon Lex 檢測到意圖(BookHotel)。此目的是使用 Lambda 函數設定為使用者資料初始化/驗證的程式碼掛接。因此,Amazon Lex 會傳遞下列資訊做為事件參數來叫用該 Lambda 函數 (請參閱輸入事件格式):

      { "messageVersion":"1.0", "invocationSource":"DialogCodeHook", "userId":"wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes":{ }, "bot":{ "name":"BookTrip", "alias":null, "version":"$LATEST" }, "outputDialogMode":"Text", "currentIntent":{ "name":"BookHotel", "slots":{ "RoomType":null, "CheckInDate":null, "Nights":null, "Location":null }, "confirmationStatus":"None" } }

      除了用戶端傳送的資訊之外,Amazon Lex 還包含下列其他資料:

      • messageVersion— 目前 Amazon Lex 僅支持 1.0 版本。

      • invocationSource— 指出 Lambda 函數叫用的目的。在這種情況下,它是執行使用者資料初始化和驗證 (目前 Amazon Lex 知道使用者尚未提供所有插槽資料來達成意圖)。

      • currentIntent – 所有槽值設定為 null。

    3. 此時,所有槽值都是 null。Lambda 函數沒有任何需要驗證的項目。Lambda 函數返回以下響應 Amazon Lex。如需有關回應格式的資訊,請參閱回應格式

      { "sessionAttributes":{ "currentReservation":"{\"ReservationType\":\"Hotel\",\"Location\":null,\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "dialogAction":{ "type":"Delegate", "slots":{ "RoomType":null, "CheckInDate":null, "Nights":null, "Location":null } } }
      注意
      • currentReservation— Lambda 函數包含此工作階段屬性。其值是目前槽資訊和預訂類型的副本。

        只有 Lambda 函數和用戶端可以更新這些工作階段屬性。Amazon Lex 只是通過這些值。

      • dialogAction.type— 將此值設定為Delegate,Lambda 函數會將下一個動作過程的責任委派給 Amazon Lex。

        如果 Lambda 函數在使用者資料驗證中偵測到任何內容,它會指示 Amazon Lex 下一步該怎麼做。

    4. 根據dialogAction.type,Amazon Lex 決定下一個操作過程-從用戶那裡獲取Location插槽的數據。它根據意圖組態選擇其中一個提示訊息 (「您會待在哪個城市?」) 給這個槽,然後傳送以下回應使用者:

      JSON 響應包含對話框狀態,意圖名稱,消息,響應卡,會話屬性,引出插槽和插槽。

      工作階段屬性傳遞給用戶端。

      用戶端讀取回應,然後顯示「您要在哪個城市留宿?」

  2. 使用者:「莫斯科」

    1. 用戶端會將下列PostText要求傳送至 Amazon Lex (新增分行符號以提高可讀性):

      POST /bot/BookTrip/alias/$LATEST/user/wch89kjqcpkds8seny7dly5x3otq68j3/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"Moscow", "sessionAttributes":{ "currentReservation":"{\"ReservationType\":\"Hotel\", \"Location\":null, \"RoomType\":null, \"CheckInDate\":null, \"Nights\":null}" } }

      除了 inputText 之外,用戶端還包含了它所收到的相同 currentReservation 工作階段屬性。

    2. Amazon Lex 首先inputText在目前意圖的內容中解譯 (該服務會記得已向特定使用者詢問有關Location插槽的資訊)。它會更新目前意圖的插槽值,並使用下列事件叫用 Lambda 函數:

      { "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":null,\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookHotel", "slots": { "RoomType": null, "CheckInDate": null, "Nights": null, "Location": "Moscow" }, "confirmationStatus": "None" } }
      注意
      • invocationSource 繼續做為 DialogCodeHook。在此步驟中,我們只需驗證使用者資料。

      • Amazon Lex 只是將會話屬性傳遞給 Lambda 函式。

      • 對於currentIntent.slots, Amazon Lex 已經更新了Location插槽Moscow.

    3. Lambda 函數會執行使用者資料驗證,並判斷該Moscow位置無效。

      注意

      本練習中的 Lambda 函數有簡單的有效城市清Moscow單,不在清單中。在生產應用程式中,您可以使用後端資料庫來取得此資訊。

      它會將插槽值重設回 null,並透過傳送下列回應,指示 Amazon Lex 再次提示使用者輸入另一個值:

      { "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Moscow\",\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "dialogAction": { "type": "ElicitSlot", "intentName": "BookHotel", "slots": { "RoomType": null, "CheckInDate": null, "Nights": null, "Location": null }, "slotToElicit": "Location", "message": { "contentType": "PlainText", "content": "We currently do not support Moscow as a valid destination. Can you try a different city?" } } }
      注意
      • currentIntent.slots.Location 重設為 null。

      • dialogAction.type設定為ElicitSlot,可指示 Amazon Lex 透過提供下列資訊再次提示使用者:

        • dialogAction.slotToElicit – 向使用者引出資料的槽。

        • dialogAction.message – 傳達給使用者的 message

    4. Amazon Lex 會在下列回應中通知dialogAction.type並將資訊傳遞給用戶端:

      JSON 響應包含對話框狀態,意圖名稱,消息,響應卡,會話屬性,引出插槽和插槽。

      用戶端直接顯示訊息:「莫斯科目前不是我們支援的有效目的地。您可以嘗試不同的城市嗎?」

  3. 使用者:「芝加哥」

    1. 用戶端會將下列PostText要求傳送至 Amazon Lex:

      POST /bot/BookTrip/alias/$LATEST/user/wch89kjqcpkds8seny7dly5x3otq68j3/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"Chicago", "sessionAttributes":{ "currentReservation":"{\"ReservationType\":\"Hotel\", \"Location\":\"Moscow\", \"RoomType\":null, \"CheckInDate\":null, \"Nights\":null}" } }

    2. Amazon Lex 知道上下文,它正在引出Location插槽的數據。在此情況下,服務知道 inputText 值是用於 Location 槽。然後,它會傳送下列事件來叫用 Lambda 函數:

      { "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":Moscow,\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookHotel", "slots": { "RoomType": null, "CheckInDate": null, "Nights": null, "Location": "Chicago" }, "confirmationStatus": "None" } }

      Amazon LexcurrentIntent.slots 通過將Location插槽設置為更新了Chicago

    3. 根據的invocationSourceDialogCodeHook,Lambda 函數會執行使用者資料驗證。它會辨識Chicago為有效的插槽值、相應地更新工作階段屬性,然後將下列回應傳回 Amazon Lex。

      { "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "dialogAction": { "type": "Delegate", "slots": { "RoomType": null, "CheckInDate": null, "Nights": null, "Location": "Chicago" } } }
      注意
      • currentReservation— Lambda 函數會透過Location將設定為來更新此工作階段屬性Chicago

      • dialogAction.type – 已設定為 Delegate。使用者資料有效,而 Lambda 函數會指示 Amazon Lex 選擇下一個動作方案。

       

    4. 據說dialogAction.type,Amazon Lex 選擇行動的下一個過程。Amazon Lex 知道需要更多插槽資料,並根據意圖組態挑選具有最高優先順序的下一個未填充的插槽 (CheckInDate)。它根據意圖組態選擇其中一個提示訊息 (「您入住的日期是哪一天?」) 給這個槽,然後將以下回應傳回給使用者:

      JSON 響應包含對話框狀態,意圖名稱,消息,響應卡,會話屬性,引出插槽和插槽。位置欄位現在填入為芝加哥。

      用戶端顯示訊息:「您要在哪一天入住?」

  4. 使用者互動會繼續:使用者提供資料、Lambda 函數驗證資料,然後將下一個動作過程委派給 Amazon Lex。最後,使用者會提供所有插槽資料,Lambda 函數會驗證所有使用者輸入,然後 Amazon Lex 會辨識出它具有所有插槽資料。

    注意

    在本練習中,在使用者提供所有插槽資料之後,Lambda 函數會計算飯店預訂的價格,並將其傳回為另一個工作階段屬性 (currentReservationPrice)。

    此時,意圖已準備就緒,但是在 Amazon Lex 達成 BookHotel意圖之前,已設定確認提示需要使用者確認的確認提示。因此,Amazon Lex 會在預訂酒店前向客戶傳送下列訊息,要求確認:

    JSON 響應包含對話框狀態,意圖名稱,消息,響應卡,會話屬性,引出插槽和插槽。現在,所有插槽都已填寫。

    用戶端顯示訊息:「好的,您要在芝加哥預訂 5 晚,從 2016-12-18 開始。要我預訂嗎?」

  5. 使用者:「是」

    1. 用戶端會將下列PostText要求傳送至 Amazon Lex:

      POST /bot/BookTrip/alias/$LATEST/user/wch89kjqcpkds8seny7dly5x3otq68j3/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"Yes", "sessionAttributes":{ "currentReservation":"{\"ReservationType\":\"Hotel\", \"Location\":\"Chicago\", \"RoomType\":\"queen\", \"CheckInDate\":\"2016-12-18\", \"Nights\":\"5\"}", "currentReservationPrice":"1195" } }
    2. Amazon Lex 會inputText在確認目前意圖的內容中解譯。Amazon Lex 瞭解使用者想要繼續進行保留。這次 Amazon Lex 會透過傳送下列事件來呼叫 Lambda 函數來完成意圖。透過在事件FulfillmentCodeHookinvocationSource將設定為,它會傳送至 Lambda 函數。Amazon Lex 也設置confirmationStatusConfirmed.

      { "messageVersion": "1.0", "invocationSource": "FulfillmentCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}", "currentReservationPrice": "956" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookHotel", "slots": { "RoomType": "queen", "CheckInDate": "2016-12-18", "Nights": "5", "Location": "Chicago" }, "confirmationStatus": "Confirmed" } }
      注意
      • invocationSource— 這次,Amazon Lex 將此值設置為FulfillmentCodeHook,指導 Lambda 函數以實現意圖。

      • confirmationStatus – 已設定為 Confirmed

    3. 這一次,Lambda 函數完成了這個 BookHotel 意圖,Amazon Lex 完成保留,然後傳回下列回應:

      { "sessionAttributes": { "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}" }, "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": "Thanks, I have placed your reservation. Please let me know if you would like to book a car rental, or another hotel." } } }
      注意
      • lastConfirmedReservation— 是 Lambda 函數新增的新工作階段屬性 (而不是currentReservation,currentReservationPrice)。

      • dialogAction.type— Lambda 函數會將此值設定為Close,表示 Amazon Lex 預期不會收到使用者回應。

      • dialogAction.fulfillmentState – 已設定為 Fulfilled 並包含適當的 message 以傳達給使用者。

    4. Amazon Lex 會檢閱fulfillmentState並將下列回應傳送給用戶端:

      JSON 響應包含對話框狀態,意圖名稱,消息,響應卡,會話屬性,引出插槽和插槽。所有插槽都已填寫,並且會話屬性下的最後一個確認的保留字段現在已填寫。
      注意
      • dialogState— Amazon Lex 將此值設置為Fulfilled.

      • message-與 Lambda 函數提供的消息相同。

      用戶端將顯示該訊息。

資料流程:預訂租車意圖

本練習中的 BookTrip 機器人支援兩種意圖 (BookHotel 和 BookCar)。預訂飯店之後,使用者可以繼續預訂租車的對話。只要工作階段未逾時,用戶端就會在每個後續的請求中繼續傳送工作階段屬性 (在這個範例中,即 lastConfirmedReservation)。Lambda 函數可以使用此資訊來初始化 BookCar 意圖的插槽資料。這說明您如何能夠在跨意圖資料分享中使用工作階段屬性。

具體來說,當使用者選擇 BookCar 意圖時,Lambda 函數會使用工作階段屬性中的相關資訊來預先填入 BookCar 意圖的位置 (PickUpDate ReturnDate、和 PickUpCity)。

注意

Amazon Lex 主控台提供清除連結,您可以用來清除任何先前的工作階段屬性。

按照此程序中的步驟,繼續對話。

  1. 使用者:「還要預訂租車」

    1. 客戶端將以下PostText請求發送到 Amazon Lex。

      POST /bot/BookTrip/alias/$LATEST/user/wch89kjqcpkds8seny7dly5x3otq68j3/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"also book a car", "sessionAttributes":{ "lastConfirmedReservation":""{\"ReservationType\":\"Hotel\", \"Location\":\"Chicago\", \"RoomType\":\"queen\", \"CheckInDate\":\"2016-12-18\", \"Nights\":\"5\"}" } }

      用戶端包含 lastConfirmedReservation 工作階段屬性。

    2. Amazon Lex 從中偵測到意圖 (BookCar)inputText。此意圖也會設定為叫用 Lambda 函數來執行使用者資料的初始化和驗證。Amazon Lex 會使用 Lex 使用 Lambda 函式,並發生下圖:

      { "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookCar", "slots": { "PickUpDate": null, "ReturnDate": null, "DriverAge": null, "CarType": null, "PickUpCity": null }, "confirmationStatus": "None" } }
      注意
      • messageVersion— 目前 Amazon Lex 僅支持 1.0 版本。

      • invocationSource – 指出呼叫的目的是執行初始化和使用者資料驗證。

      • currentIntent— 它包括意圖名稱和插槽。此時,所有插槽值都是 null。

    3. Lambda 函數會注意到所有空插槽值,而不需要驗證任何內容。然而,它使用工作階段屬性來初始化一些槽值 (PickUpDateReturnDatePickUpCity),然後傳回以下回應:

      { "sessionAttributes": { "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}", "currentReservation": "{\"ReservationType\":\"Car\",\"PickUpCity\":null,\"PickUpDate\":null,\"ReturnDate\":null,\"CarType\":null}", "confirmationContext": "AutoPopulate" }, "dialogAction": { "type": "ConfirmIntent", "intentName": "BookCar", "slots": { "PickUpCity": "Chicago", "PickUpDate": "2016-12-18", "ReturnDate": "2016-12-22", "CarType": null, "DriverAge": null }, "message": { "contentType": "PlainText", "content": "Is this car rental for your 5 night stay in Chicago on 2016-12-18?" } } }
      注意
      • 除此之外lastConfirmedReservation,Lambda 函數還包含更多工作階段屬性 (currentReservationconfirmationContext)。

      • dialogAction.type設定為ConfirmIntent,這會通知 Amazon Lex 使用者預期會收到「是」、「不」回覆 (confirmationContext 設定為 AutoPopulate,Lambda 函數知道是/否使用者回覆是要取得執行 Lambda 函數初始化的使用者確認 (auto 填入的插槽資料)。

         

        Lambda 函數也會在回應中包含資訊訊息,以dialogAction.message便 Amazon Lex 傳回給用戶端。

        注意

        ConfirmIntent 一詞 (dialogAction.type 的值) 不與任何機器人意圖相關。在此範例中,Lambda 函數使用此術語來指示 Amazon Lex 從使用者取得「是/否」回覆。

    4. 根據dialogAction.type,Amazon Lex 將以下響應返回給客戶端:

      JSON 響應包含對話框狀態,意圖名稱,消息,響應卡,會話屬性,引出插槽和插槽。

      用戶端顯示訊息:「此次租車是用於您在 2016-12-18 於芝加哥留宿 5 晚嗎?」

  2. 使用者:「是」

    1. 客戶端將以下PostText請求發送到 Amazon Lex。

      POST /bot/BookTrip/alias/$LATEST/user/wch89kjqcpkds8seny7dly5x3otq68j3/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"yes", "sessionAttributes":{ "confirmationContext":"AutoPopulate", "currentReservation":"{\"ReservationType\":\"Car\", \"PickUpCity\":null, \"PickUpDate\":null, \"ReturnDate\":null, \"CarType\":null}", "lastConfirmedReservation":"{\"ReservationType\":\"Hotel\", \"Location\":\"Chicago\", \"RoomType\":\"queen\", \"CheckInDate\":\"2016-12-18\", \"Nights\":\"5\"}" } }
    2. Amazon Lex 讀取inputText並且知道上下文 (要求使用者確認 auto 填入)。Amazon Lex 會透過傳送 Lambda 函式,藉由傳送下圖所示。

      { "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "confirmationContext": "AutoPopulate", "currentReservation": "{\"ReservationType\":\"Car\",\"PickUpCity\":null,\"PickUpDate\":null,\"ReturnDate\":null,\"CarType\":null}", "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookCar", "slots": { "PickUpDate": "2016-12-18", "ReturnDate": "2016-12-22", "DriverAge": null, "CarType": null, "PickUpCity": "Chicago" }, "confirmationStatus": "Confirmed" } }

      因為用戶回答是,Amazon Lex 設置confirmationStatusConfirmed

    3. 從中confirmationStatus,Lambda 函數知道預先填入的值是正確的。Lambda 函數會執行下列動作:

      • 以它預先填入的槽值更新 currentReservation 工作階段屬性。

      • dialogAction.type 設定為 ElicitSlot

      • slotToElicit 值設定為 DriverAge

      傳送以下回應:

      { "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Car\",\"PickUpCity\":\"Chicago\",\"PickUpDate\":\"2016-12-18\",\"ReturnDate\":\"2016-12-22\",\"CarType\":null}", "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}" }, "dialogAction": { "type": "ElicitSlot", "intentName": "BookCar", "slots": { "PickUpDate": "2016-12-18", "ReturnDate": "2016-12-22", "DriverAge": null, "CarType": null, "PickUpCity": "Chicago" }, "slotToElicit": "DriverAge", "message": { "contentType": "PlainText", "content": "How old is the driver of this car rental?" } } }
    4. Amazon Lex 返回以下響應:

      JSON 響應顯示預訂汽車的意圖和消息引出駕駛員時代插槽的插槽。

      客戶端顯示消息「這輛租車的司機幾歲?」 而對談繼續。