brunch

You can make anything
by writing

C.S.Lewis

by Dope Jan 17. 2020

일주일만에 카카오 챗봇 만들기

#5 카카오 채널 챗봇 만들기

  안녕하세요. 즐거운 금요일입니다. 어제까지 챗봇에 대해 기본적으로 알아야 할 내용들과 카카오 i 오픈빌더 소개를 진행했는데요. 오늘은 실제로 제가 자료를 준비하며 여러분의 이해를 돕기 위해 만든 샘플 챗봇 구축 과정을 하나씩 말씀드리려고 합니다. 기본적으로 카카오 i 오픈빌더 내의 기능 외에도 개발단과의 연결 과정에 대해 확인해 볼 수 있는 챗봇 샘플을 만들고자 하였습니다. 오픈 api 를 찾던 중 날씨 정보를 확인할 수 있는 OpenWeather API 를 찾았고, 이를 활용하는 간단한 챗봇을 만들어보았습니다. 사실 카카오 채널 내에 접속하여 날씨를 검색하는 것 보다 크롬 창에서 "서울 날씨" 라는 네글자를 입력하는것이 훨씬 간편합니다. 오히려 이런 날씨 챗봇은 제가 했던 프로젝트 중 인공지능 스피커 같은 곳에 심어졌을 때 효과적으로 사용할 수 있다고 생각합니다. 하지만 교보재로 사용할 만한 것들을 찾다보니 어쩔 수 없이 시장성 없고 쓸데 없어 보이는 샘플을 만들게 된 점 너그러이 양해 부탁드립니다.


  가장 먼저 저는 OpenWeather API 를 활용하여 날씨를 조회하는 시나리오를 생각하였습니다. 이를 위해 필요한 사항들을 정리하고 간단히 시나리오에 반영하였습니다. 복잡한 챗봇의 경우에 챗봇 구조 외에도 플로우 차트를 작성하시면 구축하실 때 도움이 될거에요.

  챗봇의 페르소나는 고양이로 정의하였으며, 이름은 '날씨냥' 이라고 붙여주었습니다. 구조가 단순한 챗봇이기 때문에 페르소나를 세세하게 작성하진 않고 어투 정도만 정해놓았습니다.


  본격적으로 챗봇 블록을 생성하기 전에 개발적인 이슈들이 뭐가 있을지 알아봐야겠죠?

  저는 OpenWeather API 의 Current weather data 와 daily forecast 의 데이터를 가공하여 샘플 챗봇에서 활용할 예정입니다. 그렇기 때문에 오픈빌더에서 전달되는 파라미터와 OpenWeather API 에서 활용하는 파라미터들의 규격이 맞는지 확인할 필요가 있었어요. 

  그렇게 알아보던 중 문제에 봉착하게 되었습니다. 기존 기획 시 카카오 i 오픈빌더 내의 시스템 엔티티를 활용하고자 하였는데요. 제가 활용하고자 했던 @sys.city(해외도시 엔티티), @sys.location(국내 지역명 엔티티) 모두 반환하여 전달되는 값이 한글로 되어있다는 점이었습니다.

  하지만 OpenWeather API 에서는 한글로 해외도시의 날씨 검색이 되지 않았습니다. 예시를 들어보면 무슨 얘기를 하는지 이해하실거에요. 신사동(O), 당산동(O), 뉴욕(X), Las Vegas(O). 신기하게 국내 지역명은 한글로 검색해도 결과값을 잘 보내주는데...

   그래서 어쩔 수 없이 @sys.city 엔티티는 활용하지 못하고 @custom_city 라는 별도의 엔티티를 생성하였습니다. 여기서 또 하나의 문제가 있었는데요. 관측소의 이름과 지역명이 다른 경우 검색이 안되는 것이었습니다. 예를 들어, 우리가 흔히 알고 있는 '괌' 이라는 곳의 날씨를 검색하기 위해 'Guam' 을 엔티티 값으로 만들고 검색을 하지 못한다는 점입니다.

  그래서 어쩔 수 없이 관측지점 지도를 보며 수동으로(제가 직접 했으니 완벽한 인공지능) 대표 엔티티를 설정하였습니다. '괌'의 날씨는 'Dededo Village' 라는 곳에서 측정되고 있다는걸 확인하였고, 'Dededo Village' 의 동의어로 '괌', '타무닝', '괌 타무닝' 을 넣어주었습니다.

  호기롭게 전세계 날씨를 다 보고 싶었으나... 하다보니깐 너무 힘들어서 미국, 중국, 일본의 대한항공 취항 도시만 처리해놓았습니다.


  자 이제 OpenWeather API 를 호출한 뒤 받은 데이터들을 정리하여 카카오 i 오픈빌더로 전달해주는 DB 및 서버를 만들어야합니다. 이 내용은 챗봇과는 거리가 먼 코딩 얘기니 본 포스팅에서 구체적으로 다루지 않도록 하겠습니다. 비개발자 분들은 주변의 개발자 아무나 잡고 물어보시면 저보다 훨씬 정갈하게 설명해주실거에요.

  그렇게 작성 완료된 서버 API 를 카카오 i 오픈빌더에 스킬을 활용하여 위와 같이 연결하실 수 있습니다. 여기까지 진행하셨다면 이제 본격적으로 오픈빌더 내에서 시나리오 및 블록 구성을 시작하실 수 있어요. (외부 api 를 활용하지 않으신다면, 위의 두 과정 없이 바로 챗봇을 구축하실 수 있습니다.)


  첫번째로 저는 기본 시나리오 중 웰컴 블록을 활성화 시켰습니다.

  웰컴 메시지는 최초 1회만 출력되고 카카오톡 대화방에서 나갔다가 들어와도 다시 출력되지 않습니다. 이 때문에 저는 웰컴 메시지에서 사용자에게 많은 정보를 주지 않는게 좋다고 생각하였습니다. 그래서 좌측과 같이 사용자가 앞으로 채팅방에 접속했을 때 메인 시나리오를 호출할 수 있도록 유도하였으며, 이 버튼을 첫 화면(메인 시나리오) 블록에 연결하였습니다.


  두번째로 기본 시나리오 중 폴백 블록을 수정하였는데요.

  폴백 블록은 사용자가 챗봇에 익숙하지 않은 시점에 빈번히 호출될 것이라 생각하여 최대한 슬픈 표정과 함께 첫 화면(메인 시나리오)으로 이동할 수 있는 '처음으로 돌아가기' 바로응답을 추가하였습니다.


  저는 탈출 블록을 활용하기 보다 첫 화면(메인 시나리오) 만드는 걸 선호합니다. 그래서 첫 화면을 위와 같이 구성하였습니다. "홈", "첫 화면", "냥이야 안녕", "ㅎㅇ" 등의 어터런스를 학습시켰어요. 그리고 사용자가 직접 입력하지 않아도 확인해 볼 수 있도록 샘플 발화들을 '발화 전송 바로응답' 으로 추가하였습니다.


  이제까지 틀을 주로 만들었다면, 이제는 기능적인 부분을 만들어 볼 차례입니다.

  이 샘플 챗봇의 유일무이한 기능은 날씨 조회인데요. 위와 같이 블록을 만들어서 날씨 조회 발화를 처리해주고자 하였습니다. 이 블록에서는 지역명 엔티티(@sys.location, @custom_city)를 포함하여 발화한 어터런스를 입력하였으며, 각 엔티티 부분에 엔티티를 지정하여 패턴을 학습하였습니다.


  사용자들이 시나리오대로 입력한다면 좋겠지만 세상에는 다양한 사람들이 있고, 우리는 서비스 기획 시 수 많은 곳에서 예외처리를 해야합니다. 이 블록에서는 엔티티가 존재하지 않는 날씨 조회 발화를 처리하였습니다. "날씨 보여줘", "날씨 알려줘" 등의 발화를 예로 들어볼 수 있겠네요. 사용자에게 엔티티를 포함한 올바른 발화 예시와 함께 가이드 메시지를 제공합니다.

  물론 이런 과정을 거치지 않고 날씨 조회 시나리오 만들기 (1/2) 에서 파라미터들을 '필수 파라미터'로 지정한 뒤 '되묻기 질문'을 통해 슬롯 필링 할 수 있습니다. 훨씬 편하게 만들 수 있으나, 응답 형식에 제한이 있어서 저는 별도의 블록을 만들어서 따로 처리하고자 했습니다.


  자 이제 고지가 눈 앞입니다. 카카오 i 오픈빌더에서 시나리오 작성을 완료하셨다면, 카카오 채널과 연동시켜야겠죠? 그 후 오픈빌더에서 챗봇을 배포하면 좌측과 같이 챗봇을 이용해 볼 수 있습니다.


  오늘까지 5일 동안 카카오 챗봇을 구축하는 법에 대해 소개해드렸는데요. 처음 접하시는 분들에게 작은 도움이라도 되었으면 좋겠네요. 궁금하신 점이나 말씀주실 사항이 있으시면 언제든 편하게 댓글 혹은 메일 부탁드립니다. 즐거운 주말 보내세요! 




이전글: #4 카카오 i 오픈빌더 설명(https://brunch.co.kr/@dope/32)

매거진의 이전글 일주일만에 카카오 챗봇 만들기
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari