

지원 종료 공지: 2025년 9월 15 AWS 일에는 Amazon Lex V1에 대한 지원을 중단할 예정입니다. 2025년 9월 15일 이후에는 Amazon Lex V1 콘솔 또는 Amazon Lex V1 리소스에 더 이상 액세스할 수 없습니다. Amazon Lex V2를 사용하는 경우 대신 [Amazon Lex V2 가이드를](https://docs.aws.amazon.com/lexv2/latest/dg/what-is.html) 참조하세요.

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

# 3단계: 시작하기(콘솔)
<a name="gs-console"></a>

Amazon Lex 를 사용하는 방법을 배우는 가장 쉬운 방법은 콘솔을 사용하는 것입니다. 시작하는 데 도움이 되도록 다음 연습을 만들었으며, 모두 콘솔을 사용합니다.
+ 연습 1 — 필요한 봇 구성을 모두 제공하는 사전 정의된 봇인 청사진을 사용하여 Amazon Lex 봇을 생성합니다. 엔드 투 엔드 설정을 테스트하기 위한 최소한의 작업만 수행합니다.

  또한에서 제공하는 Lambda 함수 블루프린트 AWS Lambda를 사용하여 Lambda 함수를 생성합니다. 함수는 봇과 호환되는 사전 정의된 코드를 사용하는 코드 후크입니다.
+ 연습 2 — 봇을 수동으로 생성 및 구성하여 사용자 지정 봇을 생성합니다. Lambda 함수를 코드 후크로 생성할 수도 있습니다. 샘플 코드가 제공됩니다.
+ 연습 3 - 봇을 게시하고 새로운 버전을 생성합니다. 이 실습의 일부로서 봇 버전을 가리키는 별칭을 생성합니다.

**Topics**
+ [

# 연습 1: 청사진을 사용하여 Amazon Lex 봇 생성(콘솔)
](gs-bp.md)
+ [

# 연습 2: 사용자 지정 Amazon Lex 봇 생성
](getting-started-ex2.md)
+ [

# 연습 3: 버전 게시 및 별칭 만들기
](gettingstarted-ex3.md)

# 연습 1: 청사진을 사용하여 Amazon Lex 봇 생성(콘솔)
<a name="gs-bp"></a>

이 연습에서는 다음 작업을 수행합니다.
+ 첫 번째 Amazon Lex 봇을 생성하여 Amazon Lex 콘솔에서 테스트합니다.

  이 연습에서는 **OrderFlowers** 청사진을 사용합니다. 청사진에 대한 자세한 내용은 [Amazon Lex 및 AWS Lambda 블루프린트](lex-lambda-blueprints.md)을 참조하십시오.

   
+  AWS Lambda 함수를 생성하고 Lambda 콘솔에서 테스트합니다. 요청 처리 중 봇이 이 Lambda 함수를 호출합니다. 이 연습에서는 AWS Lambda 콘솔에 제공된 Lambda 블루프린트(**lex-order-flowers-python**)를 사용하여 Lambda 함수를 생성합니다. 청사진 코드를 통해 동일한 Lambda 함수를 사용하여 초기화 및 검증을 수행하고 `OrderFlowers` 의도를 이행하는 방법에 대해 설명합니다.

   
+ 봇을 업데이트하여 Lambda 함수를 코드 후크로 추가함으로써 의도를 이행합니다. 종합적 경험을 테스트합니다.

다음 섹션에서는 청사진에서 수행하는 작업에 대해 설명합니다.

## Amazon Lex Bot: 청사진 개요
<a name="gs-bp-summary-bot"></a>

**OrderFlowers** 청사진을 사용하여 Amazon Lex 봇을 생성합니다. 봇의 구조에 대한 자세한 내용은 [Amazon Lex: 작동 방식](how-it-works.md) 섹션을 참조하십시오. 봇은 다음과 같이 미리 구성되어 있습니다.
+ **의도** – OrderFlowers
+ **슬롯 유형** – `FlowerTypes`이란 이름의 1개의 사용자 지정 슬롯 유형과 다음과 같은 열거 값: `roses`, `lilies` 및 `tulips`
+ **슬롯** – 의도에 다음 정보(즉, 슬롯)가 충족되어야 봇이 의도를 이행할 수 있습니다.
  + `PickupTime` (AMAZON.TIME 기본 제공 유형)
  + `FlowerType` (FlowerTypes 사용자 지정 유형)
  + `PickupDate` (AMAZON.DATE 기본 제공 유형)
+ **표현** – 다음 샘플 표현는 사용자의 의도를 나타냅니다.
  + "꽃을 픽업하고 싶습니다."
  + "꽃을 주문하고 싶습니다"
+ **프롬프트** – 봇이 의도를 식별한 후에는 다음 프롬프트를 사용하여 슬롯을 채웁니다.
  + `FlowerType` 슬롯에 대한 프롬프트 – "어떤 꽃을 주문하고 싶으세요?"
  + `PickupDate` 슬롯에 대한 프롬프트 – "언제 \$1FlowerType\$1를 픽업하고 싶으세요?"
  + `PickupTime` 슬롯에 대한 프롬프트 – "\$1FlowerType\$1의 픽업 시간은 언제인가요?"
  + 확인 설명문 – "네, \$1FlowerType\$1을 \$1PickupDate\$1 날 \$1PickupTime\$1에 픽업할 수 있도록 준비할게요. 괜찮으신가요?"



## AWS Lambda 함수: 블루프린트 요약
<a name="gs-bp-summary-lambda"></a>

이 연습의 Lambda 함수는 초기화 및 검증과 이행 작업을 모두 수행합니다. 따라서 Lambda 함수를 생성한 후 동일한 Lambda 함수를 코드 후크로 지정하여 의도 구성을 업데이트함으로써 초기화 및 검증과 이행 작업을 모두 처리합니다.
+ Lambda 함수는 초기화 및 검증 코드 후크로서 기본 검증을 수행합니다. 예를 들어, 사용자가 상품 수령 시간을 정상 영업 시간 외로 지정하는 경우, Lambda 함수는 사용자에게 시간을 되묻도록 Amazon Lex에 지시합니다.
+ 이행 코드 후크의 일부로, Lambda 함수는 꽃 주문이 접수되었음(즉, 의도가 이행되었음)을 나타내는 요약 메시지를 회신합니다.

**다음 단계**  
[1단계: Amazon Lex 봇 생성(콘솔)](gs-bp-create-bot.md)

# 1단계: Amazon Lex 봇 생성(콘솔)
<a name="gs-bp-create-bot"></a>

이 연습에서는 꽃을 주문하는 OrderFlowersBot이라는 봇을 생성합니다.

Amazon Lex 봇 생성(콘솔)

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) Amazon Lex 콘솔을 엽니다.

1. 봇을 처음 사용하는 경우 **시작하기**를 선택합니다. 그렇지 않으면 **봇** 페이지에서**생성**을 선택합니다.

1. **Lex 봇 생성** 페이지에서 다음 정보를 입력한 후 **생성**를 선택합니다.
   + **OrderFlowers** 청사진을 선택합니다.
   + 봇 이름(OrderFlowers)의 기본값을 그대로 둡니다.
   + **COPPA**에서 **No**를 선택합니다.
   + **사용자 표현 스토리지**의 경우 적절한 응답을 선택하십시오.

1. **생성(Create)**을 선택합니다. Amazon Lex 콘솔이 구성을 저장하는 데 필요한 요청을 합니다. 그러면 콘솔에 봇 편집기 창이 표시됩니다.

1. 귀하의 봇이 구축되었다는 확인을 기다려 주십시오.

1. 봇 테스트.
**참고**  
테스트 창에 텍스트를 입력하거나, 호환되는 브라우저의 경우 테스트 창에서 마이크 버튼을 선택하여 말해 봇을 테스트할 수 있습니다.

   다음 예제 텍스트에서는 봇과 대화하여 꽃을 주문합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/OrderFlowers-NoLambda.png)

   이 입력에서 봇은 `OrderFlowers` 의도를 유추하고 슬롯 데이터를 묻는 메시지를 표시합니다. 필요한 모든 슬롯 데이터를 제공하면, 봇은 모든 정보를 클라이언트 애플리케이션(이 경우에는 콘솔)에 반환하여 의도(`OrderFlowers`)를 이행합니다. 콘솔은 테스트 창에서 정보를 보여 줍니다.

   구체적으로 설명하면 다음과 같습니다.
   + `pickupDate` 슬롯에 대한 프롬프트가 대체물인 `{FlowerType}`을 사용하여 구성되기 때문에, "언제 장미를 픽업하고 싶으세요?" 라는 문장에서는 "장미"라는 단어가 표시됩니다. 콘솔에서 이러한 점을 확인합니다.
   + "네, 장미를..." 문장장은 사용자가 구성한 확인 프롬프트입니다.
   + 마지막 문장("`FlowerType:roses...`")은 단순히 클라이언트에게 반환되는 슬롯 데이터이며, 이 경우 테스트 창에 표시됩니다. 다음 연습에서는 Lambda 함수를 사용하여 의도를 이행해 보겠습니다. 이 경우 사용자는 주문이 이행되었다는 메시지를 받게 됩니다.

**다음 단계**  
[2단계(선택 사항): 정보 흐름의 세부 정보 검토(콘솔)](gs-bp-details-two-runtime-apis.md)

# 2단계(선택 사항): 정보 흐름의 세부 정보 검토(콘솔)
<a name="gs-bp-details-two-runtime-apis"></a>

이 섹션에서는 샘플 대화의 각 사용자 입력에 대한 클라이언트와 Amazon Lex 간의 정보 흐름에 대해 설명합니다.

이 예제에서는 콘솔 테스트 창을 사용하여 봇과의 대화를 진행합니다.

**Amazon Lex 테스트 창을 열려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) Amazon Lex 콘솔을 엽니다.

1. 테스트할 봇을 선택합니다.

1. 콘솔 오른쪽에서 **챗봇 테스트**을 선택합니다.

말한 내용 또는 입력한 내용에 대한 정보 흐름을 확인하려면 적절한 주제를 선택합니다.

**Topics**
+ [

# 2a단계(선택 사항): 음성 정보 흐름의 세부 정보 검토(콘솔)
](gs-bp-details-postcontent-flow.md)
+ [

# 2b단계(선택 사항): 입력한 정보 흐름의 세부 정보 검토(콘솔)
](gs-bp-details-part1.md)

# 2a단계(선택 사항): 음성 정보 흐름의 세부 정보 검토(콘솔)
<a name="gs-bp-details-postcontent-flow"></a>

이 섹션에서는 클라이언트가 음성으로 요청을 보낼 때 클라이언트와 간의 정보 흐름에 대해 설명합니다. 자세한 내용은 [PostContent](API_runtime_PostContent.md)을 참조하세요.

1. 사용자: 꽃을 주문하고 싶습니다

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostContent](API_runtime_PostContent.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30=" 
      Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1"
      Accept: "audio/mpeg"
      
      
      Request body
      input stream
      ```

      요청 URI 및 본문 모두 Amazon Lex에 다음 정보를 제공합니다.
      + 요청 URI – 봇 이름(`OrderFlowers`), 봇 별칭(`$LATEST`), 사용자 이름(사용자를 식별하는 임의 문자열)을 제공합니다. `content`는 이것이 `PostContent` API 요청(`PostText` 요청 아님)임을 나타냅니다.
      + 요청 헤더
        + `x-amz-lex-session-attributes` – base64 인코딩 값은 "\$1\$1"를 나타냅니다. 클라이언트가 첫 번째 요청을 한 경우 세션 속성이 없습니다.
        + `Content-Type` – 오디오 형식을 반영합니다.
      + 요청 본문 – 사용자 입력 오디오 스트림("꽃을 주문하고 싶습니다").
**참고**  
사용자가 말하기 대신에 `PostContent` API에 텍스트("꽃을 주문하고 싶습니다") 보내기를 선택하는 경우, 요청 본문이 사용자 입력입니다. `Content-Type` 헤더는 그에 따라 설정됩니다.  

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "text/plain; charset=utf-8"
      Accept: accept
      
      Request body
      input stream
      ```

   1. 입력 스트림에서 Amazon Lex는 의도(`OrderFlowers`)를 감지합니다. 그런 다음 의도의 슬롯 중 하나(이 경우 `FlowerType`)와 해당 값 유도 프롬프트 중 하나를 선택한 다음, 다음 헤더가 포함된 응답을 보냅니다.

      ```
      x-amz-lex-dialog-state:ElicitSlot
      x-amz-lex-input-transcript:I would like to order some flowers.
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-message:What type of flowers would you like to order?
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slot-to-elicit:FlowerType
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjpudWxsLCJQaWNrdXBEYXRlIjpudWxsfQ==
      ```

      헤더 값은 다음 정보를 제공합니다.
      + `x-amz-lex-input-transcript` – 요청에 있는 오디오(사용자 입력) 전사(transcript) 기록 제공
      + `x-amz-lex-message` – 응답에서 반환된 오디오 Amazon Lex의 기록 제공
      + `x-amz-lex-slots` – 슬롯 및 값의 base64 인코딩된 버전:

        ```
        {"PickupTime":null,"FlowerType":null,"PickupDate":null}
        ```
      + `x-amz-lex-session-attributes` – 세션 속성(\$1\$1)의 base64 인코딩된 버전

      클라이언트는 응답 본문에서 오디오를 재생합니다.

1. 사용자의 말: 장미

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostContent](API_runtime_PostContent.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1" 
      Accept: "audio/mpeg"
      
      
      Request body
      input stream ("roses")
      ```

      요청 본문은 사용자 입력 오디오 스트림(장미)입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 현재 의도의 컨텍스트에서 입력 스트림을 해석합니다(이 사용자에게 `FlowerType` 슬롯에 관한 정보를 요청했음을 기억). Amazon Lex는 먼저 현재 의도의 슬롯 값을 업데이트합니다. 그런 다음 또 다른 슬롯(`PickupDate`)과 해당 프롬프트 메시지 중 하나(언제 장미를 픽업하고 싶으세요?)를 선택하고 다음 헤더가 포함된 응답을 반환합니다.

      ```
      x-amz-lex-dialog-state:ElicitSlot
      x-amz-lex-input-transcript:roses
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-message:When do you want to pick up the roses?
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slot-to-elicit:PickupDate
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6bnVsbH0=
      ```

      헤더 값은 다음 정보를 제공합니다.
      + `x-amz-lex-slots` – 슬롯 및 값의 base64 인코딩된 버전:

        ```
        {"PickupTime":null,"FlowerType":"roses","PickupDate":null}
        ```
      + `x-amz-lex-session-attributes` – 세션 속성(\$1\$1)의 base64 인코딩된 버전

      클라이언트는 응답 본문에서 오디오를 재생합니다.

1. 사용자의 말: 내일

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostContent](API_runtime_PostContent.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1"
      Accept: "audio/mpeg"
      
      
      Request body
      input stream ("tomorrow")
      ```

      요청 본문은 사용자 입력 오디오 스트림("내일")입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 현재 의도의 컨텍스트에서 입력 스트림을 해석합니다(이 사용자에게 `PickupDate` 슬롯에 관한 정보를 요청했음을 기억). Amazon Lex는 현재 의도의 슬롯(`PickupDate`) 값을 업데이트합니다. 그런 다음 (`PickupTime`)의 값을 유도할 또 다른 슬롯과 값 유도 프롬프트 중 하나(2017-03-18의 언제 장미를 픽업하고 싶으세요?)를 선택하고, 다음 헤더가 포함된 응답을 반환합니다.

      ```
      x-amz-lex-dialog-state:ElicitSlot
      x-amz-lex-input-transcript:tomorrow
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-message:When do you want to pick up the roses on 2017-03-18?
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slot-to-elicit:PickupTime
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ==
      x-amzn-RequestId:3a205b70-0b69-11e7-b447-eb69face3e6f
      ```

      헤더 값은 다음 정보를 제공합니다.
      + `x-amz-lex-slots` – 슬롯 및 값의 base64 인코딩된 버전:

        ```
        {"PickupTime":null,"FlowerType":"roses","PickupDate":"2017-03-18"}
        ```
      + `x-amz-lex-session-attributes` – 세션 속성(\$1\$1)의 base64 인코딩된 버전

      클라이언트는 응답 본문에서 오디오를 재생합니다.

1. 사용자의 말: 6 pm

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostContent](API_runtime_PostContent.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "text/plain; charset=utf-8"
      Accept: "audio/mpeg"
      
      
      Request body
      input stream ("6 pm")
      ```

      요청 본문은 사용자 입력 오디오 스트림("6 pm")입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 현재 의도의 컨텍스트에서 입력 스트림을 해석합니다(이 사용자에게 `PickupTime` 슬롯에 관한 정보를 요청했음을 기억). 먼저 현재 의도의 슬롯 값을 업데이트합니다.

      이제 Amazon Lex는 모든 슬롯에 대한 정보를 갖고 있음을 감지합니다. 그러나 `OrderFlowers` 의도는 확인 메시지로 구성됩니다. 따라서 Amazon Lex는 의도를 이행하기 전에 사용자의 명시적 확인이 필요합니다. 따라서 꽃을 주문하기 전에 확인을 요청하는 다음 헤더가 포함된 응답을 보냅니다.

      ```
      x-amz-lex-dialog-state:ConfirmIntent
      x-amz-lex-input-transcript:six p. m.
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-message:Okay, your roses will be ready for pickup by 18:00 on 2017-03-18.  Does this sound okay?
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjoiMTg6MDAiLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ==
      x-amzn-RequestId:083ca360-0b6a-11e7-b447-eb69face3e6f
      ```

      헤더 값은 다음 정보를 제공합니다.
      + `x-amz-lex-slots` – 슬롯 및 값의 base64 인코딩된 버전:

        ```
        {"PickupTime":"18:00","FlowerType":"roses","PickupDate":"2017-03-18"}
        ```
      + `x-amz-lex-session-attributes` – 세션 속성(\$1\$1)의 base64 인코딩된 버전

      클라이언트는 응답 본문에서 오디오를 재생합니다.

1. 사용자가 "예"라고 한 경우

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostContent](API_runtime_PostContent.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1"
      Accept: "audio/mpeg"
      
      
      Request body
      input stream ("Yes")
      ```

      요청 본문은 사용자 입력 오디오 스트림("예")입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 입력 스트림을 해석하여 사용자가 주문을 진행하기를 원한다고 이해합니다. `OrderFlowers` 의도는 이행 활동인 `ReturnIntent`로 구성됩니다. 이것은 의도 데이터를 모두 클라이언트에 다시 반환하라고 Amazon Lex에 지시합니다. Amazon Lex는 다음이 포함된 응답을 반환합니다.

      

      ```
      x-amz-lex-dialog-state:ReadyForFulfillment
      x-amz-lex-input-transcript:yes
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjoiMTg6MDAiLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ==
      ```

      `x-amz-lex-dialog-state` 응답 헤더는 `ReadyForFulfillment`로 설정되어 있습니다. 그러면 클라이언트는 의도를 이행할 수 있습니다.

1. 이제 봇을 다시 테스트합니다. 새 (사용자) 컨텍스트를 설정하려면 콘솔에서 **지우기** 링크를 선택합니다. `OrderFlowers` 의도에 대한 데이터를 제공하고, 일부 유효하지 않은 데이터를 포함시킵니다. 예제: 
   + 재스민을 꽃 유형으로 입력(재스민은 지원되는 꽃 유형이 아님)
   + 어제를 꽃을 찾아갈 날로 입력

   사용자 데이터를 초기화 및 검증할 코드가 없으므로 봇은 이러한 값을 수락합니다. 다음 섹션에서는 Lambda 함수를 추가하여 이를 수행합니다. 다음은 Lambda 함수에 대한 참고 사항입니다.
   + 각 사용자의 입력 후 슬롯 데이터를 검증합니다. 마지막에 의도를 이행합니다. 즉, 단순히 클라이언트에게 슬롯 데이터를 반환하는 것이 아니라 봇이 꽃 주문을 처리하고 사용자에게 메시지를 반환하는 것입니다. 자세한 내용은 [Lambda 함수 사용](using-lambda.md)을 참조하세요.
   + 세션 속성도 설정합니다. 세션 속성에 대한 자세한 내용은 [PostText](API_runtime_PostText.md) 섹션을 참조하십시오.

      시작하기 섹션을 완료한 후 추가 연습([추가 예제: Amazon Lex 봇 생성](additional-exercises.md))을 할 수 있습니다. [여행 예약](ex-book-trip.md)에서는 세션 속성을 사용하여 의도 전반에 걸쳐 정보를 공유함으로써 사용자와의 동적 대화에 참여합니다.

**다음 단계**  
[3단계: Lambda 함수 만들기(콘솔)](gs-bp-create-lambda-function.md)

# 2b단계(선택 사항): 입력한 정보 흐름의 세부 정보 검토(콘솔)
<a name="gs-bp-details-part1"></a>

이 섹션에서는 클라이언트가 `PostText` API를 사용하여 요청을 보낼 때의 클라이언트와 Amazon Lex 간의 정보 흐름에 대해 설명합니다. 자세한 내용은 [PostText](API_runtime_PostText.md)을 참조하세요.

1. 사용자의 입력: 꽃을 주문하고 싶습니다

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "I would like to order some flowers",
          "sessionAttributes": {}
      }
      ```

      요청 URI 및 본문 모두 Amazon Lex에 다음 정보를 제공합니다.
      + 요청 URI – 봇 이름(`OrderFlowers`), 봇 별칭(`$LATEST`), 사용자 이름(사용자를 식별하는 임의 문자열)을 제공합니다. 후행 `text`는 이것이 `PostText` API 요청(`PostContent`가 아님)임을 나타냅니다.

         
      + 요청 본문 – 사용자 입력(`inputText`)과 빈 `sessionAttributes`를 포함합니다. 클라이언트가 첫 번째 요청을 한 경우 세션 속성이 없습니다. Lambda 함수는 이를 나중에 초기화합니다.

   1. `inputText`에서 Amazon Lex는 의도(`OrderFlowers`)를 감지합니다. 이 의도에는 사용자 입력 또는 이행의 초기화/검증을 위한 코드 후크(즉, Lambda 함수)가 없습니다.

      Amazon Lex는 값을 유도할 의도 슬롯 중 하나(`FlowerType`)를 선택합니다. 또한 슬롯의 값 유도 프롬프트 중 하나(모두 의도 구성에 포함)를 선택한 다음, 클라이언트에 다음 응답을 다시 보냅니다. 콘솔은 사용자에 대한 응답에 다음과 같은 메시지를 표시합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-10.png)

      클라이언트는 응답에 메시지를 표시합니다.

1. 사용자의 입력: 장미

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "roses",
          "sessionAttributes": {}
      }
      ```

      요청 본문에서 `inputText`는 사용자 입력입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 먼저 현재 의도의 컨텍스트에서 `inputText`를 해석합니다(이 서비스는 특정 사용자에게 `FlowerType` 슬롯에 대한 정보를 요청했음을 기억). Amazon Lex는 먼저 현재 의도의 슬롯 값을 업데이트하고, 또 다른 슬롯(`PickupDate`)을 해당 슬롯을 위한 ``로서 프롬프트 메시지 중 하나(언제 장미를 픽업하고 싶으세요?)를 선택합니다.

      그런 다음 Amazon Lex는 다음 응답을 반환합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-20.png)

      클라이언트는 응답에 메시지를 표시합니다.

1. 사용자의 입력: 내일

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "tomorrow",
          "sessionAttributes": {}
      }
      ```

      요청 본문에서 `inputText`는 사용자 입력입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 먼저 현재 의도의 컨텍스트에서 `inputText`를 해석합니다(이 서비스는 특정 사용자에게 `PickupDate` 슬롯에 대한 정보를 요청했음을 기억). Amazon Lex는 현재 의도의 슬롯(`PickupDate`) 값을 업데이트합니다. (`PickupTime`)의 값을 유도할 또 다른 슬롯을 선택합니다. 클라이언트에 값 유도 `` 프롬프트 중 하나(2017-01-05 몇 시에 장미를 배송하시겠습니까?)를 반환합니다.

      그런 다음 Amazon Lex는 다음 응답을 반환합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-30.png)

      클라이언트는 응답에 메시지를 표시합니다.

1. 사용자의 입력: 6 pm

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "6 pm",
          "sessionAttributes": {}
      }
      ```

      요청 본문에서 `inputText`는 사용자 입력입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 먼저 현재 의도의 컨텍스트에서 `inputText`를 해석합니다(이 서비스는 특정 사용자에게 `PickupTime` 슬롯에 대한 정보를 요청했음을 기억). Amazon Lex는 먼저 현재 의도의 슬롯 값을 업데이트합니다. 이제 Amazon Lex는 모든 슬롯에 대한 정보를 갖고 있음을 감지합니다.

      `OrderFlowers` 의도는 확인 메시지로 구성됩니다. 따라서 Amazon Lex는 의도를 이행하기 전에 사용자의 명시적 확인이 필요합니다. Amazon Lex는 꽃을 주문하기 전에 확인을 요청하는 다음 메시지를 클라이언트에게 보냅니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-40.png)

      클라이언트는 응답에 메시지를 표시합니다.

1. 사용자의 입력: 예

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "Yes",
          "sessionAttributes": {}
      }
      ```

      요청 본문에서 `inputText`는 사용자 입력입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 현재 의도를 확인하는 컨텍스트에서 `inputText`를 해석합니다. 사용자가 주문을 진행하기를 원한다고 이해합니다. `OrderFlowers` 의도는 이행 활동인 `ReturnIntent`로 구성됩니다(의도를 이행할 Lambda 함수가 없음). 따라서 Amazon Lex는 클라이언트에 슬롯 데이터를 반환합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-50.png)

      Amazon Lex는 다음과 같이 `dialogState`을 `ReadyForFulfillment`로 설정했습니다. 그러면 클라이언트는 의도를 이행할 수 있습니다.

1. 이제 봇을 다시 테스트합니다. 이를 위해서는 콘솔에서 **지우기** 링크를 선택하여 새 (사용자) 컨텍스트를 설정해야 합니다. 이제 꽃 주문 의도에 대한 데이터를 제공할 때 잘못된 데이터를 제공해 봅니다. 예제: 
   + 재스민을 꽃 유형으로 입력(재스민은 지원되는 꽃 유형이 아님)
   + 어제를 꽃을 찾아갈 날로 입력

   사용자 데이터를 초기화 및 검증할 코드가 없으므로 봇은 이러한 값을 수락합니다. 다음 섹션에서는 Lambda 함수를 추가하여 이를 수행합니다. 다음은 Lambda 함수에 대한 참고 사항입니다.
   + Lambda 함수는 각 사용자의 입력 후 슬롯 데이터를 검증합니다. 마지막에 의도를 이행합니다. 즉, 봇은 꽃 주문을 처리한 후 클라이언트에 슬롯 데이터를 반환하는 대신에 사용자에게 메시지를 반환합니다. 자세한 내용은 [Lambda 함수 사용](using-lambda.md)을 참조하세요.
   + Lambda 함수는 세션 속성도 설정합니다. 세션 속성에 대한 자세한 내용은 [PostText](API_runtime_PostText.md) 섹션을 참조하십시오.

      시작하기 섹션을 완료한 후 추가 연습([추가 예제: Amazon Lex 봇 생성](additional-exercises.md))을 할 수 있습니다. [여행 예약](ex-book-trip.md)에서는 세션 속성을 사용하여 의도 전반에 걸쳐 정보를 공유함으로써 사용자와의 동적 대화에 참여합니다.

**다음 단계**  
[3단계: Lambda 함수 만들기(콘솔)](gs-bp-create-lambda-function.md)

# 3단계: Lambda 함수 만들기(콘솔)
<a name="gs-bp-create-lambda-function"></a>

Lambda 함수를 만들고(**lex-order-flowers-python** 청사진 사용), AWS Lambda 콘솔의 샘플 이벤트 데이터를 사용하여 테스트 간접 호출을 수행합니다.

Amazon Lex 콘솔로 돌아가서 Lambda 함수를 코드 후크로 추가하여 사용자가 이전 섹션에서 생성한 `OrderFlowersBot`에서 `OrderFlowers` 의도를 이행해 보겠습니다.

**Lambda 함수를 만들려면(콘솔)**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1. **함수 생성**을 선택합니다.

1. **함수 생성** 페이지에서 **청사진 사용**을 선택합니다. 필터 텍스트 상자에 **lex-**를 입력하고 `Enter`를 눌러 청사진을 찾은 후 `lex-order-flowers-python` 청사진을 선택합니다.

   Lambda 함수 청사진은 Node.js 및 Python 모두에서 제공됩니다. 이 연습에서는 Python 기반 청사진을 사용합니다.

1. **기본 정보** 페이지에서 다음을 수행합니다.
   + Lambda 함수 이름(`OrderFlowersCodeHook`)을 입력합니다.
   + Execution role(실행 역할)에서 **기본 Lambda 권한을 가진 새 역할 생성**을 선택합니다.
   + 나머지는 기본값을 그대로 사용합니다.

1. **Create function(함수 생성)**을 선택합니다.

1. 영어(미국)(en-US) 이외의 지역을 사용하는 경우 [특정 로캘에 대한 청사진 업데이트](lex-lambda-blueprints.md#blueprint-update-locale)에 설명된 대로 의도 이름을 업데이트하십시오. 

1. Lambda 함수 테스트.

   1. **테스트 이벤트 선택**, **테스트 이벤트 구성**을 선택합니다.

   1. **이벤트 템플릿** 목록에서 **Amazon Lex 꽃 주문**를 선택합니다. 이 샘플 이벤트는 요청 및 응답 모델과 일치합니다([Lambda 함수 사용](using-lambda.md) 참조). 테스트 이벤트에 이름(`LexOrderFlowersTest`)을 부여합니다.

   1. **생성(Create)**을 선택합니다.

   1. **테스트**를 선택하여 코드 후크를 테스트합니다.

   1. Lambda 함수가 성공적으로 실행되었는지 확인합니다. 이 경우 응답은 Amazon Lex 응답 모델과 일치합니다.

**다음 단계**  
[4단계: Lambda 함수를 코드 후크로 추가(콘솔)](gs-bp-create-integrate.md)

# 4단계: Lambda 함수를 코드 후크로 추가(콘솔)
<a name="gs-bp-create-integrate"></a>

이 섹션에서는 OrderFlowers 의도의 구성을 업데이트하여 Lambda 함수를 다음과 같이 사용합니다.
+ 먼저 Lambda 함수를 코드 후크로 사용하여 `OrderFlowers` 의도를 이행합니다. 봇을 테스트하고 Lambda 함수로부터 이행 메시지를 받았는지 확인합니다. Amazon Lex는 사용자가 꽃을 주문하는 데 필요한 모든 슬롯에 대한 데이터를 제공한 후에만 Lambda 함수를 간접 호출합니다.
+ 동일한 Lambda 함수를 코드 후크로 구성하여 초기화 및 검증을 수행합니다. 테스트하고 Lambda 함수가 검증을 수행하는지 확인합니다(슬롯 데이터를 제공할 때).

**Lambda 함수를 코드 후크로 추가하려면(콘솔)**

1. Amazon Lex 콘솔에서 **OrderFlowers** 봇을 선택합니다. 콘솔에 **OrderFlowers** 의도가 표시됩니다. 이 버전이 수정 가능한 유일한 버전이므로 반드시 의도 버전이 `$LATEST`로 설정되어 있는지 확인합니다.

1. Lambda 함수를 이행 코드 후크로 추가하고 테스트합니다.

   

   1. 편집기에서 **AWS Lambda 함수**를 **이행**으로 선택하고, 사용자가 이전 단계(`OrderFlowersCodeHook`)에서 생성한 Lambda 함수를 선택합니다. **확인**을 선택하여 Amazon Lex에 Lambda 함수를 간접 호출할 권한을 부여합니다.

      의도를 이행하기 위해 이 Lambda 함수를 코드 후크로 구성하고 있습니다. Amazon Lex는 사용자로부터 의도를 이행하는 데 필요한 모든 슬롯 데이터를 수신한 후에만 이 함수를 간접 호출합니다.

   1. **종료 메시지**를 지정합니다.

   1. **구축**을 선택합니다.

   1. 이전 대화를 사용하여 봇을 테스트합니다.

   마지막 문장 "감사합니다, 장미에 대한 주문은....."은 사용자가 코드 후크로 구성한 Lambda 함수가 보내는 응답입니다. 이전 섹션에는 Lambda 함수가 없었습니다. 지금은 `OrderFlowers` 의도를 실제로 이행하기 위해 Lambda 함수를 사용하고 있습니다.

1. Lambda 함수를 초기화 및 검증 코드 후크로 추가하고 테스트합니다.

   현재 사용 중인 샘플 Lambda 함수 코드를 통해 사용자 입력에 대한 검증과 이행을 모두 수행할 수 있습니다. Lambda 함수가 수신하는 입력 이벤트에는, 해당 코드가 어떠한 부분의 코드를 실행할지 결정하는 데 사용되는 필드(`invocationSource`)가 있습니다. 자세한 내용은 [Lambda 함수 입력 이벤트 및 응답 형식](lambda-input-response-format.md)을 참조하세요.

   1. `OrderFlowers` 의도의 \$1LATEST 버전을 선택합니다. 업데이트할 수 있는 유일한 버전입니다.

   1. **옵션**에서 **초기화 및 유효성 검사 코드 후크**를 선택합니다.

   1. 다시 한번 동일한 Lambda 함수를 선택합니다.

   1. **구축**을 선택합니다.

   1. 봇 테스트.

      이제 다음 이미지와 같이 Amazon Lex와 대화할 준비가 갖추어졌습니다. 검증 부분을 테스트하기 위해 시간을 오후 6시로 선택하면, 사용자의 Lambda 함수가 응답("영업시간은 10 AM부터 5 PM까지입니다")을 반환하고 사용자에게 한 번 더 프롬프트를 보냅니다. 유효한 슬롯 데이터가 모두 제공된 후에 Lambda 함수가 주문을 이행합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/OrderFlowers-FullLambda.png)

**다음 단계**  
[5단계(선택 사항): 정보 흐름의 세부 정보 검토(콘솔)](gs-bp-details-after-lambda.md)

# 5단계(선택 사항): 정보 흐름의 세부 정보 검토(콘솔)
<a name="gs-bp-details-after-lambda"></a>

이 섹션에서는 Lambda 함수의 통합을 포함하여 각 사용자 입력에 대한 클라이언트와 Amazon Lex 간의 정보 흐름에 대해 설명합니다.

**참고**  
이 섹션에서는 클라이언트가 `PostText` 런타임 API를 사용하여 Amazon Lex에 요청을 보내고 그에 따라 요청 및 응답의 세부 정보를 보여 준다고 가정합니다. 클라이언트가 `PostContent` API를 사용할 때의 클라이언트와 Amazon Lex 간의 정보 흐름의 예는 [2a단계(선택 사항): 음성 정보 흐름의 세부 정보 검토(콘솔)](gs-bp-details-postcontent-flow.md)을 참조하십시오.

`PostText` 런타임 API 및 다음 단계에 나오는 요청 및 응답의 추가 세부 정보에 대한 자세한 내용은 [PostText](API_runtime_PostText.md) 섹션을 참조하십시오.

1. 사용자: 꽃을 주문하고 싶습니다.

   1. 클라이언트(콘솔)는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "I would like to order some flowers",
          "sessionAttributes": {}
      }
      ```

      요청 URI 및 본문 모두 Amazon Lex에 다음 정보를 제공합니다.
      + 요청 URI – 봇 이름(`OrderFlowers`), 봇 별칭(`$LATEST`), 사용자 이름(사용자를 식별하는 임의 문자열)을 제공합니다. 후행 `text`는 이것이 `PostText` API 요청(`PostContent`가 아님)임을 나타냅니다.
      + 요청 본문 – 사용자 입력(`inputText`)과 빈 `sessionAttributes`를 포함합니다. 클라이언트가 첫 번째 요청을 한 경우 세션 속성이 없습니다. Lambda 함수는 이를 나중에 초기화합니다.

   1. `inputText`에서 Amazon Lex는 의도(`OrderFlowers`)를 감지합니다. 이 의도는 사용자 데이터 초기화 및 검증을 위한 코드 후크인 Lambda 함수로 구성됩니다. 따라서 Amazon Lex는 다음 정보를 이벤트 데이터로 전달하여 해당 Lambda 함수를 간접 호출합니다.

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "DialogCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {},
          "bot": {
              "name": "OrderFlowers",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": null,
                  "PickupDate": null
              },
              "confirmationStatus": "None"
          }
      }
      ```

      자세한 내용은 [입력 이벤트 형식](lambda-input-response-format.md#using-lambda-input-event-format)을 참조하세요.

      클라이언트가 보낸 정보 외에도 Amazon Lex에는 다음과 같은 데이터가 추가로 포함되어 있습니다.
      + `messageVersion` - Amazon Lex는 현재 1.0 버전만 지원합니다.
      + `invocationSource` – Lambda 함수 간접 호출의 목적을 나타냅니다. 이 경우에 목적은 사용자 데이터 초기화 및 검증을 수행하는 것입니다. 이때 Amazon Lex는 사용자가 의도를 이행하기 위한 모든 슬롯 데이터를 제공하지 않았음을 압니다.
      + 모든 슬롯 값이 null로 설정된 `currentIntent` 정보

   1. 이때 모든 슬롯 값은 null입니다. Lambda 함수가 검증할 것이 없습니다. Lambda 함수는 Amazon Lex에 다음 응답을 반환합니다.

      ```
      {
          "sessionAttributes": {},
          "dialogAction": {
              "type": "Delegate",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": null,
                  "PickupDate": null
              }
          }
      }
      ```

      응답 형식에 대한 자세한 내용은 [응답 형식](lambda-input-response-format.md#using-lambda-response-format) 섹션을 참조하십시오.

      다음을 참고합니다.
      + `dialogAction.type` – Lambda 함수는 이 값을 `Delegate`로 설정하여 Amazon Lex에 일련의 다음 조치를 결정할 책임을 위임합니다.
**참고**  
Lambda 함수가 사용자 데이터 검증에서 무언가를 감지하면, 다음 단계에 나와 있듯이 Amazon Lex에 다음에 해야 할 조치를 지시합니다.

   1. `dialogAction.type`에 따라 Amazon Lex는 일련의 다음 조치를 결정합니다. 슬롯이 하나도 채워지지 않았기 때문에 `FlowerType` 슬롯의 값을 유도하기로 결정합니다. 이 슬롯의 값 유도 프롬프트 중 하나("어떤 꽃을 주문하고 싶으세요?")를 선택하고, 클라이언트에 다음 응답을 다시 보냅니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-10.png)

      클라이언트는 응답에 메시지를 표시합니다.

1. 사용자: 장미

   1. 클라이언트는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md)요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "roses",
          "sessionAttributes": {}
      }
      ```

      요청 본문에서 `inputText`는 사용자 입력입니다. `sessionAttributes`는 비어있습니다.

   1. Amazon Lex는 먼저 현재 의도의 컨텍스트에서 `inputText`를 해석합니다. 이 서비스는 특정 사용자에게 `FlowerType` 슬롯에 대한 정보를 요청했음을 기억합니다. 현재 의도의 슬롯 값을 업데이트하고, 다음 이벤트 데이터로 Lambda 함수를 간접 호출합니다.

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "DialogCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {},
          "bot": {
              "name": "OrderFlowers",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": "roses",
                  "PickupDate": null
              },
              "confirmationStatus": "None"
          }
      }
      ```

      다음 사항에 유의하세요.
      + `invocationSource` – 계속 `DialogCodeHook`입니다(단순히 사용자 데이터를 검증하는 중).
      + `currentIntent.slots` – Amazon Lex가 `FlowerType` 슬롯을 장미로 업데이트했습니다.

   1. `DialogCodeHook`의 `invocationSource` 값에 따라 Lambda 함수는 사용자 데이터 검증을 수행합니다. `roses`를 유효한 슬롯 값으로 인식하고(그리고 `Price`를 세션 속성으로 설정), Amazon Lex에 다음 응답을 반환합니다.

      ```
      {
          "sessionAttributes": {
              "Price": 25
          },
          "dialogAction": {
              "type": "Delegate",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": "roses",
                  "PickupDate": null
              }
          }
      }
      ```

      다음 사항에 유의하세요.
      + `sessionAttributes` – Lambda 함수가 (장미의) `Price`를 세션 속성으로 추가했습니다.
      + `dialogAction.type` – `Delegate`로 설정됩니다. 사용자 데이터가 유효했으므로 Lambda 함수는 Amazon Lex에 일련의 다음 조치를 선택하라고 지시합니다.

       

   1. `dialogAction.type`에 따라 Amazon Lex는 일련의 다음 조치를 선택합니다. Amazon Lex는 더 많은 슬롯 데이터가 필요함을 알고 의도 구성에 따라 우선 순위가 가장 높은 채워지지 않은 다음 슬롯(`PickupDate`)을 선택합니다. 의도 구성에 따라 Amazon Lex 이 슬롯에 대한 프롬프트 메시지 중 하나("언제 체크인 예정인가요?")를 선택하고, 클라이언트에 다음 응답을 다시 보냅니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-20.png)

      클라이언트는 응답에 단순히 "언제 장미를 픽업하고 싶으세요?" 메시지를 표시합니다.

1. 사용자: 내일

   1. 클라이언트는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "tomorrow",
          "sessionAttributes": {
              "Price": "25"
          }
      }
      ```

      요청 본문에서 `inputText`는 사용자 입력이며, 클라이언트는 서비스에 다시 세션 속성을 전달합니다.

   1. Amazon Lex는 컨텍스트를 기억합니다. 이를 통해 `PickupDate` 슬롯에 대한 데이터를 유도했습니다. 이 컨텍스트에서 `inputText` 값이 `PickupDate` 슬롯에 대한 것임을 압니다. 그런 다음 Amazon Lex는 다음 이벤트를 보내 Lambda 함수를 간접 호출합니다.

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "DialogCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {
              "Price": "25"
          },
          "bot": {
              "name": "OrderFlowersCustomWithRespCard",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              },
              "confirmationStatus": "None"
          }
      }
      ```

      Amazon Lex는 `currentIntent.slots` 값을 설정하여 `PickupDate`를 업데이트했습니다. 또한 이 서비스는 `sessionAttributes`를 그대로 Lambda 함수에 전달합니다.

   1. `DialogCodeHook`의 `invocationSource`값에 따라 Lambda 함수는 사용자 데이터 검증을 수행합니다. `PickupDate` 슬롯 값이 유효함을 인식하고 Amazon Lex에 다음 응답을 반환합니다.

      ```
      {
          "sessionAttributes": {
              "Price": 25
          },
          "dialogAction": {
              "type": "Delegate",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              }
          }
      }
      ```

      다음 사항에 유의하세요.
      + `sessionAttributes` – 변경 사항이 없습니다.
      + `dialogAction.type` – `Delegate`로 설정됩니다. 사용자 데이터가 유효했으므로 Lambda 함수는 Amazon Lex에 일련의 다음 조치를 선택하라고 지시합니다.

   1. `dialogAction.type`에 따라 Amazon Lex는 일련의 다음 조치를 선택합니다. Amazon Lex는 더 많은 슬롯 데이터가 필요함을 알고 의도 구성에 따라 우선 순위가 가장 높은 채워지지 않은 다음 슬롯(`PickupTime`)을 선택합니다. Amazon Lex는 프롬프트 메시지 중 하나를 선택합니다 ("2017-01-05 몇 시에 장미를 배송하시겠습니까?") 이 슬롯의 경우 인텐트 구성에 따라 다음 응답을 클라이언트에 다시 보냅니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-30.png)

      클라이언트는 응답에 "2017-01-05 몇 시에 장미를 배송하시겠습니까?" 메시지를 표시합니다.

1. 사용자: 4 pm

   1. 클라이언트는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "4 pm",
          "sessionAttributes": {
              "Price": "25"
          }
      }
      ```

      요청 본문에서 `inputText`는 사용자 입력입니다. 클라이언트는 요청에서 `sessionAttributes`를 전달합니다.

   1. Amazon Lex는 컨텍트스를 이해합니다. `PickupTime` 슬롯에 대한 데이터를 유도하고 있었음을 이해합니다. 이 컨텍스트에서 `inputText` 값이 `PickupTime`슬롯에 대한 것임을 압니다. 그런 다음 Amazon Lex는 다음 이벤트를 보내 Lambda 함수를 간접 호출합니다.

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "DialogCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {
              "Price": "25"
          },
          "bot": {
              "name": "OrderFlowersCustomWithRespCard",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": "16:00",
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              },
              "confirmationStatus": "None"
          }
      }
      ```

      Amazon Lex는 `PickupTime` 값을 설정하여 `currentIntent.slots`를 업데이트했습니다.

   1. `DialogCodeHook`의 `invocationSource` 값에 따라 Lambda 함수는 사용자 데이터 검증을 수행합니다. `PickupDate` 슬롯 값이 유효함을 인식하고 Amazon Lex에 다음 응답을 반환합니다.

      ```
      {
          "sessionAttributes": {
              "Price": 25
          },
          "dialogAction": {
              "type": "Delegate",
              "slots": {
                  "PickupTime": "16:00",
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              }
          }
      }
      ```

      다음 사항에 유의하세요.
      + `sessionAttributes` – 세션 속성의 변경 사항이 없습니다.
      + `dialogAction.type` – `Delegate`로 설정됩니다. 사용자 데이터가 유효했으므로 Lambda 함수는 Amazon Lex에 일련의 다음 조치를 선택하라고 지시합니다.

   1. 이때 Amazon Lex는 슬롯 데이터가 모두 있음을 압니다. 이 의도는 확인 프롬프트로 구성됩니다. 따라서 Amazon Lex는 의도를 이행하기 전에 확인을 요청하는 다음 응답을 사용자에게 보냅니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-45.png)

      클라이언트는 단순히 응답에 메시지를 표시하고 사용자 응답을 기다립니다.

1. 사용자: 예

   1. 클라이언트는 Amazon Lex에 다음 [PostText](API_runtime_PostText.md) 요청을 보냅니다.

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "yes",
          "sessionAttributes": {
              "Price": "25"
          }
      }
      ```

   1. Amazon Lex는 현재 의도를 확인하는 컨텍스트에서 `inputText`를 해석합니다. Amazon Lex는 사용자가 주문을 진행하기를 원한다고 이해합니다. 이때 Amazon Lex는 다음 이벤트를 보내 의도를 이행하도록 Lambda 함수를 간접 호출합니다. 함수에 보내는 이벤트에서 `invocationSource`를 `FulfillmentCodeHook`로 설정합니다. Amazon Lex는 또한 다음과 같이 `confirmationStatus`을 `Confirmed`로 설정합니다.

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "FulfillmentCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {
              "Price": "25"
          },
          "bot": {
              "name": "OrderFlowersCustomWithRespCard",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": "16:00",
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              },
              "confirmationStatus": "Confirmed"
          }
      }
      ```

      다음 사항에 유의하세요.
      + `invocationSource` – 이때 Amazon Lex는 이 값을 `FulfillmentCodeHook`로 설정하여 의도를 이행하도록 Lambda 함수에 지시합니다.
      + `confirmationStatus` – `Confirmed`로 설정됩니다.

   1. 이때 Lambda 함수는 `OrderFlowers` 의도를 이행하고, 다음 응답을 반환합니다.

      ```
      {
          "sessionAttributes": {
              "Price": "25"
          },
          "dialogAction": {
              "type": "Close",
              "fulfillmentState": "Fulfilled",
              "message": {
                  "contentType": "PlainText",
                  "content": "Thanks, your order for roses has been placed and will be ready for pickup by 16:00 on 2017-01-05"
              }
          }
      }
      ```

      다음 사항에 유의하세요.
      + `dialogAction.type` 설정 – Lambda 함수는 이 값을 `Close`로 설정하여 사용자 응답을 기대하지 않도록 Amazon Lex에 지시합니다.
      + `dialogAction.fulfillmentState` – Fulfilled로 설정되고, 사용자에게 전달할 적절한 `message`를 포함합니다.

   1. Amazon Lex는 `fulfillmentState`를 검토하고 클라이언트에 다음 응답을 다시 보냅니다.

      그런 다음 Amazon Lex는 클라이언트에 다음을 반환합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs-1-details-48.png)

      참고:
      + `dialogState` – Amazon Lex는 이 값을 `fulfilled`로 설정합니다.
      + `message` – Lambda 함수가 제공한 동일한 메시지입니다.

      클라이언트가 이 메시지를 표시합니다.

1. 이제 봇을 다시 테스트합니다. 새 (사용자) 컨텍스트를 설정하려면 테스트 창에서 **지우기** 링크를 선택합니다. 이제 `OrderFlowers` 의도에 대한 유효하지 않은 슬롯 데이터를 제공합니다. 이때 Lambda 함수는 데이터 검증을 수행하고, 잘못된 슬롯 데이터 값을 null로 재설정한 다음, 유효한 데이터를 묻는 메시지를 사용자에게 표시하라고 Amazon Lex에 요청합니다. 예를 들어, 다음을 시도합니다.
   + 재스민을 꽃 유형으로 입력(재스민은 지원되는 꽃 유형이 아님)
   + 어제를 꽃을 찾아갈 날로 입력
   + 주문 후 "예"를 회신하는 대신에 다른 꽃 유형을 입력하여 주문을 확인. 이에 대한 응답으로 Lambda 함수는 세션 속성의 `Price`를 업데이트하여 꽃 주문의 누계를 유지합니다.

   Lambda 함수는 이행 활동도 수행합니다.

**다음 단계**  
[6단계: 표현을 추가하도록 의도 구성 업데이트(콘솔)](gs-bp-utterance.md)

# 6단계: 표현을 추가하도록 의도 구성 업데이트(콘솔)
<a name="gs-bp-utterance"></a>

 `OrderFlowers` 봇은 표현 두 개로만 구성되어 있습니다. 따라서 이 봇은 에서 사용자의 의도를 인식해 응답하는 기계 학습 모델을 구축하는 데 제한된 정보를 제공합니다. 다음 테스트 창에서처럼 “꽃을 주문하고 싶어요”라고 입력해 보십시오. Amazon Lex는 텍스트를 인식하지 못하고 “이해하지 못했습니다. 어떻게 하시겠습니까?”라고 응답합니다. 표현을 추가해 기계 학습 모델을 개선할 수 있습니다.

![\[누락된 표현을 보여 주는 테스트 창.\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-120.png)


추가한 각 표현은 Amazon Lex에 사용자에게 어떻게 응답할지에 대한 추가 정보를 제공합니다. Amazon Lex는 정확하게 일치하는 입력과 유사한 입력을 둘 다 인식하기 위해 사용자가 제공한 샘플로부터 일반화하기 때문에 정확한 표현을 추가할 필요가 없습니다.

**표현을 추가하려면(콘솔)**

1. 의도 편집기의 **샘플 표현** 섹션에 “꽃을 원해요"라고 입력한 다음 새 표현 옆에 있는 더하기 아이콘을 클릭하여 의도에 표현을 추가합니다.  
![\[새 표현가 표시된 의도 편집기.\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-130.png)

1.  변경 사항을 적용하도록 봇을 구축합니다. **빌드**를 선택한 후 **빌드**를 다시 선택합니다.

1. 봇을 테스트해 새 표현을 인식하는지 확인합니다. 다음 테스트 창에서처럼 “꽃을 주문하고 싶어요”라고 입력해 보십시오. Amazon Lex는 이 문구를 인식하고 “어떤 종류의 꽃을 주문하시겠습니까?” 로 응답합니다.  
![\[새 표현을 인식하는 의도 편집기.\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-140.png)

**다음 단계**  
[7단계(선택 사항): 정리(콘솔)](gs-bp-cleaning-up.md)

# 7단계(선택 사항): 정리(콘솔)
<a name="gs-bp-cleaning-up"></a>

이제 생성한 리소스를 삭제하고 계정을 정리합니다.

사용하지 않는 리소스만 삭제할 수 있습니다. 일반적으로 다음 순서로 리소스를 삭제해야 합니다.
+ 봇을 삭제하여 의도 리소스를 확보합니다.
+ 의도를 삭제하여 슬롯 유형 리소스를 확보합니다.
+ 마지막으로 슬롯 유형을 삭제합니다.

**계정을 정리하려면(콘솔)**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) Amazon Lex 콘솔을 엽니다.

1. 봇 목록에서 **OrderFlowers** 옆에 있는 체크박스를 선택합니다.

1. 봇을 삭제하려면 **삭제**를 선택한 후, 확인 대화 상자에서 **계속**를 선택합니다.

1. 왼쪽 창에서 **의도**를 선택합니다.

1. 의도 목록에서 **OrderFlowersIntent**를 선택합니다.

1. 의도를 삭제하려면 **삭제**를 선택한 후, 확인 대화 상자에서 **계속**을 선택합니다.

1. 왼쪽 창에서 **슬롯 유형**을 선택합니다.

1. 슬롯 유형 목록에서 **Flowers**를 선택합니다.

1. 슬롯 유형을 삭제하려면 **삭제**를 선택한 후, 확인 대화 상자에서 **계속**를 선택합니다.

생성한 모든 Amazon Lex 리소스를 제거하고 계정을 정리했습니다. 원한다면, [콘솔](https://console.aws.amazon.com/lambda)을 사용해 이 연습에 사용되는 Lambda 함수를 삭제할 수 있습니다.

# 연습 2: 사용자 지정 Amazon Lex 봇 생성
<a name="getting-started-ex2"></a>

이 연습에서는 Amazon Lex 콘솔을 사용하여 피자를 주문하는 사용자 지정 봇(`OrderPizzaBot`)을 생성합니다. 사용자 지정 의도(`OrderPizza`)를 추가하거나, 사용자 지정 슬롯 유형을 정의하거나, 피자 주문을 이행하는 데 필요한 슬롯(피자 크러스트, 크기 등)을 정의하여 봇을 구성합니다. 슬롯 유형 및 슬롯에 대한 자세한 내용은 [Amazon Lex: 작동 방식](how-it-works.md)을 참조하십시오 .

**Topics**
+ [

# 1단계: Lambda 함수 생성
](gs2-prepare.md)
+ [

# 2단계: 봇 생성
](gs2-create-bot.md)
+ [

# 3단계: 봇 구축 및 테스트
](gs2-build-and-test.md)
+ [

# 4단계(선택 사항): 정리
](gs2-clean-up.md)

# 1단계: Lambda 함수 생성
<a name="gs2-prepare"></a>

먼저 피자 주문을 이행하는 Lambda 함수를 생성합니다. 다음 섹션에서 생성할 함수를 Amazon Lex 봇에서 지정합니다.

**Lambda 함수 생성하려면**



1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1. **함수 생성**을 선택합니다.

1. **함수 생성** 페이지에서 **처음부터 새로 작성**을 선택합니다.

   이 연습에서 제공된 사용자 지정 코드를 사용해 Lambda 함수를 생성할 것이므로 처음부터 함수 작성자를 선택합니다.

   다음 내용을 따르세요.

   1. 이름(`PizzaOrderProcessor`)을 입력합니다.

   1. **런타임**에서 최신 버전의 Node.js를 선택합니다.

   1. **역할**의 경우, **템플릿에서 새 역할 생성**을 선택합니다.

   1. 새 역할 이름(`PizzaOrderProcessorRole`)을 입력합니다.

   1. **함수 생성**을 선택합니다.

1. 함수 페이지에서 다음을 수행합니다.

   **함수 코드** 섹션에서 **코드 인라인 편집**을 선택한 후 다음의 Node.js 함수 코드를 복사하여 창에 붙여넣습니다.

   ```
   'use strict';
        
   // Close dialog with the customer, reporting fulfillmentState of Failed or Fulfilled ("Thanks, your pizza will arrive in 20 minutes")
   function close(sessionAttributes, fulfillmentState, message) {
       return {
           sessionAttributes,
           dialogAction: {
               type: 'Close',
               fulfillmentState,
               message,
           },
       };
   }
    
   // --------------- Events -----------------------
    
   function dispatch(intentRequest, callback) {
       console.log(`request received for userId=${intentRequest.userId}, intentName=${intentRequest.currentIntent.name}`);
       const sessionAttributes = intentRequest.sessionAttributes;
       const slots = intentRequest.currentIntent.slots;
       const crust = slots.crust;
       const size = slots.size;
       const pizzaKind = slots.pizzaKind;
       
       callback(close(sessionAttributes, 'Fulfilled',
       {'contentType': 'PlainText', 'content': `Okay, I have ordered your ${size} ${pizzaKind} pizza on ${crust} crust`}));
       
   }
    
   // --------------- Main handler -----------------------
    
   // Route the incoming request based on intent.
   // The JSON body of the request is provided in the event slot.
   export const handler = (event, context, callback) => {
       try {
           dispatch(event,
               (response) => {
                   callback(null, response);
               });
       } catch (err) {
           callback(err);
       }
   };
   ```

1. **저장**을 선택합니다.

## 샘플 이벤트 데이터를 사용하여 Lambda 함수 테스트
<a name="gs2-lambdafunction-test"></a>

콘솔에서 샘플 이벤트 데이터를 사용하여 Lambda 함수를 수동으로 호출해 해당 함수를 테스트합니다.

**Lambda 함수를 테스트하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1. **Lambda 함수** 페이지에서 Lambda 함수(`PizzaOrderProcessor).`를 선택합니다. 

1. 함수 페이지의 테스트 이벤트 목록에서 **테스트 이벤트 구성**을 선택합니다.

1. **테스트 이벤트 구성** 페이지에서 다음 작업을 수행하십시오.

   1. **새로운 테스트 이벤트 생성**을 선택하세요.

   1. **이벤트 이름** 필드에 이벤트 이름(`PizzaOrderProcessorTest`)을 입력합니다.

   1. 다음 Amazon Lex 이벤트를 창에 복사합니다.

      ```
      {
        "messageVersion": "1.0",
        "invocationSource": "FulfillmentCodeHook",
        "userId": "user-1",
        "sessionAttributes": {},
        "bot": {
          "name": "PizzaOrderingApp",
          "alias": "$LATEST",
          "version": "$LATEST"
        },
        "outputDialogMode": "Text",
        "currentIntent": {
          "name": "OrderPizza",
          "slots": {
            "size": "large",
            "pizzaKind": "meat",
            "crust": "thin"
          },
          "confirmationStatus": "None"
        }
      }
      ```

1. **생성(Create)**을 선택합니다.

AWS Lambda 에서 테스트를 생성하고 함수 페이지로 돌아갑니다. **테스트**를 선택하면 Lambda가 Lambda 함수를 실행합니다.

결과 상자에서 **세부 정보**를 선택합니다. 콘솔이 **실행 결과** 창에 다음 출력을 표시합니다.

```
{
  "sessionAttributes": {},
  "dialogAction": {
    "type": "Close",
    "fulfillmentState": "Fulfilled",
    "message": {
      "contentType": "PlainText",
      "content": "Okay, I have ordered your large meat pizza on thin crust."
    }
}
```

## 다음 단계
<a name="gs2-next-step-create-bot"></a>

[2단계: 봇 생성](gs2-create-bot.md)

# 2단계: 봇 생성
<a name="gs2-create-bot"></a>

이 단계에서는 피자 주문을 처리하는 봇을 생성합니다.

**Topics**
+ [

# 봇 생성
](gs2-create-bot-create.md)
+ [

# 의도 생성
](gs2-create-bot-intent.md)
+ [

# 슬롯 유형 생성
](gs2-create-bot-slot-types.md)
+ [

# 의도 구성
](gs2-create-bot-configure-intent.md)
+ [

# 봇 구성하기
](gs2-create-bot-configure-bot.md)

# 봇 생성
<a name="gs2-create-bot-create"></a>

필요한 최소한의 정보를 사용하여 `PizzaOrderingBot` 봇을 생성합니다. 의도를 추가합니다. 의도는 봇에 대해 나중에 사용자가 수행하고자 하는 작업입니다.

**봇을 생성하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) Amazon Lex 콘솔을 엽니다.

1. 봇을 생성합니다.

   1. 첫 번째 봇을 생성하는 경우 **시작하기**를 선택합니다. 그렇지 않은 경우 **봇**, **생성**을 차례로 선택합니다.

   1. **Lex 봇 생성** 페이지에서 **사용자 지정 봇**을 선택하고 다음 정보를 입력합니다.
      + **봇 이름**: PizzaOrderingBot 
      + **언어**: 봇의 언어와 로캘을 선택합니다.
      + **출력 음성**: Salli 
      + **세션 제한 시간**: 5분.
      + **COPPA**: 적절한 응답을 선택하세요.
      + **사용자 표현 스토리지: 적절한 응답을 선택하십시오.**

   1. **생성(Create)**을 선택합니다.

      콘솔은 Amazon Lex에 새 봇을 생성하라는 요청을 보냅니다. Amazon Lex는 봇 버전을 `$LATEST`로 설정합니다. 봇을 생성한 후 Amazon Lex는 다음 이미지와 같이 봇 **편집기** 탭을 표시합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-20.png)
      + 봇 버전 **최신**은 콘솔에서 봇 이름 옆에 표시됩니다. 새로운 Amazon Lex 리소스의 버전은 `$LATEST`입니다. 자세한 내용은 [버전 관리 및 별칭](versioning-aliases.md)을 참조하세요.
      + 의도 또는 슬롯 유형을 생성하지 않았으므로 아무 것도 표시되지 않습니다.
      + **빌드** 및 **게시는**는 봇 수준 작업입니다. 전체 봇을 구성한 후에 이러한 작업에 대해 자세히 알아보겠습니다.

## 다음 단계
<a name="gs2-next-step-intent"></a>

[의도 생성](gs2-create-bot-intent.md)

# 의도 생성
<a name="gs2-create-bot-intent"></a>

이제 사용자가 수행하려는 작업인 `OrderPizza` 의도를 필요한 최소한의 정보를 사용해 생성합니다. 의도에 대한 슬롯 유형을 추가한 후 나중에 의도를 구성합니다.

**의도를 생성하려면**

1. Amazon Lex 콘솔에서 **의도** 옆의 더하기 기호(\$1)를 선택한 후 **새 의도 생성**을 선택합니다.

1. **의도 생성** 대화 상자에 의도 이름(`OrderPizza`)을 입력한 후, **추가**를 선택합니다.

그러면 콘솔이 `OrderPizza` 의도를 생성하도록 Amazon Lex에 요청을 보냅니다. 이 예제에서 슬롯 유형을 생성한 다음 의도에 맞는 슬롯을 생성합니다.

## 다음 단계
<a name="gs2-next-step-slot-types"></a>

[슬롯 유형 생성](gs2-create-bot-slot-types.md)

# 슬롯 유형 생성
<a name="gs2-create-bot-slot-types"></a>

`OrderPizza` 의도에서 사용하는 슬롯 유형 또는 파라미터 값을 생성합니다.

**슬롯 유형을 생성하려면**

1. <a name="slotTypeStart"></a>왼쪽 메뉴에서 **슬롯 유형** 옆의 더하기 기호(\$1)를 선택합니다.

1. **슬롯 유형 추가** 대화 상자에서 다음을 추가합니다.
   + **슬롯 유형 이름** – 크러스트
   + **설명** – 선택 가능한 크러스트
   + **슬롯 값 및 동의어로 제한** 선택
   + **값** – **thick**를 입력합니다. 탭을 누르고 **동의어** 필드에 **stuffed**를 입력합니다. 더하기 기호를 선택합니다 (\$1). **thin**을 입력한 후 더하기 기호(\$1)를 다시 선택합니다.

   대화 상자는 다음과 같아야 합니다.  
![\[슬롯 유형 대화 상자 편집.\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-25a.png)

1. **의도에 슬롯 추가**를 선택합니다.

1. <a name="slotTypeFinish"></a>**의도** 페이지에서 **필수**를 선택합니다. **slotOne**에서 **crust**로 슬롯 이름을 변경합니다. 프롬프트를 **What kind of crust would you like?**로 변경합니다.

1. 다음 표의 값을 사용하여 [Step 1](#slotTypeStart)\$1[Step 4](#slotTypeFinish)를 반복합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/gs2-create-bot-slot-types.html)

## 다음 단계
<a name="gs2-next-step-configure-intent"></a>

[의도 구성](gs2-create-bot-configure-intent.md)

# 의도 구성
<a name="gs2-create-bot-configure-intent"></a>

사용자의 피자 주문 요청을 이행하도록 `OrderPizza` 의도를 구성합니다.

**의도를 구성하려면**
+ **OrderPizza** 구성 페이지에서 다음과 같이 의도를 구성합니다.
  + **샘플 표현** – 다음 문자열을 입력합니다. 중괄호 \$1\$1로 슬롯 이름을 묶습니다.
    + 피자 주문을 할 수 있을까요 
    + 피자 주문하고 싶어요
    + \$1pizzaKind\$1 피자를 주문하고 싶어요
    + \$1size\$1 크기의 \$1pizzaKind\$1 피자를 주문하고 싶어요 
    + \$1size\$1 크기의 \$1crust\$1 크러스트 \$1pizzaKind\$1 피자 주문할게요
    + 피자를 먹을 수 있을까요
    + \$1pizzaKind\$1 피자를 먹을 수 있을까요
    + \$1size\$1 크기의 \$1pizzaKind\$1 피자를 먹을 수 있을까요
  + **Lambda 초기화 및 검증** – 기본 설정을 그대로 둡니다.
  + **확인 프롬프트** – 기본 설정을 그대로 둡니다.
  + **이행** – 아래의 작업을 수행합니다.
    + **AWS Lambda 함수**를 선택합니다.
    + **PizzaOrderProcessor**을 선택합니다.
    + **Lambda 함수에 권한 추가** 대화 상자가 표시되면, **확인**을 선택하여 `OrderPizza` 의도에 `PizzaOrderProcessor` Lambda 함수를 호출할 권한을 부여합니다.
    +  **없음**이 선택된 상태로 둡니다.

  이 의도는 다음과 같아야 합니다.  
![\[의도 편집기.\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-70c.png)

## 다음 단계
<a name="gs2-next-step-configure-bot"></a>

[봇 구성하기](gs2-create-bot-configure-bot.md)

# 봇 구성하기
<a name="gs2-create-bot-configure-bot"></a>

`PizzaOrderingBot` 봇에 대한 오류 처리를 구성합니다.

1. `PizzaOrderingBot` 봇으로 이동합니다. **편집기**를 선택한 다음, 다음 이미지와 같이 **오류 처리**를 선택합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-80.png)

1. **편집기** 탭을 사용하여 봇 오류 처리를 구성합니다.
   + **명료화 프롬프트**에 입력한 정보가 봇의 [clarificationPrompt](https://docs.aws.amazon.com/lex/latest/dg/API_PutBot.html#lex-PutBot-request-clarificationPrompt) 구성으로 매핑됩니다.

     Amazon Lex에서 사용자 의도를 확인할 수 없는 경우, 이 서비스는 이 메시지가 포함된 응답을 반환합니다.
   + **중단** 문구에 입력한 정보가 봇의 [abortStatement](https://docs.aws.amazon.com/lex/latest/dg/API_PutBot.html#lex-PutBot-request-abortStatement) 구성으로 매핑됩니다.

     이 서비스에서 정해진 연속 요청 이후 사용자의 의도를 확인할 수 없는 경우, Amazon Lex는 이 메시지가 포함된 응답을 반환합니다.

   기본값을 그대로 둡니다.

## 다음 단계
<a name="gs2-next-step-build-and-test"></a>

[3단계: 봇 구축 및 테스트](gs2-build-and-test.md)

# 3단계: 봇 구축 및 테스트
<a name="gs2-build-and-test"></a>

봇을 구축한 다음 테스트해 작동하는지 확인합니다.

**봇을 구축 및 테스트하려면**

1. `PizzaOrderingBot` 봇을 구축하려면 **빌드**를 선택합니다.

   Amazon Lex가 봇을 위한 기계 학습 모델을 구축합니다. 콘솔에서 봇을 테스트할 경우, 콘솔은 런타임 API를 사용하여 사용자 입력을 Amazon Lex에 되돌려 보냅니다. 그 뒤에 Amazon Lex 는 기계 학습 모델을 사용하여 사용자 입력을 해석합니다.

   구축을 완료하는 데 다소 시간이 걸릴 수 있습니다.

1. Amazon Lex 봇을 테스트하려면 **봇 테스트** 창에서 봇과의 통신을 시작합니다.
   + 예를 들어 다음과 같이 말하거나 입력할 수 있습니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-110.png)
   + `OrderPizza` 의도에서 구성한 샘플 표현을 사용해 봇을 테스트합니다. 예를 들어, 다음은 사용자가 `PizzaOrder` 의도에 대해 구성한 샘플 표현 중 하나입니다.

     ```
     I want a {size} {crust} crust {pizzaKind} pizza
     ```

     테스트하려면 다음과 같이 입력합니다.

     ```
     I want a large thin crust cheese pizza
     ```

   "피자 주문하고 싶어요"라고 입력하면 Amazon Lex가 의도(`OrderPizza`)를 감지합니다. 그러면 Amazon Lex는 슬롯 정보를 묻습니다.

   사용자가 모든 슬롯 정보를 제공하면, Amazon Lex는 사용자가 의도에 대해 구성한 Lambda 함수를 호출합니다.

   Lambda 함수가 에 메시지("네, 당신의 주문을...")를 반환하고, Amazon Lex는 해당 메시지를 사용자에게 반환합니다.

## 응답 검사
<a name="gs2-inspect-pane"></a>

채팅 창 아래에는 Amazon Lex의 응답을 검사할 수 있는 창이 있습니다. 이 창은 봇과의 상호 작용에 따라 변하는 봇의 상태에 대한 포괄적인 정보를 제공합니다. 이 창의 내용은 작업의 현재 상태를 보여 줍니다.
+ **대화 상자 상태** – 사용자와의 대화에 대한 현재 상태입니다. `ElicitIntent`, `ElicitSlot`, `ConfirmIntent` 또는 `Fulfilled`일 수 있습니다.

   
+ **요약** – 정보 흐름을 계속 추적할 수 있도록 이행 중인 의도에 대한 슬롯 값을 보여 주는 대화의 단순화된 보기가 표시됩니다. 여기에는 의도 이름, 슬롯 수, 이행된 슬롯 수, 모든 슬롯 및 연결된 값 목록이 표시됩니다. 다음 이미지를 참조하세요.  
![\[Amazon Lex 콘솔의 응답 요약 검사 창.\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-115.png)
+ **세부 정보** – 챗봇을 테스트 및 디버그함에 따른 대화의 현재 상태와 봇 상호 작용을 더욱 자세히 볼 수 있도록 챗봇의 원시 JSON 응답을 보여 줍니다. 채팅 창에 입력하면 검사 창에 [PostText](API_runtime_PostText.md) 작업의 JSON 응답이 표시됩니다. 채팅 창에 말하면 검사 창에 [PostContent](API_runtime_PostContent.md) 작업의 응답 헤더가 표시됩니다. 다음 이미지를 참조하세요.  
![\[콘솔의 응답 검사 창.\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs1-116.png)

## 다음 단계
<a name="gs2-next-step-clean-up"></a>

[4단계(선택 사항): 정리](gs2-clean-up.md)

# 4단계(선택 사항): 정리
<a name="gs2-clean-up"></a>

생성한 리소스에 대해 추가 비용이 발생하지 않도록 생성한 리소스를 삭제하고 계정을 정리합니다.

사용하지 않는 리소스만 삭제할 수 있습니다. 예를 들어 의도에서 참조하는 슬롯 유형은 삭제할 수 없습니다. 봇에서 참조하는 의도는 삭제할 수 없습니다.

다음 순서에 따라 리소스를 삭제합니다.
+ 봇을 삭제하여 의도 리소스를 확보합니다.
+ 의도를 삭제하여 슬롯 유형 리소스를 확보합니다.
+ 마지막으로 슬롯 유형을 삭제합니다.



**계정을 정리하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) Amazon Lex 콘솔을 엽니다.

1. 봇 목록에서 **PizzaOrderingBot**을 선택합니다.

1. 봇을 삭제하려면 **삭제**를 선택한 후 **계속**을 선택합니다.

1. 왼쪽 창에서 **의도**를 선택합니다.

1. 의도 목록에서 **OrderPizza**를 선택합니다.

1. 의도를 삭제하려면 **삭제**를 선택한 후 **계속**을 선택합니다.

1. 왼쪽 메뉴에서 **슬롯 유형**를 선택합니다.

1. <a name="chooseSlots"></a>슬롯 유형 목록에서 **크러스트**를 선택합니다.

1. <a name="deleteSlots"></a>슬롯 유형을 삭제하려면 **삭제**를 선택한 후 **계속**을 선택합니다.

1. `Sizes` 및 `PizzaKind` 슬롯 유형에 대해 [Step 8](#chooseSlots) 및 [Step 9](#deleteSlots)를 반복합니다.

생성한 모든 리소스를 제거하고 계정을 정리했습니다.

## 다음 단계
<a name="gs-ex2-more-info"></a>
+ [버전 게시 및 별칭 생성](https://docs.aws.amazon.com/lex/latest/dg/gettingstarted-ex3.html)
+ [를 사용하여 Amazon Lex 봇 생성 AWS Command Line Interface](https://docs.aws.amazon.com/lex/latest/dg/gs-cli.html)

# 연습 3: 버전 게시 및 별칭 만들기
<a name="gettingstarted-ex3"></a>

시작하기 연습 1 및 2에서는 봇을 생성하여 테스트했습니다. 이 연습에서는 다음 작업을 수행합니다.
+ 새 버전의 봇을 게시합니다. Amazon Lex가 `$LATEST` 버전의 스냅샷 복사본을 만들어 새 버전을 게시합니다.
+ 새 버전을 가리키는 별칭을 생성합니다.

버전 관리 및 별칭에 대한 자세한 내용은 [버전 관리 및 별칭](versioning-aliases.md)을 참조하십시오.

다음을 수행하여 이 실습에서 생성한 봇 버전을 게시합니다.

1. Amazon Lex 콘솔에서, 사용자가 생성한 봇 중 하나를 선택합니다.

   콘솔에서 `$LATEST`를 봇 이름 옆에 있는 봇 버전으로 표시하는지 확인합니다.

1. **게시**를 선택합니다.

1. **게시 *봇 이름*** 마법사에서 별칭 **BETA**를 지정한 다음 **게시**를 선택합니다.

1. Amazon Lex 콘솔에서 봇 이름 옆에 새로운 버전이 표시되는지 확인합니다.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lex/latest/dg/images/gs2-final.png)

이제 게시된 버전 및 별칭을 지닌 봇이 사용 가능하므로 이 봇을 배포(모바일 애플리케이션에서 배포하거나 Facebook Messenger에 통합)할 수 있습니다. 관련 예제는 [Amazon Lex 봇을 Facebook Messenger와 통합하기](fb-bot-association.md)을 참조하세요.