사용AWS Lambda기능 - Amazon Lex

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

사용AWS Lambda기능

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

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

Lambda 함수를 다음 단계에서 Lambda 함수를 사용할 수 있습니다.

  • 대화가 시작되기 전 예를 들어, 사용자에게 인식된 의도를 알린 후입니다.

  • 가 사용자로부터 슬롯 값을 추출한 후 예를 들어, 사용자가 봇에게 주문하려는 피자의 크기를 알려준 후입니다.

  • 각 재시도 사이에 슬롯을 끌어내십시오. 고객이 인식된 크기의 피자를 사용하지 않는 경우를 예로 들 수 있습니다.

  • 인텐트를 확인할 때 예: 피자 주문을 확인할 때.

  • 의도를 이루기 위해서요 예를 들어, 피자를 주문할 때.

  • 의도가 충족된 후 음료를 주문하려는 인텐트로 전환하는 경우를 예로 들 수 있습니다.

Lambda 함수를 봇 별칭에 연결

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

의도가 Lambda 함수를 사용해야 한다고 지정합니다.CreateIntent또는UpdateIntent조작. 인텐트 편집기의 고급 옵션에서 Lambda 함수를 활성화합니다.다이얼로그 코드 후크편집기의 각 응답에 대한 섹션

Amazon Lex V2에서 응답을 위해 코드 후크를 호출하는 방법을 제어하는 방법에는 두 가지가 있습니다. 코드 후크를 활성 또는 비활성으로 표시하고 활성화 또는 비활성화로 표시할 수 있습니다.

코드 후크가 활성화되면 Amazon Lex V2에서 코드 후크를 호출합니다. 코드 후크가 비활성 상태일 때 Amazon Lex V2는 코드 후크를 실행하지 않습니다.

코드 후크가 활성으로 표시된 경우에만 활성화하거나 비활성화할 수 있습니다. 활성화로 표시되면 코드 후크가 정상적으로 실행됩니다. 비활성화되면 코드 후크가 호출되지 않고 Amazon Lex V2는 코드 후크가 성공적으로 반환된 것처럼 작동합니다.


                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", "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": { "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" }, "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": { "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 함수는 사용자의 입력을 받은 후 호출되었습니다. 출처가 다음과 같은 경우FulfillmentCodeHookLambda 함수에서 Lambda 함수를 호출하고 의도가 이행될 준비가 되었습니다.

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

  • 호출 라벨— Lambda 함수를 호출한 응답을 나타내는 값입니다. 초기 응답, 슬롯 및 확인 응답에 대한 호출 레이블을 설정할 수 있습니다.

  • 해석— Amazon Lex V2에서 사용자의 발언과 일치할 수 있다고 생각하는 인텐트가 하나 이상 있습니다. 자세한 내용은 Interpretation을 참조하세요.

  • proposedNextState— Lambda 함수가 흐름을 변경하지 않는 경우 사용자와 봇 간의 다음 대화 상태입니다. 자세한 내용은 proposedNextState구조을 참조하세요.

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

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

  • 필기— Amazon Lex V2에서 사용자의 오디오 발언과 일치할 수 있다고 생각하는 하나 이상의 트랜스크립션. 자세한 내용은 음성 녹음 신뢰도 점수 사용을 참조하세요.

proposedNextState구조

proposedNextState구조체에는 Lambda 함수가 다음을 설정할 경우 봇이 취할 다음 작업에 대한 정보가 포함되어 있습니다.dialogActionDelegate. 이 정보를 사용하여 Amazon Lex V2가 다음 작업으로 제안하는 내용을 기반으로 Lambda 함수의 동작을 수정할 수 있습니다.

proposedNextState구조에는 Amazon Lex V2가 다음에 수행할 대화 작업이 포함되어 있습니다. 또한 끌어낼 슬롯과 봇이 사용자가 이행하려고 한다고 판단한 의도를 나타냅니다. 마지막으로 봇이 슬롯을 유도하는 데 사용하는 프롬프트를 제공합니다.

예를 들어 인텐트에 이름과 성을 넣을 수 있는 슬롯이 있다고 가정해 봅시다. 이름 슬롯을 채운 후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에는 사용자에게 표시할 응답 카드의 정의가 들어 있습니다. 자세한 내용은 단원을 참조하십시오.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