정보 흐름의 세부 정보 - Amazon Lex V1

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 함수 입력 이벤트 및 응답 형식을 참조하세요.

참고

이 예제에서는 요청에서 세션 속성을 Amazon Lex에 전달하지 않는 Facebook Messenger 클라이언트를 사용한다고 가정합니다. 따라서, 이 섹션에 나와 있는 예제 요청은 빈 sessionAttributes을 표시합니다. Amazon Lex 콘솔에 제공된 클라이언트를 사용하여 봇을 테스트할 경우, 클라이언트에 세션 속성이 포함됩니다.

이 섹션에서는 각 사용자가 입력한 후에 일어나는 상황을 설명합니다.

  1. 사용자: 유형 Book an appointment.

    1. 클라이언트(콘솔)는 Amazon Lex에 다음 PostContent 요청을 보냅니다.

      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를 제공합니다. 후행 기호는 요청이 PostText (아님PostContent) text 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 – Lambda 함수는 이 필드를 ElicitSlot으로 설정하여 slotToElicit 필드에 지정된 슬롯의 값을 유도하도록 Amazon Lex에 지시합니다. 또한 Lambda 함수는 사용자에게 전달할 message를 제공합니다.

      • responseCardAppointmentType 슬롯의 가능한 값 목록을 식별합니다. 응답 카드를 지원하는 클라이언트(예: Facebook Messenger)는 사용자가 예약 유형을 선택할 수 있도록 다음 이미지와 같은 응답 카드를 표시합니다.

        예약할 예약 유형과 클리닝(30분), 신경치료(60분), 미백(30분)의 세 가지 옵션을 묻는 응답 카드.
    4. Lambda 함수 응답 내의 dialogAction.type에서 지정된 바에 따라, Amazon Lex는 클라이언트에 다음 응답을 다시 보냅니다.

      JSON약속을 잡으려는 의도와 유도하려는 약속 유형 슬롯에 대한 정보가 포함된 응답.

      클라이언트는 응답을 읽은 다음 "어떤 유형의 예약을 진행하고 싶으세요?"라는 메시지를 표시한 뒤에. 응답 카드(클라이언트가 응답 카드를 지원하는 경우)를 표시합니다.

  2. 사용자: 클라이언트에 따라 사용자에게는 다음과 같은 두 가지 옵션이 있습니다.

    • 응답 카드가 표시되는 경우 신경치료(60 분)을 선택하거나 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": {} }

      이벤트 데이터에서 다음 사항에 유의하십시오.

      • invocationSourceDialogCodeHook로 계속됩니다. 이 단계에서는 사용자 데이터만 검증합니다.

      • 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 – Lambda 함수는 이 필드를 ElicitSlot으로 설정하여 slotToElicit 필드에 지정된 슬롯의 값을 유도하도록 Amazon Lex에 지시합니다. 또한 Lambda 함수는 사용자에게 전달할 message를 제공합니다.

      • responseCardDate 슬롯의 가능한 값 목록을 식별합니다. 응답 카드를 지원하는 클라이언트(예: Facebook Messenger)는 사용자가 약속 날짜를 선택할 수 있도록 다음과 같은 응답 카드를 표시합니다.

        신경치료 예약 날짜를 유도하는 응답 카드와 2-15, 2-16, 2-17의 세 가지 옵션.

        Lambda 함수는 날짜 다섯 개를 반환했지만 클라이언트(Facebook Messenger)에는 응답 카드의 버튼이 세 개로 제한되어 있습니다. 따라서 스크린샷에서 첫 세 개의 값만 볼 수 있습니다.

        이러한 날짜는 Lambda 함수 에 하드 코딩 됩니다. 프로덕션 애플리케이션에서는 달력을 사용하여 실시간으로 예약 가능한 날짜를 가져올 수 있습니다. 날짜가 동적이므로 Lambda 함수 에서 응답 카드를 동적으로 생성해야 합니다.

    4. Amazon Lex는 dialogAction.type을 공지하고 Lambda 함수 응답에서 얻은 정보가 포함된 응답을 클라이언트에게 반환합니다.

      JSON약속을 잡겠다는 의사, 기입된 약속 유형, 약속 날짜를 알려주는 메시지가 포함된 응답.

      클라이언트는 언제 신경치료를 예약하시겠어요? 메시지와 응답 카드(클라이언트가 응답 카드를 지원하는 경우)를 표시합니다.

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

      이벤트 데이터에서 다음 사항에 유의하십시오.

      • invocationSourceDialogCodeHook로 계속됩니다. 이 단계에서는 사용자 데이터를 검증만 합니다.

      • 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를 제공합니다.

        • responseCardDate 슬롯의 값 목록을 반환합니다.

      • sessionAttributes - 이때 Lambda 함수 에는 bookingMap 세션 속성이 포함되어 있습니다. 이 값은 요청된 약속 날짜와 예약 가능한 약속입니다(빈 객체는 예약이 불가함을 나타냄).

    4. Amazon Lex는 dialogAction.type을 공지하고 Lambda 함수 응답에서 얻은 정보가 포함된 응답을 클라이언트에게 반환합니다.

      JSON약속을 잡겠다는 의사를 보여주는 응답 및 고객이 요청한 날짜에 예약이 불가능하다는 점을 명확히 하는 메시지.

      클라이언트는 해당 날짜에는 예약할 수 없으니, 다른 가능한 날이 있을까요? 메시지와 응답 카드(클라이언트가 응답 카드를 지원하는 경우)를 표시합니다.

  4. 사용자: 클라이언트에 따라 사용자에게는 다음과 같은 두 가지 옵션이 있습니다.

    • 응답 카드가 표시되는 경우 2-15(수) 또는 유형 Wednesday를 선택합니다.

    • 클라이언트가 응답 카드를 지원하지 않는 경우 Wednesday을 입력합니다.

    1. 클라이언트는 Amazon Lex에 다음 PostText 요청을 보냅니다.

      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는 Date슬롯을 2017-02-15로 설정하여 currentIntent.slots를 업데이트했습니다.

    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로 설정하여 message에 제시된 약속 시간에 대한 사용자 확인을 받도록 Amazon Lex에 지시합니다.

        • responseCard – 사용자가 선택할 수 있는 예 혹은 아니오 값 목록을 반환합니다. 클라이언트가 응답 카드를 지원하는 경우, 다음 예와 같이 응답 카드를 표시합니다.

          예약 확인과 두 가지 옵션 (예, 아니요)가 표시된 응답 카드.
      • sessionAttributes - Lambda 함수는 해당 예약 날짜와 그 예약 날짜에 가능한 예약 시간으로 값을 지정하여 bookingMap 세션 속성을 설정합니다. 이 예에서는 30분 진료 예약입니다. 진료 시간이 1시간 걸리는 신경 치료의 경우에는, 4:00 p.m만 예약할 수 있습니다.

    4. Lambda 함수 의 응답 내의 dialogAction.type에 지정된 설정에 따라 Amazon Lex는 클라이언트에 다음 응답을 반환합니다.

      JSON약속을 잡겠다는 의사를 보여주는 응답과 빈칸이 모두 채워졌습니다.

      클라이언트는 다음과 같은 메시지를 표시합니다. 2017-02-15 중 언제가 괜찮나요? 이용 가능 시간은 4:00 p.m 뿐입니다. 가능한가요?

  5. 사용자: yes를 선택합니다.

    Amazon Lex는 다음 이벤트 데이터로 Lambda 함수를 간접 호출합니다. 사용자가 yes를 회신했기 때문에 Amazon Lex는 confirmationStatusConfirmed으로 설정하고, currentIntent.slots 필드 내의 Time4 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.typeClose로 설정됩니다. 이는 사용자 응답을 기대하지 않도록 Amazon Lex에 지시합니다.

    • dialogAction.fulfillmentStateFulfilled로 설정됩니다. 이는 의도가 이행되었음을 나타냅니다.

    클라이언트는 네, 예약을 처리했습니다. 메시지를 표시합니다. 2017-02-15 4:00 p.m에 뵙겠습니다. 메시지를 표시합니다.