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")]
    public async Task Greeting(IDialogContext context, LuisResult result)
    {
        string message = "greeting";

        await context.PostAsync(message);

        context.Wait(this.MessageReceived);
    }

    [LuisIntent("")]
    [LuisIntent("None")]
    public async Task None(IDialogContext context, LuisResult result)
    {
        string message = "わからない";

        await context.PostAsync(message);

        context.Wait(this.MessageReceived);
    }

}

あとはRootDialogからよんでやります。

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

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
    {
        var activity = await result as Activity;
        
        await context.Forward(new IntelligenceLuisDialog(),ResumeAfterOptionDialog,activity, CancellationToken.None);
    }

    private async Task ResumeAfterOptionDialog(IDialogContext context, IAwaitable<object> result)
    {
        try
        {
            var message = await result;
        }
        catch (Exception ex)
        {
            await context.PostAsync($"Failed with message: {ex.Message}");
        }
        finally
        {
            context.Wait(this.MessageReceivedAsync);
        }
    }
}

これでこんな感じでLUISとつなげることができます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください