대화 상자에서 오브젝트에 액세스하기 위한 표현식

SpEL(Spring Expression) 언어를 사용하여 오브젝트의 특성 및 오브젝트에 액세스하는 표현식을 작성할 수 있습니다. 자세한 내용은 스프링 표현식 언어(SpEL)를 참조하세요.

평가 구문

다른 변수 내에서 변수값을 확장하거나 특성 및 글로벌 오브젝트에서 메소드를 호출하려면 <? expression ?> 표현식 구문을 사용하십시오. 예를 들어, 다음과 같습니다.

  • 특성 확장

    "output":{"text":"Your name is <? context.userName ?>"}
    
  • 글로벌 오브젝트의 특성에 대한 메소드 호출

    "context":{"email": "<? @email.literal ?>"}
    

단축 구문

SpEL 단축 구문을 사용하여 다음 오브젝트를 빠르게 참조하는 방법을 학습하십시오.

컨텍스트 변수의 단축 구문

다음 표에서는 조건 표현식에서 컨텍스트 변수를 작성하는 데 사용할 수 있는 단축 구문의 예제를 표시합니다.

단축 구문
단축 구문 SpEL의 전체 구문
$card_type context['card_type']
$(card-type) context['card-type']
$card_type:VISA context['card_type'] == 'VISA'
$card_type:(MASTER CARD) context['card_type'] == 'MASTER CARD'

컨텍스트 변수 이름에 하이픈 또는 마침표와 같은 특수 문자를 포함할 수 있습니다. 하지만 이렇게 하면 SpEL 표현식을 평가할 때 문제점이 발생할 수 있습니다. 예를 들어 하이픈은 마이너스 기호로 해석될 수 있습니다. 이와 같은 문제점을 방지하려면 전체 표현식 구문 또는 단축 구문 $(variable-name)을 사용하여 변수를 참조하고, 이름에 다음 특수 문자는 사용하지 마십시오.

  • 괄호 ()
  • 둘 이상의 아포스트로피 ''
  • 인용 부호 "

텍스트 응답 또는 대화 노드 조건에서 컨텍스트 변수를 참조할 때 짧은 구문을 사용할 수 있습니다.

예를 들어, Hello, $name입니다. $name 컨텍스트 변수에 Sam이 포함되어 있으면 응답은 Hello, Sam으로 표시됩니다.

텍스트 응답의 전체 구문을 사용하여 컨텍스트 변수를 참조하려면 <? ?>에서 컨텍스트 변수를 둘러싸야 합니다. 예를 들어, Hello, <? context['name'] ?>입니다.

여러 필드가 있는 컨텍스트 변수를 참조하려는 경우(예: $context.integrations.chat.browser_info.page_url) 전체 구문을 사용하려면 <? context['integrations']['chat']['browser_info']['page_url'] ?> 을 지정하세요.

엔티티의 단축 구문

다음 표에는 엔티티를 참조할 때 사용할 수 있는 속기 구문의 예가 나와 있습니다.

단축 구문
단축 구문 SpEL의 전체 구문
@year entities['year']?.value
@year == 2016 entities['year']?.value == 2016
@year != 2016 entities['year']?.value != 2016
@city == 'Boston' entities['city']?.value == 'Boston'
@city:Boston entities['city']?.contains('Boston')
@city:(New York) entities['city']?.contains('New York')

SpEL에서 물음표(?)를 사용하면 엔티티 오브젝트가 널일 때 널 포인터 예외가 트리거되지 않습니다.

검사할 엔티티 값에 ) 문자가 있는 경우 비교를 위해 : 연산자를 사용할 수 없습니다. 예를 들어, 도시 엔티티가 Dublin (Ohio)인지 여부를 검사하려면 @city == 'Dublin (Ohio)' 대신 @city:(Dublin (Ohio))를 사용해야 합니다.

인텐트의 단축 구문

다음 표에는 인텐트를 참조할 때 사용할 수 있는 속기 구문의 예가 나와 있습니다.

| 단축 구문 | SpEL 의 전체 구문 | | #help | intent == 'help' | | ! #help | intent != 'help' | | NOT #help | intent != 'help' | | #help 또는 #i_am_lost | (intent == 'help' \|\| intent == 'I_am_lost') |

기본 제공 글로벌 변수

표현식 언어를 사용하여 다음 글로벌 변수에 대한 특성 정보를 추출할 수 있습니다.

글로벌 변수
글로벌 변수 정의
컨텍스트 처리된 대화 메시지의 JSON 오브젝트 파트입니다.
엔티티[ ] 1st 요소에 대한 기본 액세스를 지원하는 엔티티 목록입니다.
입력 처리된 대화 메시지의 JSON 오브젝트 파트입니다.
의사[ ] 첫 번째 요소에 대한 기본 액세스를 지원하는 인텐트 목록입니다.
출력 처리된 대화 메시지의 JSON 오브젝트 파트입니다.

엔티티 액세스

엔티티 배열은 사용자 입력에서 인식된 하나 이상의 엔티티를 포함합니다.

대화 상자를 테스트하는 동안 대화 상자 노드 응답에 이 표현식을 지정하여 사용자 입력에서 인식되는 엔티티의 세부 정보를 확인할 수 있습니다:

<? entities ?>

사용자 입력 오늘의 경우 어시스턴트가 @sys-date 시스템 엔티티를 인식하므로 응답에 이 엔티티 오브젝트가 포함됩니다.

 [
   {
     "entity":"sys-date",
     "location":[0,5],
     "value":"2020-12-30",
     "confidence":1.0,
     "metadata":
     {
       "calendar_type":"GREGORIAN",
       "timezone":"America/New_York"
     },
     "interpretation":
     {
       "timezone":"America/New_York",
       "relative_day":0,
       "granularity":"day",
       "calendar_type":"GREGORIAN"
      }
    }
  ]

응답에 텍스트를 포함하려면 표현식에서 toJson() 메소드를 사용하여 리턴된 엔티티 목록을 JSON 오브젝트로 캐스트하십시오. 예를 들어, 다음과 같습니다.

Recognized entities are: <? entities.toJson() ?>

입력의 엔티티 배치가 문제가 되는 경우

조건에 속기 표현식 @city.contains('Boston') 을 사용하면 Boston 이 사용자 입력에서 감지된 첫 번째 엔티티인 경우에만 대화 상자 노드가 true를 반환합니다. 이 구문은 입력에서 엔티티의 배치가 중요하고 첫 번째 언급만 확인하려는 경우에만 사용하세요.

엔티티가 언급되는 순서와 관계없이 사용자 입력에서 해당 용어가 언급될 때마다 조건이 참을 반환하도록 하려면 전체 SpEL 표현식을 사용합니다. entities['city']?.contains('Boston') 조건은 배치에 관계없이 모든 @city 엔티티에서 'Boston' 도시 엔티티가 하나 이상 발견되면 true를 반환합니다.

예를 들어, 사용자는 "I want to go from Toronto to Boston." 항목을 제출합니다. @city:Toronto@city:Boston 엔티티가 감지되고 다음과 같이 리턴된 배열에 표시됩니다.

  • entities.city[0].value = 'Toronto'
  • entities.city[1].value = 'Boston'

리턴되는 배열의 엔티티 순서는 사용자 입력에서 멘션된 순서와 일치합니다.

엔티티 특성

각 엔티티에는 해당 엔티티와 관련된 일련의 속성이 있습니다. 해당 특성을 통해 엔티티에 대한 정보에 액세스할 수 있습니다.

엔티티 특성
특성 정의 사용 팁
신뢰도 인식된 엔티티에서 어시스턴트 신뢰도를 나타내는 백분율입니다. 엔티티의 퍼지 매칭을 활성화하지 않는 한 엔티티의 신뢰도는 0 또는 1입니다. 유사 일치를 사용하면 기본 신뢰수준 임계값이 0.3입니다. 퍼지 매칭을 사용하도록 설정하든 시스템 엔티티의 신뢰 수준은 항상 1.0. 신뢰수준이 지정한 백분율 이하인 경우 false를 리턴하도록 하기 위해 조건에 이 특성을 사용할 수 있습니다.
위치 발견된 엔티티 값이 입력 텍스트에서 시작되고 끝나는 위치를 표시하는 0 기반 문자 오프셋입니다. .literal을 사용하여 위치 특성에 저장된 시작과 종료 인덱스 값 사이에서 텍스트 범위를 추출하십시오.
입력에서 식별되는 엔티티 값입니다. 연관된 동의어 중 하나에 대해 일치가 이루어지는 경우에도 이 특성은 훈련 데이터에 정의된 대로 엔티티 값을 리턴합니다. .values를 사용하여 사용자 입력에 있을 수 있는 엔티티의 다중 발생을 캡처할 수 있습니다.

엔티티 특성 사용 예제

다음 예제에서 스킬에 값 JFK 및 동의어 'Kennedy Airport"가 포함된 공항 엔티티가 포함되어 있습니다. 사용자 입력은 케네디 공항으로 가고 싶어요입니다.

  • 사용자 입력에서 'JFK' 엔티티가 인식되는 경우 특정 응답을 반환하려면 응답 조건에 이 표현식을 추가할 수 있습니다: entities.airport[0].value == 'JFK' or @airport = "JFK"

  • 대화 상자 응답에서 사용자가 지정한 대로 엔티티 이름을 반환하려면 .literal 속성을 사용합니다: So you want to go to <?entities.airport[0].literal?>... or So you want to go to @airport.literal ...

두 형식 모두 응답에서 So you want to go to Kennedy Airport... 으로 평가합니다.

  • @airport:(JFK) 또는 @airport.contains('JFK')와 같은 표현식은 항상 엔티티(이 예제의 경우 **)의 **값JFK을 참조합니다.

  • 유사 일치를 사용하는 경우 입력에서 공항으로 식별되는 용어를 더 제한하기 위해 노드 조건에 이 표현식을 지정할 수 있습니다(예: @airport && @airport.confidence > 0.7). 노드는 어시스턴트가 입력 텍스트에 공항 참조가 포함되어 있다고 70% 확신하는 경우에만 실행됩니다.

이 예제에서 사용자 입력은 *Are there places to exchange currency at JFK, Logan, and O'Hare?*입니다.

  • 사용자 입력에서 엔티티 유형의 다중 발생을 캡처하려면 다음과 같은 구문을 사용하십시오.

    "context":{
      "airports":"@airport.values"
    }
    

    대화 상자 응답에서 캡처된 목록을 나중에 참조하려면 이 구문을 사용하십시오. You asked about these airports: <? $airports.join(', ') ?>. 다음과 같이 표시됩니다. You asked about these airports: JFK, Logan, O'Hare.

  • 여러 엔티티 멘션의 리터럴 값을 캡처하려면 다음 구문을 사용하십시오.

    entities['myEntityName'].![literal]
    

인텐트에 액세스

인텐트 배열에는 사용자 입력에서 인식된 인텐트가 하나 이상 포함되어 있으며, 신뢰도가 낮은 순서로 정렬됩니다.

각 인텐트에는 하나의 특성(예:confidence 특성)만 있습니다. 신뢰도 특성은 인식된 인텐트에서 어시스턴트 신뢰도를 나타내는 백분율입니다.

대화 상자를 테스트하는 동안 대화 상자 노드 응답에 이 표현식을 지정하여 사용자 입력에서 인식되는 의도에 대한 세부 정보를 확인할 수 있습니다:

<? intents ?>

사용자 입력, Hello now의 경우, 어시스턴트는 #greeting 인텐트와 정확한 일치를 찾습니다. 따라서, 먼저 #greeting 인텐트 오브젝트 세부사항을 나열합니다. 응답에는 자신의 신뢰도에 상관없이 스킬에서 정의된 상위 10 가지 다른 인텐트도 포함됩니다. (이 예제에서 다른 인텐트의 신뢰도는 0으로 설정됩니다. 이는 첫 번째 인텐트가 정확한 일치이기 때문입니다. ) "시험 사용" 분할창이 요청과 함께 alternate_intents:true 매개 변수를 보내기 때문에 상위 10 개 인텐트가 리턴됩니다. API를 직접 사용하고 상위 10 개의 결과를 보려면 호출에서이 매개변수를 지정해야 합니다. alternate_intents 이 기본값인 false인 경우, 신뢰도가 0.2 높은 인텐트만 배열에 반환됩니다.

[{"intent":"greeting","confidence":1},
{"intent":"yes","confidence":0},
{"intent":"pizza-order","confidence":0}]

응답에 텍스트를 포함하려면 표현식에서 toJson() 메소드를 사용하여 리턴된 의사 목록을 JSON 오브젝트로 캐스트하십시오. 예를 들어, 다음과 같습니다.

Recognized intents are: <? intents.toJson() ?>

다음 예제에서는 인텐트 값을 검사하는 방법을 표시합니다.

  • intents[0] == 'Help'
  • intent == 'Help'

인텐트가 발견되지 않은 경우 intent == 'help'에 예외가 발생하지 않으므로 intents[0] == 'help'intent == 'help'와 다릅니다. 이는 인텐트 신뢰도가 임계값을 초과하는 경우에만 true로 평가됩니다. 원하는 경우 조건에 대한 사용자 지정 신뢰 수준(예: intents.size() > 0 && intents[0] == 'help' && intents[0].confidence > 0.1 )을 지정할 수 있습니다.

입력 액세스

입력 JSON 오브젝트에는 하나의 특성(텍스트 특성)만 포함됩니다. 텍스트 특성은 사용자 입력의 텍스트를 나타냅니다.

입력 특성 사용 예제

다음 예제에서는 입력에 액세스하는 방법을 표시합니다.

  • 사용자 입력이 "예"인 경우 노드를 실행하려면 노드 조건에 이 표현식을 추가하십시오. input.text == 'Yes'

문자열 메소드를 사용하여 사용자 입력에서 텍스트를 평가하거나 조작할 수 있습니다. 예를 들어, 다음과 같습니다.

  • 사용자 입력에 "Yes"가 포함되는지 여부를 검사하려면 input.text.contains( 'Yes' )를 사용하십시오.
  • 사용자 입력이 숫자인 경우(input.text.matches( '[0-9]+' )) true를 리턴합니다.
  • 입력 문자열에 10개의 문자가 있는지 여부를 검사하려면 input.text.length() == 10을 사용하십시오.