如果您使用的是 Amazon Lex V2,請改參閱 Amazon Lex V2 指南。
如果您使用的是 Amazon Lex V1,建議您將機器人升級至 Amazon Lex V2。我們不再將新功能新增至 V1,強烈建議所有新機器人都使用 V2。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
資訊流程的詳細資訊
ScheduleAppointment
機器人藍圖主要是展示如何運用動態產生的回應卡。本練習中的 Lambda 函數在其對 Amazon Lex 的回應中包含回應卡。Amazon Lex 在回覆客戶端時包含回應卡。本部分說明下列兩項:
-
客戶端和 Amazon Lex 之間的數據流。
本節假設用戶端使用
PostText
執行階段將請求傳送至 Amazon Lex,API並據此顯示請求/回應詳細資訊。如需PostText
執行階段的詳細資訊API,請參閱PostText。注意
如需用戶端和用戶端使用的 Amazon Lex 之間的資訊流程範例
PostContent
API,請參閱步驟 2a (選用):檢閱口語化資訊流程的詳細資訊 (主控台) 。 -
Amazon Lex 和 Lambda 函數之間的數據流。如需詳細資訊,請參閱Lambda 函數輸入事件和回應格式。
注意
此範例假設您使用的是 Facebook 信使用戶端,該用戶端不會將要求中的工作階段屬性傳遞給 Amazon Lex。因此,本節所示的範例顯示空的 sessionAttributes
。如果您使用 Amazon Lex 主控台中提供的用戶端測試機器人,用戶端會包含工作階段屬性。
本節說明在使用者每次輸入之後,會發生什麼情況。
-
使用者:類型
Book an appointment
。-
用戶端 (主控台) 傳送以下 PostContent 請求給 Amazon Lex:
POST /bot/
ScheduleAppointment
/alias/$LATEST
/user/bijt6rovckwecnzesbthrr1d7lv3ja3n
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"book appointment", "sessionAttributes":{} }請求URI和正文都向 Amazon Lex 提供信息:
-
請求 URI — 提供機器人名稱 (ScheduleAppointment)、機器人別名 ($LATEST) 和使用者名稱 ID。尾隨
text
表示它是PostText
(不PostContent
)API請求。 -
請求本文 – 包含使用者輸入 (
inputText
) 和空的sessionAttributes
。
-
-
從中
inputText
,Amazon Lex 檢測到意圖(MakeAppointment
)。此服務會叫用設定為程式碼掛接的 Lambda 函數,藉由傳遞下列事件來執行初始化和驗證。如需詳細資訊,請參閱 輸入事件格式。{ "currentIntent": { "slots": { "AppointmentType": null, "Date": null, "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "bijt6rovckwecnzesbthrr1d7lv3ja3n", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }
除了用戶端傳送的資訊之外,Amazon Lex 還包含下列資料:
-
currentIntent
– 提供目前的意圖資訊。 -
invocationSource
— 指出 Lambda 函數叫用的目的。在這種情況下,目的是執行用戶數據初始化和驗證。Amazon Lex 知道使用者尚未提供所有插槽資料來達成意圖。) -
messageVersion
— 目前 Amazon Lex 僅支持 1.0 版本。
-
-
目前,所有槽值都是 null (沒有可驗證的內容)。Lambda 函數會將下列回應傳回給 Amazon Lex,指示服務以引出插槽的
AppointmentType
資訊。如需回應格式的相關資訊,請參閱回應格式。{ "dialogAction": { "slotToElicit": "AppointmentType", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "cleaning (30 min)", "value": "cleaning" }, { "text": "root canal (60 min)", "value": "root canal" }, { "text": "whitening (30 min)", "value": "whitening" } ], "subTitle": "What type of appointment would you like to schedule?", "title": "Specify Appointment Type" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": null, "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "What type of appointment would you like to schedule?", "contentType": "PlainText" } }, "sessionAttributes": {} }
回應包含
dialogAction
和sessionAttributes
欄位。此外,dialogAction
欄位會傳回以下欄位:-
type
— 透過將此欄位設定為ElicitSlot
,Lambda 函數會指示 Amazon Lex 針對欄位中指定的插槽引出slotToElicit
值。Lambda 函數還提供了message
一個傳達給用戶。 -
responseCard
— 識別AppointmentType
插槽可能值的清單。支援回應卡片的用戶端 (例如 Facebook Messenger) 會顯示回應卡,讓使用者選擇約會類型,如下圖所示:
-
-
如 Lambda 函數回應
dialogAction.type
中所述,Amazon Lex 會將下列回應傳回給用戶端:客戶端讀取響應,然後顯示以下消息:「您想安排什麼類型的約會?」 以及回應卡 (如果用戶端支援回應卡的話)。
-
-
使用者:根據用戶端,使用者有兩個選項:
-
如果顯示回應卡,請選擇 root canal (60 min) 或輸入
root canal
。 -
如果用戶端不支援回應卡,輸入
root canal
。
-
用戶端會將下列
PostText
要求傳送至 Amazon Lex (已新增換行符號以提高可讀性):POST /bot/
BookTrip
/alias/$LATEST
/user/bijt6rovckwecnzesbthrr1d7lv3ja3n
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "root canal", "sessionAttributes": {} } -
Amazon Lex 透過傳送下列事件做為參數,叫用 Lambda 函數進行使用者資料驗證:
{ "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "bijt6rovckwecnzesbthrr1d7lv3ja3n", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }
在事件資料中,注意下列事項:
-
invocationSource
繼續做為DialogCodeHook
。在此步驟中,我們只需驗證使用者資料。 -
Amazon Lex 將
currentIntent.slots
插槽中的AppointmentType
字段設置為root canal
。 -
Amazon Lex 只是在用戶端和 Lambda 函數之間傳遞
sessionAttributes
欄位。
-
-
Lambda 函數會驗證使用者輸入,並將下列回應傳回給 Amazon Lex,引導服務引出約會日期的值。
{ "dialogAction": { "slotToElicit": "Date", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "2-15 (Wed)", "value": "Wednesday, February 15, 2017" }, { "text": "2-16 (Thu)", "value": "Thursday, February 16, 2017" }, { "text": "2-17 (Fri)", "value": "Friday, February 17, 2017" }, { "text": "2-20 (Mon)", "value": "Monday, February 20, 2017" }, { "text": "2-21 (Tue)", "value": "Tuesday, February 21, 2017" } ], "subTitle": "When would you like to schedule your root canal?", "title": "Specify Date" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "When would you like to schedule your root canal?", "contentType": "PlainText" } }, "sessionAttributes": {} }
同樣地,回應也包含
dialogAction
和sessionAttributes
欄位。此外,dialogAction
欄位會傳回以下欄位:-
type
— 透過將此欄位設定為ElicitSlot
,Lambda 函數會指示 Amazon Lex 針對欄位中指定的插槽引出slotToElicit
值。Lambda 函數還提供了message
一個傳達給用戶。 -
responseCard
— 識別Date
插槽可能值的清單。支援回應卡 (例如 Facebook Messenger) 的用戶端會顯示回應卡,讓使用者選擇約會日期,如下圖所示:雖然 Lambda 函數返回五個日期,客戶端(Facebook 信使)有一個響應卡三個按鈕的限制。因此,您在螢幕擷取畫面中只會看到前三個值。
這些日期在 Lambda 函數中進行硬編碼。在生產應用程式中,您可以使用行事曆以即時取得可用的日期。由於日期是動態的,因此您必須在 Lambda 函數中動態產生回應卡。
-
-
Amazon Lex 會注意到
dialogAction.type
並將下列回應傳回給用戶端,其中包含來自 Lambda 函數回應的資訊。用戶端會顯示訊息:When would you like to schedule your root canal? 和回應卡 (如果用戶端有支援回應卡)。
-
-
使用者:類型
Thursday
。-
用戶端會將下列
PostText
要求傳送至 Amazon Lex (已新增換行符號以提高可讀性):POST /bot/
BookTrip
/alias/$LATEST
/user/bijt6rovckwecnzesbthrr1d7lv3ja3n
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "Thursday", "sessionAttributes": {} } -
Amazon Lex 會將下列事件做為參數傳送,藉此叫用 Lambda 函數進行使用者資料驗證:
{ "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-16", "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }
在事件資料中,注意下列事項:
-
invocationSource
繼續做為DialogCodeHook
。在此步驟中,我們只需驗證使用者資料。 -
Amazon Lex 將
currentIntent.slots
插槽中的Date
字段設置為2017-02-16
。 -
Amazon Lex 只是在客戶端和 Lambda 函數
sessionAttributes
之間傳遞。
-
-
Lambda 函數會驗證使用者輸入。這次 Lambda 函數會判斷指定日期沒有可用的約會。它會將下列回應傳回給 Amazon Lex,並將服務導向至再次引出約會日期的值。
{ "dialogAction": { "slotToElicit": "Date", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "2-15 (Wed)", "value": "Wednesday, February 15, 2017" }, { "text": "2-17 (Fri)", "value": "Friday, February 17, 2017" }, { "text": "2-20 (Mon)", "value": "Monday, February 20, 2017" }, { "text": "2-21 (Tue)", "value": "Tuesday, February 21, 2017" } ], "subTitle": "When would you like to schedule your root canal?", "title": "Specify Date" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "We do not have any availability on that date, is there another day which works for you?", "contentType": "PlainText" } }, "sessionAttributes": { "bookingMap": "{\"2017-02-16\": []}" } }
同樣地,回應也包含
dialogAction
和sessionAttributes
欄位。此外,dialogAction
會傳回以下欄位:-
dialogAction
欄位:-
type
— Lambda 函數將此值設定為,ElicitSlot
並將slotToElicit
欄位重設為Date
。Lambda 函數還提供了一個適當message
的傳達給用戶。 -
responseCard
– 傳回Date
槽的值清單。
-
-
sessionAttributes
-這次 Lambda 函數包含bookingMap
工作階段屬性。其值是要求的預約日期及可預約的時間 (空白物件表示沒有可預約的時間)。
-
-
Amazon Lex 會注意到
dialogAction.type
並將下列回應傳回給用戶端,其中包含來自 Lambda 函數回應的資訊。用戶端會顯示訊息:We do not have any availability on that date, is there another day which works for you? 和回應卡 (如果用戶端有支援回應卡)。
-
-
使用者:根據用戶端,使用者有兩個選項:
-
如果有顯示回應卡,請選擇 2-15 (Wed),或輸入
Wednesday
。 -
如果用戶端不支援回應卡,輸入
Wednesday
。
-
用戶端會將下列
PostText
要求傳送至 Amazon Lex:POST /bot/
BookTrip
/alias/$LATEST
/user/bijt6rovckwecnzesbthrr1d7lv3ja3n
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "Wednesday", "sessionAttributes": { } }注意
Facebook Messenger 用戶端不會設定任何工作階段屬性。如果您想要在請求之間維護工作階段狀態,則必須在 Lambda 函數中這樣做。在真實的應用程式中,您可能需要在後端資料庫中維護這些工作階段屬性。
-
Amazon Lex 透過傳送下列事件做為參數,叫用 Lambda 函數進行使用者資料驗證:
{ "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": { } }
Amazon Lex
currentIntent.slots
通過將Date
插槽設置為更新2017-02-15
。 -
Lambda 函數會驗證使用者輸入,並將下列回應傳回給 Amazon Lex,並引導該函數引出約會時間的值。
{ "dialogAction": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": "16:00" }, "message": { "content": "What time on 2017-02-15 works for you? 4:00 p.m. is our only availability, does that work for you?", "contentType": "PlainText" }, "type": "ConfirmIntent", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "yes", "value": "yes" }, { "text": "no", "value": "no" } ], "subTitle": "Is 4:00 p.m. on 2017-02-15 okay?", "title": "Confirm Appointment" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" } }, "sessionAttributes": { "bookingMap": "{\"2017-02-15\": [\"10:00\", \"16:00\", \"16:30\"]}" } }
同樣地,回應也包含
dialogAction
和sessionAttributes
欄位。此外,dialogAction
會傳回以下欄位:-
dialogAction
欄位:-
type
—Lambda
函數會將此值設定為ConfirmIntent
,指示 Amazon Lex 取得使用者確認中建議的約會時間message
。 -
responseCard
— 傳回是/否值清單,供使用者選擇。如果用戶端支援回應卡,它會顯示回應卡,如下例所示:
-
-
sessionAttributes
-Lambda 函數會設定bookingMap
工作階段屬性,其值設定為約會日期,並在該日期設定可用的約會。在這個範例中,這些是 30 分鐘的預約。對於需要一個小時的根管治療,只能預訂下午 4 點。
-
-
如 Lambda 函數回應
dialogAction.type
中所述,Amazon Lex 會將下列回應傳回給用戶端:客戶端顯示消息:2017-02-15 上的什麼時間適合您? 下午 4 點是我們唯一的可用性,這對你有用嗎?
-
-
使用者:選擇
yes
。Amazon Lex 使用下列事件資料叫用 Lambda 函數。因為使用者回覆了
yes
,Amazon Lex 會confirmationStatus
將設定為Confirmed
,並將Time
欄位設定currentIntent.slots
為4 p.m
。{ "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": "16:00" }, "name": "MakeAppointment", "confirmationStatus": "Confirmed" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "FulfillmentCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": { } }
由於
confirmationStatus
已確認,Lambda 函數會處理意圖 (預約牙科預約),並將下列回應傳回給 Amazon Lex:{ "dialogAction": { "message": { "content": "Okay, I have booked your appointment. We will see you at 4:00 p.m. on 2017-02-15", "contentType": "PlainText" }, "type": "Close", "fulfillmentState": "Fulfilled" }, "sessionAttributes": { "formattedTime": "4:00 p.m.", "bookingMap": "{\"2017-02-15\": [\"10:00\"]}" } }
注意下列事項:
-
Lambda 函數已更新
sessionAttributes
。 -
dialogAction.type
設定為Close
,這會指示 Amazon Lex 不會預期使用者回應。 -
dialogAction.fulfillmentState
設為Fulfilled
,指出意圖已順利達到。
客戶顯示消息:好的,我已經預約了你的約會。我們將在下午 4 點見。
-