챗봇을 쉽게, AIML
한국어 챗봇을 만들다보면 아무래도 영어 챗봇이 어떻게 구현을 했는지 리서치 하게 되죠? 영어로 성공적인 챗봇을 만든 회사들이 많지만 그 중 하나는 쿠키 AI https://www.kuki.ai/ 에요. 튜링테스트 대회인 Loebner Prize 에서 무려 5번이나 우승한 (2013, 2016, 2017, 2018, and 2019) 대단한 챗봇이랍니다. 쿠키 AI의 Research https://www.kuki.ai/rese
arch 페이지의 구현을 보면 이런 말로 시작해요.
Kuki is implemented primarily using an open standard, rule-based scripting language called Artificial Intelligence Markup Language(AIML), which entails hand-authoring chatbot replies in response to an analysis of incoming user input data with a blend of statistical models, machine learning, and manual review/tagging.
쿠키는 open-standard 이자 rule-based 스크립트 언어인 Artificial Intelligence Markup Language(AIML) 을 주축으로 구현되어 있고....
AIML이 뭐길래 쿠키 AI에서 활용하는걸까요? AIML 은 챗봇을 만드는 xml 언어랍니다. 복잡한 프로그래밍 언어를 모조리 배울 필요 없이 챗봇에 필요한 기능만을 추려서 언어를 만들었다고 할까요.
AIML을 사용하면 챗봇을 이렇게 만들 수 있어요.
<aiml version = "1.0.1" encoding = "UTF-8"?>
<category>
<pattern> HELLO ALICE </pattern>
<template>
Hello User!
</template>
</category>
</aiml>
이렇게 AIML을 입력해주면
User: Hello Alice
Bot: Hello User
이렇게 대화를 하게 돼요. 정말 쉽죠?
AIML은 이런 단순한 pattern, template 기능 뿐만 아니라 꽤나 복잡한 기능을 제공해서 생각보다 정교한 챗봇을 만들 수 있답니다. 자세한 내용은 tutorial 페이지에서 확인할 수 있어요. https://www.tutorialspoint.com/aiml
AIML, 한국어 적용의 어려움
이렇게 좋은 AIML기능이지만 한국어에는 적용이 쉽지 않았어요. AIML은 기본적으로 string match 를 기반으로 pattern의 문장이 조건과 일치할 때 template의 답변을 하는 형식이에요. 이 방법이 영어에는 굉장히 효율적일 수 있지만 한국어에 적용하기엔 어려움이 있었어요. 예를 들어 "너"가 "점심"에 "무엇"을 "먹었"냐는 의미의 말을 하고 싶을 때 영어로는 이렇게 물어보는 방식만 존재해요.
What did you eat for lunch?
하지만 얄궂은 한국어는 같은 의미의 문장에 너무 많은 경우의 수가 존재해요.
너 점심 뭐 먹었어?
너 점심 뭐 먹었니?
너 점심 뭐를 먹었니?
너 점심에 뭐를 먹었니?
너는 점심에 뭐를 먹었니?
.
.
string match 기반의 AIML을 적용하기에는 한국어의 경우의 수를 다 입력해 줄 수도 없고..
KoML, 한국어를 위한 AIML
이런 어려움을 처리하기 위해서 한국어만을 처리하기 위한 AIML이 있어요.
https://koml-docs.readthedocs.io/
KoML 1.0 documentation
Next 시작하기
koml-docs.readthedocs.io
KoML은 AIML처럼 String match 를 기반으로 패턴 매칭을 하는것이 아니라 형태소 분석 후 품사를 매칭 시켜 패턴 매칭을 진행해서 한국어 처리에 효율적인 패키지랍니다. 예를 들어 위와 같이 '너 점심을 무엇을 먹었니?' 라는 질문을 하고 싶을 때 KoML을 이용하면 이렇게 처리할 수 있어요.
<koml>
<case>
<pattern>너_j 점심_j 뭐_j 먹었_e?</pattern>
<template>로봇이 밥을 왜먹음</template>
</case>
<koml>
이렇게 KoML 파일을 입력해주면
<< 너는 점심에 뭐 먹었니?
>> 로봇이 밥을 왜먹음
이렇게 답변을 하게 돼요.
_j 는 조사의 유무/패턴을 처리하는 와일드카드랍니다. 예를 들어 "너_j 점심_j" 로 입력을 하게 되면
너는 점심에
너가 점심을
너 점심
너 점심에
.
.
다음 경우들을 모두 매칭시킬 수 있어요. 조사 뿐만 아니라 _e, _s 등으로 어미, 특수기호도 처리할 수 있고 _jks, _jko 등으로 주격조사, 목적격 조사만 따로 처리할 수도 있어요.
뿐만 아니라 KoML에서는 챗봇 제작에 필요한 많은 기능을 추가적으로 제공해요. 예를들어 KoML의 <get>, <set> 등의 기능을 활용하면 다음과 같은 기능도 쉽게 구현할 수 있어요.
<< 내 이름 뭔지 알아?
>> 아니.. 뭔데?
<< 어니언이야
>> 아 오키ㅋㅋ 이제 기억할게!
<< 내 이름 뭔지 알아?
>> 응ㅋㅋ 알지
<< 뭔데?
>> 어니언이잖아ㅋㅋ 날 뭘로 보고
"어니언이야" 라는 문장에서 "어니언" 이 이름이라는 것을 귀신같이 알아와서 답변해주죠? 이런 부분이 AIML이 속시원히 풀어주지 못했던 KoML의 장점인 것 같아요.
KoML의 <switch> 와 <func> 등의 기능을 조합하면 끝말잇기 기능도 간단히 구현할 수 있답니다.
<< 끝말잇기 하자
>> ㅋㅋㅋ 로봇인 나한테 끝말잇기로 덤비시겠다?
<< 응
>> 오키ㅋㅋ 그럼 너부터 시작해!
<< 고기
>> 기쁨
<< 쁨?
>> 뭐야 그건 너무 짧잖아 ㅋㅋ 너 졌어
<< 뭐야
>> ㅋㅋㅋㅋ억울하면 한 번 더 할래?
<< 아니
>> 싫으면 하지 마라ㅋㅋ 난 놀아줄라고 한건데
<< 끝말잇기 하자
>> ㅋㅋㅋ 로봇인 나한테 끝말잇기로 덤비시겠다?
<< 응
>> 오키ㅋㅋ 그럼 너부터 시작해!
<< 스트론튬
>> 앗.. 스트론튬은 이어지는 단어가 없는데ㅋㅋ 나의 패배다ㅠㅠ
<< ㅋㅋ
>> ㅋㅋㅋㅋ너 잘한다 한 번 더 할래?
<< 아니
>> 싫으면 하지 마라ㅋㅋ 난 놀아줄라고 한건데
끝말잇기를 진행 후 상대가 이겼는지 졌는지, 이후 다시 게임을 할건지 여부를 확인하는 기능이에요. 재미있죠?
이 외에도 KoML은 한국어로 챗봇을 만들기 위한 다양한 툴들을 지원한답니다. 자세한 사항은 공식 문서에서 확인해보세요!
KoML의 활용
KoML은 한국어 챗봇을 처음 시작하시는 분들, 또는 빠르고 간단하게 챗봇을 구현하고 싶으신 분들께 강력하게 추천드려요. 쉽고 재미있게, 간단하게 챗봇 시스템을 구현하실 수 있을거에요.
뿐만 아니라 딥러닝 기반의 챗봇 서비스를 구현하시는 분들께도 추천드려요. 요즘 챗봇을 만드는 많은 서비스는 딥러닝 기반의 모델(Transformer, RNN)에 많은 부분을 의존하고 있어요. 하지만 서비스를 하는데 있어 Rule-based 처리는 여전히 중요하답니다. 예를 들어 특정 문장을 따로 처리해야 하는 경우, 사용자의 이름/취미 등을 기억해야 하는 경우, 끝말잇기 등의 언어 놀이를 진행하는 경우 등 Rule-based 처리는 챗봇 서비스에 있어 꼭 필요해요. 이런 경우 KoML을 활용할 수 있을 것 같아요. 한국어 형태소 분석 + 강력한 툴들로 Rule 처리를 도와줄 수 있을거에요.
혹시 질문사항이 있다면 댓글로 달아주세요.
감사합니다!
'프로덕트 소개' 카테고리의 다른 글
V-MILO: 내가 만드는 익명 게시판 (1) | 2024.01.03 |
---|---|
누군가의 커뮤니티, 누코 (2) | 2023.07.02 |