아마 개인용 챗봇을 만들고 싶어하는 사람이 많을 것으로 생각하고 있습니다. 저도 그러한 사람 중에 한 사람인데 이러한 것을 구축하는 것은 쉽지 않습니다. 물론 시중에 오픈 빌더 형태로 제공되고 있는 챗봇 서비스가 있으나 정형화된 프레임만 사용이 가능하고 git에 있는 오픈 소스들은 모두 영어 기반이라 어려움이 있더라구요.
그런데 이번 정보통신산업진흥원에서 진행한 개방형 플랫폼 구축 사업에서 잘 만들어진 한국어 기반의 오픈소스 챗봇이 발표되어 이를 정리해 공유드리고자 합니다.
해당 내용은 Kochat: Korean Goal-oriented Chatbot Framework 에 올라와 있는 논문을 참고하여 작성하였습니다.
챗봇은 그 목적에 따라 자유대화(Chit-chat)를 위한 챗봇과 목적지향(Goal-oriented) 챗봇으로 나눠집니다.
자유 대화를 위한 챗봇은 정해진 주제가 없는 상황에서 주로 재미 등을 위해 사용되며, 목적지향 챗봇은 일정관리, 호텔/식당/항공권 등의 예약, 음악 듣기 등 명령 전달, 콜센터 상담 등과 같은 특정된 목적을 달성하기 위해 사용됩니다.
특히 목적지향 챗봇은 일상 생활의 많은 부분을 자동화하기 위해서 널리 쓰이고 있습니다. 이러한 목적지향 챗봇의 잘 알려진 예로는 Apple 의 Siri, Amazon 의 Alexa, Microsoft Cortana 등이 있습니다.
일반적으로 이러한 목적지향 챗봇은 아래 그림과 같이 대화 이해, 대화 관리, 대화 생성 모듈이 파이프라인 형태로 연결된 복잡한 구조를 가지고 있습니다. 그러나 기계학습 초보자 혹은 비전문가가 연구자들의 소스코드를 활용하여 각각의 모듈을 구현하는 것은 어려우며, 이러한 모듈을 연결하여 파이프라인을 형성하는 것도 많은 전문성을 필요로 합니다.
따라서 기계학습 초보자 혹은 비전문가들이 목적지향 챗봇을 구현할 때는 직접 모든 모듈을 구현하기보다는 Dialogflow나 IBM Watson 과 같은 챗봇 빌더나 오픈소스 프레임워크를 활용하는 것이 일반적입니다.
이 중 챗봇 빌더의 경우, 대부분 질의 횟수에 따라 금액이 발생하는 과금 정책을 적용하고 있기 때문에 무료로 목적지향 챗봇을 개발하려면 오픈소스 프레임워크를 이용해야 합니다. 현재까지 몇몇 오픈소스가 출시되었지만 주로 영어를 위주로 개발되어 왔고, 한국어를 처리하기 위해서는 복잡한 과정을 거쳐야 했기 때문에 어려움이 있었습니다.
이러한 문제점을 해결하기 위해 연구진이 만든 것이 국어 전용 오픈소스 목적지향 챗봇 프레임워크인 Kochat 입니다.
Kochat 프레임워크
Kochat 은 데이터세트, 임베딩, 인텐트, 폴백, 엔티티, 슬롯필링+API, 시각화 등의 모듈로 구성되어 있습니다.
1. 데이터세트 모듈
데이터세트 모듈은 사용자의 입력 데이터를 전처리하기 위한 모듈입니다. 사용자로부터 문장이 입력되면 네이버 맞춤법 검사기를 이용하여 오탈자를 교정한 뒤, 품사를 기반으로 토큰화를 진행합니다.
토크나이저는 Open Korean Text 토크나이저를 사용하여, 한국어의 특성을 반영할 수 있도록 하였습니다.
2. 임베딩 모듈
데이터 전처리 이후에 임베딩 모듈을 통해 워드 임베딩을 수행하며, FastText와 Word2Vec을 지원합니다. 사용자는 입력한 코퍼스를 이용하여 워드 임베딩 모델을 직접 학습합니다.
3. 인텐트 모듈
인텐트 모듈은 사용자 발화의 의도를 파악하기 위해 사용됩니다. Kochat 은 사용자 발화를 분류하기 위해 합성곱신경망(CNN)과 장단기메모리신경망(LSTM)을 지원하고 있습니다.
4. 폴백 모듈
폴백이란, 정해진 도메인 이외의 문장이 입력된 경우, “잘 모르겠어요.”와 같은 문장을 반환하여 대화가 지정된 도메인 안에서 진행되게 유도하는 것을 의미 합니다.
모델의 출력 로짓을 소프트맥스 계층에 통과시켜서 분류하는 방식은 이미 널리 사용되며 잘 작동하지만, 이러한 방식은 학습된 도메인 이외의 데이터를 처리하기 어렵다는 문제가 있습니다.
일반적으로 소프트맥스 기반의 분류를 수행 시에 모델로부터 출력되는 확률 값에 대한 임계치를 설정하여 분류 결과의 신뢰 여부를 판단할 수 있지만 다른 연구에 의하면 학습된 도메인 이외의 입력에 대하여 모델의 출력 확률값이 높다고 해서 그것이 높은 신뢰도를 의미하지는 않습니다. 따라서 Kochat에서는 이러한 문제를 해결하기 위해 메트릭 러닝 기법을 도입하였습니다.
먼저 유사한 문장은 거리를 가깝게, 유사하지 않은 문장은 거리가 멀리 임베딩되도록 모델을 학습합니다. 추론 시에는 사용자의 입력 문장에 대한 표현과 학습시에 사용되었던 코퍼스 내의 문장들의 표현과의 거리를 측정하여 최근접 이웃 방식으로 분류를 수행합니다. 분류 결과의 신뢰 여부를 판단하기 위해 입력 문장의 표현과 코퍼스 내에서 가장 인접한 문장의 표현과의 거리에 대한 임계값을 설정하는 것 입니다. 즉, 사용자의 입력 문장과 가장 가까운 문장이 임계치로 설정한 거리보다 멀리 있으면 이를 도메인 이외의 입력이라고 판단하게 됩니다. 이러한 기법을 통해 도메인 외의 입력을 구분하는 폴백 성능을 크게 개선할 수 있었습니다.
5. 엔티티 모듈
엔티티 모듈은 문장 내에 존재하는 개체명을 인식하기 위해 사용됩니다. 예를 들어 “수요일 부산 날씨 어때?”라는 문장이 주어지면, ‘수요일’을 날짜(DATE)로, ‘부산’을 장소(LOCATION)로 인식합니다.
Kochat 은 엔티티 인식 모델로 장단기메모리신경망을 사용했으며, 출력 레이어에 CRF(Conditional Random Field)를 적용하여 인식 정확도를 향상시켰습니다.
6. 슬롯필링 + API 모듈
슬롯필링은 목적지향 챗봇 구현시 주로 이용되는 기법입니다. 먼저 인텐트 모듈을 통해 슬롯을 고르고, 엔티티 모듈을 통해 해당 슬롯을 채웁니다. 마지막으로 API 를 호출하여 사용자에게 정보를 제공할 수 있습니다.
예를 들어, 사용자가 “수요일 부산 날씨 어때?”라 는 문장을 입력하면 인텐트 모듈은 이 문장을 날씨에 관련된 문장으로 분류하여 여러 슬롯 중, 날씨 API 를 호출하기 위한 슬롯을 선택합니다. 엔티티 모듈은 ‘수요일’을 날짜(DATE), ‘부산’을 장소(LOCATION)로 인식하여 날씨 API 슬롯을 채웁니다. 마지막으로 해당 API를 호출하여 결과를 사용자에게 반환합니다.
3.7. 시각화 모듈
Kochat 은 강력한 시각화 기능을 제공합니다. 사용자는 별도의 설정 없이 아래와 같은 여러가지 시각화 자료를 제공받을 수 있습니다.
3.8. 사용자 인터페이스
Kochat 는 사용하기 쉬운 인터페이스를 제공합니다. 이러한 인터페이스를 통해 통해 자신만의 챗봇을 구축할 수 있습니다.
데모
Kochat 프레임워크를 실험하기 위해 여행 안내 챗봇 애플리케이션 데모를 만들었다고 합니다. 여행 안내 챗봇은 날씨 안내, 미세먼지 안내, 여행지 안내, 맛집 안내 등 4개의 기능을 가지고 있습니다.
데모 개발을 위해 각 클래스당 5,000 샘플의 인텐트 분류 및 엔티티 추출 데이터세트를 제작하였다고하며 Git에서 모든 데이터세트를 확인할 수 있습니다.
오픈소스
Git에 올라와 있는 오픈 소스는 아래 링크에서 확인하실 수 있습니다.
https://github.com/hyunwoongko/kochat