AWS Lambda함수 사용 - Amazon Lex

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

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는 코드 후크가 성공적으로 반환된 것처럼 작동합니다.


                Amazon Lex V2 인텐트 에디터의 코드 후크 섹션입니다.

각 봇 별칭에서 사용할 Lambda 함수를 정의합니다. 봇이 지원하는 언어의 모든 인텐트에 동일한 Lambda 함수가 사용됩니다.

봇 별칭과 함께 사용할 Lambda 함수를 선택하려면
  1. https://console.aws.amazon.com/lexv2/ 에서 Amazon Lex 콘솔을 엽니다.

  2. 봇 목록에서 사용할 봇의 이름을 선택합니다.

  3. 배포용 버전 및 별칭 만들기에서 별칭 보기를 선택합니다.

  4. 별칭 목록에서 사용할 별칭의 이름을 선택합니다.

  5. 지원되는 언어 목록에서 Lambda 함수가 사용되는 언어를 선택합니다.

  6. 사용할 Lambda 함수 이름을 선택한 다음, 그 함수에 해당하는 별칭이나 별칭을 선택합니다.

  7. [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.dialogActionsessionState 에서 대화상자 동작을 재정의하는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는 봇 생성 시 정의된 적절한 메시지를 사용합니다. 자세한 내용은 메시지 데이터 유형을 참조하세요.

    • 콘텐츠 유형 — 사용할 메시지 유형입니다.

    • 콘텐츠 — 메시지 유형이PlainTextCustomPayloadSSML, 또는 인 경우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