#QnAMaker マネージドの Short Answer を #BotFramework Composer で利用する

この記事は Microsoft Azure Cognitive Services Advent Calendar 2020 に参加しています。

QnA Maker のバージョン 2 (予定?)、QnA Maker マネージド で登場した “ショートアンサー” 機能を Bot Framework Composer で利用してみます。

残念ながら今のところ、Bot Framework Composer 側にショートアンサーに対応した Trigger やアクションは用意されていないようです。
タイミングからして当然ですし、そもそもショートアンサーは日本語など対応していない言語があるので専用 Trigger を用意されても紛らわしいだけ。

今回は、普通に “Send an HTTP Request” を利用することにしました。
Bot Framework Composer の使い方としては新規性も何もない記事になってしまいますが、QnA Maker 連携でこういうやり方もあるよねと思いながら読んでいただければ。

この記事を書こうとしたその日の夜に、Bot Framework Composer v1.3.0 がリリースされました。
v1.3.0 についてはまだ十分触っていないので、実はもっといい方法があるかもしれません。

■ 準備:QnA Maker リソース作成とナレッジベース作成

Bot Framework Composer での作業の前に、QnA Maker 側の操作が必要。

ショートアンサーは QnA Maker マネージドの機能なので、Azure ポータルでリソースを作成する時は “マネージド” の選択が必要です。

QnA Maker ポータルでは今回のテーマは多言語対応は不要です。お好みでお好きなほうを。

それから Bot Framework Composer から呼び出すには “Publish” (発行) が必要です。
発行出来たら、

  • knowledgebaseid
  • endpointKey
  • hostname

をメモしておきます。Bot Framework Composer で使います。

他には QnA Maker リソースを作成した時のリージョンが必要になります。これは Azure ポータルで確認。


■ Bot Framework Composer で新規プロジェクト作成とプロジェクトの設定

いよいよ Bot Framework Composer での作業です。
以下では v1.3.0 を使っています。

新規プロジェクトは [Create from scratch] で作ります。
[Create from knowledge base] は QnA Maker マネージドに対応していません。

ショートアンサーは今のところ日本語未対応なので、今回はロケールを “en-us” のままにします。(Bot Framework Composer のデフォルト言語)
v1.3.0 から Bot Framework Composer 自体の UI で日本語を選択できるようになりましたが、自分が混乱しそうだったので以下では英語のままで進めました。

[Project Settings] では “qna” セクションで、先ほどメモした値を貼り付けます。

ただし v1.3.0 から登場した設定画面では、今回編集したい項目が見えません。
[Advanced Setting View (json)] をオンにして、生の JSON を編集します。

編集個所はもちろん “qna” セクション。

  • knowledgebaseid
  • endpointKey
  • hostname
  • qnaRegion

それぞれに先ほどメモした値を入れます。

他の注意点としては、”subscriptionKey” は必ず空文字列にします。
つい Azure ポータルの QnA Maker で自動的に決定された Subscription Key の値を入れたくなりますが、これをやると [Start Bot / Restart Bot] でエラーになります。


■ QnA Maker 連携するトリガーを作成

QnA Maker と連携します。

プロジェクトツリーの Design で [Add a trigger] を選択します。
Bot Framework Composer の以前のバージョンとの違いがトリガー作成のメニュー項目位置です。私は最初迷子になりました。

今回は “Unknown intent” を選択します。
“QnA intent recognized” は Short Answer に対しては現時点では使えません。アクションが V4 (GA している現在の API バージョン) を指していて URL が違うからです。
“QnA intent recognized” アクションはマネージドなナレッジベースに対しては呼び出しに失敗します。

ショートアンサーが不要であれば “Connect to QnA Knowledge base” アクションも利用可能です。
こちらは応答としては従来の QnA Maker 連携と同じ動きをします。


今回はショートアンサーが目的なので “Connect to QnA Knowledge base” アクションは使いません。

ではどうするかと言うと、”Send an HTTP request” アクションを使います。ベタなリクエストです。

プロパティは以下のように。
Url とか Body の組み立てを間違えなければ、そんなに難しくないです。

HTTP methodPOST
Url${settings.qna.hostname}/knowledgebases/${settings.qna.knowledgebaseid}/generateAnswer
Body{“question”:”${turn.activity.text}”,”answerSpanRequest”:{“enable”: true}}
Header Key 1個目Content-Type
Header Value 1個目application/json
Header Key 2個目Ocp-Apim-Subscription-Key
Header Value 2個目${settings.qna.endpointKey}
Result propertydialog.api_response
Content typeapplication/json
Response typejson

これでナレッジベースから応答が得られるので Status Code をチェックします。

If/Else Branch” アクションを配置します。
[Condition] は “dialog.api_response.statusCode == 200” にします。見てわかるレベル。

あとは Bot からユーザーに応答するだけ。

今回は少しお手軽に、ショートアンサーと詳細な回答とを順に二つ応答するようにします。
Status Code が 200 でなかった場合には、エラーだったことを教える程度の簡単なメッセージです。(エラーメッセージの内容が今回のテーマではないので)

それぞれの “Send a response” の [Language Generation] は以下の通り。

ショートアンサー用(図の左上の Send a response)- ```
Short answer :
${dialog.api_response.content.answers[0].answerSpan.text}
```
詳細な回答用(図の左下)- ```
Answer :
${dialog.api_response.content.answers[0].answer}
```
エラー発生時(図の右側、分岐で Else のほう)- Sorry, something wrong to receive answers: (${dialog.api_response.statusCode})

ナレッジベースからの応答本文のパースを間違えなければ理解できますね。
Tips としてバッククォート 3個続けると複数行の応答が作れます。Bot Framework Composer のあるあるです。

Bot Framework Emulator を使うと、2種類の回答が返ってきてるのが分かります。
おつかれさまでした!


■ (念のため)ナレッジベースからの応答本文の確認方法

ちなみに応答本文は(公式ドキュメントに書いていないので)、他の REST クライアントで一度呼び出して確認します。
例えば、Visual Studio Code の “REST Client” 拡張機能を使うとこんな感じ。


ショートアンサーは早く日本語対応と Bot Framework Composer 対応してくれると嬉しいですね。

とはいえ、個人的には期待大な機能だし、Bot Framework Composer と組み合わせるといろんな可能性がありそうです。
ぜひ触ってみてください。

コメントを残す