QnA Maker + Bot Builder SDK for C# で複数回答を返す Q&A Bot を作る

2回シリーズで、QnA Maker + Bot Builder SDK for C# で Q&A Bot を作成する手順を紹介しました。

今回はその続編として、複数回答を返す Bot を作成してみます。

Q&A に限らず、Bot からの応答は絶対一つに限られるわけではなく、スコア付きで複数の回答の候補が見つかることが多いはずです。

前回説明したシンプルな Q&A Bot では、一番スコアの高いものを自動的に返答していました。これを実現しているのが QnAMakerDialog のデフォルトの実装です。

それに対して今回は、

  • 該当しそうな回答が見つからない場合の「ごめんなさい」メッセージ
  • 2番目以降のスコアの回答
  • スコアは低いけど、こんな回答が関連しているかもというもの

を返すようにしたいと思います。


■ QnA Maker と QnAMakerDialog の復習

QnA Maker でナレッジベースを作る方法、Bot Builder SDK の QnAMakerDialog の基本的な使い方は、前の投稿を参考にしてください。

参考までに、今回のナレッジベースはこんな内容です。

2017-06-28 16-54-37


■ QnAMakerDialog の QnAMaker 属性

QnAMakerDialog を継承するクラスでは、QnAMaker 属性を付与します。

この属性は 5個の引数を指定できます。

QnAMaker 属性の最も大事な点は、QnA Service の KnowlegdebaseId (属性の 1個目の引数) と SubscriptionKey (属性の 2個目の引数) を渡すことですが、他の3個の引数は以下のような意味を持ちます。

  • 第3引数・・・回答が見つからない場合のメッセージ
  • 第4引数・・・回答の候補とするスコアの最低値、デフォルトは 0.3
  • 第5引数・・・回答の候補として何個取得するか、デフォルトは 1

例えば、以下の場合には、スコアが 0.3未満のものは回答の候補に含めません。また回答の個数は 3個までという意味です。

2017-06-28 17-26-54


■ 回答が見つからない場合

回答が見つからない場合は、QnAMaker 属性の第3引数の文字列を返します。

例えば、今回のナレッジベースではライオンについての Q&A は持っていないため、以下の回答を返します。

2017-06-28 17-14-28

■ 複数の回答を返したい場合

複数の回答を返したい場合は、QnAMakerDialog の RespondFromQnAMakerResultAsync メッセージをオーバーライドします。

2017-06-28 17-39-08

QnAMaker 属性の第4引数のスコア以上のものが、第5引数の個数までナレッジベースから取得されます。

取得した回答は resultAnswers プロパティに入っているので、各アイテムの Answer プロパティで回答文が、Score プロパティでその回答のスコアが得られます。

2017-06-28 17-13-01

■ スコアが低い回答しか得られない場合

ナレッジベースから一応回答は得られたもののスコアが低い場合には、QnAFeedbackStepAsync メソッドが呼ばれます。このメソッドをオーバーライドすることで明示的に回答を返すことができます。

念のため、IsConfidentAnswer メソッドでスコアが低いことを確認した上で(文字通り「自信のある回答かどうか」)、Answers プロパティの値を整形します。Answers の要素は QnAMakerResult であり、スコアが低いことを除いては RespondFromQnAMakerResultAsync メソッドの時と同じように処理できます。

2017-06-28 17-48-42

2017-06-28 17-13-532017-06-28 17-14-59


複数個の回答候補やスコアの低いものをどのようにユーザーに見せるかはアプリ次第ですが、今回のコードでよりユーザーにやさしい回答を返すことができます。

非常に簡単なコードですが、Q&A Bot としては一通りの応答をしてくれるようになりました。

あとは運用しながら、ナレッジベースをどうやって育てていくかがポイントになりそうです。

念のため、以下に QnAMakerDialog を継承したクラス(今回は AnimalQnADialog)のコードを載せておきます。

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Bot.Builder.CognitiveServices.QnAMaker;
using Microsoft.Bot.Builder.Dialogs;
using Microsoft.Bot.Connector;

namespace AnimalQnaBot.Dialogs
{
    [Serializable]
    [QnAMaker("63174189522d4406910a50b3fd501515", "4d723a69-e337-420f-8e30-4d3f97ac35b0",
        "別の言い方で試してください", 0.3, 3)]
    public class AnimalQnaDialog : QnAMakerDialog
    {
        protected override async Task RespondFromQnAMakerResultAsync(IDialogContext context, IMessageActivity message, QnAMakerResults result)
        {
            var bestAnswer = result.Answers.First();
            await context.PostAsync($"{bestAnswer.Answer} ({bestAnswer.Score:0.00})");

            if (result.Answers.Count > 1)
            {
                var sb = new StringBuilder();
                sb.Append("以下が答えかもしれません");

                foreach (var answer in result.Answers.Skip(1))
                    sb.Append($"\n\n{answer.Answer} ({answer.Score:0.00})");

                await context.PostAsync(sb.ToString());
            }
        }

        protected override async Task QnAFeedbackStepAsync(IDialogContext context, QnAMakerResults result)
        {
            if (!IsConfidentAnswer(result))
            {
                var sb = new StringBuilder();
                sb.Append("自信がありませんが、以下が関連しているかもしれません");

                foreach (var answer in result.Answers)
                    sb.Append($"\n\n{answer.Answer} ({answer.Score:0.00})");

                await context.PostAsync(sb.ToString());
            }
        }
    }
}
広告
カテゴリー: Bot Framework, Cogbot, Cognitive Services タグ: , , パーマリンク

QnA Maker + Bot Builder SDK for C# で複数回答を返す Q&A Bot を作る への1件のフィードバック

  1. ピンバック: 「C# で QnA Bot」資料を公開しました (第8回 Cogbot 勉強会 / 2017年8月30日開催) | 技術との戯れ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中