안녕하세요
이번 포스팅에서는 구글의 DialogFlow (이전 API.ai)를 이용하여
주문 챗봇을 만들어보도록 하겠습니다!
챗봇이라고 하면 사람과 대화를 주고받고 유저가 의도한 요청대로 결과를 전달해주는 역할을 합니다.
챗봇 구현에서 가장 어려운것은 역시 대화인데요
큰 비중을 가지고 있는것이 자연어 처리입니다.
쉽게 구현할 수 없고 매우 어렵기 때문에 챗봇 개발에 큰 어려움이 있습니다.
하지만, 구글의 DialogFlow가 우리의 어려움을 해결해 줄 수 있습니다!
DialogFlow는 구글의 인공지능 플랫폼입니다.
누구나 쉽게 사람과 대화할 수 있는 챗봇을 만들 수 있습니다.
이번 포스팅에서는 간단한 주문을 받는 챗봇을 만들어 볼 예정입니다!
놀랄만큼 쉽고 간편하기 때문에 본 포스팅을 본 후 여러분들이 원하는 챗봇도 만들 수 있습니다.
본격적으로 시작하기에 앞서 본 포스팅에서는 아래와 같이 2가지에 대해 설명하고 실습을 진행합니다.
Intent
Entity
[다이얼로그 플로우]
위 페이지로 접속하여 구글로 로그인합니다.
SIGN UP FOR FREE 를 누르거나 우측상단의 GO TO CONSOLE을 누른 후 구글 계정으로 로그인하시면 바로 사용 가능합니다.
로그인 후 콘솔로 진입합니다.
좌측 리스트나 중앙에 있는 버튼을 통해 새 에이전트를 생성합니다.
에이전트는 챗봇이라고 생각하시면 됩니다.
우리는 새 챗봇을 생성했습니다!
챗봇의 이름과 기본 언어를 선택해줍니다.
한국어를 선택해준 후 위의 CREATE 버튼을 눌러줍니다.
잠시 후 생성이 완료되면 아래와 같은 화면으로 이동합니다.
좌측 리스트를 보면 Intent, Entity.. 등이 있는데요
본 포스팅에서는 Intent와 Entity에 대해 설명합니다.
먼저 인텐트(Intent)에 대해 이해하기 쉽게 설명해드리자면
인텐트는 의도 입니다.
사용자와 챗봇간을 연결해주는 역할을 한다고 보시면 됩니다.
생성 직후 기본 인텐트가 2개 있습니다.
Default Fallback Intent
Default Welcome Intent
Fallback 인텐트는 챗봇이 사용자와 대화하는 도중 대화 내용을 이해 할 수 없는 경우 사용됩니다.
(예: 무슨말인지 모르겠어요)
Welcome Intent는 다른 플랫폼에서 챗봇과 대화를 시작할 때 처음 1회 사용됩니다.
(예: 반갑습니다)
우리는 주문 챗봇을 만들것이기 때문에 주문을 받는 인텐트를 하나 생성해봅시다.
좌측 + 모양을 눌러 새 인텐트를 생성합니다.
상단에 인텐트 명을 적어주세요!
인텐트에는
Context, Event, Training phrase, Action and Parameter, Response, fulfillment
총 6개의 항목이 있는데 본 포스팅에서는 색깔로 강조한 부분에 대해서만 알아봅니다!
첫 번째로 Training phrases를 추가해줍니다.
위와 같이 사람들이 피자 주문에 입력할만한 문장을 여러개 입력해줍니다.
챗봇이 우리가 작성한 문장을 학습하여 나중에 우리가 입력한 비슷한 문장을 이해할 수 있습니다.
숫자 4와 2에 노란색으로 강조되어있는데
이는 다이얼로그 플로우의 Entity(개체)입니다.
자연어를 분석하려면 단어를 분류해야 하는데 개체는 여기서 단어에 해당됩니다.
피자 주문의 경우 피자의 종류가 개체에 해당됩니다.
다이얼로그 플로우는 기본적인 개체가 있는데 주로 숫자, 날짜, 시간, 위치 등
일상생활에서 자주 사용할만한 개체를 가져와서 사용할 수 있습니다.
피자 종류의 경우 우리가 직접 개체에 추가해야합니다.
개체로 생성하고 싶은 단어를 드래그합니다.
(그 전에 인텐트를 저장해주세요!!!)
우리는 피자 종류를 개체로 만들어야 하기 때문에 피자 종류를 드래그했습니다.
드래그하면 존재하는 개체(엔티티)들이 나옵니다.
하지만 모두 기본 제공 개체이므로 우리가 원하는 피자 종류 개체를 생성해봅시다.
아래 +Create new 버튼을 눌러줍니다.
(인텐트 저장 후 버튼을 눌러주세요! 그냥 개체를 생성하러가면 저장되지않은 내용이 지워집니다)
개체의 이름을 정해줍니다.
저는 PIZZA_NAME으로 지정했습니다.
그리고 피자 종류를 여러개 추가해주세요!
Reference value와 Synonym 두가지 항목에 입력칸이 있는데
레퍼런스에는 피자종류의 기본 이름을 작성해주시면 되구요
Synonym에는 해당 피자 종류의 동의어 (동일한 의미를 가지는 단어)를 추가해주시면 됩니다.
추가할만한 동의어가 없으면 안적어도 됩니다.
모두 작성했으면 SAVE 버튼을 눌러줍니다.
다시 아까 만들던 인텐트로 이동해봅시다.
야채피자를 드래그하면 아까 만들었던 PIZZA_NAME 개체가 보입니다.
피자종류 개체를 눌러서 해당 "야채피자"가 개체라는것을 알려줍시다.
위와같이 피자 종류를 개체로 지정해줍니다.
본 블로그에서는 먼저 인텐트를 생성하면서 개체를 추가한 후 드래그하여 직접 개체로 인식시켜줬지만,
개체를 먼저 만들고 인텐트를 생성하며 문장을 입력하면 "야채피자"를 직접 인식시키지 않아도
다이얼로그 플로우가 자동으로 인식해줍니다.
트레이닝 문장은 간단하게 작성하고, 아래의 Action and parameters 를 추가해줍니다.
자동으로 우리의 개체가 추가됩니다.
좌측에 REQUIRED에 체크해주세요!
초록색으로 표시한 VALUE는 변수와 같습니다.
사용자가 입력한 문장에 올바른 개체가 있을 경우 위 VALUE에 저장됩니다.
(예)
유저: 치즈피자 주문
$PIZZA_NAME = 치즈피자
필수란에 체크를 하게 되면 사용자가 챗봇과 대화 할 때 피자종류, 숫자(갯수)를 무조건 입력받습니다.
입력은 사용자가 하는데 어떻게 입력받을까요?
우측에 있는 PROMPTS 질문을 다시 하며 사용자에게 필수 개체 데이터를 요구합니다.
PROMPTS를 추가해줍니다.
이런식으로 필수 개체값을 받기 위해 질문할 문장을 적어줍니다.
REQUIRED에 체크가 되어있지 않으면 해당 개체가 없어도 대화는 쭉 진행됩니다.
REQUIRED에 체크되어있으면 해당 개체를 받을 때 까지
PROMPTS에 추가한 질문을 계속 합니다.
이제 마지막으로 Responses 입니다.
유저와 대회를 나누고 결과를 유저에게 전달하는 부분이죠
응답 메시지도 여러개 추가할 수 있습니다.
여러개의 메시지가 있다면 랜덤으로 유저에게 전달됩니다!
파란 네모로 표시한 부분을 확인해보시면 $PIZZA_NAME과 $number 부분이 보입니다.
응답에서 개체를 담고있던 VALUE 이름을 사용할 수 있습니다!
VALUE 이름은 실제로 사용자에게 전달 될 시 저장된 데이터로 치환됩니다.
예)
$PIZZA_NAME = 치즈피자
$number = 4
결과: 네, 치즈피자로 4판 주문하겠습니다!
기본적인 부분은 모두 마쳤습니다!
이제 챗봇과 대화를 해봅시다!
우측 상단에 Try it now 부분에 원하는 메시지를 입력해보세요!
저는 피자를 주문해보겠습니다.
아까 학습시켰던 문장과 동일하지 않은 문장임에도 챗봇이 무슨 의도인지 알아냈습니다.
우리가 만들었던 인텐트(의도)가 피자 주문을 받도록 데이터를 학습시켰기 때문에 우리가 만든 인텐트가 사용된 모습입니다.
하지만 우리의 인텐트는 필수 개체값으로 피자 종류와 갯수를 입력받도록 구현되어있기 때문에
PROMPTS에 추가한 질문이 출력됩니다.
치즈피자로 해달라고 챗봇에게 요구하자
아래 ACTION 부분에 있는 PIZZA_NAME의 VALUE가 치즈피자로 정확하게 들어갔습니다.
PIZZA_NAME 개체(엔티티)에 추가된 다른 피자 종류로 문장을 보내도 바로 인식합니다.
만약 모르는 피자 종류일 경우 피자 종류를 다시 물어봅니다.
PIZZA_NAME에 데이터가 들어갔습니다.
이제 마지막으로 피자를 몇 판 주문할지 채팅해봅시다.
5판 주문한다고 챗봇에게 전달하니
number 값에 5가 들어가고
RESPONSE의 응답 메시지가 정상적으로 출력되었습니다!
이처럼 간단한 문장을 학습시기고 원하는 개체를 추가만 한다면 다이얼로그 플로우에서 자연어를 처리하고 분석하여
결과를 전달해줍니다.
위와같이 피자 종류와 갯수를 한꺼번에 입력해도 정확하게 인식합니다.
이번 포스팅에서는 간단한 주문 챗봇을 만들어보았습니다.
이렇게 만든 챗봇을 페이스북 메신저, 텔레그램 등 다양한 플랫폼에 연동할 수 있습니다.
또한 서버에서도 연동이 가능하기 때문에 카카오톡 챗봇 등에서도 쉽게 사용할 수 있습니다!
감사합니다.