3. 튜토리얼 소개
1. WCS 시작하
기
2. 메신저와 연동
하기
3. 질문 수집하
기
4. Intent 분류하
고 학습시키기
5. Entity와
Dialog 설정하
기
6. Backend 서비
스와 연동하기
사용자
인터페이스
어플리케이션
워크스페이스
Conversation
Service 백엔드 시스템
Architecture
4. 사전 준비 사항
Bluemix Account 생성 및 CLI 설치1 2
3 GIT 설치
Node.js 설치
https://github.com/cloudfoundry/cli#do
wnloads
https://console.ng.mybluemix.net https://nodejs.org/en/#d
ownload
https://git-
scm.com/book/ko/v1/%EC%8B%9
C%EC%9E%91%ED%95%98%EA%B
8%B0-Git-
%EC%84%A4%EC%B9%98
6. 튜토리얼 1. WCS 시작하기
Watson Conversation Service (이하 WCS)는 Bluemix(IBM PaaS Platform)을 통해서 제공되는 클라우드 서비스
입니다. Bluemix에서 WCS 인스턴스를 생성하여 사용할 수 있습니다.
이 튜토리얼은 Bluemix의 가입 과정은 생략합니다.
1) bluemix.net 에 접속합니다.
2) Catalog에서 Conversation 서비스를 작성합니다. 왼쪽 카테고리에서 Watson을 선택하면 서비스를 더
빨리 찾을 수 있습니다.
3) 서비스를 작성하면 아래와 같은 화면이 나타납니다. 다른 메뉴로 이동했다가 다시 이 화면을 보려면
좌측 상단의 햄버거 버튼을 눌러 Service/Dashboard를 선택 하고 작성한 Conversation 인스턴스를 클릭
합니다.
4) Launch Tool 버튼을 눌러 WCS 툴로 이동합니다.
7. 5) Conversation Tool의 URL을 편의를 위해 북마크에 추가합니다. 브라우저별 방법은 상이합니다.
6) Create 버튼을 눌러 Workspace를 생성합니다. Workspace는 챗봇을 빌드하기 위해 Intent 등을 트레이닝
시키기 위한 단위입니다. 우측에 Import 버튼이 있습니다. 추 후에 Workspace 단위로 Import/Export 할
수도 있음을 참조하십시오.
7) Name 필드에 자유롭게 이름을 입력하고, Language로 English를 선택하십시오.
8. 8) Workspace가 생성되었습니다 !
9) 마지막으로 앞으로 어플리케이션 연동에 필요한 Credential 정보를 확인합니다. 좌측 상단에 있는 햄
버거 메뉴를 누른 후 Deploy > Credentials 메뉴를 클릭합니다.
10) Username, Password 및 Workspace ID를 선호하는 에디터에 Copy합니다.
Workspace는 어플리케이션이 사용하는 단위입니다. 하나의 Watson Conversation Service 인스턴스 안에 여러
Workspace를 생성할 수 있습니다. Workspace는 다음과 같은 타입의 artifact로 이루어집니다.
• Intent : Intent는 사용자가 하려는 말의 목적을 의미합니다. 따라서 우리는 서비스에서 제공하고자 하는
요청의 모든 타입을 Intent로 정의하게 됩니다. 예를들어 회의실 예약은 하나의 Intent가 될 수 있습니다.
Watson Conversation에서 Intent를 지칭할 때에는 #을 prefix로 사용합니다. Intent를 정의할 때에는 사용자가
이 Intent를 목적으로 말을 할 때 사용할 가능성이 있는 최대한 많은 예시를 제공하는 것이 좋습니다. 예를
들어 회의실 예약이라는 Intent에는 “회의실 예약해주세요.”, “지금 빈 회의실이 있나요?” 등의 예시를
제공할 수 있습니다.
• Entity : Entity는 Intent와 관련된 용어 또는 목적어를 의미합니다. Entity는 Intent에 대해 구체적인
문맥(Context)을 제공하는데에 쓰입니다. 예를 들어 회의실 예약이라는 Intent를 사용하기 위해서는 회의실
이라는 Entity를 정의할 수 있습니다. 회의실 Entity에는 실제로 보유중인 회의실 이름을 담으면 됩니다.
이렇게 Entity를 정의하면 사용자가 “진달래 회의실 지금 비어 있어?” 라고 했을 때 회의실 Entity의 값이
“진달래”로 리턴되게 됩니다.
• Dialog : Dialog는 대화의 흐름을 분기하는 것으로 어플리케이션이 정의된 Intent와 Entity를 인식했을 때
어떠한 응답을 할 것인지를 정의합니다. 다시 말하면 사용자가 대화를 시도했을 때 이 대화의 Intent와
Entity를 파악한 후 어떠한 응답을 할 것인지를 정의합니다.
9. 11) 첫번째 Intent로 #Greeting을 작성해 보겠습니다. 상단의 메뉴에서 Intents를 클릭하여 이동합니다.
12) Create new 버튼을 클릭하여 인텐트를 작성합니다.
13) 작성 후에 Create 버튼을 클릭합니다.
10. 14) Watson의 첫번째 응답 메세지를 작성해 보겠습니다. 상단 메뉴에서 Dialog로 이동합니다.
15) Create 버튼을 눌러 Dialog 작성을 시작합니다. 먼저 Welcome 메세지를 작성합니다. Trigger 조건에
conversation_start를 입력하면 나오는 드롭다운 메뉴에서 create new condition을 클릭합니다.
16) 노드의 이름에 Welcome을 입력합니다.
17) 다음과 같이 Response를 입력합니다.
Good to see you ! I can help you book or manage your meeting room.
11. 18) Welcome 노드 하위의 + 버튼을 눌러 새 노드를 작성합니다.
19) 아래와 같이 노드를 작성합니다.
20) 지금까지 작성한 챗봇을 테스트 해 보겠습니다. 우측 상단에 위치한 메세지 아이콘을 선택합니다.
21) 대화창을 이용하여 테스트합니다. Watson이 예측한 Intent가 맞지 않는 경우 바로 보정할 수 있습니다.
튜토리얼 1. WCS 시작하기를 모두 마치셨습니다 ! J
12. 튜토리얼 2. 챗봇 노출하기
두번째 단계로, 내 챗봇을 어플리케이션을 통해 외부로 노출하는단계입니다.
2.1 웹 어플리케이션으로 노출하기 (필수)
웹 어플리케이션으로 노출하기 위해 먼저 아래 튜토리얼을 따르십시오.
https://developer.ibm.com/kr/cloud/bluemix/watsonservice/2017/01/20/watsonchatbot-2-watson-
conversation/
- 텔테그램 또는 카카오톡에서 Context를 저장하기 위해 Cloudant를 사용합니다.
2.1에서 어플리케이션을 블루믹스에 올릴 때 Cloudant 인스턴스가 생성되었을 것입니다.
블루믹스의 대쉬보드에서 생성된 Cloudant 서비스를 선택하고 “Service Credentials” 탭에서 url을 복사하여
어플리케이션의 .env 에 CLOUDANT_URL 값으로 복사합니다.
2.2 카카오톡으로 노출하기 (선택, 옐로아이디가 이미 있는 경우에만 !)
카카오톡으로 노출하기 위해 아래 튜토리얼을 따르십시오. 단, tutorial4를 checkout하지 않고, 2.1 에서 작
업하신 내용에 이어서 작성합니다.
https://developer.ibm.com/kr/cloud/bluemix/watsonservice/2017/02/19/watsonchatbot-4-watson-
conversation/
2.3 텔레그램으로 노출하기 (선택)
1) 아래 튜토리얼의 1번 과정(1. 텔레그램에 Bot 생성하기)을 따라하여 텔레그램 bot token을 얻습니다.
https://developer.ibm.com/kr/developer-%EA%B8%B0%EC%88%A0-
%ED%8F%AC%EB%9F%BC/2017/03/11/node-js-
%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-
%ED%85%94%EB%A0%88%EA%B7%B8%EB%9E%A8%EA%B3%BC-
%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0/
2) 다음 명령을 사용하여 api 모듈을 설치합니다.
3) .env 파일에 다음 환경변수를 추가합니다.
4) /api 밑에 telegram 폴더를 생성하고 message.js를 생성합니다.
> npm install –save node-telegram-bot
# Telegram
TELEGRAM_TOKEN=376884728:AAH0EcH3tPqBZ6G30tI8nEZCrchXXXXXXXX
chatbot-tutorial
- api
- telegram
- message.js
13. 5) /api/telegram/message.js를 통해 텔레그램 메신저와 대화 서비스를 연동합니다. 먼저 필요한 모듈 및
값을 가져옵니다.
'use strict';
const conversation = require('../message');
const config = require('../../util/config');
const cloudant = require('../../util/db');
const TelegramBot = require('node-telegram-bot');
const db = cloudant.db;
const token = process.env.TELEGRAM_TOKEN;
6) 발급받은 token으로 Telegram bot을 생성합니다.
let bot = new TelegramBot({
'token' : token
});
17. 튜토리얼 4. Intent 분류하고 학습시키기
1) https://meetup23th.eu-gb.mybluemix.net/csv/questions 에 접속하여 엑셀을 다운로드 합니다.
2) 엑셀을 열어 두번째 Column에 아래 표를 참조하여 Intent 값을 명시합니다.
3) Comma(‘,’) separated 형식으로 저장해야 WCS 툴에 바로 업로드 할 수 있습니다 !!
Intent Example
Greeting Hi
Reservation Would you reserve a room for me tomorrow?
Positive Answer Yes
기타 기타
18. 튜토리얼 5. Entity와 Dialog 설정하기
2.1 System Entity 사용하기
1) WCS 툴의 상단 메뉴에서 Entities를 선택합니다.
2) System entities를 사용하도록 설정합니다. System entities는 날짜, 숫자, 통화 등을 핸들링 할때 매우
유용합니다. 회의실 예약시에는 날짜와 시간이 필요합니다. 따라서 이 두 Entity를 Enable합니다.
19. 2.2 Dialog 설정하기
이 단계에서는 사용자와의 대화에서 Watson이 어떻게 대답할 것인지를 결정하고 분기하게 됩니다. Dialog
는 Intent와 Entity를 사용하여 사용자 인풋을 분석하며 정보를 수집하고 유용한 대답을 하게 만듭니다.
Dialog는 트리 형태를 가지는데 각 인텐트를 최상위 노드로 놓고 가지를 치며 적절한 대답을 할 수 있도록
유도하면 됩니다. 이 Recipe에서는 아래 그림처럼 4개의 최상위 노드를 만들 것이며 Reservation 노드가 가
장 중요한 비즈니스 역할을 할 것입니다.
1) WCS 툴의 상단 메뉴에서 Dialog를 클릭하고 Create 버튼을 클릭합니다.
노드를 생성하기 앞서 Dialog에서 사용하는 용어를 설명드리겠습니다.
• 노드(Node) : 노드는 Dialog를 구성하는 요소입니다. 사용자와의 대화에서 1번의 상호작용을 의미합니
다.
• 컨디션(Condition) : 노드를 구성하는 요소로 사용자의 인풋 등을 바탕으로 조건에 맞는 경우 해당 내용
을 응답합니다.
• 응답(Response) : 노드를 구성하는 요소로 사용자의 인풋이 컨디션에 매치되면 활성화됩니다. 간단한
문자열을 리턴할 수도 있고 좀 더 복잡한 프로세스를 실행시킬 수도 있습니다.
• 브랜치(Branch) : 사용자와의 대화를 의미한 일련의 Dialog Node를 브랜치라고 합니다. 사용자의 인풋이
기본 노드의 컨디션에 맞을 때 브랜치가 사용되게 됩니다.
• 턴(Turn) : 사용자가 인풋을 하고 이에 응답하는 하나의 사이클을 턴이라고 합니다. 브랜치는 하나 이상
의 턴을 가질 수 있습니다.
• 기본 노드(Base node) : 브랜치의 최 상위 노드(첫 번째 노드)를 기본 노드라고 합니다.
• 자식 노드(Child node) : 기본 노드가 아닌 노드를 자식 노드라고 합니다. 자식 노드는 이전 노드가 최종
응답을 주기 위해 더 많은 사용자 인풋 또는 프로세스를 필요로 할 때 사용됩니다.
• 동기 노드 또는 자매 노드(Peer node or Sibling node) : 다른 노드의 대안책이 되는 노드입니다. 모든 기본
노드는 다른 기본 노드의 동기 노드입니다.
• 노드 메뉴(Node menu) : 노드를 구성하느 요소로 노드를 지우거나 기능을 추가할 수 있도록 해줍니다.
노드를 작성할 때에는 SpEL(Spring Expression Language)을 사용합니다. 자세한 사용법은 Watson
Conversation에서 사용하는 Expression Language를 참조하세요.
20. 2) 4개의 최상위 노드를 아래와 같이 작성합니다.
3) #Reservation 노드의 하위노드로 아래와 같이 작성합니다.
Index Triggered by
Response
Condition
Response Jump to
1 conversation_start Welcome!
2 #Greeting
Hi, what can I do for you?,
Hey, what can I do for you?
3 #Reservation
{ "context": { "dates": null,
"rooms": null, "times": null },
"output": {} }
3-1 Condition
4 anything_else
I’m sorry, I don’t understand.
Please try again.
Index Triggered by
Response
Condition
Response Jump to
3-1 NOT $user
{ "context": { "user": { "id":
"hjjo@kr.ibm.com", "name":
"HyeonJeong Jo", "email":
"hjjo@kr.ibm.com", "phone":
"01031229436" } }, "output": {} }
3-2 Condition
3-2 $user
{ "context": { "dates": "<? @sys-
date?:$dates ?>", "rooms": "<?
@Room?:$rooms ?>", "times":
"<? @sys-time?:$times ?>" },
"output": {} }
3-2-1 Condition
3-2-1 NOT $dates
{ "context": { "repeat": 1 },
"output": { "text": { "values": [
"When do you want to have a
meeting?" ], "selection_policy":
"sequential" } } }
3-2-1-1 @sys-date 3-2 Condition
3-2-1-2 true
I’m sorry. Please tell me the dates
that you want to book a room. For
example, you can say in format
“mm/dd/yyyy”
3-2-1-2-1 @sys-date 3-2 Condition
3-2-1-2-2 $repeat < 3
{ "context": { "repeat": "<?
$repeat + 1 ?>" }, "output": {} }
3-2-1-2 Condition
3-2-1-2-3 true
I’m sorry. I can’t understand you.
Please start again.
21. 3-2-2 NOT $times
{ "context": { "repeat": 1 },
"output": { "text": { "values": [
"What time do you prefer?" ],
"selection_policy": "sequential" } }
}
3-2-2-1 @sys-time 3-2 Condition
3-2-2-2 true
I’m sorry. Please tell me the times.
You can tell me like this. “From
13:00 To 14:00”
3-2-2-2-1 @sys-time 3-2 Condition
3-2-2-2-2 $repeat < 3
{ "context": { "repeat": "<?
$repeat + 1 ?>" }, "output": {} }
3-2-2-2 Condition
3-2-2-2-3 true
I’m sorry. I can’t understand you.
Please start again.
3-2-3 true
{ "context": { "action": {
"command": "check-availability",
"dates": "$dates", "times":
"$times" } }, "output": { "text": {
"values": [ "$user.name, OK I will
check the availabilty of room.
$dates, $times, $rooms" ],
"selection_policy": "sequential" } }
}
3-2-3-1 #PositiveAnswer
{ "context": { "action": { "dates":
"$dates", "times": "$times",
"command": "confirm-
reservation" } }, "output": { "text":
{ "values": [ "OK. <? context.room
?> at < ?
context.times.get(0).value ?>, <?
context.dates ?> is reserved for
you." ], "selection_policy":
"sequential" } } }
3-2-3-2 true
{ "context": { "action": null },
"output": { "text": { "values": [
"Canceled. please start again." ],
"selection_policy": "sequential" } }
}
3-3 true
I’m sorry. You’re not a registered
user in our system.