대화 상자에서 오브젝트에 액세스하기 위한 표현식
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?>...orSo 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을 사용하십시오.