Dialogflow의 동작 시나리오
- 사용자가 입력 장치에 말을 한다.
- 사용자 질문이 Dialogflow 엔진으로 입력된다.
- Dialogflow가 인텐트를 인식한다.
- 인텐트에 적합한 동작이 수행되고, 필요한 정보가 데이터베이스로부터 리턴된다.
- 인텐트에 대한 응답이 구성된다.
- 응답이 실행 가능한 정보로 변경된다.
- 사용자가 요청한 정보가 출력 장치로 전달된다.
음식 주문 챗봇 구축하기
챗봇의 이름은 OnlineEats, 기능은 음식 주문 기능에 초점을 맞춰 구현한다.
구현 범위 결정하기
- 사용자를 역동적으로 맍이할 수 있어야 한다.
- 사용자가 요청한 메뉴와 수량을 이해할 수 있어야 한다.
- 사용자를 대신하여 주문을 할 수 있어야 한다.
- 주문 상태를 사용자에게 제공할 수 있어야 한다.
인텐트 목록
- 초기시작 인텐트 : 사용자가 챗봇에 메시지를 보낼 때
- 주문하기 인텐트 : 사용자가 음식 주문을 챗봇에 요청할 때
- 품목명세 인텐트 : 사용자가 원하는 품목과 수량을 말할 때
- 주문처리 상태 : 사용자가 주문처리 상태를 알고 싶어 할 때
- Order_ID : 챗봇은 주문을 추적하기 위해 주문 ID를 이해할 필요가 있다.
- 감사 표현 : 사용자가 챗봇에게 감사의 표현을 할 때
엔티티 목록
- food_items : 사용자가 주문하고자 하는 음식은?
- quantities : 사용자가 주문하고자 하는 음식의 수량은 얼마인가?
- order_id : 사용자가 주문한 음식의 주문 ID
예상 스크립트
User : Hello
OnlineEats : Hello and Welcome! How may I help you?
User : I am looking to order Chinese food.
OnlineEats : Sure, what would you like to order today?
User : One chicken dumpling and two spring rolls.
OnlineEats : Done. Your final amount is XYZ, and your order is placed for 1 Chicken dumpling and 2 spring rolls.
User : I haven't received my order yet. Where is my food?
OnlineEats : Can you please help me with your order ID?
User : 123456
OnlineEats : Order Status for Order ID: 123456. The delivery guy is in your locality. Your food will arrive in about 5 minutes.
User : Thanks.
OnlineEats : Thanks a lot for you cooperation.
Dialogflow 시작
- 계정 생성 및 로그인
- 에이전트 생성
- 인텐트 생성
- 기본 대체 인텐트(Default fallback intent) : 사용자가 입력한 대화가 앞으로 생성될 어느 인텐트와도 일치하지 않는 경우에 활성화되거나. 내장된 small talk에 의해 사용된다. 새로운 에이전트를 만들 때 자동으로 생성되며, 원하는 경우 수정 및 삭제할 수 있다.
- 기본 시작 인텐트(Default welcome intent) : 나만의 챗봇을 위한 시작 인텐트 확장이 가능하다.
아래 화면에서 Default Welcom Intent를 클릭하여 기본 시작 인텐트에 어터런스를 추가할 수 있다.
training pharases에 원하는 표현을 입력해 추가할 수 있다.
인텐트를 생성할 때 기억해야 할 점
- Dialogflow의 모든 인텐트는 기본 응답 값을 갖고 있다. 기본 응답이란 인텐트가 인식될 때마다 챗봇이 사용자에게 응답하는 값을 의미한다.
- 응답을 추가하거나 존재하는 응답을 삭제할 수 있는데, 한 개 이상의 응답을 갖는 것이 챗봇을 좀 더 현실적으로 보이게 만들 수 있다.
- Dialogflow의 인텐트는 또한 대화가 종료되는 것을 표시할 수 있는 기능을 갖고 있다. 즉, 챗봇이 사용자가 더 이상 대화에 참여하지 않을 것임을 추측할 수 있게 할 수 있고, 챗봇은 추측한 정보를 바탕으로 대화를 종료하기 위해 필요한 조치를 할 수 있게 된다.
인텐트를 생성하고 어터런스 추가하기
place_order_intent라는 주문 인텐트 생성하고 아래와 같은 학습 문구를 입력한다.
I want food.
I want to order food asap.
Can you please take my order for food?
Take my order please.
I want to place an order for Chinese food.
I want to place an order.
Would you please help me to order food?
Can you please order food for me?
I want to order food.
I am looking to order Thai food.
I am looking to order Chinese food.
인텐트에 기본 응답 추가하기
place_order_intent라고 인식되면 사용자에게 반환되는 응답들을 추가한다.
Sure, What would you like to order today?
Definitely, What would you like to have today?
Certainly, I'll try to help you with that. What are you feeling like eating today?
다음은 사용자가 원하는 음식을 입력하는 것을 기다린 후 해당 문장을 분석하는 것이다. 따라서 무엇을 주문할 것인지를 알려주는 items_description 인텐트를 생성한다. 그 후에 일반적인 사용자 표현을 추가한다.
One chicken dumpling and two spring rolls.
우리가 다루고 있는 모든 데이터들이 어떠한 프로그램 언어에서도 사용이 가능하도록 가독성이 높은 포맷으로 파싱될 수 있어야 한다. Dilalogflow는 기본적으로 JSON 포맷으로 데이터를 반환한다.
품목 명세 인텐트와 소속 엔티티 생성하기
One, two를 선택하고, 각각의 값을 데이터 타입의 한 종류인 @sys.number로 정의할 수 있다. 음식의 품목을 식별하기 위한 food_items_entity라는 새로운 엔티티를 생성하고, 단어를 선택해서 각 파라미터의 이름을 food_items_entity1과 food_items_entity2로 명명한다.
이러한 것들은 인텐트가 활성화되면 보게 될 JSON 응답을 이해하는 데 도움이 되므로, 챗봇 구축을 진전시키기 위해 위와 같은 값들을 정의할 필요가 있다.
이제 Training Phrases에 계속해서 사용자 표현을 추가하고 엔티티를 선택한다.
One chicken dumpling and two spring rolls.
I would like to have 1 biryani and two mango lassi.
1 Butter Chicken and 14 naans.
I just need an egg chowmein.
I need two falafel and one Fttoush.
one butter chicken and four chapatis.
one chicken wrap and three veg wraps.
Three noodles and 1 veg soup.
1 spring roll and 1 swarama.
Please give me 3 veg wraps and 3 soft drinks.
I want one falafel sandwich and one soft drink.
1 Butter Chicken and 4 naans.
Give me one falafel and one virgin mojito.
Get me one milkshake and a chickenwrap.
위와 같이 사용자 표현을 추가하고 각각 엔티티를 선택한 후에 저장을 하고, One chicken dumpling and two spring rolls.라는 문장을 입력하면 JSON 응답을 확인할 수 있다.
{
"responseId": "응답ID",
"queryResult": {
"queryText": "One chicken dumpling and two spring rolls.",
"parameters": {
"food_items_entity1": "chicken dumpling",
"quantity2": 2,
"food_items_entity2": "spring rolls",
"quantity1": 1
},
"allRequiredParamsPresent": true,
"fulfillmentMessages": [
{
"text": {
"text": [
""
]
}
}
],
"outputContexts": [
{
"name": "projects/newagent-cqux/agent/sessions/b1acccdd-3c1a-b875-7684-9ed88274b0f6/contexts/__system_counters__",
"lifespanCount": 1,
"parameters": {
"food_items_entity2.original": "spring rolls",
"quantity2.original": "two",
"quantity1": 1,
"quantity2": 2,
"no-input": 0,
"food_items_entity1.original": "chicken dumpling",
"food_items_entity1": "chicken dumpling",
"food_items_entity2": "spring rolls",
"quantity1.original": "One",
"no-match": 0
}
}
],
"intent": {
"name": "projects/newagent-cqux/agent/intents/69438dfd-ce6a-464e-a289-1c17621b75c0",
"displayName": "items_description"
},
"intentDetectionConfidence": 1,
"languageCode": "en",
"sentimentAnalysisResult": {
"queryTextSentiment": {}
}
}
}
순서는 이상하지만 잘 인식한 것을 확인할 수 있다.
대화를 이해하고 사용자에게 응답하기
이제 챗봇은 사용자의 대화에서 주문 및 주문과 관련된 부가적인 정보들을 이해하고 응답해야 한다. 부가정보란 주문 ID, 주문 금액, 주문 수량, 예상 배송 시간 등이 될 수 있다.
먼저 Dialogflow에서 구현 중인 인텐트의 기본 응답 기능을 이용하여 주문 금액을 추가한다. 주문 금액은 품목, 수량 그리고 어디서 주문하는지에 따라 달라지는데, 일단은 코드 내에 해당 금액을 harcode한다.
items_description 인텐트의 텍스트 응답 필드에 입력하면 된다. 이때 $parameter_name 포맷을 사용하면 파라미터 테이블에 존재하는 값을 참조할 수 있다.
Done. Your final amount is XYZ and your order is placed for $quantity1 $food_items_entity1 and $quantity2 $food_items_entity2
주문 처리 상태 인텐트
사용자가 주문 처리 상태를 요청할 경우를 대비하여, order_status 인텐트를 생성하고, 학습 문구를 추가한다.
where is my order?
I haven't received my order yet
Hello, when will I receive my food order?
where is my food?
Can you please tell me where is my food?
What is the status of my food order?
Can you please help me know my food order status?
Tell me where is my food?
"Haven't received my food yet"을 입력하니 챗봇은 order_status 인텐트임을 인식했다.
User_Order_ID 인텐트
다음은 사용자에게 주문 ID를 요청하는 것이다. 인텐트의 기본 응답에는 "Can you please help me with your order ID?"를 기본 응답에 설정될 것이다.
질문을 받은 사용자는 본인의 주문 ID를 입력할 것이고, 챗봇은 그것을 식별하고 다시 응답을 제공해야 한다. 따라서 사용자가 주문 ID 관련한 대화를 진행할 때 그것을 식별할 수 있는 새로운 인텐트 생성이 필요하다.
주문 ID와 전화번호가 모두 정수일 수도 있다는 점도 유의해야 한다. 이 경우 order_id 혹은 주민등록번호의 자릿수와 같은 몇 가지 검증을 해야한다.
주문 ID 인텐트 user_order_id를 만들고 학습 문구를 추가한다.
Haven't received my food yet.
order id 453455
Order ID: 545454
Sure, my order ID is 394820
Why not order id 001212
yes, order number 001901
785647
662286
테스트를 진행해 보니 잘 인식한 것을 알 수 있었다.
parameter name을 order_id로 바꾸고 기본 응답을 설정한다.
Order Status for Order ID: $order_id. The delivery guy is in your locality, your food will arrive in about 5 minutes.
User_Thanks 인텐트
사용자가 챗봇의 응답에 여러 가지 다양한 문장으로 감사를 표현할 때를 위한 user_thanks 인텐트를 생성하고 학습 문구를 추가한다.
Thank you
Thanks a lot
Thank you so much
ok thank you
well thank you
thank a ton
ok waiting thank you
이제 기본 응답 기능을 이용하여 사용자에게 감사 인사를 하고, 이것이 대화의 마지막임을 인텐트에게 알려준다.
Thanks a lot for your cooperation.
대화의 마지막임을 설정하는 버튼은 기본 응답 설정 아래에서 설정할 수 있다.