如果您使用的是 Amazon Lex V2,請改參閱 Amazon Lex V2 指南。
如果您使用的是 Amazon Lex V1,我們建議您將機器人升級至 Amazon Lex V2。我們不再將新功能新增至 V1,並強烈建議對所有新機器人使用 V2。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
資訊流程的詳細資訊
在本練習中,您使用 Amazon L BookTrip ex 主控台提供的測試視窗用戶端與 Amazon Lex 機器人進行對話。本節說明下列各項:
-
用戶端和 Amazon Lex 之間的資料流。
本節假設用戶端使用
PostText
執行階段 API 將請求傳送至 Amazon Lex,並據此顯示請求和回應詳細資訊。如需有關PostText
執行時間 API 的詳細資訊,請參閱 PostText。注意
如需用戶端和用戶端使用
PostContent
API 的 Amazon Lex 之間的資訊流程範例,請參閱步驟 2a (選用):檢閱口語化資訊流程的詳細資訊 (主控台) 。 -
Amazon Lex 和 Lambda 函數之間的數據流。如需詳細資訊,請參閱Lambda 函數輸入事件和回應格式。
資料流程:預訂飯店意圖
本節說明在使用者每次輸入之後,會發生什麼情況。
-
使用者:「預訂飯店」
-
用戶端 (主控台) 傳送以下 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 函數首先設置會話屬性。
-
-
從中
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。
-
-
此時,所有槽值都是 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 下一步該怎麼做。
-
-
根據
dialogAction.type
,Amazon Lex 決定下一個操作過程-從用戶那裡獲取Location
插槽的數據。它根據意圖組態選擇其中一個提示訊息 (「您會待在哪個城市?」) 給這個槽,然後傳送以下回應使用者:工作階段屬性傳遞給用戶端。
用戶端讀取回應,然後顯示「您要在哪個城市留宿?」
-
-
使用者:「莫斯科」
-
用戶端會將下列
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
工作階段屬性。 -
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
.
-
-
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
。
-
-
-
Amazon Lex 會在下列回應中通知
dialogAction.type
並將資訊傳遞給用戶端:用戶端直接顯示訊息:「莫斯科目前不是我們支援的有效目的地。您可以嘗試不同的城市嗎?」
-
-
使用者:「芝加哥」
-
用戶端會將下列
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}" } } -
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 Lex
currentIntent.slots
通過將Location
插槽設置為更新了Chicago
。 -
根據的
invocationSource
值DialogCodeHook
,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 選擇下一個動作方案。
-
-
據說
dialogAction.type
,Amazon Lex 選擇行動的下一個過程。Amazon Lex 知道需要更多插槽資料,並根據意圖組態挑選具有最高優先順序的下一個未填充的插槽 (CheckInDate
)。它根據意圖組態選擇其中一個提示訊息 (「您入住的日期是哪一天?」) 給這個槽,然後將以下回應傳回給使用者:用戶端顯示訊息:「您要在哪一天入住?」
-
-
使用者互動會繼續:使用者提供資料、Lambda 函數驗證資料,然後將下一個動作過程委派給 Amazon Lex。最後,使用者會提供所有插槽資料,Lambda 函數會驗證所有使用者輸入,然後 Amazon Lex 會辨識出它具有所有插槽資料。
注意
在本練習中,在使用者提供所有插槽資料之後,Lambda 函數會計算飯店預訂的價格,並將其傳回為另一個工作階段屬性 (
currentReservationPrice
)。此時,意圖已準備就緒,但是在 Amazon Lex 達成 BookHotel意圖之前,已設定確認提示需要使用者確認的確認提示。因此,Amazon Lex 會在預訂酒店前向客戶傳送下列訊息,要求確認:
用戶端顯示訊息:「好的,您要在芝加哥預訂 5 晚,從 2016-12-18 開始。要我預訂嗎?」
-
使用者:「是」
-
用戶端會將下列
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" } } -
Amazon Lex 會
inputText
在確認目前意圖的內容中解譯。Amazon Lex 瞭解使用者想要繼續進行保留。這次 Amazon Lex 會透過傳送下列事件來呼叫 Lambda 函數來完成意圖。透過在事件FulfillmentCodeHook
中invocationSource
將設定為,它會傳送至 Lambda 函數。Amazon Lex 也設置confirmationStatus
為Confirmed
.{ "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
。
-
-
這一次,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
以傳達給使用者。
-
-
Amazon Lex 會檢閱
fulfillmentState
並將下列回應傳送給用戶端:注意
-
dialogState
— Amazon Lex 將此值設置為Fulfilled
. -
message
-與 Lambda 函數提供的消息相同。
用戶端將顯示該訊息。
-
-
資料流程:預訂租車意圖
本練習中的 BookTrip 機器人支援兩種意圖 (BookHotel 和 BookCar)。預訂飯店之後,使用者可以繼續預訂租車的對話。只要工作階段未逾時,用戶端就會在每個後續的請求中繼續傳送工作階段屬性 (在這個範例中,即 lastConfirmedReservation
)。Lambda 函數可以使用此資訊來初始化 BookCar 意圖的插槽資料。這說明您如何能夠在跨意圖資料分享中使用工作階段屬性。
具體來說,當使用者選擇 BookCar 意圖時,Lambda 函數會使用工作階段屬性中的相關資訊來預先填入 BookCar 意圖的位置 (PickUpDate ReturnDate、和 PickUpCity)。
注意
Amazon Lex 主控台提供清除連結,您可以用來清除任何先前的工作階段屬性。
按照此程序中的步驟,繼續對話。
-
使用者:「還要預訂租車」
-
客戶端將以下
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
工作階段屬性。 -
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。
-
-
Lambda 函數會注意到所有空插槽值,而不需要驗證任何內容。然而,它使用工作階段屬性來初始化一些槽值 (
PickUpDate
、ReturnDate
和PickUpCity
),然後傳回以下回應:{ "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 函數還包含更多工作階段屬性 (currentReservation
和confirmationContext
)。 -
dialogAction.type
設定為ConfirmIntent
,這會通知 Amazon Lex 使用者預期會收到「是」、「不」回覆 (confirmationContext 設定為 AutoPopulate,Lambda 函數知道是/否使用者回覆是要取得執行 Lambda 函數初始化的使用者確認 (auto 填入的插槽資料)。Lambda 函數也會在回應中包含資訊訊息,以
dialogAction.message
便 Amazon Lex 傳回給用戶端。注意
ConfirmIntent
一詞 (dialogAction.type
的值) 不與任何機器人意圖相關。在此範例中,Lambda 函數使用此術語來指示 Amazon Lex 從使用者取得「是/否」回覆。
-
-
根據
dialogAction.type
,Amazon Lex 將以下響應返回給客戶端:用戶端顯示訊息:「此次租車是用於您在 2016-12-18 於芝加哥留宿 5 晚嗎?」
-
-
使用者:「是」
-
客戶端將以下
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\"}" } } -
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 設置
confirmationStatus
為Confirmed
。 -
從中
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?" } } }
-
-
Amazon Lex 返回以下響應:
客戶端顯示消息「這輛租車的司機幾歲?」 而對談繼續。
-