아 그게 뭐더라

디지스트봇 딩굴이 v2 본문

프로젝트/디지스트봇 딩굴이

디지스트봇 딩굴이 v2

뭐더라토 2019. 8. 30. 17:35

https://github.com/friendship1/dinguli_v2.0

 

카카오 플러스친구 API v1 이 올해를 끝으로 종료되면서, 새로운 API인 v2로 업데이트를 피할 수 없었다.

만든지는 좀 지났는데 계속 수정할까봐 업로드를 안했다가, 이제는 당장 큰 수정이 필요없을 것 같아서 이제서야 올린다.

 

목차

1. 기본 소스 파일 구성

2. 소스 파일 이외의 설정

3. 구현상의 두 개의 가지

4. 세부 구현에서의 특이사항

 

 

 

1. 기본 소스 파일 구성

만들기 전에 생각이라는 것을 하고 만들어서 그런지 확실히 v1보다는 파일 구성이 깔끔하다. 오로지 세 개.

 

form.py

func.py 

main_bob.py

 

main_bob.py가 카카오 서버와의 통신 부분으로, flask를 이용해 쉽게 만들었다. 예전에 우리 학교에서 푼 백준 문제 크롤링 해주는 사이트를 만들때 건드려봐서 할만했다.

 

form.py는 기본 고정된 string부분들을 적어두는 곳이다. 카카오 플러스친구가 개편되면서, json형식으로 카카오 서버와 통신해야 하는데, json은 string과 중괄호가 전부이기 때문에, 기본 json 포맷을 만들어 두는 용도로 form.py를 사용했다.

 

func.py는 말 그대로 이외의 모든 각종 함수들이 저장된 곳. main_bob.py에서는 오로지 카카오 서버와의 통신. 그 말단만 책임지고, 어떤 데이터를 json에 담아 보낼지는 모두 func.py에서 한다. 예를 들면, 내 서버에서 식단 이미지를 가져온다든지, 이메일 인증을 하다든지, 데이터베이스에 사용자가 입력을 저장한다던지. 사실 너무 다양한 기능들이 한 파일에 있어서 분리의 필요성을 느끼고 있다.

 

2. 소스 파일 이외의 구성

카카오 플러스친구(곧 명칭도 "카카오톡 채널"로 바뀐다) 가 version 2로 개편되면서, 달라진 점은 너무 많았다.

당장 json형식으로 통신하기 때문에, 어떻게 해야 json을 주고받는 것인지 시행착오가 있었으며,

"카카오 i 오픈빌더" 라는 웹페이지를 따로 두어, 여기서 추가로 각종 설정들 (시나리오, 블록, 스킬, 엔티티, 컨텍스트...) 을 해주어야 한다. 무슨 말인지 이해하는데도 한참 걸렸다. 그래서 저 github에 올린 파일을 돌릴 뿐만 아니라, 저기에 맞게 "카카오 i 오픈빌더" 홈페이지에서 각종 설정을 나와 똑같이 맞춰 주어야, 챗봇이 동작한다.

(근데 사실 설정 할 것도 많지는 않고, 시나리오랑 스킬 갯수를 똑같이 맞추고, 각 스킬마다 링크만 잘 걸어주면 된다.)

(여기에 추가로 컨텍스트도 설정해줘야 하는데... 음. 아무튼 그렇다.)

 

대충 이런 식의 화면 구성이다. 

 (*실제로 딩굴이에게 뭐해 라고 물어보면 "그냥~" 이라고 하며 나연사진을 준다)

아마 아직 베타기간이라서 신청을 해야 카카오 i 오픈빌더에 접속할 수 있을거다.

오픈빌더 도움말 페이지는 아래 링크.

https://i.kakao.com/docs/getting-started-overview

 

 

3. 구현상의 두 개의 가지

메인 메뉴 카드에서 보이는 두 개의 버튼에서 볼 수 있듯이. 구현상 큰 두개의 가지가 있다. 식단정보와 생활정보. 쉽게 구현할 수 있지만 재미있는 그런 좋은 게임 아이디어가 없어서 오락 요소는 아직까지 넣지 못했다.

 

가. 식단정보의 디자인

 - 식단정보에서 가장 중요한 것은 당연 식단표이다. 식단표 보기는 url 방식으로 그냥 두었다. v2로 넘어오면서 이미지 방식도 가능해졌지만, 트래픽도 잡아먹고, 무엇보다 1주치 식단표를 이미지 하나로 채팅창에 계속 띄워버리면 사용자가 다른 버튼을 누르지 않는 문제가 있다. 지금도 식단표 url 버튼만 클릭하고 도망가는 사람들이 많아서 문제다.

 - 추가로 별점을 사용자가 입력할 수 있게 만들었다. 언젠가는 이 챗봇으로 설문조사를 하겠다는 희망을 담아 만들어진 사족이다. 

 - 마지막으로 가장 중요한, 식단 이미지 정보를 주려고 시도하고 있다. 식단표를 알더라도 굳이 학생식당까지 걸어갔다가 한숨과 함께 돌아오는 수많은 발걸음들을 보면서 생각했다. 식단 사진은 끼니마다 한 장씩 이면 충분하기 때문에, 식단을 샘플매대(?)에 올려두는 영양사가 사진을 한번만 찍어 올리면 제격이라고 생각했다. 사진을 업로드 할 수 있는 웹페이지를 따로 php기반으로 만들어 두고 3대 식당 영양사분들께 협조를 요청드리러 갔다.

  교내 학식은 에프엔에스에서 운영하는 R1식당과, 웰리브에서 운영하는 교직원 식당, 학생식당이 있다. R1에서는 바쁘지만 가끔 올리겠다는 답을. 웰리브 쪽의 두 식당에서는 필요없다고 하시더라. 그래서 결국 학생이 직접 사진을 올리는 것으로 할 수 밖에 없었다.

  이미지 보안 업로드 플러그인을 카카오톡에서 지원해준다는 것을 뒤늦게 알아냈고, 이걸로 쉽게 업로드를 처리할 수 있었다. 사용자들이 제각각 자신이 먹은 밥 사진을 올리고 코멘트를 남기는, 학식스타그램의 모습을 꿈(만)꿨다. 구현된 세부 사항은 직접 써보면 알 수 있으니 패스.

 - 게시는 익명이기 때문에 이상한 사진이나 코멘트가 올라올 것을 대비하여 교내 메일 인증 서비스도 만들어 두고 주석처리하여 비활성화 시켜두었다. 하지만 놀랍게도 사용자는 오지 나 하나. (익숙...)

 

나. 생활정보의 디자인

 생활정보는 별 거 없다. 그냥 링크만 붙여놓으면 된다. 그래도 링크처리를 더 깔끔하게 해 두어서 보기 좋다. 한 카드에 최대 5개의 요소만이 들어갈 수 있다는 제약이 있다.

 

 

4. 세부 구현에서의 특이사항

 - 세부 구현은 결국 func.py가 전부이다. 딱히 특이한 것은 없고, 그냥 output을 json형태로 만들어내는 것이 목적. github에 같이 올라와 있는 dbsetting.txt 파일을 보면 table들을 어떻게 만들었는지 볼 수 있다. 원래 저거 말고 user 목록 table이랑 뭐가 더 있었는데... 아 뭐더라. 아무튼 코드를 보면 알 수 있다.

 - json.dumps() 와 json.loads()가 빈번하게 호출되는데, json이라는게 string형태가 있고, dictionary 형태가 있어서 이렇게 전환이 필요한 경우가 있는 것 같다. form.py 맨 하단에는 전부 json.dumps()를 한 것을 볼 수 있다.

 - 카카오에서 만들어 놓은 개념인, 컨텍스트(context) 설정이 조금 까다롭다. context란, 사용자가 발화를 하면서 특정 context 상황에 진입하도록 되었을 때, 이를 몇분 동안, 또는 몇번의 채팅 동안 변수로 저장하여, 사용자가 지속적으로 챗봇 서비스에 값을 전달해주는 시스템이다.(설명이 개떡같지만 더 궁금하면 카카오톡 API 도움말에 좋은 설명이 있으니 그걸 보면 된다.) 즉, 각 발화(텍스트의 주고받음)가 각각 독립적인 것이 아니라, 연결될 수 있는 변수를 제공하는 것. 예를들면 딩굴이에서는 별점 주기 버튼을 클릭해야만 숫자가 인식되지, 이외의 상황에서는 숫자를 입력해도 딩굴이가 이해를 하지 못한다. (이해하지 못하는 상황을 폴백(fallback)발화로 넘어간다고 한다.)

 - 그리고 가변적인(==동적인) 입력을 받는 것이 상당히 까다롭다. 카카오톡은 기본적으로 사전에 정해둔 사용자 응답에 대해서만 챗봇이 대응할 수 있도록 하고 있다. 그래서 이메일 주소 같은 동적인 사용자 입력을 처리할 수 없는데, 이는 전부 폴백(fallback) 발화에서 받아서 처리해 주어야 한다. (사실 카카오에서는 동적 입력을 처리하기 위해 '엔티티'라는 개념을 쓰라고 권장하고 있는데, 기능이 한정적이다. 자세한건 패스.)

 - 이외에도 이미지 업로드 플러그인 처리와 설명 입력에서의 컨텍스트 유지 문제, 메일 인증 구현, 데이터베이스에서 업로드된 식단 이미지 가져오기 등 다양한 어려운(?) 더러운(?) 구현들이 있었다. 최적화 같은건 그렇게 신경쓰지 않았다.

 

당장은 식단 이미지 업로드를 어떻게 참여시킬건지와 오락요소를 무얼 넣을지를 생각해야 한다.

 

 

====

20190902

메인 식단 listcard에서 링크를 걸고, 버튼 위치와 이름을 약간 수정했다.

 

 

'프로젝트 > 디지스트봇 딩굴이' 카테고리의 다른 글

디지스트봇 딩굴이 v1  (2) 2019.07.17
Comments