Watson으로 쉽게 만드는 카카오톡 ChatBot

이 포스팅은 1. Watson Conversation 서비스로 대화 서비스 만들기와 이어지는 포스팅입니다. 이 단계에서는 이전에 만든 대화 서비스를 앱에서 활용하고 목적에 맞게 수정하는 방법을 배울 것입니다.

< 이 포스팅과 연결된 글 목록 >

2. 내가 만든 채팅 서비스를 어플리케이션으로 노출하기

2.1 Github에서 샘플 어플리케이션 다운로드

이 튜토리얼은 Github를 통해 공유되고 있는 Conversation Simple repository를 기본으로 작성 작성되었습니다. 이 어플리케이션은 블루믹스에 올라가 있으므로 테스트해 보시고 향후 어플리케이션 개발에 참조하십시오.

1) Node.js 와 Bluemix CLI 설치
이 어플리케이션은 Node.js 기반입니다. 따라서 이 어플리케이션을 로컬에서 실행하기 위해서는 Node.js를 설치해야 합니다. 이 어플리케이션을 블루믹스 환경에서 실행하여 Public에 노출하려면 Cloud Foundary CLI를 설치해야 합니다. 개발 환경에 맞는 파일을 다운로드 하여 설치하십시오. Node.js나 CLI 설치 후에는 명령 프롬포트 창을 닫은 후 다시 여십시오. Node.js는 npm -version, Cloud Foundary CLI는 cf –version 명령어를 사용하여 설치를 확인하십시오.

git이 설치되어 있지 않은 경우 git도 설치하십시오.

2) Repository Folk and Clone
Chatbot-tutorial를 Folk 후 Clone하거나 바로 Clone합니다.

git clone https://github.com/hjjo/chatbot-tutorial.git

tutorial2 branch로 이동합니다.

git checkout tutorial2

2.2 어플리케이션과 내 Watson Conversation 연결

먼저 환경변수를 수정하여 내 어플리케이션이 내 Conversation Service의 Workspace를 바라볼 수 있도록 수정합니다. 다운로드한 소스의 최상위 폴더에 .env.example 파일이 있습니다. OS에 따라서 숨김 파일 보기를 해야할 수 있습니다. 이 파일을 복사하여 각자의 내용에 맞게 수정한 후 .env로 저장합니다. 향후 이 .env에 등록한 환경변수는 process.env.xxx의 형태로 코드에서 사용할 수 있습니다.

  # Conversation
  WORKSPACE_ID= [workspace-id]
  CONVERSATION_USERNAME= [conversation-username]
  CONVERSATION_PASSWORD= [conversation-password]

환경변수로 3개의 값이 필요합니다. 이 정보는 Bluemix > Watson Conversation 서비스 >신입 정보 보기, Watson Conversation Tool > Workspaces > View Detail을 통해 확인이 가능합니다.

아래 스크린샷을 참조하여 필요한 정보를 얻으십시오.

credential2

credential3

정보를 참조하여 다음과 같이 수정합니다.

  # Conversation
  WORKSPACE_ID=8dd88a9c-83ac-40f1-bd08-47b319cXXXXX
  CONVERSATION_USERNAME=da3ff9bf-5098-42c2-b2fa-47d1XXXXXX
  CONVERSATION_PASSWORD=tBIuHHpXXXXX

2.3 Watson Conversation SDK 모듈 설치

Command창을 열어 chatbot-tutorial 프로젝트의 최상위 폴더로 이동합니다.

어플리케이션에 정의된 dependency가 있는 node module을 로컬 Node.js 런타임에 설치합니다.

  npm install

Watson Conversation SDK 모듈을 설치합니다. –save 옵션은 insatll 후에 해당 모듈을 package.json에 자동으로 등록해줍니다.

  npm install watson-developer-cloud --save

2.4 어플리케이션 구조 이해하기

이 스텝에서는 /api/message api를 완성하여 웹 클라이언트를 통해 Conversation 서비스를 노출합니다. 웹 클라이언트는 ./public에 이미 개발되어 있습니다.

다음은 app.js의 코드입니다. 이 어플리케이션은 ./public 폴더를 ui로 사용하고 ./api 밑에 REST API를 생성하여 노출하는 구조로 되어 있습니다.

'use strict';

var express = require('express'); // app server
var bodyParser = require('body-parser'); // parser for post requests

var api = require('./api');
var app = express();

// Bootstrap application settings
app.use(express.static('./public')); // load UI from public folder
app.use(bodyParser.json());
api.initialize(app);
module.exports = app;

./api/index.js는 ./api 하위의 api 목록을 관리하고 초기화하기 위한 index 파일입니다.

./api/message.js는 /api/message api를 노출함과 동시에 Conversation API를 호출하는 모듈입니다.

./api/message.js 상단을 보면 다음과 같이 conversation 모듈과 config 모듈을 가져옵니다.

const Conversation = require('watson-developer-cloud/conversation/v1'); // watson sdk
const config = require('../util/config');

config.json에 셋팅한 값을 바탕으로 Conversation Service Wrapper를 생성합니다.

// Create a Service Wrapper
let conversation = new Conversation(config.conversation);

getConversationResponse 함수는 사용자의 message와 context 오브젝트를 input으로 받아 Conversation API를 호출하고 Promise 객체를 리턴합니다. Conversation API를 호출하는 부분은 // TODO로 구현되지 않은 상태입니다.

let getConversationResponse = (message, context) => {
  let payload = {
    workspace_id: process.env.WORKSPACE_ID,
    context: context || {},
    input: message || {}
  };

  payload = preProcess(payload);

  return new Promise((resolved, rejected) => {
    // Send the input to the conversation service
    // TODO : To be implemented
  })
}

postMessage() 함수는 /api/message api로 노출시키기 위한 함수로 http request를 받아 getConversationResponse()를 통해 Watson의 응답을 받으면 http response로 리턴합니다.

preProcess() 함수와 postProcess() 함수는 각각 사용자의 Input을 전처리, Watson의 응답을 후처리 하기 위한 함수입니다.

doAction() 함수는 대화 도중 시스템이 수행해야 하는 Action이 있는 경우 이를 수행합니다.

2.5 Watson Conversation API 호출하는 코드 작성하기

./api/message.js를 열어 getConversationResponse() 함수를 수정합니다.
getConversationResponse 함수의 return 문을 다음과 같이 변경합니다. Conversation SDK를 사용하여 API를 호출한 후에 err가 발생한 경우 reject 오브젝트를, 정상적으로 처리한 경우 resolved 오브젝트를 호출하는 코드입니다.

return new Promise((resolved, rejected) => {
    // Send the input to the conversation service
    conversation.message(payload, function(err, data) {
      if (err) {
        rejected(err);
      }
      resolved(postProcess(data));
    });
  })

2.6 어플리케이션 테스트

어플리케이션이 구동중이라면 Ctrl + C를 눌러 종료합니다.

어플리케이션을 실행합니다.

  npm start

어플리케이션이 작동되면 localhost:3000 에 접속하여 아래처럼 대화합니다.

test2

Command창을 보면 Watson Conversation과 대화할 때마다 로그가 찍히는 것을 확인할 수 있습니다.

2.7 내 어플리케이션 블루믹스에 올려보자 !

프로젝트의 Root 디렉토리에서 manifest.yml 파일을 오픈합니다. 블루믹스는 어플리케이션을 올릴 때 환경을 설정하기 위해 yml 파일을 사용합니다.

manifest.yml 파일에 applications 섹션과 services 섹션이 있습니다.
applications 섹션에는 어플리케이션 이름을 Unique 하게 지정하십시오. 서비스 섹션에서는 각자 생성한 서비스 인스턴스의 서비스 이름으로 변경합니다.

예를들면 아래처럼 수정하면 됩니다.


declared-services:
my-conversation-service:
label: conversation
plan: free
applications:
- name: meetingroom-reservation-with-camomile
command: npm start
path: .
memory: 256M
instances: 1
services:
- Conversation-vp
env:
NPM_CONFIG_PRODUCTION: false

이제 블루믹스 명령어를 사용하여 어플리케이션을 배포합니다. 먼저 블루믹스에 로그인 합니다.

  cf login

커맨드 창에 나타나는 요구사항에 따라 로그인 정보를 입력합니다.

  API endpoint > https://api.eu-gb.bluemix.net

API endpoint는 사용하고 계신 데이터센터 지역에 따라 다르게 입력해야 합니다. 예를 들어 미국 남부이면 https://api.ng.bluemix.net 를, 시드니이면 https://api.au-syd.bluemix.net 을 입력합니다.

다음으로 블루믹스 계정을 입력합니다.

  Email > hjjo@kr.ibm.com 
Password > ***

블루믹스 내에 갖고 계신 Organization과 Watson을 선택합니다.

  Org> hjjo@kr.ibm.com 
Space > watson

로그인까지 완료되었으면 이제 다음 명령어를 사용하여 어플리케이션을 배포합니다.

  cf push

문제가 발생한경우 아래 명령어를 통해 로그를 확인할 수 있습니다.

  cf logs [application name] –recent

이어지는 포스팅은

Watson으로 쉽게 만드는 카카오톡 ChatBot 3. 대화 내용으로 회의실 예약하기

입니다.