챗봇 기획 - FSM 기반의 챗봇 대화 구조
챗봇을 구현할때 시나리오에 따라 대화의 흐름을 제어할 필요가 있습니다. 이때 많이 사용하는 방법이 유한상태기계(FSM)입니다. FSM은 상태를 변화시키며 그에 맞는 행동을 수행하는데, 특히 게임에서 캐릭터 인공지능에 유용하게 사용됩니다.
위의 그림(하단 링크에서 자세한 그림을 참조하세요.)은 게임에서 몬스터 인공지능을 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이 유용하게 사용될 것이라 생각합니다.... 더보기
챗봇을 구현할때 시나리오에 따라 대화의 흐름을 제어할 필요가 있습니다. 이때 많이 사용하는 방법이 유한상태기계(FSM)입니다. FSM은 상태를 변화시키며 그에 맞는 행동을 수행하는데, 특히 게임에서 캐릭터 인공지능에 유용하게 사용됩니다. (출처 : https://www.slideshare.net/yonghakim900/2009-ndc) 위의 그림은 게임에서 몬스터 인공지능을 FSM으로 구현한 것입니다. |