BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人的メモ

QnA Maker と Azure Bot Service を連携(して QnA Makerの閾値を変更)その2

ここでは、Azure Bot Service を作成し、前回作成した QnA Maker と連携してみます。

Bot Service を QnA のテンプレートで作成した際、回答の精度を示すスコアが特定の 閾値 より低い場合、回答を返さない(正確には「No good match in FAQ.」と返します)仕組みが SDK で実装されています。

その 閾値 の変更方法についても触れます。

Overview

1. QnA Maker の作成(前回)
2. QnA Maker に REST でアクセス(前回)
3. Bot Service の作成(今回)
4. QnA の回答の閾値の変更(今回)

3. Bot Service の作成

今回は、Azure Bot Service の Functions Bot で進めます。Web App Bot の方は、諸事情(現時点では、build.cmd を動かすためのNodeのファイルが空で動かない...ですよね?) により動かないと思ってます。

ということで、 Azure Portal(https://portal.azure.com/) から 新規 > AI + Cognitive Services > すべて表示 を開きます(検索で「Functions Bot」って入力すれば一発で手出来ますが...)。

f:id:beachside:20180123033241p:plain


Functions Bot をクリックします。

f:id:beachside:20180123033251p:plain


で、作成 をクリックします。

f:id:beachside:20180123033300p:plain


入力項目を埋めていきます。ボット名やリソースグループ名、場所は適当(自分なりに適切)に入れましょう(場所、私はだいたい West US 2を使ってますが特に理由はありません)。

価格レベルは、F0 にしました。もちろん自己責任ですが私の場合、ちょっとやそっと使うくらいならほとんど課金がかかりません。

ボットテンプレートは、Question and Answer (C#) にします。ホスティングプランはもちろん 従量課金 、でストレージを作るのと、Application Insights は今回はどうでもいいです。

作成 をクリックすると、だいたい1-2分で作成されます。

f:id:beachside:20180123033308p:plain


できたら、そのリソースグループ(私は「func-bot-qna」としました)に移動してみましょう。種類が Functions Bot のやつをクリックします。

f:id:beachside:20180123033318p:plain


Functions Bot を開いたら、アプリケーション設定 というメニューをクリックします(下の方にあります)。で、開いたブレードの下の方に QnAKnowledgebaseIdQnASubscriptionKey の値が空になっているところが見えますね。ここに QnA Maker から取得できる値を入力します。

f:id:beachside:20180123033327p:plain


QnA Maker のポータルから値を取得

前回操作した QnA Makerのポータル(https://qnamaker.ai/)My services を開き、作ったサービス(私のは demo15 )の View Code をクリックします。

f:id:beachside:20180123033342p:plain


そして、 QnAKnowledgebaseIdQnASubscriptionKey の値を取得しましょう(どれ?って場合は、前回のパブリッシュのあたりをご覧ください)。

Azure ポータルに戻り....

取得した値を入力し、忘れず保存しましょう。

f:id:beachside:20180123033350p:plain


テスト in Web Chat

Fuction Bot のブレードで、Test in Web Chat をクリックすると、 Web Chat でテストができます。QnAで試した時と同じ回答が得れるはずです。

f:id:beachside:20180123033403p:plain


前回作成した QnA Maker と同じものを作っているのであれば、一例として、「EA契約を買いたい」と入力してみましょう。QnA Maker のポータルでは回答が得れるのに、Azure Bot Service では回答が得れず、「No good match in FAQ.」となってしまいます。

これは、テンプレートで作成されたプログラムが、閾値0.5(0~1のうちの0.5 = 50点/100点満点中)以下の場合に「No good match in FAQ.」と返すようにしているからです。

4. QnA の回答の閾値の変更

この閾値を変更する方法です。Azure ポータルで、先ほど作成したリソースグループ(私の場合「func-bot-qna」というリソースグループ)のブレードに戻りましょう。

ここで、Function App のリソースをクリックします。

f:id:beachside:20180123033412p:plain


Function App のブレードが開いたら、プラットフォーム機能 > App Service エディター を開きましょう。

f:id:beachside:20180123033422p:plain


EXPLORE で、 WWWROOT > messages の中に BasicQnAMakerDialog.csx というファイルがあります。開きましょう。 この56行目を右の方にスクロールすると、閾値として設定されている値が表示されます。この値を適当に設定することで対応ができます。

f:id:beachside:20180123033444p:plain


前回POSTMANで確認をすることでスコアをみることができるのを紹介しましたが、「EAを買いたい」という質問のスコアは17点くらい( = 0.17....)です。つまりは 0.1くらいに設定すれば表示されるわけですなと。

この値を0.1にしてみましょう。エディタの機能で自動で保存されます(画面右上の方の表示が「SAVED」になると保存完了です)。

ちなみに、ここらへんで使われている QnAMakerServiceBasicQnAMakerDialog の実装は、GitHub で確認できますのでいいですね♪

GitHub - Microsoft/BotBuilder-CognitiveServices: The Microsoft Cognitive Services controls for Microsoft Bot Builder

テスト in Web Chat 再び

試してみましょう。

f:id:beachside:20180123033504p:plain


無事に表示されました。と言っても、閾値を下げれば精度もさがるので、バランスをとってよい チャットボットを作れるよう調整が必要ですね。

終わりに

QnA Maker & Bot Service はある程度ノンコーディングでやれますので、最初の一歩としてはとっつきやすい方ではないでしょうか。

Cannel との連携について、簡単な内容ですが書いてみました。

beachside.hatenablog.com

念のため書いておきますが、もう使わない場合、リソースグループを消してリソースをすっきりさせましょう♪