챗봇만들기#7 Watson Assistant Context 변수 활용하기 (최종) DEV / CHATBOT
2019-04-29 posted by sang12
챗봇만들기#1~#6 까지는, Intent, Dialog, Entity 그리고 Java연동까지.. Watson Assistant에서 중요하게 다뤄지는 것들을 간략하게 훑어보았는데요. 이번에는 마지막 시간입니다. Context 변수를 활용하여 조금더 Chatbot을 사람답게 만들어 보겠습니다. 또한 챗봇만들기#5에서는 간단하게 Watson Assistant에 연동만 했었는데요. 이번에는 Context 변수를 계속적으로 가져 갈 수 있게끔 약간 수정해 보겠습니다 ^^.
여봇의 기분이 항상 일정하면 재미가 없잖아요. 슬플수도 있고, 화날수도 있고... Random 함수를 사용해서 여봇의 변하는 기분을 표현해 보겠습니다
위와 같이 Context에 randomValue를 추가해줍니다. randomValue = "<? new Random().nextInt(2) + 1 ?>"
그리고 오른쪽 테스트창에서 Manage Context를 눌러주면 $rendomValue에 값이 들어가는 것을 확인 할 수 있습니다. clear를 누를때마다 값이 바뀌는 것을 확인 할 수 있습니다.
그리고 여봇의 기분을 담당하는 노드를 Multiple Responses로 바꿔주고, 변수값에 따라 기분을 표시해 주도록 합니다. 자, 그럼 여봇이 계속해서 기분이 바뀌는 것을 볼 수 있겠네요~^^. 이 포스팅에서는 간단하게 Context Value에 대해서 알아 봤는데요. 실제로 이 변수를 잘 활용하면 더욱 더 챗봇다운 챗봇을 만들 수 있습니다. 가령 어떤 영화에 대한 질문을 했을때, 일반적으로 "해리포터 재미있어?, 주인공이 누군데?, 평점은 몇이야?" 등과 같이 처음엔 해리포터란 주어가 등장하지만 그 후부터는 주어가 생략 된체 대화를 이어나가는 경우가 많습니다. 이럴경우, Context변수에 해리포터라는 주어를 저장해두고 $변수 + Intent로 Dialog를 만들 경우, 자연스럽게 대화를 이어 나갈 수 있게 되죠.
자.. 만약 저의 포스팅을 계속 보시면서 따라오시는 분들은... 뭔가 잘못된 것을 느끼 셨을 겁니다. 뭐가 잘못됐을까요? 챗봇만들기#5에서 Watson Assistant에서 간단하게 Java를 연동하는 것을 포스팅 했는데요. 이부분에서는 단순하게 api를 콜해서 입력값에 따른 Watson의 응답값을 받는 작업을 했습니다. 그런데 해당 방법으로 위와 같이 환영인사를 받고 기분을 물어본다면, 개발자님 무엇인가 잘 못된거같아요를 외치는 여봇을 볼 수 있을겁니다.
이유는 Context변수를 계속해서 가져가게끔 변경을 해야 되는데요. 간단하게 코드로 만들어 보겠습니다(변수명이나..그냥 대충..^^; 참고만..하세요 ㅎㅎ ). 왓슨과 연동하는 부분은 챗봇만들기#5를 참고해주세요 ^^
1. input="" output="환영인사"
2. input="기분어때?" output="여봇기분"
Java Code(연동하는 부분 제외, 코드 일부)
InputData input = new InputData.Builder("").build();
MessageOptions options = new MessageOptions.Builder(workspaceId)
.input(input)
.build();
MessageResponse response = service.message(options).execute();
System.out.println("response:::" + response);
InputData input2 = new InputData.Builder("기분어때?").build();
Context context = response.getContext();
MessageOptions options2 = new MessageOptions.Builder(workspaceId)
.context(context)
.input(input2)
.build();
MessageResponse response2 = service.message(options2).execute();
System.out.println("response:::" + response2);
위 소스코드를 보시면 처음엔 환영인사를 받기위해 input값을 ""으로 했고, 두번째는 기분을 물어보기위해 input값을 "기분어때?"라고 전송했습니다. 이때, 첫번째 응답값에서 받아온 Context를 추가로 날려주는걸 볼 수 있는데요. 이 Context에 저희가 설정했던 랜덤변수가 들어가 있고, 이를 두번째 보낼 때 추가해서 기분어때라는 대화를 보내야, Watson에서 해당 변수를 인식해서 응답 할 수 있게 됩니다. 결국 대화를 계속해서 이어나갈려면 저 Context변수를 계속 가져가게끔 해줘야 겠죠.
그리고 Watson에서 말고 Java단에서 Context변수를 상황에 따라 추가하고 수정해줌으로 써, 좀더 멋진 챗봇을 만들어 볼 수도 있겠죠.
여기까지 Watson Assistant를 이용해서 간단하게 여자친구 챗봇을 만들어 봤습니다. 기본적인 것들을 설명하려고 노력했는데 도움이 되실지는 모르겠네요.
꼭.... 챗봇말고 현실에서 여자친구를 만드시길......^^;;; 개발자분들 화이팅!
챗봇만들기#6 Multiple Responses를 이용한 여러 응답 만들기 DEV / CHATBOT
2019-04-29 posted by sang12
거의 한달만에 포스팅 하네요..^^; 이전 시간에는 Java에서 Watson Assistant를 연동하는 방법을 알아 봤습니다. 이번 시간에는 Multiple responses를 이용해서 여러 응답을 만들어 보도록 하겠습니다.
챗봇만들기#4 에서 만들었던 데이트_영화 인탠트를 조금 변형해서, 여봇이 좋아하는 영화일때만 데이트를 승낙하게끔 만들어 보겠습니다.
위와 같이 대화 노드를 Multiple responses로 변경하고, @영화:반지의제왕 , @영화:헤리포터, @영화:다이하드 일때 원하는 대답을 할 수 있게 만들 수 있습니다. c언어나 java등을 배우셨다면 if문과 동일하다고 생각하시면 됩니다. 그리고 anything_else를 사용하면 저 위의 경우가 아닐때 원하는 대답을 세팅할수 있습니다.
다음 시간에는 Context변수를 활용하여, 더욱 챗봇을 사람답게 만들어 보도록 하겠습니다~^^
챗봇만들기#5 Watson Assistant 연동(JAVA) DEV / CHATBOT
2019-03-31 posted by sang12
Watson Assistant에서 다얄로그를 추가하기 지겨우셨죠? 이번에는 실제 Java에서 Watson Api를 호출해서 응답값을 받아 보겠습니다. 일단 API를 호출하는 방법은 Go, Java, Node, Python, Ruby, Swift별로 공식 홈페이지에 잘 정리가 되어 있습니다.(https://console.bluemix.net/apidocs/assistant) 해당 페이지를 참고하여 진행하도록 하겠습니다. 실제로 채팅하는 화면단은 구현할 예정이 아니며, 단순히 저희가 정의한 String을 Watson Api를 이용하여 java단에서 전송하는데까지 진행 할 예정입니다.
Watson Api를 호출하기 위해, Eclipse 프로젝트를 생성해줍니다. 저는 아래와 같이 추가를 했습니다.
그리고 Watson Api를 호출하기위해선 해당 라이브러리(jar)파일을 받아와야하는데, 저는 maven을 이용하여 받아왔습니다. 프로젝트에서 오른쪽 클릭을하고 configure -> Convert to Maven Project를 눌러줍니다.
그러면 maven을 관리 할 수 있는 pom.xml파일이 생성 되는데 그곳에 maven dependency를 추가해줍시다. 그리고 메이븐에 추가한 java-sdk를 받기위해 프로젝트 우클릭 후 Run As에서 Maven install을 눌러줍니다.
<dependencies>
<dependency>
<groupId>com.ibm.watson.developer_cloud</groupId>
<artifactId>java-sdk</artifactId>
<version>6.14.0</version>
</dependency>
</dependencies>
정상적으로 위 과정이 진행 됬다면, Maven Dependencies폴더 아래에 Watson Api를 호출하기 위한 jar파일 들이 들어온 것을 확인 할 수 있을 겁니다. 그럼 실제로 저희가 만든 여봇에게 말을 걸어 봅시다. 말을 걸기 위해서는 apiKey와 Endpoint, 그리고 workspaceId가 필요한데요. Ibm Cloud에서 확인 할 수 있습니다. 신임정보 표시를 누르면 Api Key와 Endpoint를 확인 할 수 있습니다. 저기 저 Endpoint는 서비스의 위치에 따라서 주소가 바뀝니다.
-참고(19.03. 31 기준)
Dallas: https://gateway.watsonplatform.net/assistant/api
Washington, DC: https://gateway-wdc.watsonplatform.net/assistant/api
Frankfurt: https://gateway-fra.watsonplatform.net/assistant/api
Sydney: https://gateway-syd.watsonplatform.net/assistant/api
Tokyo: https://gateway-tok.watsonplatform.net/assistant/api
London: https://gateway-lon.watsonplatform.net/assistant/api
그러면 workspace 아이디는 어디서 확인 할 수 있을 까요? Ibm Cloud에서 저희가 만든 여봇에서 1시방향의 View Api Details를 보면 workspace Id를 확인 할 수 있습니다.
자, 그럼 저희는 Watson Api를 호출하기위한 세가지 변수를 얻었습니다. 그럼 호출해봅시다. 저는 인풋 데이터에 이전에 만들었던 다이하드 보러갈래?를 넣어봤습니다. 그리고 Run해주면 Watson이 어떻게 응답값을 줄까요~?
import com.ibm.watson.developer_cloud.assistant.v1.Assistant;
import com.ibm.watson.developer_cloud.assistant.v1.model.InputData;
import com.ibm.watson.developer_cloud.assistant.v1.model.MessageOptions;
import com.ibm.watson.developer_cloud.assistant.v1.model.MessageResponse;
import com.ibm.watson.developer_cloud.service.security.IamOptions;
public class ChatbotTest {
public static void main(String[] args) {
IamOptions iamOptions = new IamOptions.Builder().apiKey("{apikey}").build();
Assistant service = new Assistant("2018-09-20", iamOptions);
service.setEndPoint("https://gateway.watsonplatform.net/assistant/api");
String workspaceId = "{workspaceId}";
InputData input = new InputData.Builder("다이하드 보러갈래?").build();
MessageOptions options = new MessageOptions.Builder(workspaceId)
.input(input)
.build();
MessageResponse response = service.message(options).execute();
System.out.println(response);
}
}
Watson 응답값
왓슨 응답값을 보면 Json형태로 왔다는 것을 알 수 있고, inputData가 어떻게 들어 왔는지, 그리고 의도의 정확도가 몇프로이며 어떤 의도로 받았는지, OutputData는 어떻게되는지를 알수있습니다. 웹, 카카오, 안드로이드, 개인어플 등 다양한 플랫폼에서 Watson Api를 호출하는 형태로 구현만 해준다면, 리턴값을 Json형태로 받아와서 실제 Chatbot을 구현 할 수 있습니다. (Context 변수를 포함 한 버전은 http://sang12.co.kr/113 참조)
{
"input": {
"text": "다이하드 보러갈래?"
},
"intents": [
{
"confidence": 0.9608183383941651,
"intent": "데이트_영화"
}
],
"entities": [
{
"confidence": 1.0,
"location": [
0.0,
4.0
],
"value": "다이하드",
"entity": "영화"
}
],
"context": {
"system": {
"initialized": true,
"dialog_stack": [
{
"dialog_node": "root"
}
],
"dialog_turn_counter": 1.0,
"dialog_request_counter": 1.0,
"_node_output_map": {
"node_1_1553514883205": {
"0": [
0.0,
1.0,
0.0
]
}
},
"branch_exited": true,
"branch_exited_reason": "completed"
},
"conversation_id": "adb8416f-4812-4529-bcb4-9cd486d7ea6d"
},
"output": {
"log_messages": [],
"text": [
"그거 재미있데 보러가자~"
],
"generic": [
{
"response_type": "text",
"text": "그거 재미있데 보러가자~"
}
],
"nodes_visited": [
"node_1_1553514883205"
]
}
그럼 여기까지, Watson Api를 연동하는 방법에 관해 알아봤습니다. 해당 방법을 이용하여, 다양한 환경에서 연동하여 사용 할 수 있을 것이라고 생각 됩니다. 그럼 다음시간에는 단순하기만 한 Watson Dialog를 조금 더 고도화 시켜 보도록 하겠습니다.