핀켓 CS ChatBot 만들기 HackFest 사례

매드업은 2011년 설립된 폰플에서 진화한 마케팅 전문기업으로 핀켓(FINKET)이라는 Mobile Finance Service를 운영하고 있습니다. 핀켓 앱은 스마트폰의 잠금화면으로 신뢰성 있는 금융 기사와 포인트 통합 그리고 편리한 멤버십 적립과 개인 금융 서비스를, 광고주에게는 타겟 금융 광고 플랫폼을 제공합니다.

매드업과 마이크로소프트가 함께 HackFest를 통해서 핀켓 앱의 CS(Customer Satisfaction) 기능을 강화하기 위해 ChatBot을 만들었습니다.

해결하고싶은문제점

핀켓의 서비스는 여러 금융 서비스가 연결되기 때문에 사용자들의 문의가 많은 편입니다. 앱의 문의하기 기능은 운영자가 답변을 해줘야 하기 때문에 시간이 지체되거나 업무시간이 아니면 답변을 빠르게 줄 수 없는 문제가 있습니다.

대화형으로 고객의 질문에 답변을 즉시 해줄 수 있는 Bot을 통해서 1차 응답을 주고 더 자세한 고객지원이 필요하면 다시 운영 담당자에게 연결시켜주면 고객의 만족도를 높일 수 있다는 아이디어에서 HackFest를 진행했습니다.

Microsoft Bot Framework 소개

Microsoft Bot Framework는 Bot을 만들기 위해 마이크로소프트가 운영하는 서비스와 SDK입니다. Bot Connector라는 서비스를 중심으로 Skype, Facebook Messenger등의 채널을 우리가 만들 Bot에 연결시켜 줍니다. Node.js 와 C# 을 지원하는 Bot Builder SDK를 사용하면 빠르게 Bot을 만들 수 있습니다.

만든 Bot을 개발자 포털을 통해 등록하고 Bot Directory를 통해서 사용자들에게 배포 할 수 있습니다.

또한 Microsoft Cognitive Service의 여러 API를 연결시키면 Bot을 더욱 똑똑하게 만들어 줄 수 있습니다. 특히 LUIS(Language Understand Intelligent Service)는 자연어 처리를 할 수 있으므로 사용자와 Bot 사이의 자연스러운 대화가 가능하게 합니다. LUIS는 현재 Preview 버전을 사용해 볼 수 있고 영어, 중국어 등 7가지 언어를 지원하지만 한국어는 2017년 공개 예정이고 아직 지원하고 있지 않습니다.

Microsoft Bot Frame의 기본 개발 방법은 아래 시리즈에 자세히 설명되어 있다.

Microsoft Bot Framework 시작해보기 (1) Microsoft Bot Framework 시작해보기 (2) Hello Bot Framework Microsoft Bot Framework 시작해보기 (3) Bot Application 배포 Microsoft Bot Framework 시작해보기 (4) Bot 등록과 스카이프에서 테스트 하기 [Microsoft Bot Framework] Direct Line REST API 3.0 [Microsoft Bot Framework] Dialog를 사용하여 대화의 흐름 만들기 [Microsoft Bot Framework] 상태저장을 위한 Bot State Service 핀켓 CS ChatBot 만들기 HackFest 사례

FINKET CS Bot

[embed]https://www.youtube.com/watch?v=iUrwiaHB7p4[/embed]

현재 LUIS 도 한국어를 지원하지 않고 기타 API형태로 공개된 한국어 자연어 처리 서비스가 없으므로 두 단계의 개발 로드맵을 설정하고 첫번째 단계에서는 자연어 처리를 쓰지 않지만 자연스럽게 대화하는 느낌을 주면서 사용자에게 선택지를 주는 방식으로 1차 개발하기로 결정했습니다.

사용자에게 3 단계의 선택지를 주면서 최종 질문을 알아내고 그 질문에 가장 적절한 답을 줍니다. 대화하는 느낌을 주기 위해서 항상 같은 문장의 질문과 답변이 아닌 3가지 정도의 같은 의미의 다른 문장을 준비해서 사용자에게 전달 합니다.

질문 / 답데이터

그 동안 FINKET 서비스를 운영하면서 쌓아놓은 고객의 질문과 답변 중에서 가장 빈도가 높은 질문을 뽑아서 3단계 카테고리로 정의하고 최종 질문과 그 질문에 적합한 답변 데이터도 준비를 해서 이 데이터들은 데이터베이스에 담았습니다.

기본아키텍처다이어그램

madup-bot-diagram

  • 사용자는 Android앱을 통해서 메시지를 입력하여 Bot에 전달하거나 Bot이 전달 해준 메시지를 받습니다.
  • 사용자가 입력한 메시지는 Direct Line REST API를 통해서 Bot Connector에 전달 되고 Bot Connector는 올바른 Bot에게 메시지를 전달 합니다.
  • Bot은 적절한 질문과 대답을 데이터베이스에서 조회해서 사용자에게 전달합니다.
  • Bot은 Azure Web App 에 배포해서 운영하고 데이터 베이스는 Azure SQL Database를 사용합니다.

Conversation Channel

기존 FINKET앱에 통합되어 배포가 될 예정이기 때문에 Microsoft Bot Framework가 지원하는 Skype, Facebook Messenger 등의 채널을 사용하지 않고 Android 기반의 앱을 직접 개발하기로 결정했습니다. Bot Connector와 연결을 위해서 Direct Line이라는 채널을 사용했습니다.  Direct Line은 REST 방식의 API로 인증을 하고 대화를 주고 받는 API를 제공 합니다. 현재  Direct Line 3.0 REST API가 공개되었고 FINKET Bot은 Direct Line 1.1 REST API를 사용했습니다.

Direct Line API에 대한 자세한 내용은 Bot Framework 문서(영문)나 Eva 블로그 포스팅을 참조하세요.

FINKET Bot 소스코드

HackFest의 결과물인 소스코드는 오픈소스로 Github 에 공개 되어 있습니다. 개발 환경은 아래 표와 같고 실제 구동 방법은 Github README 파일을 참조하세요.

Bot Builder SDK의 가장 핵심적인 코드는 바로 IDialog 인터페이스를 상속받은 Dialog 클래스들 입니다. FINKET Bot 에서는 5개의 Dialog를 체인으로 연결해서 대화의 흐름을 만들어 냈습니다. Microsoft Bot Framework의 기본 설계 철학 중 하나는 Stateless 입니다. 따라서 대화 중에 저장되어야 하는 상태 값들은 모두 Bot State Service에 저장해서 Bot 자체는 상태를 가지고 있지 않도록 해야만 합니다. 그러면 Bot을 여러 대로 늘리는 Scale Out을 해도 문제가 발생하지 않습니다.

madup-bot-code-flow

Dialog의 사용 방법은 Eva 블로그 포스트를 참조 바랍니다.

개발하면서배운점

  • 질문과 답변이 정해진 Bot의 경우 질문과 답 데이터를 데이터베이스에 저장해서 가져오는 것이 좋은 방법이 아닐 수도 있습니다. 한글 적용에는 조금 어색한 면이 있지만 FormFlow를 사용하는게 오히려 성능에는 좋을 것 같습니다.
  • Direct Line을 사용하면 채널(Android 앱)에 여러 기능을 넣어서 Bot의 Workload를 가져갈 수 있지만 Skype 등의 다른 채널로 확장을 할 수 없는 문제가 생깁니다. FINKET Bot의 Android 앱도 최대한 메시지만 주고 받도록Dummy 기능만 구현되었습니다.

향후과제

1차 구현에서 제외 되었던 자연어 처리 서비스를 붙여서 우리의 말과 글로 자연스럽게 Bot에게 고객지원 관련 질문을 던지고 답을 받을 수 있어야 합니다. 아직 LUIS 가 한국어를 지원하지 않는 상황에서 Microsoft Translator API 를 추가로 붙여서 시도를 해볼 예정입니다.