IBM Watson 리서치 자료
===
- 작성일: 2021년 6월 22일(화)
- 작성자: joonoh.oh@kt.com
## 목차
[TOC]
## Watson은 무엇인가?
- Watson은 IBM의 AI 브랜드 네이밍 (KT의 Genie와 같은 것)
- 보이스봇 관련해서 Watson에서 사용하는 솔루션은 다음과 같다.
- Watson Text to Speech : TTS 솔류션
- Watson Assistant : 챗봇 솔루션
- Watson Discovery : FAQ 답변 검색 or 인터넷에서 답변 검색 등을 위해 사용
- Watson Speech to Text : STT 솔루션
## Watson으로 보이스봇을 만드려면 어떻게 해야하는가?
- Watson에서 보이스봇을 만들려면 Watson STT, TTS 솔루션에 챗봇 솔루션인 Watson Assistant에서 대화를 구성하여 보이스봇 만든다.

*<center>watson으로 보이스봇을 만들때의 구성도</center>*
- Watson Assitant에는 3가지 요금 plan이 있는데, 무료버전인 "Lite" plan으로는 TTS, STT, phone 채널 자동 연동 설정 기능인 phone integration 기능을 사용할 수 없다. 그렇기 때문에 Lite plan 이용자는 Watson SST, Watson TTS, Watson Assitant를 각기 생성한 후, 자신이 만든 서버에서 각 엔진을 호출해야한다.

*<center>phone integration 예시</center>*
- 보통 AI담당에서 "Watson"이라고 부루는 것은 dialog를 관장하는 **Watson Assistant**
### IBM의 챗봇 솔류션 - Watson Assistant 소개
- Watson Assistant = "문장 형태의 사용자 질의를 이해하고, 사전에 준비된 대화흐름에 따라 답변을 제공하는 자연어 기반 대화 서비스"
- IBM에서 2016년 출시
- 한국어를 포함해 다양한 언어 지원
### Watson Assistant 구조
- Watson Assistant의 제일 상위 개념은 Assistant다. Assistant는 대화를 진행하는 봇이다.
- 그리고 해당 봇 안에 여러가지 skill을 저작하고, assistant에 한 가지 skill을 assign 한다.
- skill은 봇의 지식으로 보면 된다.
- skill은 3가지 종류가 있는데, Dialog Skill, Search Skill 그리고 신규 출시된 Actions skill이다.
- Dialog Skill : 시나리오를 저작하여 답변 제공 skill
- Search Skill : 의도를 파악하지 못한 경우 검색을 통한 답변 제공 skill
- Actions Skill : Dialog Skill 보다 쉽게 시나리오 저작하여 답변 제공 skill
- Watson Assistant는 다음과 같은 구성요소를 가진다.

*<center>Watson Assistant 구성요소</center>*
- Intent : 사용자 발화 의도를 파악하는 기능
- 딥러닝 기반 classificaton 사용
- 사용자는 의도 명과 예시 문장을 작성해야한다.
- Intent 명은 영어로 작성하는 것이 좋다. (context에 Intent 명이 그대로 세팅되는데, 한글이면 에러 발생하기 때문에 일일이 수작업으로 수정해줘야함)
- Intent 학습 문장 권장 개수: 한 의도 당 최소 5문장, 보통 20문장 정도 입력 권장
- SK C&C 구축 경험 상 Watson을 이용 시, 한 의도 당 30~40 문장 정도를 입력했을 때 성능이 좋았다고 한다.
- CSV를 통한 Intent 업로드, 다운로드 할 수 있다.
- 작성을 하면 얼마지나지 않아, 자동으로 바로 학습이 진행된다. (따로 학습, 배포 process가 없음)

*<center>Watson Assistant 의도 학습/추론 과정</center>*
- Entity : 사용자 발화에 특정한 정보를 파악하는 기능
- 고객 발화에서 파악해야할 특정 정보를 catch
- synonym과 pattern 기반의 rule을 통해 Entity 추출
- 추출하고자 하는 Enity는 사용자가 등록해야한다.
- 사용자는 Enitity name, Value name, Synonym/Pattern을 등록해야함. (자세한 건 아래 "실습"에서 확인)
- 사전에 정의된 5개의 System Entity가 있다.
- System Entity는 On, Off 설정을 통해 사용여부를 결정할 수 있다. (default는 Off로 되어 있어, System Entity를 사용하고 싶으면 On으로 변경해야한다.)
- CSV를 통한 Entity 업로드, 다운로드 할 수 있다.
- 작성을 하면 얼마지나지 않아, 바로 학습 진행 (따로 학습, 배포 process가 없음)

*<center>Watson Assistant 개체 학습/추론 과정</center>*
- Context : 앞서 말했던 발화 내용을 기억하는 기능
- 만약 고객이 "오늘 서울 날씨는 어떄?" 라고 질문, 봇이 답변을 했다고 가정한다. 고객이 이어서 "그럼 온도는?"이라고 질문하면, context에 location = "서울"이라고 저장이 되어 있기 때문에, 봇은 서울 온도를 답변해준다.
- Dialog : 대화흐름을 정의하는 기능
- 대화 시나리오를 기반으로 Dialog 저작
- GUI 환경에서 대화흐름 저작 가능
- Dialog는 Node로 구성되어 있다.
- Watson Assistant의 Dialog 저작은 top-down 형식의 UI를 가지고 있는데, 이는 조건 매칭 우선 순위가 상위에 위치한 Node는 하위 Node 보다 높다는 것을 의미한다.
- 기본적으로 Dialog를 처음 저작하면 기본적으로 "Welcome", "Anything Else" 노드가 생성된다.
- Welcome : 처음 봇에 진입했을 때 인사말 제공 노드
- Anything Else : 매칭되는 의도가 없을 때 fall-back 처리 노드
- Welcome과 Anything Else 노드 이름을 변경해도 되지만, Watso에서 제공하는 통계를 사용하기 위해 가급적이면 이름을 변경하지않는 것이 좋다.
- Node는 정의된 Condition(AND/OR 조건)에 따라 trigger될지를 결정한다.
- Condition은 Intent, Entity, Context를 활용하여 정의한다.
- 노드 trigger는 Intent를 통하는 것을 권장한다. Entity나 Context로 노드 trigger를 한다면, rule base를 이용하는 것이기 때문에 노동집약적으로 Node를 trigger 할 수 밖에 없다.
- Node의 아웃풋은 Text만 가능한 것은 아니고 옵션, 이미지 등 "Enrich Interaction"으로 사용자에게 답변을 제공할 수 있다.

*Node 응답 유형*
- 해당 노드의 답변은 사용자 정의 json으로 나가게끔 설정할 수도 있다.

*<center>json 응답 작성 예시</center>*
- 마지막으로 Node는 사용자의 입력을 기다릴지, 사용자의 답변을 기다리지 않고 다음 노드로 진행할지, 다른 노드로 jump해서 대화를 이어나갈지 설정한다.

*<center>Watson Assistant 대화 시나리오 흐름</center>*
- Dialog 저작 중, 실시간으로 시뮬레이터를 이용하여 테스트 할 수 있다.
- 봇 답변을 클릭 시 어떤 노드에서 생성한 답변인지 볼 수 있다.
- 파악된 Intent, Entity, Context 정보도 같이 보여준다.

- Node 복사 가능
- 버전 관리 지원 (무료버전은 지원하지 않음)

*<center>버전 관리 예시</center>*
- Search Skill을 추가하면 Anything Else 노드에서 답변을 검색으로 제공할 수 있게 해준다.

*<center>search skill 답변 예시</center>*
- Workspace : Intent, Entity, Context, Dialog를 묶어 대화 서비스를 구현하는 환경
- Tool : Intent, Entity 등족 및 학습, Dialog 저작 등 서비스 구현을 위한 tool
- Log : 대화 이력 및 통계 기반 로그 제공
- SDK : 다양한 언어의 개발자 도구 제공

*<center>Watson Assistant 질문 인식 및 답변 예시</center>*
- Use Case
- Case 1: NLU 및 답변 생성까지 Watson Assitant에서 진행
- Case 2: Watson Assistant에서 분석한 Intent, Entity, Context 정보를 가지고, 온프레미스 서버에서 답변을 생성
- MWW가 하는 방식이 case 2 방식일 거라 추측

### Node 유형
- 대화 Node
- 조건에따라 대화를 진행할 Node가 선택된다.
- Assistant responds에 답변을 작성한다.

- Webhook Node
- Webhook은 외부 api를 연동하여 답변을 제공하는 노드다. 하지만 api 연동에 제약사항이 많다.

*<center>Webhook 제약사항</center>*
- Slot Node
- Slot Node = "Dialog의 특정 Node에서 지정한 다수의 정보를 반복을 통해 모두 확보하는 기능"
- Slot Node를 사용하려면, Node를 클릭한 후 Customize를 선택하면 Slots "On"으로 수정하면 된다.
- prompt for everything : 파악해야하는 정보를 한 번에 하나만 추출할지, 여러개의 정보를 한 번에 추출할지 설정
- slot filiing 시도 횟수를 ui에서 조작할 수는 없다. context와 node trigger condition을 이용하여 직접 구현해야한다.

*<center>멀티 slot 추출 설정</center>*
- Node의 Digression 설정
- Digression = "Multi-turn 혹은 Slot을 통해 진행중인 대화흐름 이외의 답변을 제공하는 기능"
- 대화흐름에 정의하지 않은 답변을 제공하기 어려워, digression을 이용하여 자연스럽게 다른 Node를 통해 대화를 진행하고, 원래 Node로 돌아올 수 있게 했다.
- 다른 노드로 이동할 수 있게 설정 or 다른 노드가 해당 노드로 접근할 수 있게 설정할 수 있다.

*<center>digression 설정 예시</center>*
- Node에서 SpEL 표현식으로 파라미터 접근
- Watson은 노드안에서 SpEL 표현식을 제공하고, 표현식을 이용하여 user input, context 등의 value에 접근한다.
- 표현식 작성에는 "<?" "?>" 태그를 이용한다.

*<center>SpEL 표현식 상용 예시</center>*
## SOE 관점에서 Watson Assistant
- Watson Assistant는 SOE로 사용할 수 없다. Watson Assistant는 대화를 위한 엔진이고, custom API, DB연동은 사용자의 온프레미스에서 수행하게 설계된 시스템이다.

*<center>SOE 구조 및 필요한 이유</center>*
- Watson Assistant의 Context Managing 및 시스템 연동 방식
- Context Managing
- Watson Dialog 저작 시 Node에 조건을 달아 해당 조건을 만족하는 대화 진행
- 트리구조를 이용하여 진행할 대화를 탐색, 매칭되는 조건이 없거나 더이상 진행할 노드가 없는 경우, 루트 노드부터 조건 검색
- 노드 간 정보 교환은 context 및 글로벌 변수를 통해 파라미터 형태로 교환

- 시스템 연동
- Twillo, Facebook Messenger, Slack 등과 같은 채널 연동 제공
- TTS, STT는 Plus plan부터는 자동 연동 제공
- Webhook이용하여 외부 서버, API를 이용하여 답변 생성 지원
- 단점
- Watson Assistant에서 연동을 지원하지 않는 채널은 ui랄 통해 연동 설정 할 수 없다.
- NLU, TTS, STT는 Watson이 제공하는 솔루션이 아니면 이용할 수 없다.
- Webhook 기능에서 지원하는 url은 1개로 정해져 있어, 온프레미스 연동을 위한 orchestration engine은 Watson Assistant와 별개 외부에 존재해야할 수 있다.
## 요금 정책
- 요금 Plan은 "Lite", "Plus", "Enterprise"로 구분
- 비용
- Lite: 무료
- Plus: 한달 $140 / 30일 무료 trail 제공
- Enterprise: 비용 비공개 (영업팀 contact 필요)
- 요금 Plan 별 상세 기능 비교
- Plus 부터 Search Skill, Phone 채널, 의도 추천, 의도 conflict highlight 제공


## Watson Assistant 실습
- Watson Assistant에서 보험금 수령 계좌 변경 시나리오 제작
1. Watson Assistant 가입
- https://us-south.assistant.watson.cloud.ibm.com/
2. 보험금 수령 계좌 변경 Intent 정의
3. 전화번호 Entity를 Pattern 형식으로 등록
- 사용할 pattern: \d{2,3}\d{2,4}\d{4}
4. 계좌번호 Enitity를 Pattern 형식으로 등록
- 사용할 pattern: [0-9]{3,6}[0-9]{2,6}[0-9]
5. 보험금 수령 계좌 변경 slot node 생성
- condition : 보험금 수령 계좌 Intent일 때
- 채워야할 slot: 전화번호, 계좌번호
6. slot이 채워졌으면, 보험금 수령 계좌 변경 완료 멘트 전달
## What's new?
- Actions Skill: 2021년 6월 17일 최종 beta에서 정식 release 됨. (아래 한글 문서는 아직 beta라 표시되어 있음)
- 위에서 Dialog를 저작하는 것은 Dialog Skill이고, 기존 Dialog Skill 보다 시나리오 저작 효율성을 증대시킨 버전이 Actions Skill

*<center>actions skill 설명</center>*

*<center>actions skill 화면</center>*
## 참고자료
- Watson Assistant 공식 도큐먼트 : https://cloud.ibm.com/docs/assistant
- Watson Assistant와 Voice Gateway 연동 SOE : https://sugerent.tistory.com/660
- Watson Voice Gateway : https://www.ibm.com/docs/en/voice-gateway?topic=gateway-about-voice
- Watson Text to Speech : https://www.ibm.com/kr-ko/cloud/watson-text-to-speech
- Watson Speech to Text : https://www.ibm.com/kr-ko/cloud/watson-speech-to-text
- Watson Assistant Phone Integration: https://cloud.ibm.com/docs/assistant?topic=assistant-deploy-phone
- SK C&C Watson Assistant 소개자료: https://www.youtube.com/watch?v=gryeg9hf5x0
- 신한생명 상품 공시실 : http://www.shinhanlife.co.kr/bigLife.do