컨텍스트를 사용하여 대화 개인화

대화를 개인화하기 위해 어시스턴트가 고객으로부터 정보를 수집한 후 나중에 대화에서 참조할 수 있습니다.

대화 턴(turn) 사이의 정보 유지

대화 상자는 Stateless이므로 사용자와의 상호작용에서 다음 상호작용까지의 정보를 유지하지 않습니다. 어시스턴트에 대화 상자를 추가하고 이를 배치하면 어시스턴트가 한 메시지 호출의 컨텍스트를 저장한 후 현재 세션 전체에서 다음 요청 시 이를 다시 제출합니다. 현재 세션은 사용자가 어시스턴트 및 지정된 세션 비활성 시간 프레임과 상호작용하는 동안 지속됩니다. 허용되는 최대 세션 비활성 시간은 플랜 유형에 따라 5분에서 7일까지입니다. 어시스턴트에 대화 상자를 추가하지 않으면 사용자 정의 애플리케이션 개발자가 애플리케이션에 필요한 지속적인 정보를 유지보수해야 합니다.

애플리케이션은 대화에 정보를 전달할 수 있으며, 대화는 이 정보를 업데이트하여 애플리케이션 또는 후속 노드에 다시 전달할 수 있습니다. 대화는 컨텍스트 변수를 사용하여 이 작업을 수행합니다.

컨텍스트 변수

컨텍스트 변수는 노드에서 정의하는 변수입니다. 이에 대한 기본값을 선택할 수 있습니다. 그러면 다른 노드, 애플리케이션 로직 또는 사용자 입력이 컨텍스트 변수의 값을 설정하거나 변경할 수 있습니다.

노드 실행 여부를 판별하기 위해 대화 노드 조건에서 컨텍스트 변수를 참조하여 컨텍스트 변수값에 대해 조건을 지정할 수 있습니다. 대화 상자 노드 응답 조건에서 컨텍스트 변수를 참조하여 외부 서비스 또는 사용자가 제공하는 값에 따라 다른 응답을 표시할 수도 있습니다.

자세히 보기:

애플리케이션에서 컨텍스트 전달

컨텍스트 변수를 설정하고 대화에 컨텍스트 변수를 전달하여 애플리케이션에서 대화로 정보를 전달하십시오.

예를 들어, 애플리케이션은 $time_of_day 컨텍스트 변수를 설정하고 정보를 사용하여 사용자에게 표시하는 인사말을 조정할 수 있는 대화 상자로 전달할 수 있습니다.

애플리케이션에서 대화 상자로 전달되는 $time_of_day 컨텍스트 변수의 값을 확인하기 위해 응답 조건을 사용하는 Welcome 노드를 표시합니다.
시간 컨텍스트

이 예제에서 대화는 애플리케이션이 변수를 다음 값 중 하나로 설정한다고 인식합니다. morning, afternoon 또는 evening. 또한 각 값을 검사하고 존재하는 값에 따라 적절한 인사를 리턴할 수 있습니다. 변수가 전달되지 않거나 예상 값 중 하나와 일치하지 않는 값을 포함하는 경우, 보다 일반적인 인사가 사용자에게 표시됩니다.

노드 간 컨텍스트 전달

대화는 컨텍스트 변수를 추가하여 하나의 노드에서 다른 노드로 정보를 전달하거나 컨텍스트 변수값을 업데이트할 수 있습니다. 대화 상자가 사용자에게 정보를 요청하고 가져오면 나중에 대화에서 정보를 추적하고 참조할 수 있습니다.

예를 들어, 하나의 노드에서 사용자에게 이름을 묻고 후속 노드에서 이름별로 주소를 지정할 수 있습니다.

사용자에게 이름을 묻는 소개 노드를 표시하고 이를 컨텍스트 변수로 저장합니다. 다음 노드는 $username 컨텍스트 변수를 사용하여 이름별로 사용자를 참조합니다.
한 노드에서 다른 노드로 컨텍스트 전달

이 예제에서 @name 시스템 엔티티는 사용자가 제공하는 경우 입력에서 사용자의 이름을 추출하는 데 사용됩니다. JSON 편집기에서 사용자 이름 컨텍스트 변수가 정의되고 @name 값으로 설정됩니다. 후속 노드에서 $username 컨텍스트 변수는 이름별로 사용자 주소를 지정하도록 응답에 포함됩니다.

컨텍스트 변수 정의

변수 필드에 변수 이름을 추가하고 노드의 편집 보기에 있는 필드에 변수의 기본값을 추가하여 컨텍스트 변수를 정의합니다.

  1. 컨텍스트 변수를 추가할 대화 노드를 클릭하여 엽니다.

  2. 어시스턴트 응답 섹션으로 이동하여 메뉴 아이콘 오버플로우 메뉴 아이콘을 클릭하십시오.

  3. 컨텍스트 편집기 열기를 클릭하십시오.

  4. 값 이름과 값 쌍을 변수 필드에 추가하십시오.

    • name 에는 대문자 및 소문자 알파벳 문자, 숫자 문자 (0-9) 및 밑줄이 포함될 수 있습니다.

    • value는 지원되는 JSON 유형일 수 있습니다(예: 단순 문자열 변수, 숫자, JSON 배열 또는 JSON 오브젝트).

다음 표에서는 다양한 값 유형의 이름 및 값 쌍을 정의하는 방법에 대한 몇 가지 예제를 보여줍니다.

이름 및 값 쌍 정의
가변 값 유형
디저트 "cake" 문자열
나이 18 숫자
toppings_array ["onions","olives"] JSON 배열
full_name {"first":"John","last":"Doe"} JSON 오브젝트

그런 다음, 이러한 컨텍스트 변수를 참조하려면 $name 구문을 사용하십시오. 여기서 name 은 사용자가 정의한 컨텍스트 변수의 이름입니다.

예를 들어, 다음 표현식을 대화 응답으로 지정할 수 있습니다.

The customer, $age-year-old <? $full_name.first ?>, wants a pizza with <? $toppings_array.join(' and ') ?>, and then $dessert.

결과 출력은 다음과 같이 표시됩니다.

The customer, 18-year-old John, wants a pizza with onions and olives, and then cake.

또한 JSON 편집기를 사용하여 컨텍스트 변수를 정의할 수 있습니다. 복합 표현식을 변수 값으로 추가하려는 경우 JSON 편집기를 사용하는 것이 좋습니다. 자세한 내용은 JSON 편집기의 컨텍스트 변수를 참조하십시오.

공통 컨텍스트 변수 태스크

사용자가 입력한 전체 문자열을 저장하려면 input.text를 사용하십시오.

사용자 입력 캡처
가변
반복 <?input.text?>

예를 들어, 사용자 입력은 I want to order a device. 노드 응답이 You said: $repeat 인 경우 응답은 You said: I want to order a device. 로 표시됩니다.

컨텍스트 변수에 엔티티 값을 저장하려면 다음 구문을 사용하십시오.

엔티티 언급 캡처
가변
위치 @place

예를 들어, 사용자 입력은 I want to go to Paris. @place 엔티티가 Paris 를 인식하는 경우 어시스턴트가 $place 컨텍스트 변수에 Paris 를 저장합니다.

사용자가 사용자 입력에서 추출할 문자열의 값을 저장하려면 정규식을 사용자 입력에 적용하는 데 extract 메소드를 사용하는 SpEL 표현식을 포함할 수 있습니다. 다음 표현식은 사용자 입력에서 숫자를 추출하고 $number 컨텍스트 변수에 저장합니다.

String 메서드 사용
가변
<?input.text.extract('[\d]+',0)?>

패턴 엔티티의 값을 저장하려면 엔티티 이름에 .literal을 추가하십시오. 이 구문을 사용하여 지정된 패턴과 일치하는 사용자 입력의 정확한 텍스트 범위가 변수에 저장되어 있는지 확인하십시오.

패턴 엔티티 값 캡처
가변
이메일 <? @email.literal ?>

예를 들어, 사용자 입력은 Contact me at joe@example.com. 이름이 @email 인 엔티티가 name@domain.com 이메일 형식을 인식합니다. @email.literal을 저장하도록 컨텍스트 변수를 구성하여, 패턴과 일치하는 입력 부분을 저장할 것임을 표시합니다. 값 표현식에서 .literal 특성을 생략하는 경우, 패턴과 일치하는 사용자 입력의 세그먼트 대신 패턴에 지정한 엔티티 값 이름이 리턴됩니다.

컨텍스트 변수 삭제

컨텍스트 변수를 삭제하려면, 변수를 널로 설정하십시오.

컨텍스트 변수 널 지정
가변
order_form null

컨텍스트 변수값 업데이트

컨텍스트 변수의 값을 업데이트하려면 이전 컨텍스트 변수와 동일한 이름의 컨텍스트 변수를 정의하되, 이번에는 다른 값을 지정하십시오.

둘 이상의 노드가 동일한 컨텍스트 변수의 값을 설정하는 경우, 컨텍스트 변수의 값이 사용자와의 대화 과정에서 변경될 수 있습니다. 적용되는 값은 대화 중에 사용자가 트리거하는 노드에 따라 다릅니다. 처리된 마지막 노드의 컨텍스트 변수에 지정된 값이 이전에 처리된 노드가 변수에 설정한 값을 겹쳐씁니다.

값이 JSON 오브젝트 또는 JSON 배열 데이터 유형인 경우 컨텍스트 변수의 값을 업데이트하는 방법에 대한 정보는 JSON의 컨텍스트 변수 값 업데이트를 참조하십시오.

컨텍스트 변수가 처리되는 방법

컨텍스트 변수 문제를 정의하는 위치입니다. 어시스턴트가 컨텍스트 변수를 정의한 대화 노드의 일부를 처리할 때까지 컨텍스트 변수가 작성되지 않고 사용자가 지정하는 값으로 설정됩니다. 대부분의 경우, 노드 응답의 일부로 컨텍스트 변수를 정의합니다. 이를 수행하면 어시스턴트가 노드 응답을 리턴할 때 컨텍스트 변수가 작성되고 변수에 지정된 값이 제공됩니다.

조건부 응답이 있는 노드의 경우, 특정 응답에 대한 조건이 충족되고 응답이 처리될 때 컨텍스트 변수가 작성되고 설정됩니다. 예를 들어, 조건부 응답 #1 에 대한 컨텍스트 변수를 정의하고 어시스턴트가 응답 #2를 처리하는 경우 조건부 응답 #1 에 대해 정의한 변수가 설정되지 않습니다.

사용자가 슬롯이 있는 노드와 상호작용할 때 어시스턴트가 설정하도록 할 컨텍스트 변수 추가에 대한 정보는 슬롯이 있는 노드에 컨텍스트 변수 추가 를 참조하십시오.

연산 순서

함께 처리할 변수를 여러 개 정의하는 경우, 사용자가 정의하는 순서가 어시스턴트에서 평가하는 순서를 결정하지 않습니다. 어시스턴트는 변수를 임의의 순서로 평가합니다. 첫 번째 컨텍스트 변수에 값을 설정하지 말고 두 번째 변수에서 사용하십시오. 첫 번째 컨텍스트 변수가 두 번째 변수보다 먼저 실행되지 않을 수 있기 때문입니다. 예를 들어, 사용자 입력에 단어 Yes가 있는지 확인하는 로직을 구현하는 데 두 개의 컨텍스트 변수를 사용하지 마십시오.

두 개의 컨텍스트 변수를 사용하여 사용자 입력의 값 확인
가변
user_input <? input.text ?>
contains_yes <? $user_input.contains('Yes') ?>

대신, 약간 더 복잡한 표현식을 사용하면 두 번째 변수(contains_yes)가 평가되기 전에 평가되는 목록의 첫 번째 변수(user_input) 값에 의존하지 않도록 할 수 있습니다.

단일 컨텍스트 변수 사용
가변
contains_yes <? input.text.contains('Yes') ?>

슬롯이 있는 노드에 컨텍스트 변수 추가

슬롯에 대한 자세한 정보는 슬롯이 있는 정보 수집을 참조하십시오.

슬롯에 대한 응답 조건이 충족된 후 처리되는 컨텍스트 변수를 추가하려면 다음을 수행하십시오.

  1. 편집 보기에서 슬롯이 있는 노드를 여십시오.
  2. 슬롯 사용자 정의 아이콘 슬롯 사용자 정의 를 클릭하십시오.
  3. 옵션 아이콘 옵션 을 클릭한 후 조건 사용을 선택하십시오.
  4. 컨텍스트 변수를 연관시킬 응답 옆에 있는 핸들러 사용자 정의 아이콘 슬롯 편집 을 클릭하십시오.
  5. 지원 응답 섹션에서 옵션 아이콘 옵션 을 클릭한 후 컨텍스트 편집기 열기를 클릭하십시오.
  6. 값 이름과 값 쌍을 변수 필드에 추가하십시오.

슬롯 조건이 충족된 후 설정되거나 업데이트된 컨텍스트 변수를 추가하려면 다음 단계를 완료하십시오.

  1. 편집 보기에서 슬롯이 있는 노드를 여십시오.
  2. 슬롯 사용자 정의 아이콘 슬롯 사용자 정의 를 클릭하십시오.
  3. 옵션 아이콘 옵션 을 클릭한 후 조건 사용을 선택하십시오.
  4. 변수 이름과 값 쌍을 JSON 형식으로 추가하십시오.
{
"time_of_day": "morning"
}

대화 상자 노드 평가의 이 단계 중에 설정되는 컨텍스트 변수를 정의하기 위해 컨텍스트 편집기를 사용할 수 없습니다. 대신 JSON 편집기를 사용해야 합니다. JSON 편집기 사용에 대한 자세한 정보는 JSON 편집기의 컨텍스트 변수를 참조하십시오.

JSON 편집기의 컨텍스트 변수

또한 JSON 편집기에서 컨텍스트 변수를 정의할 수 있습니다. 복합 컨텍스트 변수를 정의하고 이를 추가하거나 변경할 때 전체 SpEL 표현식을 볼 수 있도록 하려면 JSON 편집기를 사용하십시오.

이름 및 값 쌍은 다음 요구사항을 충족해야 합니다.

  • name 에는 대문자 및 소문자 알파벳 문자, 숫자 문자 (0-9) 및 밑줄이 포함될 수 있습니다.

    마침표 및 하이픈과 같은 기타 문자를 이름에 포함할 수 있습니다. 그러나 이 경우 변수를 참조할 때마다 단축 구문 $(variable-name) 를 지정해야 합니다. 자세한 내용은 오브젝트 액세스에 대한 표현식을 참조하십시오.

  • value는 지원되는 JSON 유형일 수 있습니다(예: 단순 문자열 변수, 숫자, JSON 배열 또는 JSON 오브젝트).

다음 JSON 샘플은 $dessert 문자열, $toppings_array 배열, $age 숫자 및 $full_name 오브젝트 컨텍스트 변수의 값을 정의합니다.

{
  "context": {
    "dessert": "cake",
    "toppings_array": [
      "onions",
      "olives"
    ],
    "age": 18,
    "full_name": {
      "first": "Jane",
      "last": "Doe"
    }
  },
  "output":{}
}

컨텍스트 변수를 JSON 형식으로 정의하려면 다음 단계를 완료하십시오.

  1. 컨텍스트 변수를 추가할 대화 노드를 클릭하여 엽니다.

    이 노드에 정의되어 있는 기존 컨텍스트 변수 값이 해당 변수 필드 세트에 표시됩니다. 사용자가 이 노드의 편집 보기에서 표시되지 않게 하려면, 컨텍스트 편집기를 닫아야 합니다. JSON 편집기를 열 때 사용했던 동일한 메뉴에서 편집기를 닫을 수 있습니다. 다음 단계에서는 메뉴에 액세스하는 방법을 설명합니다.

  2. 어시스턴트 응답에 대한 옵션 아이콘 옵션 을 클릭한 후 JSON 편집기 열기를 클릭하십시오.

    노드에 대해 다중 조건 응답 설정을 사용하는 경우 먼저 컨텍스트 변수를 연관시킬 응답에 대해 응답 사용자 정의 응답 사용자 정의 아이콘을 클릭해야 합니다.

  3. 없는 경우, "context":{} 블록을 추가합니다.

    {
      "context":{},
      "output":{}
    }
    
  4. 컨텍스트 블록에서, 정의할 각 컨텍스트 변수의 "name""value" 쌍을 추가합니다.

    {
      "context":{
        "name": "value"
    },
      "output": {}
    }
    

    이 예제에서 이름이 new_variable 인 변수는 이미 변수를 포함하는 컨텍스트 블록에 추가됩니다.

    {
      "context":{
        "existing_variable": "value",
        "new_variable":"value"
      }
    }
    

    컨텍스트 변수를 참조하려면 $name 구문을 사용하십시오. 여기서 name 은 정의한 컨텍스트 변수의 이름입니다. 예: $new_variable.

자세히 보기:

JSON에서 컨텍스트 변수 삭제

컨텍스트 변수를 삭제하려면, 변수를 널로 설정하십시오.

{
  "context": {
    "order_form": null
  }
}

컨텍스트 변수의 모든 추적을 제거하려는 경우, JSONObject.remove(string) 메소드를 사용하여 컨텍스트 오브젝트에서 삭제할 수 있습니다. 그러나 제거를 수행하려면 변수를 사용해야 합니다. 현재 호출 이후에 저장되지 않도록 메시지 출력에 새 변수를 정의하십시오.

{
  "output": {
    "text" : {},
    "deleted_variable" : "<? context.remove('order_form') ?>"
  }
}

또는, 애플리케이션 로직에서 컨텍스트 변수를 삭제할 수 있습니다.

JSON에서 컨텍스트 변수 값 업데이트

일반적으로, 노드가 이미 설정된 컨텍스트 변수의 값을 설정하면 새 값이 이전 값을 겹쳐씁니다.

복합 JSON 오브젝트 업데이트

JSON 오브젝트를 제외한 모든 JSON 유형에 대해 이전 값을 겹쳐씁니다. 컨텍스트 변수가 JSON 오브젝트와 같은 복합 유형인 경우 JSON 병합 프로시저가 변수 업데이트에 사용됩니다. 병합 오퍼레이션은 새로 정의된 특성을 추가하고 오브젝트의 기존 특성을 겹쳐씁니다.

이 예제에서는 이름 컨텍스트 변수가 복합 오브젝트로 정의됩니다.

{
  "context": {
    "complex_object": {
      "user_firstname" : "Paul",
      "user_lastname" : "Pan",
      "has_card" : false
    }
  }
}

대화 노드는 다음 값으로 컨텍스트 변수 JSON 오브젝트를 업데이트합니다.

{
  "complex_object": {
    "user_firstname": "Peter",
    "has_card": true
  }
}

결과는 다음 컨텍스트입니다.

{
  "complex_object": {
    "user_firstname": "Peter",
    "user_lastname": "Pan",
    "has_card": true
  }
}

배열 업데이트

대화 컨텍스트 데이터에 값 배열이 있는 경우, 값을 추가하거나 값을 제거하거나 값을 모두 바꿔 배열을 업데이트할 수 있습니다.

이러한 조치 중 하나를 선택하여 배열을 업데이트하십시오. 각 경우에 조치 전에 배열, 조치 및 조치가 적용된 후에 배열이 표시됩니다.

  • 추가: 배열의 끝에 값을 추가하려면 append 메소드를 사용하십시오.

    이 대화 상자 런타임 컨텍스트의 경우:

    {
      "context": {
        "toppings_array": ["onion", "olives"]
      }
    }
    

    이 업데이트를 작성하십시오.

    {
      "context": {
        "toppings_array": "<? $toppings_array.append('ketchup', 'tomatoes') ?>"
      }
    }
    

    결과:

    {
      "context": {
        "toppings_array": ["onion", "olives", "ketchup", "tomatoes"]
      }
    }
    
  • 제거: 요소를 제거하려면 remove 메소드를 사용하고 배열에 해당 값 또는 위치를 지정하십시오.

    • 값을 기준으로 제거: 값을 기준으로 배열에서 요소를 제거합니다.

      이 대화 상자 런타임 컨텍스트의 경우:

      {
        "context": {
          "toppings_array": ["onion", "olives"]
        }
      }
      

      이 업데이트를 작성하십시오.

      {
        "context": {
          "toppings_array": "<? $toppings_array.removeValue('onion') ?>"
        }
      }
      

      결과:

      {
        "context": {
          "toppings_array": ["olives"]
        }
      }
      
    • 위치를 기준으로 제거: 인덱스 위치를 기준으로 배열에서 요소를 제거합니다.

      이 대화 상자 런타임 컨텍스트의 경우:

      {
        "context": {
          "toppings_array": ["onion", "olives"]
        }
      }
      

      이 업데이트를 작성하십시오.

      {
        "context": {
          "toppings_array": "<? $toppings_array.remove(0) ?>"
        }
      }
      

      결과:

      {
        "context": {
          "toppings_array": ["olives"]
        }
      }
      
  • 겹쳐쓰기: 배열의 값을 겹쳐쓰려면 배열을 새 값으로 설정하십시오.

    이 대화 상자 런타임 컨텍스트의 경우:

    {
      "context": {
        "toppings_array": ["onion", "olives"]
      }
    }
    

    이 업데이트를 작성하십시오.

    {
      "context": {
        "toppings_array": ["ketchup", "tomatoes"]
      }
    }
    

    결과:

    {
      "context": {
        "toppings_array": ["ketchup", "tomatoes"]
      }
    }
    

한 컨텍스트 변수를 다른 변수와 동일하게 설정

하나의 컨텍스트 변수를 다른 컨텍스트 변수와 동일하게 설정하는 경우 한 변수에서 다른 변수까지 포인터를 정의합니다. 나중에 변수 중 하나의 값이 변경되면 다른 변수의 값도 변경됩니다.

예를 들어, 다음과 같이 컨텍스트 변수를 지정하면 $var1 또는 $var2 의 값이 나중에 변경될 때 다른 값도 변경됩니다.

한 컨텍스트 변수를 다른 변수와 동일하게 설정
가변
var2 var1

특정 시점 값을 캡처하려면 한 변수를 다른 변수와 동일하게 설정하지 마십시오. 배열을 사용하여 컨텍스트 변수에 저장된 배열 값을 캡처하고 나중에 사용하려면 대신 변수의 현재 값을 기반으로 새 변수를 작성하십시오.

예를 들어, 특정 지점에서 배열 값의 사본을 작성하려면 기존 배열의 값으로 채워진 배열을 추가하십시오. 이를 수행하려면 다음 단계를 수행하십시오.

{
"context": {
   "var2": "<? output.var2?:new JsonArray().append($var1) ?>"
 }
 }