기가지니 1,2 Dev Guide v2.0 logo 기가지니 1,2 Dev Guide v2.0

코드 개발 시 필요한 사용자 발화문 속 어휘 정보와 인텐트 정보를 가져옵니다.

2.5.1 사용 목적

해당 내용은 개발자가 사용자 발화문 내 정보를 사용하고 싶거나 인텐트를 페이지 로드가 아닌 하나의 기능 실행으로 사용하고 싶을 경우에 해당됩니다. 인텐트의 실행은 다음과 같이 구분됩니다.

인텐트 실행 구분

  • 기가지니 홈 화면일 때 (서비스가 실행 중이 아닐 때)
    • base url + service url로 서비스 실행
  • 서비스가 실행 중일 때
    • onActionEvent API를 코드 내 사용한 경우
      • onActionEvent 호출
      • service url이 다르더라도, onActionEvent로 들어와 페이지 이동 안됨
    • onActionEvent API 사용하지 않은 경우 - base url + service url 실행

※ onActionEvent api를 코드 내에 사용했다면, 어떤 인텐트가 실행되더라도 onActionEvent가 호출됩니다. 따라서 해당 페이지에서 발화로 실행되는 모든 인텐트 기능을 실행할 수 있도록 작업해야 합니다.

2.5.2 Service SDK - Dialog Kit 연동하기

1) Dialog Kit - Parameter 정보

개발자는 onActionEvent API를 사용하여 사용자 발화문 내 어휘 정보를 가져올 수 있습니다. 사용할 수 있는 어휘 정보는 발화문에 포함 되어 있는 ‘NE 사전명’‘대표 어휘’입니다.

Dialog Kit 대화 시뮬레이터를 확인해보면 파라미터로 사용할 수 있는 어휘 사전 정보를 알 수 있습니다. 앞서 dialog kit 작업에서 게임 선택 카테고리를 선택하는 selectCategory 인텐트를 생성했었습니다. 사용자가 “동물 선택해줘”라고 발화를 하면, CDMS Response의 CS 항목 아래 발화에 포함된 NE-CATEGORY라는 어휘 사전명과 “동물”이라는 대표 어휘가 추출됩니다.

추가로 “나라로 선택해줘”라고 발화 시에서는 NE-CATEGORY와 대표 어휘인 “나라”가 추출됩니다.

파라미터는 인텐트 규칙으로 지정하지 않은 어휘 사전 정보도 추출됩니다. 예를 들어, 지니고개 서비스는 아래와 같은 방식으로 서비스가 진행된다고 가정합니다. 사용자는 메인 화면이 실행되면 게임 카테고리를 선택하고, 그 카테고리 내에서의 게임 난이도를 선택하게 됩니다.

  • 지니고개 서비스 진입 방식: 메인화면 - 카테고리 선택 - 난이도 선택 순으로 이동

앞서 카테고리 선택에 대한 인텐트만 생성했으니, 게임 난이도 선택 인텐트도 생성합니다. 게임 난이도에 대한 어휘 사전은 NE-LEVEL이고, 대표 어휘로 {초급, 중급, 고급}을 추가하였습니다. 게임 난이도 선택 인텐트는 selectLevel로 생성하여, selectCateSgory와 동일하게 NE-LEVEL+PR-B-SELECT로 인텐트 규칙을 생성합니다.

여기서 만약 사용자가 카테고리를 선택하는 동시에 게임 난이도까지 결정한다고 가정합니다. 발화는 “지니야, 동물 중급으로 시작해줘” 라고 한다면, 인텐트 규칙이 selectCategory도 해당되고, selectLevel도 해당됩니다. 여기서 어떤 인텐트가 추출될지는 인텐트 우선 설정 항목을 이용하여 지정할 수 있습니다.

인텐트 우선 설정

인텐트 우선 설정은 사용자의 발화문에 대해 복수개의 인텐트가 후보로 추출될 경우, 인텐트 간의 우선 순위를 설정하여 원하는 인텐트가 추출 될 수 있도록 설정하는 기능입니다. 상위에 존재할 수록 인텐트의 순위가 높아집니다.

먼저, 현재 “동물 중급으로 선택해줘”의 발화는 selectLevel이 인텐트로 추출됩니다. 서비스 흐름이 카테고리 지정 후 난이도 선택이므로, 인텐트 우선 설정 기능을 이용하여 selectCategory가 추출될 수 있도록 변경합니다.

[우선 순위 설정 변경 전]

[우선 순위 설정 변경 후]

이제, selectCategory가 정상적으로 추출됨을 확인했습니다. selectCategoty의 CDMS Response 결과를 확인해보면, 인텐트 규칙에는 포함되지 않았지만 NE-LEVEL이 파라미터로 추출되는 것을 확인할 수 있습니다.

추가 예로 들면, 주소 입력이 필요한 서비스의 경우 다양한 어휘 사전 정보가 필요할 것입니다. 인텐트 규칙으로 사용할 수 있는 최대 NE 사전은 2개이기 때문에, 필수 입력 조건에 필요한 어휘 정보만 인텐트 규칙으로 적용하고, 이를 제외한 사전들은 파라미터 값으로 처리할 수 있도록 개발하시면 됩니다.

이렇게 대화 모델에서 넘겨주는 파라미터 값은 service sdk의 onActionEvent로 전달 되고, 개발자는 해당 api를 사용하여 목적에 맞게 개발해주시면 됩니다.

2) Service SDK - onActionEvent API

onActionEvent API는 인텐트에 대한 수신 Event입니다. 개발 코드 내에 onActionEvent 콜백을 정의하면 사용자 발화문으로 실행되는 인텐트의 정보들을 가져올 수 있습니다. (만약 정의 되지 않았다면, base url + service url로 페이지가 이동됩니다.)

  • gigagenie.voice.onActionEvent 콜백 구현
  • 콜백은 function callback(extra)로 구현해야 하며, extra에는 actioncode와 actionpath 및 parameter가 전달됨
    • actioncode : intent 명
    • actionpath : Service SDK 정보 등록에서 작성한 service url
    • uword : 발화 문구 (입력된 그대로의 발화문)
    • parameter : 대화 서버에서 전달하는 파라미터 JSON 값 (Dialog Kit의 정보)
gigagenie.voice.onActionEvent=function(extra){
	switch(extra.actioncode){
		case 'selectCategory':
			// 카테고리 선택 인텐트가 호출된 경우
			switch(extra.parameter['NE-CATEGORY']){
				case "동물" : gameMode = "A" ; break;
				case "나라" : gameMode = "C" ; break;
				case "음식" : gameMode = "F" ; break;
			}
			// 사용자가 난이도를 선택한 경우 해당 case에서 함께 처리
			if(extra.parameter['NE-LEVEL']!=null) {...}
		break;
		
		case 'selectLevel':
		// 난이도 선택 인텐트가 호출된 경우
			switch(extra.parameter['NE-LEVEL']){
				case "초급" : gameLevel = "1" ; break;
				case "중급" : gameLevel = "2" ; break;
				case "고급" : gameLevel = "3" ; break;
			}
		break;
	}
}

해당 내용은 Service SDK API 가이드를 인용했습니다. (링크)