사용AWS Lambda기능 - Amazon Lex

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

사용AWS Lambda기능

이 단원에서는 Lambda 함수를 봇 별칭에 연결하는 방법과 Amazon Lex V2가 Lambda 함수에 제공하는 이벤트 데이터의 구조에 대해 설명합니다. Lambda 코드에 대한 입력을 분석하려면 이 정보를 사용합니다. 또한 Amazon Lex V2에서 Lambda 함수가 반환할 것으로 Amazon Lex V2에서 예상하는 응답 형식에 대해 설명합니다.

Amazon Lex V2는 각 인텐트에 대해 하나의 Lambda 함수 대신 언어당 봇 별칭당 하나의 Lambda 함수를 사용합니다. 각 인텐트에 대해 개별 함수를 사용하기 위해 Lambda 함수 라우터 섹션에서 사용할 수 있는 함수를 제공합니다.

봇 별칭에 Lambda 함수 연결

Amazon Lex V2에서는 인텐트가 각 인텐트에 대해 Lambda 함수를 사용해야 함을 나타냅니다. 그러나 봇 별칭에서 지원하는 각 언어에 대해 인텐트가 사용하는 Lambda 함수를 할당합니다. 이렇게 하면 봇 별칭이 지원하는 각 언어에 맞게 조정된 Lambda 함수를 생성할 수 있습니다.

사용자는 인텐트가 콘솔 또는 을 사용하여 Lambda 함수를 사용해야 함을 나타냅니다.CreateIntent또는UpdateIntent작업. 인텐트 편집기에서 Lambda 함수를 켭니다.코드 후크편집기의 섹션입니다.


                Amazon Lex V2 인텐트 편집기의 코드 후크 섹션입니다.

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

봇 별칭과 함께 사용할 Lambda 함수를 선택하려면

  1. 에서 Amazon Lex 콘솔을 엽니다.https://console.aws.amazon.com/lexv2/.

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

  3. From배포를 위한 버전 및 별칭 만들기, 선택별칭 보기.

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

다음은 이벤트 필드에 대한 추가 정보입니다.

  • invocationSource— Lambda 함수를 호출한 작업을 나타냅니다. 소스가 다음과 같을 때DialogCodeHook, 사용자의 입력 후 Lambda 함수가 호출되었습니다. 소스가 다음과 같을 때FulfillmentCodeHook필요한 모든 슬롯이 채워지고 인텐트가 이행될 준비가 된 후에 Lambda 함수가 호출되었습니다.

  • inputTranscript— 사용자의 입력을 처리하는 데 사용된 텍스트입니다. 텍스트 또는 DTMF 입력의 경우 사용자가 입력한 텍스트입니다. 음성 입력의 경우 이 텍스트는 음성에서 인식된 텍스트입니다.

  • 해석— Amazon Lex V2가 사용자의 발언과 일치할 수 있는 것으로 간주하는 하나 이상의 인텐트입니다. 자세한 정보는 Interpretation을 참조하십시오.

  • 제안된 넥스트스테이트— Lambda 함수가 흐름을 변경하지 않는 경우 사용자와 봇 사이의 대화 상자의 다음 상태입니다. 자세한 정보는 proposedNextState구조을 참조하십시오.

  • requestAttributes— 클라이언트가 요청에서 전송하는 요청별 속성입니다. 전체 세션에서 유지할 필요가 없는 정보를 전달하려면 요청 속성을 사용합니다.

  • 세션스테이트— 사용자와 Amazon Lex V2 봇 간의 대화의 현재 상태입니다. 세션 상태에 대한 자세한 내용은 단원을 참조하십시오.SessionState.

  • 필기— Amazon Lex V2가 사용자의 오디오 발언과 일치할 수 있는 것으로 간주하는 하나 이상의 전사 자세한 정보는 음성 녹음 신뢰도 점수 사용을 참조하십시오.

proposedNextState구조

proposedNextStatestructure에는 Lambda 함수가 다음을 설정할 경우 봇이 수행할 다음 작업에 대한 정보가 들어 있습니다.dialogActionDelegate. 이 정보를 사용하여 Amazon Lex V2가 다음 작업으로 제안하는 내용에 따라 Lambda 함수의 동작을 수정할 수 있습니다.

예를 들어 인텐트에 성과 이름에 대한 슬롯이 있다고 가정합니다. 이름 슬롯을 채운 후proposedNextState다음 턴에서 이끌어낼 슬롯이 성 슬롯임을 나타냅니다. 데이터베이스에 이름과 연관된 성을 쿼리하고 그 결과를 슬롯에 대한 런타임 힌트로 제공할 수 있습니다. 런타임 힌트에 대한 자세한 내용은 단원을 참조하십시오.런타임 힌트를 사용하여 슬롯 값 인식 향상.

proposedNextState구조에는 Amazon Lex V2가 다음에 수행할 대화상자 작업이 포함되어 있습니다. 또한 이끌어낼 슬롯과 봇이 사용자가 이행하려고 한다고 판단한 의도를 나타냅니다.

proposedNextState구조는 다음과 같은 경우에만 존재합니다.invocationSource필드는 입니다.DialogCodeHook예측된 대화 상자 동작이 다음과 같은 경우ElicitSlot.

에 대한 예측proposedNextStateLambda 함수가 세션 상태를 설정하는 경우에만 true를 보유합니다.dialogActionDelegate대화 동작 또는 의도를 설정하여 대화 상자의 동작을 재정의하지 않는 경우 에서 대화상자 동작을 재정의하는 경우sessionState다음 상태는 Lambda 함수에서 반환하는 설정에 따라 다릅니다.

응답 형식

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

다음은 응답 필드에 대한 추가 정보입니다.

  • 세션스테이트- 필수입니다. 사용자와의 대화에 대한 현재 상태입니다. 구조의 실제 내용은 대화상자 작업의 유형에 따라 달라집니다.

    • dialogAction— Amazon Lex V2가 Lambda 함수에 대한 응답으로 수행해야 하는 작업 유형을 결정합니다. 이type필드는 항상 필수 항목입니다. 이slotToElicit필드만 필수 입력dialogAction.type입니다ElicitSlot.

    • 의지— Amazon Lex V2가 사용해야 하는 인텐트의 이름입니다. 경우에는 필요하지 않습니다.dialogAction.type입니다Delegate또는ElicitIntent.

      • state- 필수입니다. 상태는 다음과 같을 수 있습니다.ReadyForFulfillment만약dialogAction.type입니다Delegate.

  • 메시지—: 필수dialogAction.type입니다ElicitIntent. Amazon Lex V2가 고객에게 다음 번 대화를 수행하기 위해 표시하는 하나 이상의 메시지입니다. 메시지를 제공하지 않으면 Amazon Lex V2에서는 봇이 생성될 때 정의된 적절한 메시지를 사용합니다. 자세한 내용은 단원을 참조하십시오.Message데이터 유형.

    • ContentType— 사용할 메시지의 유형입니다.

    • 함유량— 메시지 유형이 인 경우PlainText,CustomPayload또는SSML,content필드에는 사용자에게 보낼 메시지가 포함됩니다.

    • 이미지 응답카드— 메시지 유형이 인 경우ImageResponseCard에는 사용자에게 표시할 응답 카드의 정의가 포함되어 있습니다. 자세한 내용은 단원을 참조하십시오.ImageResponseCard데이터 유형.

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