안녕하세요~
이번 포스팅에서는 지난시간에 이어 주문챗봇을 더 개선해보도록 하겠습니다!
지난시간에 알아보았던 Intent, Entity 말고 새로운 Context에 대해 간단히 익히고,
기존 Dialogflow 프로젝트에 적용해보도록 하겠습니다!
[새 인텐트 만들기]
유저로부터 "배달해줘" 라는 의도를 파악하여 반응할 수 있도록 인텐트를 하나 생성합니다.
저는 인텐트명을 DELIVERY로 정했습니다.
학습 문장은 배달해줘, 보내줘 등 배달을 요청하는 문장으로 적절히 추가해주세요
그리고 아래의 응답 메시지로 알겠다는 응답 문장을 작성해주시고 저장해주세요
저장 및 트레이닝 후 챗봇에게 다짜고짜 배달해달라고 해봅시다.
챗봇은 알겠다고 답장하는 문장을 배웠기 때문에 의도, 상황도 모른 채 배운대로 알겠다고 답장합니다.
하지만 주문도 하지 않았는데 배달해달라고 하면 곤란하죠
이런 상황을 해결하기 위해 대화의 맥락을 알아야합니다.
다행히도 Dialogflow에서는 맥락을 어느정도 구분지어서 답변할 수 있도록 Context 라는 옵션을 지원합니다!
일단 컨텍스트를 적용하기 전에 응답을 "네, 알겠습니다" 에서 주문을 먼저 해달라는 문장으로 바꿔줍니다.
그리고 기존에 만들었던 PIZZA_ORDER 인텐트로 이동한 후 새 출력 컨텍스트를 추가해줍니다.
Dialogflow에서 컨텍스트는 맥락을 파악할 수 있도록 인텐트에서 태그형식으로 입력, 출력 할 수 있는 옵션입니다.
위 사진에서는 order 라는 이름의 컨텍스트를 출력하도록 하는 모습입니다.
PIZZA_ORDER 인텐트가 종료(유저에게 응답한 경우)되면 출력 컨텍스트에 추가한 order 컨텍스트가 생성됩니다.
사진에서 보이는 order 컨텍스트 옆에 있는 숫자 2는 생명인데요 유저가 Dialogflow 챗봇과
대화를 주고 받는 횟수가 2회가 지나면 소멸된다는 의미입니다.
흐름으로 쉽게 설명하자면 아래와 같습니니다.
유저: 배달해줘 ( 컨텍스트: 없음)
Dialogflow: 주문을 먼저 해주세요! ( 인텐트: DELIVERY, 컨텍스트: 없음 )
유저: 그럼 치즈피자 1판만 주문해줘 ( 컨텍스트: 없음 )
Dialogflow: 네 치즈피자 1판 주문하겠습니다! ( 인텐트: PIZZA_ORDER, 컨텍스트: order[2] )
유저: 배달해줘 ( 컨텍스트: order[2] )
Dialogflow: 네, 배달해드릴게요 ( 인텐트: DELIVERY_ORDERED, 컨텍스트: order[1] )
흐름을 보면 "배달해줘" 라는 동일한 의도를 Dialogflow에서는 서로 다르게 인식하여 답변하고 있습니다.
대화의 맥락(Context)를 파악했기 때문에 이처럼 상황에 맞는 응답을 할 수 있는것입니다.
PIZZA_ORDER 인텐트에서 대화가 마무리되면 (주문을 했으면) 생명주기가 2인 새로운 order 컨텍스트를 생성합니다.
order 컨텍스트가 있을 때만 "배달해줘" 에 대해 응답하는 인텐트를 생성해봅시다.
새로운 인텐트를 생성합니다.
저는 인텐트 명을 DELIVERY_ORDERED로 정했습니다.
그리고 컨텍스트 옵션에서 입력 컨텍스트에 order를 추가해줍니다.
출력 컨텍스트는 없어도 됩니다.
출력컨텍스트에 order를 추가하면 DELIVERY_ORDERED에 진입한 후 유저와 대화를 마무리 하면
order 컨텍스트의 생명주기를 다시 2로 설정합니다.
컨텍스트는 0이 되면 소멸이 되는데 위와 같이 다시 출력해주면 설정한 생명주기만큼 설정되서 컨텍스트가 더 오래 유지됩니다.
입력 컨텍스트에 order가 있다는 의미는 DELIVERY_ORDERED 인텐트에 진입하려면 order 컨텍스트가 있어야
진입이 가능하다는 의미로 알고계시면 쉽습니다.
프로그래밍의 조건문으로 보자면 아래와 비슷하겠네요.
(이해를 돕기 위해 추가한 그림입니다)
유저가 "배달해줘"를 입력했을 때 order 컨텍스트가 없으면 DELIVERY 인텐트에서 응답하고, order 컨텍스트가 있으면
DELIVERY_ORDERED 인텐트에서 응답하는 구조입니다.
크게 어렵지 않습니다.
order 컨텍스트가 있을 때 응답할 인텐트에도 학습 문장을 작성해줍니다.
응답 메시지로는 배달해주겠다는 의미의 문장을 추가해주세요!
이제 저장하고 테스트해봅시다!
챗봇에게 갑작스럽게 배달해달라고 요청합니다.
챗봇은 학습한 응답 메시지대로 주문을 먼저 해달라고 요청합니다.
(인텐트: DELIVERY, 컨텍스트: 없음)
챗봇의 응답대로 유저가 주문을 먼저 합니다.
치즈피자 3판을 주문했네요
아래 Context 부분을 보면 order 컨텍스트가 새로 추가된것을 확인하실 수 있습니다.
(인텐트: PIZZA_ORDER, 컨텍스트: order)
주문을 했으니 다시 배달해달라고 유저가 요청합니다.
챗봇은 order 컨텍스트가 있는것을 확인하고 DELIVERY 인텐트가 아닌, DELIVERY_ORDERED 인텐트에서 응답해줍니다.
이렇게 컨텍스트를 적절히 사용하여 사용자의 대화에서 맥락을 구분지어서 답변할 수 있습니다.
다음 포스팅에서는 지금까지 간단히 만든 Dialogflow 챗봇을
카카오톡 챗봇에 연동시켜서 카카오톡을 통해 대화를 할 수 있도록 구현해보도록 하겠습니다.
감사합니다.