

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

# Amazon Lex V2 봇 대화 이해
<a name="managing-conversations"></a>

봇을 구축한 후에는 클라이언트 애플리케이션을 Amazon Lex V2 런타임 작업과 통합하여 봇과 대화를 진행합니다. 사용자가 봇과 대화를 시작하면 Amazon Lex V2는 *세션*을 생성합니다. 이 세션은 애플리케이션과 봇 간에 교환되는 정보를 캡슐화합니다. 자세한 내용은 [Amazon Lex V2 봇 세션 이해](managing-sessions.md) 단원을 참조하세요.

일반적인 대화에는 사용자와 봇 간의 오가는 흐름이 포함됩니다. 예제:

```
User : I'd like to make an appointment
Bot : What type of appointment would you like to schedule?
User : dental
Bot : When should I schedule your dental appointment?
User : Tomorrow
Bot : At what time do you want to schedule the dental appointment on 2021-01-01?
User : 9 am
Bot : 09:00 is available, should I go ahead and book your appointment?
User : Yes
Bot : Thank you. Your appointment has been set successfully.
```

[RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 또는 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) API 작업을 사용하여 직접 대화를 관리합니다. [StartConversation](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_StartConversation.html) API 작업을 사용하여 Amazon Lex V2가 자동으로 대화를 관리하도록 합니다.

대화를 관리하려면 대화가 논리적으로 끝날 때까지 봇에게 사용자 발화를 보내야 합니다. 현재 대화는 세션 상태로 캡처됩니다. 세션 상태는 각 사용자 발화 후에 업데이트됩니다. 세션 상태는 대화의 현재 상태를 포함하며 각 사용자 발화에 대한 응답으로 봇이 반환합니다.

대화는 다음 상태 중 하나일 수 있습니다.
+ **ElicitIntent** – 봇이 아직 사용자의 의도를 파악하지 못했음을 나타냅니다.
+ **ElicitSlot** – 봇이 사용자의 의도를 감지하고 의도를 이행하는 데 필요한 정보를 수집하고 있음을 나타냅니다.
+ **ConfirmIntent** – 봇이 사용자가 수집된 정보가 정확한지 확인할 때까지 기다리고 있음을 나타냅니다.
+ **Closed** – 사용자의 의도가 완전하고 봇과의 대화가 논리적으로 끝났음을 나타냅니다.

사용자는 첫 번째 의도가 완료된 후 새 의도를 지정할 수 있습니다. 자세한 내용은 [Lex V2 봇과의 대화 컨텍스트](conversation-contexts.md) 단원을 참조하세요.

의도에는 다음과 같은 상태 중 하나가 있을 수 있습니다.
+ **InProgress** – 봇이 의도를 완료하는 데 필요한 정보를 수집하고 있음을 나타냅니다. 이는 `ElicitSlot` 대화 상태와 관련이 있습니다.
+ **Waiting** – 봇이 특정 슬롯에 대한 정보를 요청했을 때 사용자가 봇에게 대기하도록 요청했음을 나타냅니다.
+ **Fulfilled** – 의도와 연결된 Lambda 함수의 비즈니스 로직이 성공적으로 실행되었음을 나타냅니다.
+ **ReadyForFulfillment** – 봇이 의도를 이행하는 데 필요한 모든 정보를 수집했으며 클라이언트 애플리케이션이 이행 비즈니스 로직을 실행할 수 있음을 나타냅니다.
+ **Failed** – 의도가 실패했음을 나타냅니다.

Amazon Lex V2 API를 사용하여 봇과 사용자 간의 대화 컨텍스트와 세션을 관리하는 방법을 알아보려면 다음 주제를 참조하세요.

**Topics**
+ [Lex V2 봇과의 대화 컨텍스트](conversation-contexts.md)
+ [Amazon Lex V2 봇 세션 이해](managing-sessions.md)

# Lex V2 봇과의 대화 컨텍스트
<a name="conversation-contexts"></a>

*대화 컨텍스트*는 사용자, 클라이언트 애플리케이션 또는 Lambda 함수가 의도를 이행하기 위해 Amazon Lex V2 봇에 제공하는 정보입니다. 대화 컨텍스트에는 사용자가 제공하는 슬롯 데이터, 클라이언트 애플리케이션에서 설정한 요청 속성, 클라이언트 애플리케이션과 Lambda 함수가 생성하는 세션 속성이 포함됩니다.

**Topics**
+ [Lex V2 봇의 의도 컨텍스트 설정](context-mgmt-active-context.md)
+ [Lex V2 봇에서 의도에 기본 슬롯 값 사용](context-mgmt-default.md)
+ [Lex V2 봇의 세션 특성 설정](context-mgmt-session-attribs.md)
+ [Lex V2 봇의 요청 특성 설정](context-mgmt-request-attribs.md)
+ [세션 시간 제한 설정](context-mgmt-session-timeout.md)
+ [Lex V2 봇과 의도 간 정보 공유](context-mgmt-cross-intent.md)
+ [Lex V2 봇에서 복잡한 특성 설정](context-mgmt-complex-attributes.md)

# Lex V2 봇의 의도 컨텍스트 설정
<a name="context-mgmt-active-context"></a>

*컨텍스트*에 따라 Amazon Lex V2 트리거 의도를 사용할 수 있습니다. *컨텍스트*는 봇을 정의할 때 intent와 연결할 수 있는 상태 변수입니다. 콘솔이나 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 작업을 사용하여 의도를 만들 때 intent의 컨텍스트를 구성합니다. 영어(미국)(en-US) 로캘에서만 컨텍스트를 사용할 수 있습니다.

컨텍스트에는 출력 컨텍스트와 입력 컨텍스트라는 두 가지 유형의 관계가 있습니다. 관련 intent가 이행되면 *출력 컨텍스트*가 활성화됩니다. 출력 컨텍스트는 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 또는 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 작업의 응답으로 애플리케이션에 반환되며, 이 컨텍스트는 현재 세션에 맞게 설정됩니다. 컨텍스트가 활성화된 후에는 컨텍스트가 정의될 때 구성된 턴 수 또는 시간 제한 동안 활성 상태를 유지합니다.

*입력 컨텍스트*는 의도를 인식할 수 있는 조건을 지정합니다. 의도는 모든 입력 컨텍스트가 활성화된 경우에만 대화 중에 인식될 수 있습니다. 입력 컨텍스트가 없는 의도는 항상 인식될 수 있습니다.

Amazon Lex V2는 출력 컨텍스트로 의도를 이행하여 활성화된 컨텍스트의 수명 주기를 자동으로 관리합니다. `RecognizeText` 또는 `RecognizeUtterance` 작업에 대한 직접 호출에서 활성 컨텍스트를 설정할 수도 있습니다.

또한 의도에 대한 Lambda 함수를 사용하여 대화의 컨텍스트를 설정할 수 있습니다. Amazon Lex V2의 출력 컨텍스트는 Lambda 함수 입력 이벤트로 전송됩니다. Lambda 함수는 응답으로 컨텍스트를 전송할 수 있습니다. 자세한 내용은 [Amazon Lex V2 봇에 AWS Lambda함수 통합](lambda.md) 단원을 참조하세요.

예를 들어, "book\$1car\$1fulfilled"라는 출력 컨텍스트를 반환하도록 구성된 렌터카를 예약하려는 의도가 있다고 가정해 보겠습니다. 의도가 이행되면 Amazon Lex V2는 출력 컨텍스트 변수 "book\$1car\$1fulfilled"를 설정합니다. "book\$1car\$1fulfilled"는 활성 컨텍스트이므로 "book\$1car\$1fulfilled" 컨텍스트가 입력 컨텍스트로 설정된 의도는 이제 인식 대상으로 간주됩니다. 단, 사용자 표현이 해당 의도를 이끌어내려는 시도로 인식되어야 합니다. 영수증을 이메일로 보내거나 예약을 수정하는 등 차량 예약 이후에만 의미가 있는 의도에 이 방법을 사용할 수 있습니다.

## Lex V2 봇의 의도 출력 컨텍스트
<a name="context-output"></a>

Amazon Lex V2는 의도가 이행될 때 의도의 출력 컨텍스트를 활성화합니다. 출력 컨텍스트를 사용하여 현재 의도의 후속 조치로 적합한 의도를 제어할 수 있습니다.

각 컨텍스트에는 세션에서 유지 관리되는 파라미터 목록이 있습니다. 파라미터는 수행된 의도의 슬롯 값입니다. 이 매개변수를 사용하여 다른 의도의 슬롯 값을 미리 채울 수 있습니다. 자세한 내용은 [Lex V2 봇에서 의도에 기본 슬롯 값 사용](context-mgmt-default.md) 단원을 참조하세요.

콘솔이나 [CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 작업을 사용하여 intent를 생성할 때 출력 컨텍스트를 구성합니다. 둘 이상의 출력 컨텍스트로 intent를 구성할 수 있습니다. intent가 이행되면 모든 출력 컨텍스트가 활성화되고 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 또는 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 응답에 반환됩니다.

출력 컨텍스트를 정의할 때 *컨텍스트*가 Amazon Lex V2의 응답에 포함되는 시간, 시간 또는 회전 수도 정의합니다. *턴*은 애플리케이션에서 Amazon Lex V2로 보내는 하나의 요청입니다. 턴 수 또는 시간이 만료되면 컨텍스트는 더 이상 활성화되지 않습니다.

애플리케이션은 필요에 따라 출력 컨텍스트를 사용할 수 있습니다. 예를 들어, 애플리케이션은 출력 컨텍스트를 사용하여 다음을 수행할 수 있습니다.
+ 컨텍스트를 기반으로 응용 프로그램의 동작을 변경합니다. 예를 들어 여행 애플리케이션은 "book\$1car\$1fulfilled" 컨텍스트에서 "rental\$1hotel\$1fulfilled"와는 다른 작업을 수행할 수 있습니다.
+ 출력 컨텍스트를 Amazon Lex V2에 다음 발화의 입력 컨텍스트로 반환합니다. Amazon Lex V2는 표현을 의도를 유도하려는 시도로 인식하는 경우 컨텍스트를 사용하여 지정된 컨텍스트가 있는 의도로 반환할 수 있는 의도를 제한합니다.

## Lex V2 봇의 의도 입력 컨텍스트
<a name="context-input"></a>

대화에서 의도가 인식되는 지점을 제한하도록 입력 컨텍스트를 설정합니다. 입력 컨텍스트가 없는 의도는 항상 인식될 수 있습니다.

콘솔이나 `CreateIntent` 작업을 사용하여 의도가 응답하는 입력 컨텍스트를 설정합니다. intent에는 입력 컨텍스트가 둘 이상 있을 수 있습니다.

입력 컨텍스트가 두 개 이상인 intent의 경우 intent를 트리거하려면 모든 컨텍스트가 활성 상태여야 합니다. [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html), [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 또는 [PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html) 작업을 직접적으로 호출할 때 입력 컨텍스트를 설정할 수 있습니다.

현재 활성 컨텍스트에서 기본값을 가져오도록 intent에서 슬롯을 구성할 수 있습니다. 기본값은 Amazon Lex V2가 새 의도를 인식하지만 슬롯 값을 수신하지 않을 때 사용됩니다. 슬롯을 정의할 때 컨텍스트 이름과 슬롯 이름을 `#context-name.parameter-name` 형식으로 지정합니다. 자세한 내용은 [Lex V2 봇에서 의도에 기본 슬롯 값 사용](context-mgmt-default.md) 단원을 참조하세요.

# Lex V2 봇에서 의도에 기본 슬롯 값 사용
<a name="context-mgmt-default"></a>

기본값을 사용하는 경우 사용자 입력으로 슬롯이 제공되지 않을 때 새 의도에 맞게 채워질 슬롯 값의 소스를 지정합니다. 이 소스는 이전 대화상자, 요청 또는 세션 속성이거나 빌드 시 설정한 고정 값일 수 있습니다.

다음을 기본값의 소스로 사용할 수 있습니다.
+ 이전 대화 상자(컨텍스트) – \$1context -name.parameter-name
+ 세션 속성 – [attribute-name]
+ 요청 속성 – <attribute-name>
+ 고정 값 – 이전 값과 일치하지 않는 모든 값

[CreateIntent](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateIntent.html) 작업을 사용하여 intent에 슬롯을 추가할 때 기본값 목록을 추가할 수 있습니다. 기본값은 나열된 순서대로 사용됩니다. 예를 들어 다음과 같은 정의의 슬롯이 있는 의도를 가정합니다.

```
"slots": [
    {
        "botId": "string",
        "defaultValueSpec": {
            "defaultValueList": [
                {
                    "defaultValue": "#book-car-fulfilled.startDate"
                },
                {
                    "defaultValue": "[reservationStartDate]"
                }
            ]
        },
        Other slot configuration settings
    }
]
```

의도가 인식되면 이름이 "reservation-start-date"라는 슬롯의 값은 다음 중 하나로 설정됩니다.

1. "book-car-fulfilled" 컨텍스트가 활성화된 경우 "startDate" 매개 변수의 값이 기본값으로 사용됩니다.

1. "book-car-fulfilled" 컨텍스트가 비활성화된 경우 또는 "startDate" 매개 변수가 설정되지 않은 경우, "reservationStartDate"의 세션 속성의 값이 기본값으로 사용됩니다.

1. 처음 두 기본값 중 어느 것도 사용되지 않으면 슬롯에 기본값이 없으며 Amazon Lex V2는 평소와 같이 값을 유도합니다.

슬롯에 기본값을 사용하면 필요한 경우에도 슬롯이 추출되지 않습니다.

# Lex V2 봇의 세션 특성 설정
<a name="context-mgmt-session-attribs"></a>

*세션 속성*에는 세션 중에 봇과 클라이언트 애플리케이션 간에 전달되는 애플리케이션별 정보가 포함됩니다. Amazon Lex V2는 봇에 대해 구성된 모든 Lambda 함수에 세션 속성을 전달합니다. Lambda 함수가 세션 속성을 추가 또는 업데이트하는 경우 Amazon Lex V2는 새로운 정보를 클라이언트 애플리케이션에 다시 전달합니다.

Lambda 함수의 세션 속성을 사용하여 봇을 초기화하고 프롬프트 및 응답 카드를 사용자 지정합니다. 예제:
+ 초기화 – 피자 주문 봇에서 클라이언트 애플리케이션은 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 또는 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 작업에 대한 첫 번째 직접 호출 시 사용자의 위치를 세션 속성으로 전달합니다. 예를 들어 `"Location": "111 Maple Street"`입니다. Lambda 함수는 이 정보를 사용하여 주문할 수 있는 가장 가까운 피자 가게를 찾습니다.
+ 프롬프트 개인화 - 세션 속성을 참조하도록 프롬프트와 응답 카드를 구성합니다. 예를 들어, "[FirstName]님, 어떤 토핑을 드시겠어요?" 사용자의 이름을 세션 속성(`{"FirstName": "Vivian"}`)으로 전달하면 Amazon Lex 가 자리 표시자를 이름으로 대체합니다. 그런 다음 사용자에게 “Hey Vivian, 어떤 토핑을 원하세요?”라는 맞춤형 프롬프트를 보냅니다.

세션 속성은 세션 기간 동안 암호화된 저장소에서 지속됩니다. Amazon Lex V2는 세션이 종료될 때까지 암호화된 데이터 스토어에 저장합니다. 클라이언트는 `sessionAttributes` 필드가 값으로 설정된 상태에서 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 또는 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 작업을 직접적으로 호출하여 요청에 세션 속성을 생성할 수 있습니다. Lambda 함수 는 응답에 세션 속성을 생성할 수 있습니다. 클라이언트 또는 Lambda 함수가 세션 속성을 생성한 후에는 클라이언트 애플리케이션이 Amazon Lex V2에 대한 요청에 `sessionAttribute` 필드를 포함하지 않을 때마다 저장된 속성 값이 사용됩니다.

예를 들어, 다음과 같은 두 개의 세션 속성 `{"x": "1", "y": "2"}`이 있다고 가정하겠습니다. 클라이언트가 `sessionAttributes` 필드를 지정하지 않고 `RecognizeText` 또는 `RecognizeUtterance` 작업을 호출하는 경우 Amazon Lex V2는 저장된 세션 속성()을 사용하여 Lambda 함수를 호출합니다`{"x": 1, "y": 2}`. Lambda 함수가 세션 속성을 반환하지 않으면 Amazon Lex V2는 저장된 세션 속성을 클라이언트 애플리케이션에 반환합니다.

클라이언트 애플리케이션 또는 Lambda 함수가 세션 속성을 전달하면 Amazon Lex V2는 저장된 세션 속성을 업데이트합니다. ` {"x": 2}`과 같은 기존 값을 전달하면 저장된 값이 업데이트됩니다. 새 세션 속성 세트(예를 들어, `{"z": 3}`) 를 전달하면 기존 값은 제거되고 새 값만 유지됩니다. 빈 맵 `{}`가 전달되면 저장된 값이 지워집니다.

세션 속성을 Amazon Lex V2로 전송하려면 속성의 string-to-string 맵을 생성합니다. 다음은 세션 속성을 매핑하는 방법을 보여줍니다.

```
{
   "attributeName": "attributeValue",
   "attributeName": "attributeValue"
}
```

`RecognizeText` 작업의 경우 다음과 같이 `sessionState` 구조의 `sessionAttributes` 필드를 사용하여 요청 본문에 맵을 삽입합니다.

```
"sessionState": {
    "sessionAttributes": {
        "attributeName": "attributeValue",
        "attributeName": "attributeValue"
    }
}
```

`RecognizeUtterance` 작업의 경우, 맵을 base64로 인코딩한 다음 `x-amz-lex-session-state` 헤더의 일부로 전송합니다.

세션 속성으로 이진수 또는 구조화된 데이터를 보내는 경우 먼저 데이터를 단순 문자열로 변환해야 합니다. 자세한 내용은 [Lex V2 봇에서 복잡한 특성 설정](context-mgmt-complex-attributes.md) 단원을 참조하세요.

# Lex V2 봇의 요청 특성 설정
<a name="context-mgmt-request-attribs"></a>

*요청 속성*은 요청 관련 정보를 포함하고 있고 현재 요청에만 적용됩니다. 클라이언트 애플리케이션은이 정보를 Amazon Lex V2로 전송합니다. 전체 세션에서 유지할 필요가 없는 정보를 전달하려면 요청 속성을 사용합니다. 요청 속성을 직접 생성할 수도 있고 사전 정의된 속성을 사용할 수도 있습니다. 요청 속성을 보내려면 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 요청에 포함된 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 또는 `requestAttributes` 필드 안의 `x-amz-lex-request-attributes` 헤더를 사용합니다. 요청 속성은 세션 속성처럼 요청 전체에 지속되지 않기 때문에 요청 속성은 `RecognizeUtterance` 또는 `RecognizeText` 응답에서 반환되지 않습니다.

**참고**  
요청 간에 유지되는 정보를 보내려면 세션 속성을 사용하세요.

## 각 Lex V2 봇 요청에서 사용자 정의 요청 특성 설정
<a name="context-mgmt-user"></a>

*사용자-정의 요청 속성*은 각 요청에서 봇에 보내는 데이터입니다. `RecognizeUtterance` 요청의 `amz-lex-request-attributes` 헤더나 `RecognizeText` 요청의 `requestAttributes` 필드에 정보를 전송합니다.

Amazon Lex V2로 요청 속성을 보내려면 속성의 string-to-string 맵을 생성합니다. 다음은 세션 속성을 매핑하는 방법을 보여줍니다.

```
{
   "attributeName": "attributeValue",
   "attributeName": "attributeValue"
}
```

`PostText` 작업의 경우 다음과 같이 `requestAttributes` 필드를 사용하여 요청 본문에 맵을 삽입합니다.

```
"requestAttributes": {
   "attributeName": "attributeValue",
   "attributeName": "attributeValue"
}
```

`PostContent` 작업의 경우, 맵을 base64로 인코딩한 다음 `x-amz-lex-request-attributes` 헤더로 전송합니다.

세션 속성으로 이진수 또는 구조화된 데이터를 보내는 경우 먼저 데이터를 단순 문자열로 변환해야 합니다. 자세한 내용은 [Lex V2 봇에서 복잡한 특성 설정](context-mgmt-complex-attributes.md) 단원을 참조하십시오.

Amazon Lex V2는 봇으로 전송된 정보를 처리하는 방식을 관리하기 위해 사전 정의된 요청 속성을 제공합니다. 속성은 전체 세션 동안 지속되지 않으므로 각 요청에서 사전 정의된 속성을 전송해야 합니다. 사전 정의된 모든 속성은 `x-amz-lex:` 네임스페이스에 있습니다. 

Amazon Lex는 다음과 같은 사전 정의된 속성 외에도 메시징 플랫폼을 위한 사전 정의된 속성을 제공합니다. 이러한 속성 목록은 메시징 플랫폼에서 Amazon Lex 봇 배포 섹션을 참조하세요.

## 응답 유형 설정
<a name="response-type-context"></a>



기능이 다른 두 개의 클라이언트 애플리케이션을 사용하는 경우 응답의 메시지 형식을 제한해야 할 수 있습니다. 예를 들어 웹 클라이언트에 보내는 메시지는 일반 텍스트로 제한하고 모바일 클라이언트는 일반 텍스트와 음성 합성 마크업 언(SSML)를 모두 사용할 수 있도록 할 수 있습니다. `PostContent` 및 `PostText` 작업이 필드에 반환하는 메시지 형식을 제어하려면 x-amz-lex:accept-content-types 요청 속성을 사용합니다.

다음 메시지 유형의 모든 조합으로 속성을 설정할 수 있습니다.
+ `PlainText` - 메시지에 일반 UTF-8 텍스트가 포함됩니다.
+ `SSML` - 메시지에 음성 출력용으로 서식이 지정된 텍스트가 포함됩니다.
+ `CustomPayload` - 메시지에 클라이언트용으로 생성한 사용자 지정 형식이 포함됩니다. 애플리케이션의 요건을 이행하도록 페이로드를 정의할 수 있습니다.

Amazon Lex V2는 응답 메시지 필드에 지정된 유형의 메시지만 반환합니다. 값을 쉼표로 구분하여 둘 이상의 값을 설정할 수 있습니다. 메시지 그룹을 사용하는 경우 모든 메시지 그룹에는 지정된 유형의 메시지가 하나 이상 포함되어야 합니다. 그러지 않을 경우 `NoUsableMessageException` 오류가 발생합니다. 더 자세한 내용은, 메시지 그룹을 참조하십시오.

## Lex V2 봇에서 사전 정의된 요청 속성 설정
<a name="setting-predefined-request-attributes"></a>

Amazon Lex V2는 봇으로 전송된 정보를 처리하는 방식을 관리하기 위해 사전 정의된 요청 속성을 제공합니다. 속성은 전체 세션 동안 지속되지 않으므로 각 요청에서 사전 정의된 속성을 전송해야 합니다. 사전 정의된 모든 속성은 `x-amz-lex:` 네임스페이스에 있습니다. 

## Lex V2 봇에서 의도 전환 비활성화
<a name="disabling-intent-switches-attributes"></a>

사용자가 의도 확인 또는 슬롯 유도 중에 의도 간에 전환할 수 있는지 여부를 제어하려면 `x-amz-lex:intent-switch` 요청 속성을 사용합니다. `DISABLE`로 설정하면 이 속성은 사용자가 현재 의도 흐름을 완료하는 동안 다른 의도를 트리거하지 못하도록 합니다.

예를 들어, 사용자가 항공편을 예약하는 중에 항공편 세부 정보를 묻는 메시지가 표시되는 경우 일반적으로 다른 의도를 트리거할 수 있는 '날씨 확인' 또는 '예약 호텔'과 같은 표현은 무시되어 대화가 현재 예약 프로세스에 집중되도록 합니다.

# 세션 시간 제한 설정
<a name="context-mgmt-session-timeout"></a>

Amazon Lex는 대화 세션이 종료될 때까지 슬롯 데이터 및 세션 속성과 같은 컨텍스트 정보를 유지합니다. 봇의 세션 지속 시간을 제어하려면 세션 제한 시간을 설정하세요. 기본적으로 세션 기간은 5분이지만 0\$11,440분(24시간) 사이의 기간을 지정할 수 있습니다.

예를 들어, `OrderShoes` 및 `GetOrderStatus` 와 같은 의도를 지원하는 `ShoeOrdering` 봇을 생성한다고 가정해 보겠습니다. Amazon Lex는 사용자의 의도가 신발을 주문하는 것임을 감지하면 슬롯 데이터를 요청합니다. 예를 들어 신발 사이즈, 색상, 브랜드 등을 묻습니다. 사용자가 일부 슬롯 데이터를 제공했지만 신발 구매를 완료하지 않은 경우 Amazon Lex는 전체 세션의 슬롯 데이터와 세션 속성을 모두 기억합니다. 사용자가 세션이 만료되기 전에 세션으로 돌아오면 나머지 슬롯 데이터를 제공하고 구매를 완료할 수 있습니다.

Amazon Lex V2 콘솔에서 봇을 생성할 때 세션 제한 시간을 설정합니다. AWS Command Line Interface(AWS CLI) 또는 API에서는 [idleSessionTTLInSeconds](https://docs.aws.amazon.com/lexv2/latest/dg/API_PutBot.html#API_CreateBot.html#lexv2-CreateBot-request-idleSessionTTLInSeconds) 필드를 설정함으로써 [CreateBot](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBot.html) 작업을 갖는 봇을 생성할 때에 제한 시간을 설정합니다.

# Lex V2 봇과 의도 간 정보 공유
<a name="context-mgmt-cross-intent"></a>

Amazon Lex V2는 의도 간 정보 공유를 지원합니다. intent 간에 공유하려면 출력 컨텍스트 또는 세션 속성을 사용하세요.

출력 컨텍스트를 사용하려면 intent를 만들거나 업데이트할 때 출력 컨텍스트를 정의해야 합니다. intent가 이행되면 Amazon Lex V2의 응답에는 의도의 컨텍스트 및 슬롯 값이 컨텍스트 파라미터로 포함됩니다. 이러한 파라미터를 후속 intent나 애플리케이션 코드 또는 Lambda 함수에서 기본값으로 사용할 수 있습니다.

세션 속성을 사용하려면 Lambda 또는 애플리케이션 코드에서 속성을 설정합니다. 예를 들어 `ShoeOrdering` 봇 사용자는 신발을 주문하는 것으로 시작합니다. 봇은 사용자와 대화하면서 신발 사이즈, 색상, 브랜드와 같은 슬롯 데이터를 수집합니다. 사용자가 주문을 하면 주문을 이행하는 Lambda 함수가 주문 번호가 포함된 `orderNumber` 세션 속성을 설정합니다. 사용자는 `GetOrderStatus` 의도를 사용하여 주문 상태를 확인합니다. 봇은 사용자에게 주문 번호 및 주문 날짜와 같은 슬롯 데이터를 요청할 수 있습니다. 봇이 필수 정보를 수집하면 주문 상태를 반환합니다.

같은 세션에서 사용자가 의도를 바꿀 수 있다고 생각되면 최신 주문 상태를 반환하도록 봇을 설계할 수 있습니다. 사용자에게 주문 정보를 다시 요청하는 대신 `orderNumber` 세션 속성을 사용하여 의도 간에 정보를 공유하고 `GetOrderStatus` 의도를 이행할 수 있습니다. 봇은 사용자가 마지막으로 주문한 상태를 반환하여 이 작업을 수행합니다.

# Lex V2 봇에서 복잡한 특성 설정
<a name="context-mgmt-complex-attributes"></a>

세션 및 요청 속성은 속성 및 값의 문자열 간 매핑입니다. 대부분의 경우 문자열 맵을 사용하여 클라이언트 애플리케이션과 봇 간에 속성 값을 전송할 수 있습니다. 하지만 문자열 맵으로 쉽게 변환할 수 없는 이진 데이터나 복잡한 구조를 전송해야 하는 경우도 있습니다. 예를 들어 다음 JSON 객체는 미국에서 인구가 가장 많은 세 도시의 배열을 나타냅니다.

```
{
   "cities": [
      {
         "city": {
            "name": "New York",
            "state": "New York",
            "pop": "8537673"
         }
      },
      {
         "city": {
            "name": "Los Angeles",
            "state": "California",
            "pop": "3976322"
         }
      },
      {
         "city": {
            "name": "Chicago",
            "state": "Illinois",
            "pop": "2704958"
         }
      }
   ]
}
```

이 데이터 배열은 string-to-string 맵으로 잘 변환되지 않습니다. 이 경우 객체를 간단한 문자열로 변환하여 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 및 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 작업으로 봇에 보낼 수 있습니다.

예를 들어 JavaScript를 사용하는 경우 객체를 JSON으로 변환하는 `JSON.stringify` 작업과 JSON 텍스트를 JavaScript 객체로 변환하는 `JSON.parse` 작업을 사용할 수 있습니다.

```
// To convert an object to a string.
var jsonString = JSON.stringify(object, null, 2);
// To convert a string to an object.
var obj = JSON.parse(JSON string);
```

`RecognizeUtterance` 작업을 통해 속성을 보내려면 다음 JavaScript 코드와 같이, 속성을 요청 헤더에 추가하기 전에 속성을 base64로 인코딩해야 합니다.

```
var encodedAttributes = new Buffer(attributeString).toString("base64");
```

먼저 데이터를 base64로 인코딩된 문자열로 변환한 다음 이 문자열을 세션 속성의 값으로 전송하여 `RecognizeText` 및 `RecognizeUtterance` 작업에 바이너리 데이터를 보낼 수 있습니다.

```
"sessionAttributes" : {
   "binaryData": "base64 encoded data"
}
```

# Amazon Lex V2 봇 세션 이해
<a name="managing-sessions"></a>

사용자가 봇과 대화를 시작하면 Amazon Lex V2는 *세션*을 생성합니다. 애플리케이션과 Amazon Lex V2 간에 교환된 정보는 대화의 세션 상태를 구성합니다. 요청하면 지정한 식별자 조합으로 세션이 식별됩니다. 세션 식별자에 대한 자세한 내용은 [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html) 또는 [RecognizeUtterance](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeUtterance.html) 작업의 `sessionId` 필드를 참조하세요.

애플리케이션과 봇 간에 전송된 세션 상태를 수정할 수 있습니다. 예를 들어 세션에 대한 사용자 정의 정보가 포함된 세션 속성을 생성 및 수정할 수 있으며, 다음 표현을 해석하도록 대화 컨텍스트를 설정하여 대화의 흐름을 변경할 수 있습니다.

세션 상태를 업데이트할 수 있는 방법에는 세 가지가 있습니다.
+ `RecognizeText` 또는 `RecognizeUtterance` 작업에 대한 직접 호출의 일부로 세션 정보를 인라인으로 전달합니다.
+ 첫 번째 방법은 대화가 바뀔 때마다 직접적으로 호출되는 `RecognizeText` 또는 `RecognizeUtterance` 작업을 통해 Lambda 함수를 사용하는 것입니다. 자세한 내용은 [Amazon Lex V2 봇에 AWS Lambda함수 통합](lambda.md) 단원을 참조하세요. 다른 방법은 애플리케이션에서 Amazon Lex V2 런타임 API를 사용하여 세션 상태를 변경하는 것입니다.
+ 봇과의 대화에 대한 세션 정보를 관리할 수 있도록 하는 작업을 사용합니다. 이 작업은 [PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html) 작업, [GetSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_GetSession.html) 작업 및 [DeleteSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_DeleteSession.html) 작업입니다. 이러한 작업을 사용하여 봇과의 사용자 세션 상태에 대한 정보를 얻고 상태를 세부적으로 제어할 수 있습니다.

현재 세션 상태를 확인하려는 경우 `GetSession` 작업을 사용합니다. 이 작업은 사용자와의 대화 상태, 설정된 모든 세션 속성, 현재 의도에 대한 슬롯 값, Amazon Lex V2가 사용자의 발화와 일치하는 가능한 의도로 식별한 기타 의도를 포함하여 세션의 현재 상태를 반환합니다.

`PutSession` 작업을 사용하면 현재 세션 상태를 직접 조작할 수 있습니다. 봇이 다음에 수행할 대화 작업의 유형과 Amazon Lex V2가 사용자에게 보내는 메시지를 포함하여 세션을 설정할 수 있습니다. 이를 통해 봇과의 대화 흐름을 제어할 수 있습니다. Amazon Lex V2가 봇의 다음 작업을 결정하도록 하려면 대화 작업 `type` 필드를 `Delegate`로 설정합니다.

`PutSession` 작업을 사용하여 봇과의 새로운 세션을 만들고 봇이 시작해야 하는 의도를 설정할 수 있습니다. `PutSession` 작업을 사용하여 한 의도에서 다른 의도로 변경할 수도 있습니다. 세션을 만들거나 의도를 변경할 때 슬롯 값 및 세션 속성 등의 세션 상태를 설정할 수도 있습니다. 새 의도를 마치면 이전 의도를 다시 시작할 수 있습니다.

`PutSession` 작업의 응답에는 `RecognizeUtterance` 작업과 동일한 정보가 포함되어 있습니다. `RecognizeUtterance` 작업의 응답과 마찬가지로 이 정보를 사용하여 사용자에게 다음 정보를 입력하라는 메시지를 표시할 수 있습니다.

`DeleteSession` 작업을 사용하여 기존 세션을 제거하고 새 세션을 시작합니다. 예를 들어 봇을 테스트하려는 경우 `DeleteSession` 작업을 사용하여 봇에서 테스트 세션을 제거할 수 있습니다.

이 세션 작업은 이행 Lambda 함수와 함께 작동합니다. 예를 들어 Lambda 함수가 이행 상태로 `Failed`를 반환하는 경우, `PutSession` 작업을 사용하여 대화 작업 유형을 `close`로 설정하고 `fulfillmentState`를 `ReadyForFulfillment`로 설정하여 이행 단계를 재시도할 수 있습니다.

다음은 세션 작업으로 수행할 수 있는 작업입니다.
+ 봇이 사용자를 기다리지 않고 대화를 시작하도록 합니다.
+ 대화 중에 의도를 전환합니다.
+ 이전 의도로 돌아갑니다.
+ 상호 작용 중에 대화를 시작하거나 다시 시작합니다.
+ 슬롯 값의 유효성을 검사하고 봇이 유효하지 않은 값을 다시 묻도록 합니다.

이러한 각 내용은 아래에 자세히 설명되어 있습니다.

## 새 세션 시작
<a name="session-start"></a>

봇이 사용자와 대화를 시작하도록 하려면 `PutSession` 작업을 사용하면 됩니다.
+ 슬롯이 없는 환영 의도와 사용자에게 의도를 명시하라는 결론 메시지를 만듭니다. 예를 들어 "무엇을 주문하시겠어요? '음료 주문' 또는 '피자 주문.'이라고 말할 수 있습니다.
+ `PutSession` 작업을 직접적으로 호출합니다. 의도 이름을 환영 의도의 이름으로 설정하고 대화 작업을 `Delegate`로 설정합니다.
+ Amazon Lex는 환영 의도의 프롬프트에 응답하여 사용자와의 대화를 시작합니다.

## 의도 전환
<a name="session-switch"></a>

`PutSession` 작업을 사용하여 한 의도에서 다른 의도로 전환할 수 있습니다. 이 작업을 사용하여 이전 의도로 다시 전환할 수도 있습니다. `PutSession` 작업을 사용하여 새 의도의 슬롯 값 또는 세션 속성을 설정할 수 있습니다.
+ `PutSession` 작업을 직접적으로 호출합니다. 의도 이름을 새 의도의 이름으로 설정하고 대화 작업을 `Delegate`로 설정합니다. 새 의도에 필요한 슬롯 값 또는 세션 속성을 설정할 수도 있습니다.
+ Amazon Lex는 새 의도를 사용하여 사용자와의 대화를 시작합니다.

## 이전 의도 다시 시작
<a name="session-return"></a>

이전 의도를 다시 시작하려면 `GetSession` 작업을 사용하여 의도의 상태를 가져오고 필요한 상호 작용을 수행한 다음 `PutSession` 작업을 사용하여 의도를 이전 대화 상태로 설정합니다.
+ `GetSession` 작업을 직접적으로 호출합니다. 의도의 상태를 저장합니다.
+ 다른 의도 이행과 같은 다른 상호 작용을 수행합니다.
+ 이전 의도에 대해 저장된 정보를 사용하여 `PutSession` 작업을 직접적으로 호출합니다. 그러면 사용자가 대화의 같은 위치에 있는 이전 의도로 돌아갑니다.

경우에 따라 봇과 사용자의 대화를 다시 시작해야 할 수 있습니다. 예를 들어 고객 서비스 봇을 만들었다고 가정하겠습니다. 애플리케이션은 사용자가 고객 서비스 담당자와 대화해야 한다고 결정합니다. 사용자와 대화한 후 이 담당자는 수집한 정보와 함께 대화를 다시 봇에 전달할 수 있습니다.

세션을 다시 시작하려면 다음과 비슷한 단계를 사용합니다.
+ 애플리케이션은 사용자가 고객 서비스 담당자와 대화해야 한다고 결정합니다.
+ `GetSession` 작업을 사용하여 의도의 현재 대화 상태를 가져옵니다.
+ 고객 서비스 담당자는 사용자와 대화하고 문제를 해결합니다.
+ `PutSession` 작업을 사용하여 의도의 대화 상태를 설정합니다. 여기에는 슬롯 값 설정, 세션 속성 설정 또는 의도 변경이 포함될 수 있습니다.
+ 봇이 사용자와의 대화를 다시 시작합니다.

## 슬롯 값의 유효성 검사
<a name="session-validation"></a>

클라이언트 애플리케이션을 사용하여 봇에 대한 응답의 유효성을 검사할 수 있습니다. 응답이 유효하지 않은 경우 `PutSession` 작업을 사용하여 사용자로부터 새 응답을 얻을 수 있습니다. 예를 들어 꽃 주문 봇이 튤립, 장미, 백합만 팔 수 있다고 가정하겠습니다. 사용자가 카네이션을 주문하면 애플리케이션이 다음을 수행할 수 있습니다.
+ `PostText` 또는 `PostContent` 응답에서 반환된 슬롯 값을 검사합니다.
+ 슬롯 값이 유효하지 않으면 `PutSession` 작업을 직접적으로 호출합니다. 애플리케이션이 슬롯 값을 지우고, `slotToElicit` 필드를 설정하고, `dialogAction.type` 값을 `elicitSlot`으로 설정합니다. 선택적으로, Amazon Lex가 슬롯 값을 유도하기 위해 사용하는 메시지를 변경하려는 경우 `message` 및 `messageFormat` 필드를 설정할 수 있습니다.