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

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

 

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

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

資訊流程的詳細資訊

ScheduleAppointment 機器人藍圖主要是展示如何運用動態產生的回應卡。本練習中的 Lambda 函數在其對 Amazon Lex 的回應中包含回應卡。Amazon Lex 在回覆客戶端時包含回應卡。本部分說明下列兩項:

注意

此範例假設您使用的是 Facebook 信使用戶端,該用戶端不會將要求中的工作階段屬性傳遞給 Amazon Lex。因此,本節所示的範例顯示空的 sessionAttributes。如果您使用 Amazon Lex 主控台中提供的用戶端測試機器人,用戶端會包含工作階段屬性。

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

  1. 使用者:類型Book an appointment

    1. 用戶端 (主控台) 傳送以下 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

    2. 從中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 版本。

    3. 目前,所有槽值都是 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": {} }

      回應包含 dialogActionsessionAttributes 欄位。此外,dialogAction 欄位會傳回以下欄位:

      • type— 透過將此欄位設定為ElicitSlot,Lambda 函數會指示 Amazon Lex 針對欄位中指定的插槽引出slotToElicit值。Lambda 函數還提供了message一個傳達給用戶。

      • responseCard— 識別AppointmentType插槽可能值的清單。支援回應卡片的用戶端 (例如 Facebook Messenger) 會顯示回應卡,讓使用者選擇約會類型,如下圖所示:

        響應卡詢問預約時間表和三個選項的類型:清潔(30 分鐘),根管(60 分鐘),和美白(30 分鐘)。
    4. 如 Lambda 函數回應dialogAction.type中所述,Amazon Lex 會將下列回應傳回給用戶端:

      JSON包含有關預約意圖和要引出的約會類型時段的信息的響應。

      客戶端讀取響應,然後顯示以下消息:「您想安排什麼類型的約會?」 以及回應卡 (如果用戶端支援回應卡的話)。

  2. 使用者:根據用戶端,使用者有兩個選項:

    • 如果顯示回應卡,請選擇 root canal (60 min) 或輸入 root canal

    • 如果用戶端不支援回應卡,輸入 root canal

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

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "root canal", "sessionAttributes": {} }
    2. 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欄位。

    3. 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": {} }

      同樣地,回應也包含 dialogActionsessionAttributes 欄位。此外,dialogAction 欄位會傳回以下欄位:

      • type— 透過將此欄位設定為ElicitSlot,Lambda 函數會指示 Amazon Lex 針對欄位中指定的插槽引出slotToElicit值。Lambda 函數還提供了message一個傳達給用戶。

      • responseCard— 識別Date插槽可能值的清單。支援回應卡 (例如 Facebook Messenger) 的用戶端會顯示回應卡,讓使用者選擇約會日期,如下圖所示:

        響應卡引出安排根管的日期和三個選項:2-15,2-16 和 2-17。

        雖然 Lambda 函數返回五個日期,客戶端(Facebook 信使)有一個響應卡三個按鈕的限制。因此,您在螢幕擷取畫面中只會看到前三個值。

        這些日期在 Lambda 函數中進行硬編碼。在生產應用程式中,您可以使用行事曆以即時取得可用的日期。由於日期是動態的,因此您必須在 Lambda 函數中動態產生回應卡。

    4. Amazon Lex 會注意到dialogAction.type並將下列回應傳回給用戶端,其中包含來自 Lambda 函數回應的資訊。

      JSON包含預約意圖,填寫的約會類型以及引出約會日期的消息的響應。

      用戶端會顯示訊息:When would you like to schedule your root canal? 和回應卡 (如果用戶端有支援回應卡)。

  3. 使用者:類型Thursday

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

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "Thursday", "sessionAttributes": {} }
    2. 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之間傳遞。

    3. 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\": []}" } }

      同樣地,回應也包含 dialogActionsessionAttributes 欄位。此外,dialogAction 會傳回以下欄位:

      • dialogAction 欄位:

        • type— Lambda 函數將此值設定為,ElicitSlot並將slotToElicit欄位重設為Date。Lambda 函數還提供了一個適當message的傳達給用戶。

        • responseCard – 傳回 Date 槽的值清單。

      • sessionAttributes-這次 Lambda 函數包含bookingMap工作階段屬性。其值是要求的預約日期及可預約的時間 (空白物件表示沒有可預約的時間)。

    4. Amazon Lex 會注意到dialogAction.type並將下列回應傳回給用戶端,其中包含來自 Lambda 函數回應的資訊。

      JSON表示意圖進行約會和消息的響應,澄清客戶要求的日期沒有可用性。

      用戶端會顯示訊息:We do not have any availability on that date, is there another day which works for you? 和回應卡 (如果用戶端有支援回應卡)。

  4. 使用者:根據用戶端,使用者有兩個選項:

    • 如果有顯示回應卡,請選擇 2-15 (Wed),或輸入 Wednesday

    • 如果用戶端不支援回應卡,輸入 Wednesday

    1. 用戶端會將下列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 函數中這樣做。在真實的應用程式中,您可能需要在後端資料庫中維護這些工作階段屬性。

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

    3. 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\"]}" } }

      同樣地,回應也包含 dialogActionsessionAttributes 欄位。此外,dialogAction 會傳回以下欄位:

      • dialogAction 欄位:

        • typeLambda 函數會將此值設定為ConfirmIntent,指示 Amazon Lex 取得使用者確認中建議的約會時間message

        • responseCard— 傳回是/否值清單,供使用者選擇。如果用戶端支援回應卡,它會顯示回應卡,如下例所示:

          響應卡顯示預約確認和兩個選項:是和否。
      • sessionAttributes-Lambda 函數會設定bookingMap工作階段屬性,其值設定為約會日期,並在該日期設定可用的約會。在這個範例中,這些是 30 分鐘的預約。對於需要一個小時的根管治療,只能預訂下午 4 點。

    4. 如 Lambda 函數回應dialogAction.type中所述,Amazon Lex 會將下列回應傳回給用戶端:

      JSON響應顯示意圖預約並填寫所有插槽。

      客戶端顯示消息:2017-02-15 上的什麼時間適合您? 下午 4 點是我們唯一的可用性,這對你有用嗎?

  5. 使用者:選擇 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 點見。