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 콘솔에 제공된 클라이언트를 사용하여 봇을 테스트할 경우, 클라이언트에 세션 속성이 포함됩니다.
이 섹션에서는 각 사용자가 입력한 후에 일어나는 상황을 설명합니다.
-
사용자: 유형
Book an appointment
.-
클라이언트(콘솔)는 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
를 포함합니다.
-
-
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
– Lambda 함수는 이 필드를ElicitSlot
으로 설정하여slotToElicit
필드에 지정된 슬롯의 값을 유도하도록 Amazon Lex에 지시합니다. 또한 Lambda 함수는 사용자에게 전달할message
를 제공합니다. -
responseCard
–AppointmentType
슬롯의 가능한 값 목록을 식별합니다. 응답 카드를 지원하는 클라이언트(예: Facebook Messenger)는 사용자가 예약 유형을 선택할 수 있도록 다음 이미지와 같은 응답 카드를 표시합니다.
-
-
Lambda 함수 응답 내의
dialogAction.type
에서 지정된 바에 따라, Amazon Lex는 클라이언트에 다음 응답을 다시 보냅니다.클라이언트는 응답을 읽은 다음 "어떤 유형의 예약을 진행하고 싶으세요?"라는 메시지를 표시한 뒤에. 응답 카드(클라이언트가 응답 카드를 지원하는 경우)를 표시합니다.
-
-
사용자: 클라이언트에 따라 사용자에게는 다음과 같은 두 가지 옵션이 있습니다.
-
응답 카드가 표시되는 경우 신경치료(60 분)을 선택하거나
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
– Lambda 함수는 이 필드를ElicitSlot
으로 설정하여slotToElicit
필드에 지정된 슬롯의 값을 유도하도록 Amazon Lex에 지시합니다. 또한 Lambda 함수는 사용자에게 전달할message
를 제공합니다. -
responseCard
–Date
슬롯의 가능한 값 목록을 식별합니다. 응답 카드를 지원하는 클라이언트(예: Facebook Messenger)는 사용자가 약속 날짜를 선택할 수 있도록 다음과 같은 응답 카드를 표시합니다.Lambda 함수는 날짜 다섯 개를 반환했지만 클라이언트(Facebook Messenger)에는 응답 카드의 버튼이 세 개로 제한되어 있습니다. 따라서 스크린샷에서 첫 세 개의 값만 볼 수 있습니다.
이러한 날짜는 Lambda 함수 에 하드 코딩 됩니다. 프로덕션 애플리케이션에서는 달력을 사용하여 실시간으로 예약 가능한 날짜를 가져올 수 있습니다. 날짜가 동적이므로 Lambda 함수 에서 응답 카드를 동적으로 생성해야 합니다.
-
-
Amazon Lex는
dialogAction.type
을 공지하고 Lambda 함수 응답에서 얻은 정보가 포함된 응답을 클라이언트에게 반환합니다.클라이언트는 언제 신경치료를 예약하시겠어요? 메시지와 응답 카드(클라이언트가 응답 카드를 지원하는 경우)를 표시합니다.
-
-
사용자: 유형
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 함수 응답에서 얻은 정보가 포함된 응답을 클라이언트에게 반환합니다.클라이언트는 해당 날짜에는 예약할 수 없으니, 다른 가능한 날이 있을까요? 메시지와 응답 카드(클라이언트가 응답 카드를 지원하는 경우)를 표시합니다.
-
-
사용자: 클라이언트에 따라 사용자에게는 다음과 같은 두 가지 옵션이 있습니다.
-
응답 카드가 표시되는 경우 2-15(수) 또는 유형
Wednesday
를 선택합니다. -
클라이언트가 응답 카드를 지원하지 않는 경우
Wednesday
을 입력합니다.
-
클라이언트는 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 함수 에서 그렇게 해야 합니다. 실제 어플리케이션에서는 백엔드 데이터베이스에서 이러한 세션 속성을 유지해야 할 수 있습니다.
-
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
를 업데이트했습니다. -
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
로 설정하여message
에 제시된 약속 시간에 대한 사용자 확인을 받도록 Amazon Lex에 지시합니다. -
responseCard
– 사용자가 선택할 수 있는 예 혹은 아니오 값 목록을 반환합니다. 클라이언트가 응답 카드를 지원하는 경우, 다음 예와 같이 응답 카드를 표시합니다.
-
-
sessionAttributes
- Lambda 함수는 해당 예약 날짜와 그 예약 날짜에 가능한 예약 시간으로 값을 지정하여bookingMap
세션 속성을 설정합니다. 이 예에서는 30분 진료 예약입니다. 진료 시간이 1시간 걸리는 신경 치료의 경우에는, 4:00 p.m만 예약할 수 있습니다.
-
-
Lambda 함수 의 응답 내의
dialogAction.type
에 지정된 설정에 따라 Amazon Lex는 클라이언트에 다음 응답을 반환합니다.클라이언트는 다음과 같은 메시지를 표시합니다. 2017-02-15 중 언제가 괜찮나요? 이용 가능 시간은 4:00 p.m 뿐입니다. 가능한가요?
-
-
사용자:
yes
를 선택합니다.Amazon Lex는 다음 이벤트 데이터로 Lambda 함수를 간접 호출합니다. 사용자가
yes
를 회신했기 때문에 Amazon Lex는confirmationStatus
를Confirmed
으로 설정하고,currentIntent.slots
필드 내의Time
를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
로 설정됩니다. 이는 의도가 이행되었음을 나타냅니다.
클라이언트는 네, 예약을 처리했습니다. 메시지를 표시합니다. 2017-02-15 4:00 p.m에 뵙겠습니다. 메시지를 표시합니다.
-