ごった煮

色々な事を書いてます

Bot Frameworkでシンプルな応答ボットを作ってみる

一番簡単なBotを作ってみましょう

はじめに

ドキュメントにやたらにDialogっていう言葉が出てきたのでなんのこっちゃって思いました。

Dialog(ダイアログ) : 対話、(首脳者同士の)意見交換、会談、(建設的な)話し合い、「対話」(Weblioより)

ダイアログって

みたいなやつのこと全般さしてる新しい言葉だと思ってたら全然違った

Bot Framework的には会話をモデル化したものみたいなイメージで使われてる印象(英語わからない)

Dialogクラスを起点にしてBot自体の処理(受けたメッセージに対する応答とか)を動かしていくみたいな感じっぽいです。

 

よくわからないから手を動かしてみる

公式のオーバービューみたいなのがあったのでそこを参考に

Botを作るのには、以下のnamespaceが重要になってくるようなので、公式で出しているテンプレートに対していろいろ追加していきます。

とりあえず以下をusingに追加

using Microsoft.Bot.Builder.Dialogs;

追加すると、テンプレートのはずなのになぜか名前空間がないよって怒られます()

パッケージ足りないみたいです。なのでNuGetから以下のやつを入れます。

image

これを入れたらさっきのnamespaceは、適切に追加できるはずです。

公式が出してるテンプレートは、Connector関係のみ入ってるもののようです。

 

APIを新しく作る

まずエンドポイントを一つ生やしましょう。

単純にWebApiのコントローラを一つ追加するだけです。

今回は、EchoBotControllerを追加しました。

image

この中に肉付けしていきます。

 

応答ボットのコード

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

        public async Task MessageReceiveAsync(IDialogContext context, IAwaitable<Message> argument)
        {
            var message = await argument;
            await context.PostAsync($"あなたは「{message.Text}」といいました");
            context.Wait(MessageReceiveAsync);
        }
    }

与えられたメッセージに対して、あなたは「message」といいました とレスポンスを返すだけのシンプルなものです。

 

呼び出しのコード

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

        private Message HandleSystemMessage(Message message)
        {
            if (message.Type == "Ping")
            {
                Message reply = message.CreateReplyMessage();
                reply.Type = "Ping";
                return reply;
            }
            else if (message.Type == "DeleteUserData")
            {
                // Implement user deletion here
                // If we handle user deletion, return a real message
            }
            else if (message.Type == "BotAddedToConversation")
            {
            }
            else if (message.Type == "BotRemovedFromConversation")
            {
            }
            else if (message.Type == "UserAddedToConversation")
            {
            }
            else if (message.Type == "UserRemovedFromConversation")
            {
            }
            else if (message.Type == "EndOfConversation")
            {
            }

            return null;
        }
    }

呼び出しのコードは、テンプレートのものを流用しています。

PostでMessageを受け取ったときの処理を少し変更しています。

ConversationクラスのSendAsyncメソッドに対して受け取ったメッセージとIDialogを実装したデリゲートを渡してやるとその中のStartAsyncを呼び出してくれるみたいな動きをしてるみたいです。

恐らくこの形がDialog Modelな実装の一番基礎になる部分かと思われます。

これを実行してみると以下みたいな感じになります。

image

 

まとめ

シンプルなBotならすぐ作れますが、やっぱり今後おもしろいことをするなら機械学習と組み合わせるとか自動応答で何か物事が楽になったり楽しくなったりできるとおもしろそうですね。