Kakao Chatbot Skill with GoormIDE

스킬 사용 : 구름 IDE

  • 구름 IDE를 이용한 스킬 사용 시도
  • 그러나 구름IDE는 서버 실행 후 해당 창을 종료하면 스킬 사용이 불가능 = 편의성이 떨어짐
  • 된다는 것만 확인하고 실제 챗봇 스킬에는 사용하지 않았다
  • 단, Heroku에 비해 난이도는 낮은 편이라 수월하다는 장점이 있었다

사전준비

  • 카카오 채널 생성
  • 카카오 챗봇 오픈 빌더 OBT 승인
  • 구름 IDE 가입 : https://ide.goorm.io/

컨테이너 생성

  • 구름 IDE 가입 후에 컨테이너를 생성한다.

Untitled

  • 생성 시 설정 : 이름, 설명, 공개범위 등
  • 추가 모듈/패키지 : 항목 모두 체크

Untitled

  • 생성 완료

Untitled

  • 컨테이너 실행

Untitled

파일 생성, 코드 작성

  • 파일 생성 : application.py
  • 랜덤으로 숫자를 생성하는 코드를 작성해본다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from flask import Flask, jsonify
import sys
import random
application = Flask(__name__)

@application.route("/")
def start():
return "Hello goorm!!!"

@application.route("/random", methods=["POST"])
def random_function():
response = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": str(random.randint(1,10))
}
}
]
}
}
return jsonify(response)

if __name__ == "__main__":
application.run(host='0.0.0.0', port=int(sys.argv[1]), debug=True)
  • 실행 : python [application.py](http://application.py/) 80
  • 서버가 작동한다.
  • 구름을 사용하는 동안에는 이 창을 종료해서는 안 된다.

Untitled

  • 컨테이너 관리 창에서 ‘설정으로 가기’

Untitled

Untitled

스킬 사용

Untitled

  • 블록에서 사용할 스킬을 설정한다.

Untitled

결과

  • 설정한 발화패턴 입력시 랜덤으로 숫자가 생성된다

Untitled

  • Reference

https://www.youtube.com/watch?v=EWK9G9XAk00&t=97s

Kakao Chatbot 스킬 사용

사전준비

  • Heroku 배포 이후에 진행
  • Hello world가 출력된 페이지를 띄어야 한다.

스킬 서버 구축 기본편

  • 스킬 서버에서 제공하는 2가지 API URI는 다음과 닽다.
  • 단순 텍스트형 응답 스킬
    • POST /api/sayHello
  • 단순 이미지형 응답 스킬
    • POST /api/showHello

(1) 스킬 서버 예제

  • 코드 작성 : main.py
    • 코드 print(body['userRequest']['utterance'])와 responseBody 영역은 추후 설명 할 예정이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from flask import Flask, request
import json

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!!!!!!!!!!!!!!!!!!!!!!!'

# 카카오톡 텍스트형 응답
@app.route('/api/sayHello', methods=['POST'])
def sayHello():
body = request.get_json() # 사용자가 입력한 데이터
print(body)
print(body['userRequest']['utterance'])

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "반가워!!!!! hello I'm Ryan"
}
}
]
}
}

return responseBody

# 카카오톡 이미지형 응답
@app.route('/api/showHello', methods=['POST'])
def showHello():
body = request.get_json()
print(body)
print(body['userRequest']['utterance'])

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleImage": {
"imageUrl": "https://t1.daumcdn.net/friends/prod/category/M001_friends_ryan2.jpg",
"altText": "hello I'm Ryan"
}
}
]
}
}

return responseBody
  • 코드 저장 후 배포 시 주의점
    • 경로에 주의해야 한다!
  • 배포 진행한다.
1
2
3
4
$ git add .
$ git commit -am "your_message" # 이 부분만 자유롭게 쓸 수 있다.
$ git push origin main ## Github Repository에 업데이트
$ git push heroku main ## Heroku 코드 배포

(2) 스킬 서버 등록

단순 텍스트형 응답

  • 아래와 같이 스킬 서버 정보를 입력하고 저장한다.
  • 코드에서 정의한 이름을 URL 뒤에 덧붙인다 : /api/sayHello

Untitled

단순 이미지형 응답

  • 텍스트형 응답과 같은 과정을 거친다.
  • /api/showHello

(3) 시나리오

  • 여기가 가장 중요하다. 이제 시나리오를 등록한다. 이 때 중요한 것은 파라미터 설정 탭에서 스킬 선택을 개별적으로 호출 할 수 있다.

단순 텍스트형 응답’ 스킬 사용

  • 봇 응답에서 스킬 데이터를 선택 후, 저장 버튼을 클릭한다.

Untitled

단순 이미지형 응답’ 스킬 사용

  • 사용할 스킬 데이터를 선택 후, 저장한다.

(4) 배포

  • 배포 탭을 클릭한 후, 배포를 진행

Untitled

(5) 테스트

  • 봇 테스트를 열고 아래와 같이 테스트를 한다.

  • 배포 완료 후 사용 가능

  • 단순 텍스트형 응답

    • 설정한 텍스트 출력
    • 정상 작동
  • 단순 이미지형 응답

    • 설정한 이미지 출력
    • 정상 작동

Untitled

(6) 로그 확인

  • Heroku 에서는 로그를 쉽게 확인 가능
1
heroku logs

(7) 출력

챗봇 빌더를 활용한 사칙연산 계산기 구현

  • 사칙 연산을 구현하는 챗봇을 만들어 본다.

(1) 엔티티 구성

  • 엔티티(Entity) : 봇이 이해할 수 있는 용어를 체계적으로 정리한 데이터 사전
  • 엔티티 구조는 = 엔티티명, 대표 엔트리, 동의어
  • 엔티티의 자세한 설명은 다음 링크에서 확인
  • 사칙연산을 예로 들면 아래와 같이 지정할 수 있다.
    • division, subtraction 등은 대표 엔트리를 말한다.
    • 동의어에 해당하는 값이 나오면 추후에 확인할 로그 값에는 대표 엔트리만 별도로 데이터를 수집할 수 있다.

Untitled

(2) 시나리오 구성

  • 엔티티를 구성했다면, 이제 시나리오를 구성한다.
  • 사용할 파라미터를 설정한다.

Untitled

  • 패턴 발화를 할 때 원하는 파라미터를 별도로 지정할 수 있다.
  • 패턴 발화를 보면 빨간색 네모 박스를 확인할 수 있는 데, 이 부분에서 파라미터를 설정할 수 있다.
  • 더하기, +에서의 파라미터는 엔티티 그룹을 설정하게 된다.

Untitled

  • 실제 파라미터 설정된 값은 다음과 같다.

Untitled

(3) 파이썬 코드

  • 이제 다음 코드를 작성하여 기존 main.py에 추가한다.
  • 코드 작성시, 한가지 유의 사항은 json.loads() 함수를 반드시 써줘야 한다. Python Dictionary를 String으로 변경하는 것은 str() 함수를 사용하면 쉽게 변경이 가능하지만, 문자열 dictionary를 Dictionary로 바로 변경은 되지 않는다. 따라서, json.loads()를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from flask import Flask, request
import json

# 메인 로직!!
def cals(opt_operator, number01, number02):
if opt_operator == "addition":
return number01 + number02
elif opt_operator == "subtraction":
return number01 - number02
elif opt_operator == "multiplication":
return number01 * number02
elif opt_operator == "division":
return number01 / number02

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello, World!!!!!!!!!!!!!!!!!!!!!!!'

# 카카오톡 텍스트형 응답
@app.route('/api/sayHello', methods=['POST'])
def sayHello():
body = request.get_json() # 사용자가 입력한 데이터
print(body)
print(body['userRequest']['utterance'])

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": "반가워!!!!! hello I'm Ryan"
}
}
]
}
}

return responseBody

# 카카오톡 이미지형 응답
@app.route('/api/showHello', methods=['POST'])
def showHello():
body = request.get_json()
print(body)
print(body['userRequest']['utterance'])

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleImage": {
"imageUrl": "https://t1.daumcdn.net/friends/prod/category/M001_friends_ryan2.jpg",
"altText": "hello I'm Ryan"
}
}
]
}
}

return responseBody

# 카카오톡 Calculator 계산기 응답
@app.route('/api/calCulator', methods=['POST'])
def calCulator():
body = request.get_json()
print(body)
params_df = body['action']['params']
print(type(params_df))
opt_operator = params_df['operators']
number01 = json.loads(params_df['sys_number01'])['amount']
number02 = json.loads(params_df['sys_number02'])['amount']

print(opt_operator, type(opt_operator), number01, type(number01))

answer_text = str(cals(opt_operator, number01, number02))

responseBody = {
"version": "2.0",
"template": {
"outputs": [
{
"simpleText": {
"text": answer_text
}
}
]
}
}

return responseBody
  • 코드를 저장 후 git배포한다.
  • 스킬 설정

Untitled

  • 스킬을 사용할 블록에서 스킬을 지정하고 챗봇 배포한다.

Untitled

  • 배포 후 카카오톡에서 직접 실험

  • (+) 연산 정상작동

  • (-)연산 정상작동

  • (x) 연산 정상작동

  • (%) 연산 정상작동

  • 사칙연산 모두 정상작동하므로 성공

Untitled

Kakao 스킬서버

챗봇에 다음과 같은 연산을 도입하게 위한 기능이다

5*10은 무엇인가요?

  • 사칙연산

  • number01 operator number02

  • def cal(number1, number2)

         number 1 * number 2
    

스킬의 역할

  1. 바로 동작에서 출력으로 이동함으로써 달성 불가능한 것을 스킬을 거쳐서 가능케 함
  2. [발화입력 → 동작 → 스킬 → 출력]

Untitled

  • 웰컴 블록(Welcome Block)

웰컴 블록은 사용자가 봇을 처음 사용할 때 받게되는 웰컴메시지를 설정하는 블록.

웰컴블록’이 ‘사용중’일 경우 사용자가 봇을 처음 사용할 때 웰컴블록에 설정된 응답이 전송되고, ‘미사용’일 경우 응답을 설정하는 부분이 비활성화 되고 OFF로 표기.

  • 폴백 블록(Fallback Block)

폴백 블록은 사용자의 발화 의도가 어떠한 블록과도 매칭이 되지 않을 때 (=봇이 사용자의 발화 의도를 이해하지 못할 때)의 응답을 설정하는 블록.

  • 탈출 블록(Exit Block)

탈출 블록은 봇의 되묻기 상황에서 사용자가 대화를 초기화하거나 탈출하고 싶을때 쓰는 사용자 명령어를 정의하는 블록.

스킬 처리 과정

  • 봇 시스템 = 주문 블록
  • 사용자 발화 : ‘피자 주문 할께요’
  • 주문 블록 — [스킬 호출] —> 스킬 서버
  • 주문 블록 <— [스킬 응답] — 스킬 서버
  • 챗봇 답변 : ‘피자 주문 완료’

Untitled

서버와 DB 구조

  • 서버가 2개 필요
  • 폭백 블록 → ←챗봇 API 서버 ↔ 챗봇 엔진 서버 ↔ 학습 DB

Untitled

스킬 사용

  • 카카오 챗봇 → 스킬 → 생성
  • 단, 서버 주소가 필요하다.

Untitled

  • 주소 끝에 다음과 같은 형식으로 입력

    • 단순 테스트 응답 스킬 주소 끝에 입력 : .com/api/sayHello
    • 단순 계산기 텍스트 응답 스킬 주소 끝에 입력 : .com/api/calCulator
  • body = request.get_json() # 사용자가 입력한 데이터

  • responseBody 는 일종의 템플릿. 이 틀에서 응답 형식으로 작성한다.

  • simpletext

스킬 사용 코드 예시 : SimpleImage

간단한 이미지형 출력 요소입니다. 이미지 링크 주소를 포함하면 이를 스크랩하여 사용자에게 전달합니다. 이미지 링크 주소가 유효하지 않을 수 있기 때문에, 대체 텍스트를 꼭 포함해야 합니다.

상세 필드

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"version": "2.0",
"template": {
"outputs": [
{
"simpleImage": {
"imageUrl": "http://k.kakaocdn.net/dn/83BvP/bl20duRC1Q1/lj3JUcmrzC53YIjNDkqbWK/i_6piz1p.jpg",
"altText": "보물상자입니다"
}
}
]
}
}

엔티티 설정

  • 엔티티 → 나의 엔티티 관리 → (엔티티 생성)

Untitled

  • 이 엔티티와 동일한 이름으로 변수를 생성하고 코드 작성

  • def clas(opt_operator, number01, number02) : # 메인로직!!!

  • sys.number 사용 가능한지 체크

Untitled

  • 파라미터 설정

Untitled

  • 사용자 발화 : 다음과 같이 발화에서 엔티티를 설정

Untitled

  • 로그값 확인이 가능한 것을 사용 : aws, heroku, 구름IDE 중에서 선택

heroku project 생성 시 주의

  • 이름 다르게 생성! = 유일값
  • heroku-kakap-chatbot은 사용 불가
  • 언더바 _ 사용불가
  • 다음 3가지를 같은 이름으로 생성
    • 로컬 폴더명 == Github Repo == Heroku Project 이름

Kakao Chatbot open builder

챗봇 제작

챗봇 설정

  • 프로필 설정 : 모든 사항에 관해 공개로 전환

Untitled

  • 운영 채널 연결 : ‘tutorial’ 챗봇 ↔ ‘휴먼주식도우미챗봇’ 채널
    • 배포만 하면 카카오톡에서 검색 가능하다.

Untitled

  • 배포
    • 첫 배포 : 이제 카카오톡에서 검색이 가능하며 사용이 가능해진다.
    • 그 이후의 배포 : 작성한 블록 시나리오 등이 실제 카카오톡에 반영된다.

Untitled

  • 관리자 초대
    • 조원들과 챗봇을 공동으로 관리하기 위해 설정

Untitled

시나리오 작성

  • 앞서 제작된 시나리오 구상안을 토대로 챗봇의 시나리오, 블록 작성

  • 시나리오 생성

  • 주요 기능을 기반으로 시나리오 생성

Untitled

  • 0 메뉴

    • 주요 기능을 모두 사용할 수 있는 메뉴를 호출할 시나리오를 의도하고 생성
  • 1 주식이 처음이신가요?

    • 주식 초심자를 위해 ‘계정 생성 방법’과 ‘주식 거래하는 방법’ 등을 설명하기 위한 시나리오
  • 2 주식 단어

    • 입문자를 위한 간단한 주식 용어를 설명하고 더 많은 용어를 공부하기 원하는 사용자를 위한 추가적으로 자료를 담을 예정
  • 3 종목별 시세를 알려드릴까요

    • 종목 시세를 확인 가능하도록 크롤링한 데이터를 출력할 시나리오를 계획
  • 4 현재 인기 많은 종목 알려드릴까요?

    • 처음 주식하는 사람들에게 주식을 추천하기 위한 기능을 넣을 시나리오
  • 5 꼭 알아야 할 이슈

    • 초심자가 현재의 주식 관련 흐름을 파악하는데 도움을 줄 정보를 알려줘야 할 시나리오 생성

블록 작성

  • 시나리오 아래에 구상안을 구현할 블록들을 작성

  • 블록명을 넘버링하여 상위 하위를 구분 가능하게 함.

  • 상위에서 하위로 넘어갈 수 있게 제작

    • 예를 들어, 1-1 블록에서 1-1-1 블록이나 1-1-2 블록으로 이동 가능
  • 거의 모든 블록에 돌아가기 기능 탑재. 반대로 하위에서 상위로 이동하도록 구현

  • 0 메뉴얼 블록

    • 0 메뉴얼 : 주요 기능 사용과 개선사항 전달이 가능한 메뉴를 출력하는 블록

Untitled

  • 1 주식이 처음이신가요 블록
    • 다음 두 가지 기능 중 하나를 선택하고 호출하는 블록
    • 1-1 계정 만드는 법 알아보기
      • 1-1-1 오프라인으로 계좌 개설하기
      • 1-1-2 온라인으로 계좌 개설하기
    • 1-2 기초 상식 알아보기
      • 1-2-1 주식은 이렇게 거래합니다
      • 1-2-2 주식 시장의 결제 방식
      • 1-2-3 증권사 수수료, 증권거래세

Untitled

  • 2 주식 단어 목록 블록
    • 간단한 단어와 그 뜻이 담긴 여러 블록과 연결
    • 더 많은 용어를 알고 싶은 초심자를 위한 자료의 링크가 연결된 버튼을 제작

Untitled

  • 3 종목별 시세 확인 블록
    • 종목 시세를 확인 가능하도록 크롤링한 데이터를 출력할 예정
    • 임시로 시가총액 확인 가능한 링크를 연결

Untitled

  • 4 최근 인기 종목 알려드립니다 블록
    • 거래상위, 상승주, 하락주를 확인 가능한 링크를 연결
    • 매수상위, 매도상위를 기반으로 인기 많은 종목을 출력할 예정
    • 임시로 매수상위, 매도상위 확인 가능한 링크를 연결

Untitled

  • 5 꼭 알아야할 이슈,뉴스 블록
    • 주식 관련 뉴스를 확인할 수 있게 설정
    • 매일 뉴스를 찾아서 확인하기 번거로운 사용자들을 위한 관련 기능 추천

Untitled

제네릭 메뉴 설정

  • +시나리오 밑에 ‘시나리오 설정’ 에서 설정
  • 주요 기능과 같은 이름으로 제네릭 메뉴 생성
  • 각 제네릭 메뉴를 주요 기능을 사용할 수 있는 블록과 연결한다.

Untitled

배포 : 챗봇 시나리오 반영 여부 확인

  • 배포 후 카카오톡에서 의도대로 기능이 작동하는 시험

Untitled

Untitled

Untitled

Untitled

피드백 받습니다.

  • 카카오톡 검색 : 휴먼주식도우미챗봇

Untitled

  • 개선사항 전달 or 상담직원 연결

Untitled

Untitled

  • 개선사항을 적어주세요

Untitled

  • 채널에서 확인하고 개선

Untitled

Kakao Chatbot Start

카카오 챗봇

카카오톡 오픈 빌더 챗봇 만들기 1편 - Data Science | DSChloe

개요

  • 카카오톡 오픈 빌더 챗봇을 만드는 과정을 보여준다.
  • 회원가입이 필요할 수 있다.
  • 카카오톡 채널을 만든다.

등록하기

  • 구글 검색창에서 카카오톡 오픈 빌더를 검색한다.

Untitled

  • 로그인

Untitled

  • 챗봇 관리자센터 OBT 참여 신청 메뉴가 나오는지 확인한다.
  • 신청 메뉴가 나오면 참여 신청

카카오톡 채널 관리자 가입

  • 카카오톡 관리자 채널에서 새로운 채널을 만든다.

Untitled

  • 채널을 개설한다.
    • 프로필 사진, 소개글은 추후에 작성이 가능하다.

Untitled

  • 개설이 완료되었다.

Untitled

  • 채널로 이동한다

Untitled

Untitled

  • 챗봇 관리자센터 OBT 참여를 신청한다.

• 대시보드로 화면이 넘어가면 이제 챗봇 서비스를 시작하면 된다.

Untitled

카카오계정 (kakao.com)

챗봇 제작

Heroku 가입

스킬 서버 이론

heroku 배포

스킬 사용

스킬 사용 : 구름 IDE

크롤링 기초