- AI Dev - 인공지능 개발자 모임
- 정보공유
- 챗봇 기획
챗봇을 구현할때 시나리오에 따라 대화의 흐름을 제어할 필요가 있습니다. 이때 많이 사용하는 방법이 유한상태기계(FSM)입니다. FSM은 상태를 변화시키며 그에 맞는 행동을 수행하는데, 특히 게임에서 캐릭터 인공지능에 유용하게 사용됩니다.
(출처 : https://www.slideshare.net/yonghakim900/2009-ndc)
위의 그림은 게임에서 몬스터 인공지능을 FSM으로 구현한 것입니다. 'IDLE, COMBAT, RETREAT' 세가지 상태로 되어있고 각각의 조건에 따라 상태를 전이합니다. 그리고 현재 상태에 따라 몬스터의 행동을 결정할 수 있습니다. 예를 들어, IDLE일때는 주변을 배회하도록 움직이고 COMBAT일때는 적을 공격하도록 합니다.
피자 배달 챗봇을 FSM으로 구현하는 예를 들어보겠습니다. 최대한 간단하게 하기위해 '인사, 메뉴소개, 주문'의 세가지 상태만 존재합니다.
유저 : 안녕
챗봇 : 안녕하세요. 저는 피자주문 챗봇입니다.
상태 : Main(인사), Sub(None)
변수 : None
유저 : 무슨 피자 있어?
챗봇 : 불고기피자, 페페로니피자, 치즈피자가 있습니다.
상태 : Main(메뉴소개), Sub(피자)
변수 : None
유저 : 불고기피자
챗봇 : 불고기피자는 정통 불고기와 신선한 야채가 어우러져 모두가 좋아하는 맛입니다.
상태 : Main(메뉴소개), Sub(피자)
변수 : Target(불고기피자)
유저 : 별로..
챗봇 : 새로 출시된 슈프림피자는 어떠신가요?
상태 : Main(메뉴소개), Sub(피자)
변수 : Target(슈프림피자)
유저 : 좋아! 이걸로 주문할래
챗봇 : 슈프림피자를 선택하셨습니다. 전화번호를 입력해주세요.
상태 : Main(주문), Sub(전화번호)
변수 : Slot(피자/슈프림피자, 전화번호/None, 주소/None)
유저 : 010-1111-2222
챗봇 : 주소를 입력해주세요
상태 : Main(주문), Sub(주소)
변수 : Slot(피자/슈프림피자, 전화번호/010-1111-2222, 주소/None)
유저 : 서울 강남구 신사동
챗봇 : 주문 감사합니다. 곧 배달하도록 하겠습니다.
상태 : Main(주문), Sub(None)
변수 : Slot(피자/슈프림피자, 전화번호/010-1111-2222, 주소/서울 강남구 신사동)
이런 FSM 구조의 장점은 대화의 문맥을 유지할 수 있다는 점입니다. 위의 예시에서 '별로...'라고 말했을때 Main(메뉴소개), Sub(피자)라는 상태를 알고 있기 때문에 새로운 피자를 추천할 수 있었습니다. 문장의 의미를 검사할때 상태에 따라서 좀 더 적합한 대답을 선택할 수 있습니다.
하지만 상태가 많아질수록 전체적인 구조를 파악하고 상태간의 전이를 처리하기 힘들다는 단점이 있습니다. 하지만 제한된 범위에서 챗봇을 구현할때 FSM이 유용하게 사용될 것이라 생각합니다.
< 챗봇 개발자 모임 >
- 페이스북 그룹에 가입하시면 챗봇에 대한 최신 정보를 쉽게 받으실 수 있습니다.