如果您使用的是 Amazon Lex V2,請改參閱 Amazon Lex V2 指南。
如果您使用的是 Amazon Lex V1,建議您將機器人升級至 Amazon Lex V2。我們不再將新功能新增至 V1,強烈建議所有新機器人都使用 V2。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
步驟 5 (選用):檢閱資訊流程的詳細資訊 (主控台)
本節說明用戶端和 Amazon Lex 之間針對每個使用者輸入的資訊流程,包括 Lambda 函數的整合。
注意
本節假設用戶端使用PostText
執行階段 API 將請求傳送至 Amazon Lex,並據此顯示請求和回應詳細資訊。如需用戶端與用戶端使用PostContent
API 之 Amazon Lex 之間的資訊流程範例,請參閱步驟 2a (選用):檢閱口語化資訊流程的詳細資訊 (主控台) 。
如需 PostText
執行時間 API 的詳細資訊及關於以下步驟所示的請求與回應的更多細節,請參閱 PostText。
-
使用者:我想要訂花。
-
用戶端 (主控台) 傳送以下 PostText 請求給 Amazon Lex:
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
)、bot 別名 ($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
資訊 – 所有槽值均設定為 null。
-
-
此時,所有槽值都是 null。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
槽的值。服務將選取該槽的其中一個值引出提示「您想要訂購哪一種花?」,然後傳回以下回應給用戶端:用戶端顯示回應中的訊息。
-
-
使用者:玫瑰
-
用戶端會將下列PostText要求傳送至 Amazon Lex:
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
插槽玫瑰.
-
-
根據的
invocationSource
值DialogCodeHook
,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 選擇其中一個價值引起的提示訊息 —「您希望什麼日子收到玫瑰花?」 —for 此插槽根據意圖配置,然後將以下響應發送回客戶端:用戶端將顯示回應中的訊息 –「您想要在哪一天拿取玫瑰?」
-
-
使用者:明天
-
用戶端會將下列PostText要求傳送至 Amazon Lex:
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 已經
currentIntent.slots
通過設置PickupDate
值更新了。另請注意,服務將原sessionAttributes
樣傳遞給 Lambda 函數。 -
根據的
invocationSource
值DialogCodeHook
,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-01-05 什麼時候交付玫瑰?」) 根據意圖配置此插槽,並將以下響應發送回客戶端:客戶端在響應中顯示消息-「在 2017-01-05 什麼時候交付玫瑰?」
-
-
使用者:下午 4 點
-
用戶端會將下列PostText要求傳送至 Amazon Lex:
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 已經
currentIntent.slots
通過設置PickupTime
值更新了。 -
根據的
invocationSource
值DialogCodeHook
,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 會先傳送下列回應給要求確認的使用者,再完成意圖:
用戶端將顯示回應中的訊息並等待使用者回應。
-
-
使用者:好
-
用戶端會將下列PostText要求傳送至 Amazon Lex:
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 函數來完成意圖,該事件會FulfillmentCodeHook
在傳送invocationSource
至 Lambda 函數的事件中設定為。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
– 設定為 Fulfilled 且附上相應的message
以傳達給使用者。
-
-
Amazon Lex 會檢閱,
fulfillmentState
並將下列回應傳回給用戶。Amazon Lex 接著會將下列項目傳回給用戶端:
請注意:
-
dialogState
— Amazon Lex 將此值設置為fulfilled
. -
message
-與提供的 Lambda 函數相同的消息。
用戶端將顯示該訊息。
-
-
-
現在,再次測試機器人。要建立新的 (使用者) 內容,請由測試視窗選擇 Clear (清除) 連結。接著為
OrderFlowers
意圖提供無效的槽資料。這次 Lambda 函數會執行資料驗證、將無效的插槽資料值重設為空值,並要求 Amazon Lex 提示使用者提供有效資料。例如,嘗試以下操作:-
花種為「茉莉」(此花種不受支援),
-
想要取花的日期為「昨天」。
-
下單後再輸入其他花種,而不要回覆「好」確認下單。作為回應,Lambda 函數會更新工作階段
Price
中的屬性,以保持花卉訂單的執行總數。
Lambda 函數也會執行履行活動。
-