티스토리 뷰

반응형

봇 프레임웍의 문서 페이지에 Dialogs라는 페이지에 대해 알아보고 전에 만들었던 kakiBot 페이지를 업데이트 해보도록 하겠습니다.

 

Part1 : Bot Framework 시작하기

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

Part3 : Facebook 메신저와 연동하기

Part4 : 다이얼로그 처리

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

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

 

 

Dialog

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

 

 

1. 개요

다이얼로그 모델은 봇과 사용자간에 가장 대표적인 인터렉션 채널 입니다. 각각의 다이얼로그 모델은 IDialog를 C#클래스에 구현해서 사용 할 수 있습니다. 또한 재사용을 극대화하기 위해 다른 다이얼로그와 함께 사용할 수도 있으며, 다이얼로그 스택을 유지 합니다. 대화 상태는 Bot Connector의 메시지 형태로 저장되어 상태를 관리하지 않는 곳에서도 사용이 가능합니다.

 

머 이래저래 이야기를 마니 해봐도 이해가 앙가기 때문에 셈플을 바로 보도록 하겠습니다.

 

 

2. Echo Bot

기본 에코 봇을 만들어 보죠..지난번 소스를 먼저 살펴 보겠습니다.

 

public async Task<Message> Post([FromBody]Message message)
{
    if (message.Type == "Message")
    {
        // fetch our state associated with a user in a conversation. If we don't have state, we get default(T)
        var counter = message.GetBotPerUserInConversationData<int>("counter");

        // create a reply message  
        Message replyMessage = message.CreateReplyMessage($"[{++counter}] {message.Text}라고 했지 말입니다");

        // save our new counter by adding it to the outgoing message
        replyMessage.SetBotPerUserInConversationData("counter", counter);

        // return our reply to the user
        return replyMessage;
    }
    else
    {
        return HandleSystemMessage(message);
    }
}

 

완전 초간단 Echo Bot소스였습니다.

여기서 대화 부분을 IDialog라는 인터페이스를 상속 받는 클래스로 만들어서 사용하도록 합니다.

일단, bot builder로 검색한 후 설치 합니다.

 

 

 

EchoDialog.cs

[Serializable]
public class EchoDialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
    }

    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<Message> argument)
    {
        var message = await argument;

        await context.PostAsync($"{message.Text}라고 했지 말입니다.{message.From.Name}");

        context.Wait(MessageReceivedAsync);
    }
}

 

MessagesController.cs

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

 

이렇게 만든 EchoDialog의 동작 방식은 아래와 같습니다.

 

1) 필요한 구성요소를 인스턴스

2) Bot Connector 메시지로 부터 다이얼로그 상태를 deserialize (다이얼로그 스택 및 상태)

3) Bot이 결정하는 동안 잠시 대기를 한 후 계속 대화

4) 대기열 메시지를 사용자에게 전송

5) 사용자에게 보낸 메시지를 포함한 데이터를 serializes

 

처음 대화가 시작할 때 Conversation.SendAsync에 전달된 대리자가 EchoDialog를 구성합니다. 이 때 대화 상태는 없고 StartAsync 메소드가 호출 됩니다. 그리고, 새 메시지가 발생하면 MessageReceivedAsync 메소드를 통해서 지속 적으로 메시지가 처리됩니다.

 

기본적으로는 Bot 템플릿과 동일한 동작을 하지만, 약간더 복잡한 방법으로 동작하나 개발자가 명시적으로 상태를 관리할 필요가 없이 복잡한 대화 상자를 구성할 수 있게 됩니다.

 

 

3. Echo Bot with State

 

이제 상태를 제어하는 몇 가지 대화 상태와 몇 가지 명령을 추가 하는 예제를 만들어 보겠습니다. 여기서는 응답 카운트를 명령에 의해서 재설정 할 것입니다.

[Serializable]
public class EchoDialog : IDialog<object>
{
    protected int count = 1;

    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
    }

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<Message> argument)
    {
        var message = await argument;
        if (message.Text == "reset" || message.Text == "재설정")
        {
            PromptDialog.Confirm(
                context,
                AfterResetAsync,
                "대화 카운트를 재설정 하시겠습니까? (yes/no)",
                "yes 혹은 no로 대답해주시기 바랍니다.",
                promptStyle: PromptStyle.None);
        }
        else
        {
            await context.PostAsync($"{message.From.Name}님의 {this.count++}번째 대화: {message.Text}라고 했지 말입니다.");
            context.Wait(MessageReceivedAsync);
        }

    }

    public async Task AfterResetAsync(IDialogContext context, IAwaitable<bool> argument)
    {
        var confirm = await argument;
        if (confirm)
        {
            count = 1;
            await context.PostAsync("카운트를 재설정했습니다.");
        }
        else
        {
            await context.PostAsync("카운트를 재설정하지 않았습니다.");
        }
        context.Wait(MessageReceivedAsync);
    }
}

 

 

대화중 reset이나 재설정이라고 입력하면, 대화 카운트를 재설정 하겠냐고 물어볼 수 있습니다. 현재는 영어로 yes/no를 입력해야만 하는데.. 음..언젠가 예/아니오가 되겠죠?

 

 

 

페이스북~

 

 

그런데 궁금한게..저만 되는 것 맞죠?

 

반응형
댓글