Azureチャットボットの回答スコアを取得する
チャットボットを作るところは、以下記事をご参照いただきたく。
QnA MakerとAzure Bot Serviceでサクッと作れます。
さて、今回ですが、Azureチャットボットの回答スコアを取得してみようと思います。
チャットボットが返してくる回答についてスコアを取得し、“自信度”みたいなものが分かったほうが、スコアによって回答の仕方をカスタマイズしたり、どう質問すれば良かったか後で分析したりしやすいかなと思います。
早速ソースをいじっていきます。カスタマイズ方法については以下記事をご参照ください。
今回は分かりやすいように、回答にそのままスコアを付けちゃいます。
QnAMakerBaseDialog.cs内にDisplayQnAResultという処理がありますので、以下のような感じに。response.First().Scoreでスコア取得しています。
private async Task<DialogTurnResult> DisplayQnAResult(
WaterfallStepContext stepContext,
CancellationToken cancellationToken)
{
var dialogOptions = GetDialogOptionsValue(stepContext);
var qnaDialogResponseOptions = dialogOptions[QnADialogResponseOptions] as
QnADialogResponseOptions;
var reply = stepContext.Context.Activity.Text;
if (reply.Equals(qnaDialogResponseOptions.CardNoMatchText,
StringComparison.OrdinalIgnoreCase))
{
await stepContext.Context.SendActivityAsync(
qnaDialogResponseOptions.CardNoMatchResponse,
cancellationToken: cancellationToken).ConfigureAwait(false);
return await stepContext.EndDialogAsync().ConfigureAwait(false);
}
// If previous QnAId is present, replace the dialog
var previousQnAId = Convert.ToInt32(dialogOptions[PreviousQnAId]);
if (previousQnAId > 0)
{
return await stepContext.ReplaceDialogAsync(QnAMakerDialogName,
dialogOptions,
cancellationToken).ConfigureAwait(false);
}
// If response is present then show that response, else default answer.
if (stepContext.Result is List<QueryResult> response && response.Count > 0)
{
await stepContext.Context.SendActivityAsync(response.First().Answer +
"\n\nスコア:" + response.First().Score,
cancellationToken: cancellationToken).ConfigureAwait(false);
}
else
{
await stepContext.Context.SendActivityAsync(qnaDialogResponseOptions.NoAnswer,
cancellationToken: cancellationToken).ConfigureAwait(false);
}
return await stepContext.EndDialogAsync().ConfigureAwait(false);
}
試します。
なるほど。なかなかいい感じにスコア取得できますね。
元々のQAは以下の内容でした。
質問文そのままで聞いた場合は、当然自信を持って(スコア:1)回答していますが、聞き方を少し変えると、ちゃんと正答できているものの、自信度は質問文そのままよりは低め(スコア:0.72…)で回答しています。
回答スコアが低い場合は回答なしとする
せっかくなので、この回答スコアを利用して、チャットボットが自信なさげに回答してきた場合は、回答が見つからなかった時と同じ振る舞いをさせようと思います。
例えば、以下のようなパターンですね。
おおよその質問に入っているであろう「できますか?」という文章に対し、チャットボットは一応頑張って回答を返してくるわけですが、スコア0.3395と、かなり自信なさげです。
自信がなくてもとりあえず何かしら回答しなきゃ!というメンタリティで仕事をされると、利用者として困る場面もあるかと思いますので、以下のようにソースをカスタマイズします。
// If response is present then show that response, else default answer.
if (stepContext.Result is List<QueryResult> response &&
response.Count > 0 &&
response.First().Score >= 0.70)
{
await stepContext.Context.SendActivityAsync(response.First().Answer +
"\n\nスコア:" + response.First().Score,
cancellationToken: cancellationToken).ConfigureAwait(false);
}
else
{
await stepContext.Context.SendActivityAsync(qnaDialogResponseOptions.NoAnswer,
cancellationToken: cancellationToken).ConfigureAwait(false);
}
触る箇所は、先ほど同様QnAMakerBaseDialog.cs内のDisplayQnAResultという処理でOKです。
今回は、0.70以上のスコアでない場合は、回答が見つからなかった方の分岐へ流します。
試します。
ちゃんと回答が見つからなかった方の分岐へ流れていますね。
もちろん、回答が絞られるような質問をすれば、しっかり答えてくれます。
しきい値(今回は0.70)をどの辺りにするのかが重要になってきそうですが、そこは運用をしながら見極めていくしかないかと。スコアを見ながら、QA集のほうをメンテしていくのもアリですね。
まとめ
今回は、Microsoft Azureのチャットボットで回答スコアから自信度をチェックする方法をご紹介しました。
似たような質問文が多いQA集をインプットにすると、どうしてもボット側も回答に迷ってしまう場面が出てきますので、スコア値を元に振る舞いを調整できるのはとても良いと思います。
ジャンル分けが明確になる場合は、ボットそのものを分けてしまってもいいかもしれません。
それでは、また次回!
平成生まれのアラサー文系ぽんこつシステムエンジニア。
エンジニアらしく技術系の記事を書いたり、全く関係ない記事を書いたり、まったりやっていきたいです。
AI(人工知能)、デジタルマーケティング、DX、Office365活用、ガジェットなどに興味があります。
コメント