티스토리 뷰

반응형

지난번 Part4에 이어서 샌드위치 주문하기를 시작합니다. Alarm Bot 예제는 LUIS 때문에 난이도가 갑자기 높아져서 차후에 다루도록 하겠습니다.

 

Part1 : Bot Framework 시작하기

Part2 : Azure에 배포하고, Bot Framework에 등록하기

Part3 : Facebook 메신저와 연동하기

Part4 : 다이얼로그 처리

Part5 : 카키 샌드위치 주문하기

Part6 : 향상된 카키 샌드위치 주문하기

 

1. FormFlow

http://docs.botframework.com/sdkreference/csharp/forms.html

 

 

2. FormFlow

 

Dialogs는 매우 강력하고 유연한 기능입니다. 그러나, 샌드위치를 주문할 때 사용할 대화를 만들기 위해서는 손이 많이 갈 수 있습니다. 대화의 각 지점에서 여러 상황이 발생할 수 있기 때문입니다. 예를 들자면 이런 것 들이죠 모호성을 명확히 하거나, 도움말을 제공하거나 뒤로가기 혹은 진행 상태를 표시하는 것을 이야기 합니다. 하지만, 주문에서 사용하는 간단한 안내 대화를 하기 위해서 Bot Framework은 FormFlow라는 강력한 대화 블럭을 제공합니다.

FormFlow는 Dialogs에서 제공하는 유연성의 일부를 희생하지만, 훨씬 적은 노력을 필요로 합니다. 그래서, FormFlow로 생성된 대화 상자와 LuisDialog를 조합해서 더 좋은 결과를 만들어 낼 수 있습니다. FormFlow 대화 상자는 사용자에게 도움과 지침을 제공하면서 양식 작성을 안내 합니다.

 

이런 내용을 가장 쉽게 이해하는 방법은 샌드위치 샘플 봇을 살펴보는 것입니다. 이 샘플은 C# 클래스, 필드 및 속성을 사용하여 원하는 형태를 정의해서 사용합니다. 이는 도움말, 설명, 상태 및 탐색을 지원하는 대화를 유도 할 수도 있습니다.

 

 

3. Forms and Fields

 

FormFlow는 사용자와의 대화를 통해 입력되는 필드들의 컬렉션을 구성하는 것으로 시작합니다. 이러한 형태를 설명하기 위한 간단한 방법은 C# 클래스를 통해서이며, 클래스 내에서 "field"는 public field 혹은 다음에서 이야기하는 property 중 하나를 사용합니다.

 

1) Integral - sbyte, byte, short, ushort, int, unit, long, ulong

2) Floating point – float, double

3) String

4) DateTime

5) Enum

6) List of enum

 

그 뒤에도 몇가지 설명이 있는데..일단 소스를 보겠습니다.

 

4. KakiSandwichOrder.cs

주문용 Form을 만듭니다.

using System;
using System.Collections.Generic;
using Microsoft.Bot.Builder.FormFlow;

namespace kakiBot
{
    public enum KakiMenuOptions
    {
        Menu15cm, Menu30cm, 찹샐러드
    }
    public enum KakiBreadOptions
    {
        화이트, 하티_이탈리안, 위트, 파마산_오레가노, 허니오트, 플랫_브래드
    }
    public enum KakiAdditionOptions
    {
        베이컨, 더블미트, 계란, 더블치즈, 아보카도
    }
    public enum KakiVegetableOptions
    {
        양상추, 토마토, 오이, 피망, 양파, 피클, 올리브, 할라피뇨
    }
    public enum KakiSourceOptions
    {
        랜치드레싱, 마요네즈, 스위트_어니언, 허니_머스터드, 스위트_칠리, 바베큐, 핫_칠리, 사우스웨스트,
        머스타드, 디종_홀스_래디쉬, 사우전_아일랜드, 이탈리안_드레싱, 마리나라소스, 레드와인_식초,
        올리브_오일, 소금, 후추
    }
    public enum KakiSetOptions
    {
        탄산음료, 칩스, 쿠키
    }

    [Serializable]
    public class KakiSandwichOrder
    {
        /// <summary>
        /// 기본 메뉴
        /// </summary>
        public KakiMenuOptions? Menu;
        /// <summary>
        /// 빵 선택
        /// </summary>
        public KakiBreadOptions? Bread;
        /// <summary>
        /// 추가 선택
        /// </summary>
        public KakiAdditionOptions? Addition;
        /// <summary>
        /// 야채 선택
        /// </summary>
        public List<KakiVegetableOptions> Vegetable;
        /// <summary>
        /// 소스 선택
        /// </summary>
        public List<KakiSourceOptions> Source;
        /// <summary>
        /// 세트 선택
        /// </summary>
        public List<KakiSetOptions> Set;
        /// <summary>
        /// 주문 수량
        /// </summary>
        public int OrderCount;
        /// <summary>
        /// 빌드 폼
        /// </summary>
        /// <returns></returns>
        public static IForm<KakiSandwichOrder> BuildForm()
        {
            return new FormBuilder<KakiSandwichOrder>()
                .Message("안녕하세요 카키 샌드위치 주문 봇입니다. help 혹은 ? 를 입력하시면 도움말을 보실 수 있습니다.")
                .Build();
        }

    }
}

 

 

5. MessageController.cs 수정

 

internal static IDialog<KakiSandwichOrder> KakiMakeRootDialog()
{
    return Chain.From(() => FormDialog.FromForm(KakiSandwichOrder.BuildForm));
}

public async Task<Message> Post([FromBody]Message message)
{
    if (message.Type == "Message")
    {
        return await Conversation.SendAsync(message, KakiMakeRootDialog);
    }
    else
    {
        return HandleSystemMessage(message);
    }
}

 

 

Chain.From(() => ...) 은 대화가 시작되면 새로운 대화를 생성하는 구문입니다.

대화가 시작되면, KakiSandwichOrder가 생성되며, 다음과 같은 화면이 출력됩니다.

 

 

 

이때 메뉴를 선택할 수 있는 방법은 3가지 입니다. Menu 15 cm를 입력하거나, 1을 입력하거나, 마우스로 Menu 15 cm를 클릭할 수 있습니다.

 

그럼 cm라고 입력하면 어떻게 될까요?

 

 

 

cm이라는 글씨가 들어간 메뉴가 2개이기 때문에 다시한번 선택을 하도록 안내를 해줍니다. 정확하게 선택을 돕는 거죠. 15 cm이라고 입력하면, 다음으로 넘어갈 수 있습니다.

 

 

빵 종류에서 '위투'라고 입력을 했더네 그런 빵 종류는 없다고 하는군요. 숫자 3을 눌러서 위트를 선택하고 다음으로 넘어가지요.

 

 

마우스를 베이컨에 올리니 마우스 오버 컬러로 변경이 됩니다. 클릭하면 숫자 1이 입력되는 것을 볼 수 있습니다.

 

 

이번에는 야채를 선택하는 곳인데요..여기는 숫자가 표시되고, 박스가 보이지 않는 군요..이런 다중 선택을 하는 경우에 나오는 화면입니다. 오이와 할라피뇨를 빼고 먹기를 원한다면, 1,3,4,5,6이라고 입력하고 엔터를 치면 됩니다.

 

그 다음으로는 소스를 선택하게 되어있는데, 소스도 여러가지를 동시에 선택합니다.

 

 

세트는 약간 이상하게 나오네요..음음..콜라는 어디간건지..쿨럭..칩스와 쿠키만 나오는데..음음....

마지막은 주문 수량을 입력합니다. 2를 입력할까요?

 

 

최종 주문 내역 확인입니다~

앗 그런데 Addition을 베이컨에서 다른 것으로 바꿀려면 어떻게 할까요? Addition이라고 입력하면 다시 선택할 수 있습니다.

 

베이컨을 계란으로 변경했습니다.~

 

채팅으로 주문하기 참 쉽죠? 캬캬캬;;; 이제 기본적인 주문 방법을 알았습니다. 다음에는 좀더 고급지게 수정을 하도록 하겠습니다.

 

반응형
댓글