기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS Lambda함수 사용
이 단원에서는 Lambda 함수를 봇 별칭에 연결하는 방법과 Amazon Lex V2가 Lambda 함수에 제공하는 이벤트 데이터의 구조를 설명합니다. 이 정보를 사용하여 Lambda 코드에 대한 입력을 분석할 수 있습니다. 또한 Amazon Lex V2에서 Lambda 함수가 반환할 것으로 예상하는 응답 형식에 대해서도 설명합니다.
Amazon Lex V2는 각 인텐트에 대해 하나의 Lambda 함수를 사용하는 대신 언어당 봇 별칭당 하나의 Lambda 함수를 사용합니다. 각 인텐트에 대해 개별 함수를 사용하기 위해 Lambda 함수 라우터 섹션에서는 사용할 수 있는 함수를 제공합니다.
Lambda 함수 사용 시, 그 함수에 사용할 수 있습니다.
-
대화가 시작되기 전에요. 예를 들어, 사용자에게 인식된 의도를 알려준 후
-
가 사용자로부터 슬롯 값을 추출한 후 예를 들어, 사용자가 주문하려는 피자의 크기를 봇에게 알려준 후입니다.
-
슬롯을 끌어내기 위해 다시 시도할 때마다 고객이 인식된 피자 크기를 사용하지 않는 경우를 예로 들 수 있습니다.
-
의도를 확인할 때. 예를 들어, 피자 주문을 확인할 때.
-
의도를 충족하기 위해. 피자를 주문하는 경우를 예로 들 수 있습니다.
-
의도가 충족된 후. 음료를 주문하려는 의도로 전환하는 경우를 예로 들 수 있습니다.
Lambda 함수를 봇 별칭에 연결
Amazon Lex V2를 사용하면 인텐트가 각 인텐트에 대해 Lambda 함수를 사용하도록 지정할 수 있습니다. 하지만 봇 별칭이 지원하는 각 언어에 대해 인텐트가 사용하는 Lambda 함수를 할당합니다. 이렇게 하면 봇 별칭이 지원하는 각 언어에 맞게 조정된 Lambda 함수를 생성할 수 있습니다.
콘솔 또는 CreateIntent또는 UpdateIntent작업을 사용하여 인텐트가 Lambda 함수를 사용해야 한다고 지정합니다. 인텐트 에디터에서는 에디터의 각 응답에 대해 Dialog code hook 섹션의 고급 옵션에서 Lambda 함수를 활성화합니다.
Amazon Lex V2에서 응답을 위한 코드 후크를 호출하는 방법을 제어하는 두 가지 방법이 있습니다. 코드 후크를 활성 또는 비활성으로 표시하고 활성화 또는 비활성화로 표시할 수 있습니다.
코드 후크가 활성화되면 Amazon Lex V2에서 코드 후크를 호출합니다. 코드 후크가 비활성화되면 Amazon Lex V2에서는 코드 후크를 실행하지 않습니다.
코드 후크가 활성으로 표시된 경우에만 활성화하거나 비활성화할 수 있습니다. 활성화로 표시되면 코드 후크가 정상적으로 실행됩니다. 비활성화되면 코드 후크가 호출되지 않고 Amazon Lex V2는 코드 후크가 성공적으로 반환된 것처럼 작동합니다.

각 봇 별칭에서 사용할 Lambda 함수를 정의합니다. 봇이 지원하는 언어의 모든 인텐트에 동일한 Lambda 함수가 사용됩니다.
봇 별칭과 함께 사용할 Lambda 함수를 선택하려면
-
https://console.aws.amazon.com/lexv2/
에서 Amazon Lex 콘솔을 엽니다. -
봇 목록에서 사용할 봇의 이름을 선택합니다.
-
배포용 버전 및 별칭 만들기에서 별칭 보기를 선택합니다.
-
별칭 목록에서 사용할 별칭의 이름을 선택합니다.
-
지원되는 언어 목록에서 Lambda 함수가 사용되는 언어를 선택합니다.
-
사용할 Lambda 함수 이름을 선택한 다음, 그 함수에 해당하는 별칭이나 별칭을 선택합니다.
-
[Save]를 선택하여 변경 사항을 저장합니다.
입력 이벤트 형식
다음은 Lambda 함수에 전달되는 Amazon Lex V2 이벤트의 일반 형식입니다. Lambda 함수를 작성할 때 이 정보를 사용하십시오.
입력 형식은 해당 변경 없이 변경될 수messageVersion
있습니다. 새 필드가 있는 경우 코드에서 오류가 발생하지 않아야 합니다.
{
"messageVersion": "1.0",
"invocationSource": "DialogCodeHook | FulfillmentCodeHook",
"inputMode": "DTMF | Speech | Text",
"responseContentType": "CustomPayload | ImageResponseCard | PlainText | SSML",
"sessionId": "string",
"inputTranscript": "string",
"invocationLabel": "string",
"bot": {
"id": "string",
"name": "string",
"aliasId": "string",
"localeId": "string",
"version": "string"
},
"interpretations": [
{
"intent": {
"confirmationState": "Confirmed | Denied | None",
"name": "string",
"slots": {
"string": {
"value": {
"interpretedValue": "string",
"originalValue": "string",
"resolvedValues": [
"string"
]
}
},
"string": {
"shape": "List",
"value": {
"interpretedValue": "string",
"originalValue": "string",
"resolvedValues": [
"string"
]
},
"values": [
{
"shape": "Scalar",
"value": {
"originalValue": "string",
"interpretedValue": "string",
"resolvedValues": [
"string"
]
}
},
{
"shape": "Scalar",
"value": {
"originalValue": "string",
"interpretedValue": "string",
"resolvedValues": [
"string"
]
}
}
]
}
},
"state": "Failed | Fulfilled | FulfillmentInProgress | InProgress | ReadyForFulfillment | Waiting",
"kendraResponse": {
// Only present when intent is KendraSearchIntent. For details, see
// https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html#API_Query_ResponseSyntax
}
},
"nluConfidence": number,
"sentimentResponse": {
"sentiment": "string",
"sentimentScore": {
"mixed": number,
"negative": number,
"neutral": number,
"positive": number
}
}
}
],
"proposedNextState": {
"dialogAction": {
"slotToElicit": "string",
"type": "Close | ConfirmIntent | Delegate | ElicitIntent | ElicitSlot"
},
"intent": {
"name": "string",
"confirmationState": "Confirmed | Denied | None",
"slots": {},
"state": "Failed | Fulfilled | InProgress | ReadyForFulfillment | Waiting"
},
"prompt": {
"attempt": "string"
}
},
"requestAttributes": {
"string": "string"
},
"sessionState": {
"activeContexts": [
{
"name": "string",
"contextAttributes": {
"string": "string"
},
"timeToLive": {
"timeToLiveInSeconds": number,
"turnsToLive": number
}
}
],
"sessionAttributes": {
"string": "string"
},
"runtimeHints": {
"slotHints": {
"string": {
"string": {
"runtimeHintValues": [
{
"phrase": "string"
},
{
"phrase": "string"
}
]
}
}
}
},
"dialogAction": {
"slotToElicit": "string",
"type": "Close | ConfirmIntent | Delegate | ElicitIntent | ElicitSlot"
},
"intent": {
"confirmationState": "Confirmed | Denied | None",
"name": "string",
"slots": {
"string": {
"value": {
"interpretedValue": "string",
"originalValue": "string",
"resolvedValues": [
"string"
]
}
},
"string": {
"shape": "List",
"value": {
"interpretedValue": "string",
"originalValue": "string",
"resolvedValues": [
"string"
]
},
"values": [
{
"shape": "Scalar",
"value": {
"originalValue": "string",
"interpretedValue": "string",
"resolvedValues": [
"string"
]
}
},
{
"shape": "Scalar",
"value": {
"originalValue": "string",
"interpretedValue": "string",
"resolvedValues": [
"string"
]
}
}
]
}
},
"state": "Failed | Fulfilled | FulfillmentInProgress | InProgress | ReadyForFulfillment | Waiting",
"kendraResponse": {
// Only present when intent is KendraSearchIntent. For details, see
// https://docs.aws.amazon.com/kendra/latest/dg/API_Query.html#API_Query_ResponseSyntax }
},
"originatingRequestId": "string"
}
},
"transcriptions": [
{
"transcription": "string",
"transcriptionConfidence": number,
"resolvedContext": {
"intent": "string"
},
"resolvedSlots": {
"string": {
"shape": "List",
"value": {
"originalValue": "string",
"resolvedValues": [
"string"
]
},
"values": [
{
"shape": "Scalar",
"value": {
"originalValue": "string",
"resolvedValues": [
"string"
]
}
},
{
"shape": "Scalar",
"value": {
"originalValue": "string",
"resolvedValues": [
"string"
]
}
}
]
}
}
}
]
}
다음은 이벤트 필드에 대한 추가 정보입니다.
-
MessageVersion — Lambda 함수로 전달되는 이벤트 데이터의 형식과 Lambda 함수에서 예상되는 응답 형식을 식별하는 messageVersion 버전입니다.
참고 의도를 정의할 때 이 값을 구성합니다. 현재 구현에서는 메시지 버전 1.0만 지원됩니다. 따라서 콘솔은 기본값을 1.0으로 가정하며 이는 메시지 버전에 표시되지 않습니다.
-
invocationSource — Lambda 함수를 호출한 작업을 나타냅니다. 소스가
DialogCodeHook
인 경우 사용자가 입력한 후 Lambda 함수가 호출되었습니다. 소스가FulfillmentCodeHook
Lambda 함수일 때 필요한 슬롯이 모두 채워지고 인텐트가 이행될 준비가 된 후에 호출됩니다. -
입력 모드 — 사용자 발화 유형입니다. 유효한 값은
Speech
,DTMF
또는Text
입니다. -
responseContentType— 봇이 사용자 입력에 텍스트 또는 음성으로 응답할지 결정합니다.
-
sessionId — 대화에 사용되는 세션 식별자입니다.
-
InputTranscript — 사용자의 입력을 처리하는 데 사용된 텍스트입니다. 텍스트 또는 DTMF 입력의 경우 사용자가 입력한 텍스트입니다. 음성 입력의 경우 음성에서 인식된 텍스트입니다.
-
호출 레이블 — Lambda 함수를 호출한 응답을 나타내는 값입니다. 초기 응답, 슬롯 및 확인 응답에 대한 호출 레이블을 설정할 수 있습니다.
-
bot — 요청을 처리한 봇에 대한 정보입니다.
-
id — 봇을 만들 때 봇에 할당된 식별자입니다. Amazon Lex V2 콘솔의 봇 설정 페이지에서 봇 ID를 확인할 수 있습니다.
-
이름 — 봇을 만들 때 지정한 이름입니다.
-
AliasID — 봇 별칭을 만들 때 봇 별칭에 할당된 식별자입니다. Amazon Lex V2 콘솔의 별칭 페이지에서 봇 별칭 ID를 확인할 수 있습니다. 목록에서 별칭 ID가 보이지 않으면 오른쪽 상단의 톱니바퀴 아이콘을 선택하고 Alias ID를 켜십시오.
-
LocaleID — 봇에 사용한 로케일의 식별자입니다. 로케일 목록은 을 참조하십시오Amazon Lex V2에서 지원하는 언어 및 로케일.
-
버전 — 요청을 처리한 봇의 버전입니다.
-
-
해석 — Amazon Lex V2에서 사용자의 발언과 일치할 수 있다고 간주하는 하나 이상의 인텐트입니다. 자세한 내용은 해석을 참조하십시오.
-
proposedNextState— Lambda 함수가 를 to로 설정한 경우 사용자와 봇 간에 발생할 것으로 예상되는 다음 대화 상태입니다
Delegate
.dialogAction
sessionState
에서 대화상자 동작을 재정의하는sessionState
경우 다음 상태는 Lambda 함수에서 반환한 설정에 따라 달라집니다. 이 정보를 사용하여 Amazon Lex V2가 다음 조치로 제안하는 내용을 기반으로 Lambda 함수의 동작을 수정할 수 있습니다. 이 구조는invocationSource
필드가 일 때와 예측된 대화 동작이DialogCodeHook
일 때만 표시된다는 점에ElicitSlot
유의하세요.-
DialogAction — Amazon Lex V2가 다음 턴에 제안하는 조치
slotToElicit
및 조치를 포함합니다.type
-
의도 — 사용자가 이행하려고 한다고 봇이 판단한 의도입니다. 자세한 내용은 Intent를 참조하세요.
-
프롬프트는 봇이 슬롯을 추출하는 데 사용하는 프롬프트입니다.
-
-
RequestAttributes — 클라이언트가 요청에서 보내는 요청별 속성입니다. 전체 세션에서 유지할 필요가 없는 정보를 전달하려면 요청 속성을 사용합니다.
-
세션 상태 — 사용자와 Amazon Lex V2 봇 간의 현재 대화 상태입니다. 세션 상태에 대한 자세한 내용은 단원을 참조하십시오 SessionState.
-
dialogAction — Amazon Lex V2가 Lambda 함수에 응답하여 취해야 하는 작업 유형을 결정합니다. 이 필드는 현재 항상 비어 있습니다.
-
-
트랜스크립션 — Amazon Lex V2에서 사용자의 오디오 발화와 일치할 수 있다고 간주하는 하나 이상의 트랜스크립션. 자세한 정보는 음성 트랜스크립션 신뢰도 점수 사용을 참조하세요.
응답 형식
Amazon Lex V2에서는 Lambda 함수에서 다음 형식의 응답을 기대합니다.
{
"sessionState": {
"activeContexts": [
{
"name": "string",
"contextAttributes": {
"key": "value"
},
"timeToLive": {
"timeToLiveInSeconds": number,
"turnsToLive": number
}
}
],
"sessionAttributes": {
"string": "string"
},
"runtimeHints": {
"slotHints": {
"string": {
"string": {
"runtimeHintValues": [
{
"phrase": "string"
},
{
"phrase": "string"
}
]
}
}
}
},
"dialogAction": {
"slotElicitationStyle": "Default | SpellByLetter | SpellByWord",
"slotToElicit": "string",
"type": "Close | ConfirmIntent | Delegate | ElicitIntent | ElicitSlot"
},
"intent": {
"confirmationState": "Confirmed | Denied | None",
"name": "string",
"slots": {
"string": {
"value": {
"interpretedValue": "string",
"originalValue": "string",
"resolvedValues": [
"string"
]
}
},
"string": {
"shape": "List",
"value": {
"originalValue": "string",
"interpretedValue": "string",
"resolvedValues": [
"string"
]
},
"values": [
{
"shape": "Scalar",
"value": {
"originalValue": "string",
"interpretedValue": "string",
"resolvedValues": [
"string"
]
}
},
{
"shape": "Scalar",
"value": {
"originalValue": "string",
"interpretedValue": "string",
"resolvedValues": [
"string"
]
}
}
]
}
},
"state": "Failed | Fulfilled | FulfillmentInProgress | InProgress | ReadyForFulfillment | Waiting"
}
},
"messages": [
{
"contentType": "CustomPayload | ImageResponseCard | PlainText | SSML",
"content": "string",
"imageResponseCard": {
"title": "string",
"subtitle": "string",
"imageUrl": "string",
"buttons": [
{
"text": "string",
"value": "string"
}
]
}
}
],
"requestAttributes": {
"string": "string"
}
}
응답 필드에 대한 다음 추가 정보에 유의합니다.
-
세션 상태 — 필수. 가 사용자와의 현재 대화 상태입니다. 구조의 실제 내용은 대화 동작 유형에 따라 달라집니다. 자세한 내용은 단원을 참조하십시오 SessionState.
-
ActiveContext — 사용자가 세션에서 사용 중인 컨텍스트에 대한 정보가 들어 있습니다. 자세한 내용은 인텐트 컨텍스트 설정을 참조하십시오 ActiveContext.
-
SessionAttributes — 세션별 컨텍스트 정보를 나타내는 키/값 쌍의 맵입니다. 자세한 내용은 세션 속성 설정을 참조하세요.
-
RuntimeHints — 고객이 슬롯에 사용할 가능성이 높은 문구에 대한 힌트를 제공합니다. 자세한 내용은 단원을 참조하십시오 RuntimeHints.
-
dialogAction — 필수. Amazon Lex V2가 Lambda 함수에 응답하여 취해야 하는 작업 유형을 결정합니다.
-
slotElicitationStyle— 슬롯의 사용 spell-by-letter 또는 spell-by-word 스타일 여부를 결정합니다. 자세한 내용은 맞춤법 스타일을 사용하여 슬롯 값 캡처를 참조하십시오.
-
slotToElicit— 인 경우에만
dialogAction.type
필요합니다ElicitSlot
. 사용자로부터 끌어낼 슬롯을 정의합니다. -
유형 — 필수. 봇이 실행해야 하는 동작을 정의합니다.
-
-
인텐트 — Amazon Lex V2에서 사용해야 하는 인텐트의 이름입니다.
Delegate
또는 일 때는dialogAction.type
필요하지 않습니다ElicitIntent
.-
상태 — 필수. 상태는 다음과 같은
ReadyForFulfillment
경우에만dialogAction.type
가능합니다Delegate
.
-
-
-
메시지 — 있는 경우
dialogAction.type
필수입니다ElicitIntent
. 다음 번 대화를 진행하기 위해 Amazon Lex V2가 고객에게 보여주는 하나 이상의 메시지. 메시지를 제공하지 않는 경우 Amazon Lex V2는 봇 생성 시 정의된 적절한 메시지를 사용합니다. 자세한 내용은 메시지 데이터 유형을 참조하세요.-
콘텐츠 유형 — 사용할 메시지 유형입니다.
-
콘텐츠 — 메시지 유형이
PlainText
CustomPayload
SSML
, 또는 인 경우content
필드에는 사용자에게 보낼 메시지가 포함됩니다. -
imageResponseCard— 메시지 유형이
ImageResponseCard
인 경우 사용자에게 표시할 응답 카드의 정의가 포함됩니다. 자세한 내용은 ImageResponseCard데이터 유형을 참조하세요.
-
-
RequestAttributes — 클라이언트가 요청에서 보낸 요청별 속성입니다.
Lambda 라우터 함수
Amazon Lex V2 API로 봇을 구축하는 경우 각 인텐트에 대한 Lambda 함수 대신 언어당 봇 별칭당 Lambda 함수가 하나씩만 있습니다. 별도의 함수를 사용하려면 각 인텐트에 대해 별도의 함수를 활성화하는 라우터 함수를 만들 수 있습니다. 다음은 애플리케이션에 맞게 사용하거나 수정할 수 있는 라우터 함수입니다.
import os import json import boto3 # reuse client connection as global client = boto3.client('lambda') def router(event): intent_name = event['sessionState']['intent']['name'] fn_name = os.environ.get(intent_name) print(f"Intent: {intent_name} -> Lambda: {fn_name}") if (fn_name): # invoke lambda and return result invoke_response = client.invoke(FunctionName=fn_name, Payload = json.dumps(event)) print(invoke_response) payload = json.load(invoke_response['Payload']) return payload raise Exception('No environment variable for intent: ' + intent_name) def lambda_handler(event, context): print(event) response = router(event) return response