BotFrameworkにLUISを組み込んで自然言語を認識させる

対話ができるシステムを作るうえで、「コーヒーを注文する」というタスクに対し、「コーヒーをください」という発話は認識するが「コーヒーをちょうだい」という言葉は認識できないような対話システムはあまり賢いとは言えません。 そのようなユーザーの発話のブレに対応するために、BotFrameworkではLUISというサービスを利用して機械学習を用いた自然言語認識をすることができます。 今回はLUISを用いて自然言語を認識するBOTを作りましょう。 LUISのモデルを作成する https://www.luis.aiのアカウントを作成します。 NewAppから新しくモデルを作成します。 Intentをいくつかつくります。 このIntentとは認識してほしいカテゴリごとに作成します。 今回は発話をNoneとgreetingとpredictの3つに分類することにします。 各Intentには発話候補を書いておきます。 これらの発話に近い発話が来るとそのカテゴリに分類されます。 IntentができたらTrain&TestからLUISを学習させます。この画面でテストをすることもできます。 学習がうまくいったらPublishしましょう。キーは必要に応じて作ってください   BOTを作成する 今回はVisualStudioを用いてC#でBotを作成します。 まずこのリンクからBotのテンプレートをダウンロードします。 VisualStudioのテンプレートのディレクトリに配置し、新規作成からBotのプロジェクトを作成します。 デフォルトではMessagesControllerのPostメソッドからRootDialogが呼ばれていると思います。 なのでRootDialogからLUISを呼び出すDialogを作りましょう。 Dialogフォルダの中にLuisDialogを継承するクラスをつくります。 このクラス内には作成したIntentごとにメソッドを作り、属性を加えます。 クラスに紐づけているLuisModel属性にはLuisのAppIdとLuis のEndpointKey(上記publish時に設定したキー)を貼り付けます。 [LuisModel(“Luis App Id”, “Luis Endpoint Key”)] [Serializable] public class IntelligenceLuisDialog : LuisDialog<object> { [LuisIntent(“predict”)] public async Task Predict(IDialogContext context, LuisResult result) { string message = “predict”; await context.PostAsync(message); context.Wait(this.MessageReceived); } [LuisIntent(“greeting”)]…

MicrosoftBotFramework v1とv3の罠

結論 使用していたクラスはv1時代のものでv3では非推奨となっている(使えるけど) v1時代はSkypeのグループ会話に対応していなかった v1時代のクラスでBotを開発していたのでSkypeグループでのMentionに反応できなかった v3のクラスに置き換えましょう 事の発端 12/18に横浜でMicrosoftBotFrameworkのハッカソンを開いたとき、参加者の方からこのような質問をいただきました。 BotFrameworkで作成したBotが、普通の1対1の会話には反応してくれるけどグループ会話に追加したときに反応してくれない   そもそもBotFrameworkはSkypeのグループチャットを有効にしたとき、「@botname こんにちは」などのMentionを飛ばすことで反応ができるはずなのに実際に動きを見せてもらったら見事に反応してませんでした。 その後ソースコードをいただき、その原因を探ってみました。 ソースコードは以下となります。(掲載許可はいただきました) var restify = require(‘restify’); var builder = require(‘botbuilder’); var port = process.env.PORT || 8080; // Create bot and add dialogs var bot = new builder.BotConnectorBot({ appId: process.env.MICROSOFT_APP_ID||”, appSecret: process.env.MICROSOFT_APP_PASSWORD||” }); var dialog = new builder.CommandDialog(); dialog.matches([“help”],function(session){ session.send(“これはゲームしよbot(仮)です。”); session.send(“現在応答する単語には Hi,hi,Hello,hello,こんにちは,シージしよ,シージして? があります。”) }) dialog.matches([“Hi”,”hi”,”hello”,”Hello”,”こんにちは”],function(session){…