Help us understand the problem. What is going on with this article?

QnA Maker Deep Dive (といいつつ実際は公式ドキュメントのサマリ)

この記事では Microsoft が提供する QnA Maker サービスの動作について詳細を見ていきます。

QnA Maker とは

QnA Maker はユーザーの質問に対して回答を返す QA サービスを簡単に作成できるサービスです。
裏では Azure の複数のサービスを高度に組み合わせることで、より精度の高い回答が出せるようになっています。
まずは組み合わせで使っている Azure サービスを見ていきます。

QnA Maker 本体

QnA Maker 本体は以下の機能を提供します。

  • ナレッジベースの作成: 自動で情報を解析することも手動で作成することもできます
  • ナレッジベースの管理: 作成されたナレッジベースの編集をはじめ、タグの追加や類似の質問の仕方など、コンテンツを強化することができます
  • Azure Search との連携: 実際の検索は Azure Search を利用しますが、クエリと結果の最適化を行います (詳細は後述)
  • セキュリティの管理: 公開された API の管理が行えます
  • ボット連携: Microsoft BotFramework と連携して、ボットをノーコードで公開できます

Azure Search

ナレッジベースの検索は Azure Search をサーチエンジンとして利用します。Azure Search は自然言語解析をはじめ多くの AI 機能を提供するインテリジェントサーチサービスであり、単体でも頻繁に利用されるサービスですが、QnA Maker を使った場合は自動的にインデックスの作成や管理がされるため、ユーザーが意識する必要はありません。

Azure App Service

QnA Maker を公開する際、Azure App Service の機能を使って Web API として公開します。スケールやセキュリティなど数多くのエンタープライズ機能が使えますが、API 自体は QnA Maker が用意するためコードを書く必要はありません。

Application Insights

QnA Maker の利用状況などを分析するため、Application Insights が利用されます。

Bot Framework

QnA Maker を公開する際、API としてだけではなく、ボットとして公開することもできます。この際、Bot Framework が使われます。これにより複数のチャネルに QA を公開することが可能になっています。

質問から回答までの処理の流れ

実際にユーザーが QnA Maker に質問をした場合は、以下のような処理となります。
以下公式ドキュメントから一部抜粋

  1. クライアントアプリケーションがユーザークエリを QnA Maker が提供する GenerateAnswer API に送信します。
  2. QnA Maker が言語検出、スペルチェックプログラム、およびワードブレーカーを使用してユーザークエリを前処理します。※この前処理は、ユーザー クエリを変更して最適な検索結果を得るために行われます。
  3. 変更されたクエリが Azure Search インデックスに送信され、top パラメーターで指定した数の結果を受け取ります。 正しい回答がこれらの結果にない場合、top の値をわずかに増やします。 一般的に top の値として 10 を使用すれば、90% のクエリに対応できます。
  4. QnA Maker は高度な特徴抽出を適用して、ユーザークエリに対して取得された Azure Search の結果の正確性を判別します。
  5. トレーニング済みのランカーモデルにより、手順 4 からの特徴スコアを使用して、Azure Search の結果にランクが付けられます。
  6. 新しい結果が、ランク順にクライアントアプリケーションに返されます。

信頼度のスコア

上記の通り、QnA Maker では Azure Search からの結果がどの程度信頼できるかスコアリングします。スコアは 0 から 100 の間です。

  • 90 - 100 : ユーザー クエリと KB の質問がほぼ完全に一致
  • 70 以上 :高信頼度 - 通常、ユーザーのクエリに対する完全な答えとなる良い回答
  • 50 - 70 : 中程度の信頼度 - 通常、ユーザー クエリの主な意図に答えるかなり良い回答
  • 30 - 50 : 低信頼度 - 通常、ユーザーの意図の一部に答える回答
  • 30以下:非常に低い信頼度 - 通常ユーザーのクエリに答えていないが、一部、一致する単語や語句がある回答
  • 0 : 一致なし

このスコアに対して開発者は閾値を変えることができます。閾値を変える場合、以下の 2 つを考慮します。

Accuracy
回答の精度または正確さが重要な場合は、しきい値を大きくします。信頼度の高いケースが多くなる一方で最終的に回答を得られない質問が多くなる可能性があります。

Coverage
ユーザーの質問に対して部分的な関係しかなくても、できるだけ多くの質問に答えるようにしたい場合は、しきい値を小さくします。 このことは、ユーザーの実際のクエリに対する答えにはなっていないものの、他の多少関係のある回答が得られるケースが増える可能性があることを意味します。

ナレッジベースで似たような質問が複数ナレッジにある場合、回答のスコアが近くなる場合があるため、それぞれのナレッジに対して明確で異なる質問文に変更したり、メタデータを活用することを検討が必要となります。

QnA Maker の作成

ここでは Surface Go のヘルプページを QnA Maker で QA 化してみます。

リソースの作成

まずは QnA Maker 使えるように Azure のリソースを作成します。上記で説明したリソースがここで一気に作成されます。また開発環境として一番コストがかからない設定をしていきます。

1. Azure ポータル より「リソースの作成」をクリック。
image.png

2.「QnA Maker」で検索し、「作成」をクリック。
image.png

3. 任意の名前を付け、価格レベルを選択して作成。ここで指定するサービスは以下の 3 つ。

  • 価格レベル: QnA Maker 自体の価格
  • 検索価格レベル: QnA Maker がバックエンドとして利用する Azure Search の価格
  • Web サイト: QnA Maker のサービスをホストする App Service。S1 プランが設定されるので後で変更


4. 作業が完了すると、以下のようにリソースが作成される。
image.png

5. 最後に App Service プランを開き、「スケールアップ」をクリック。「開発/テスト」から「F1」を選択。
image.png

QnA Maker 本体の作成

次に QnA Maker の本体を作っていきます。

1. QnA Maker にアクセスして「Create a knowledge base」をクリック。サインインを求められたら Azure サブスクリプションと同じ ID でサインイン。
image.png

2. STEP 1 のリソース作成はすでに行ったため、STEP 2 で作成したリソースを指定。
image.png

3. STEP 3 で任意の名前を指定。
image.png

4. STEP 4 で FAQ がある URL やドキュメントを指定。また QA の精度を上げるため、「Enable multi-turn...」にチェックを入れる。マルチターンについての詳細は後述。尚、雑談機能も入れたい場合は Chit-chat で指定できるが英語となるため、ここでは None のまま。
image.png

5. STEP 5 で 「Create your KB」をクリック。
image.png

6. 解析が完了するまでしばし待機。
image.png

7. 解析が完了したら、以下のようにナレッジベースができていることを確認。
image.png

ナレッジベース

ナレッジベースは質問と回答からなるデータで、1つのナレッジは以下の構成となっています。

質問リスト
ユーザーの質問は自然言語解析によりある程度の違いは自動的に吸収されますが、より多くの例があると精度が高くなるため、1 つのナレッジに対して複数の聞き方を登録することができます。

回答
1 つのナレッジにつき、回答は 1 つです。

メタデータ
ナレッジのデータをフィルタできるよう、キーと値のペア (キー:値 の形式) を複数登録できます。

早速手動でナレッジを追加してみましょう。

1.「Add QnA pair」をクリックして質問を追加。
image.png

2.「Add alternative phrasing」をクリックして別の聞き方を追加。
image.png

3.「View options」より「Show metadata」をクリック。
image.png

4. 必要に応じてメタデータを入力。
image.png

既定の回答

QnA Maker がナレッジベースより回答を見つけられない場合、既定の回答を返します。既定の回答は以下の手順で変更可能です。

1. QnA Maker と同時に作成さえた App Services を開く。
image.png

2.「構成」をクリックして「DefaultAnswer」の値を編集をクリック。
image.png

3. 任意の文言に変更して「OK」クリック。
image.png

4. 画面上部の「保存」をクリック。その後 App Service を概要メニューから再起動。
image.png

マルチターン機能

質問または回答の内容が複雑である場合、一問一答形式では対応がしきれない場合があります。マルチターン機能は、ナレッジに対してフォローアッププロンプトをユーザーに返すことで、より精度の高い回答を提供する仕組みです。

以下の例では、「画面にひびが入った」という問いあわせに対して、すべての選択肢を一度に返すのではなく、ユーザーに次に知りたいことを選択させています。
image.png

マルチターンの自動解析

実際のページからどのようにマルチターンを解析しているか見てみましょう。

ナレッジベース作成で指定した URL では以下のリンクが見つかります。
image.png

リンクをクリックすると、詳細なページが表示されます。
image.png

この中でオプションがいくつか提示されています。
image.png

QnA で解析されたナレッジベースを見てみると、これに対応した形式でマルチターンが作成されています。
image.png

マルチターンの手動入力

マルチターンも手動で設定が可能です。先ほど手動で追加したナレッジにマルチターンを追加してみましょう。

1.「Add follow-up prompt」をクリック。
image.png

2. 選択肢として表示される文字を入力。回答の候補が自動で提案される。
image.png

3. ここでは自分で回答を作るため、以下のように入力して、「Save」をクリック。Context-only にチェックを入れた場合は、マルチターン内でしかそのナレッジは使われなくなる。
image.png

4. フォローアッププロンプトも新しいナレッジとして登録されることを確認。
image.png

5. 同様に他のフォローアッププロンプトも追加して、「Save and train」をクリック。
image.png

6. 完了するまでしばし待つ。
image.png

サポートされるデータソース

QnA Maker で自動でナレッジを解析できるデータソースは以下の通りです。サンプルも含めてより詳細な情報が公式ドキュメント:QnA Maker コンテンツのデータ ソース にあります。

  • URL : FAQ ページやハウツー記事など
  • PDF/DOC : FAQ や製品マニュアル、パンフレットやサポートガイドなど
  • Excel : 構造化 QnA ファイル
  • TXT/TSV : 構造化 QnA ファイル

ナレッジベースのテスト

外部に公開する前に、テストをしてみましょう。

1.「Test」ボタンをクリック。
image.png

2. 「Enable multi-turn」にチェックをいれて質問を送信。戻ったフォローアッププロンプトをクリックするなどテストを実施。
image.png

QnA の公開

準備が整ったので公開してみましょう。

1. 画面上部の「Publish」をタブより公開画面に移動し、画面中央の「Publish」をクリック。
image.png

2. 公開が完了したらエンドポイントの情報などが表示される。
image.png

3. Curl や Postman で実際の動作を確認。
image.png

ボットと連携

公開したサービスは簡単にボットとしても公開できます。

1. Publish のページで「Create Bot」をクリック。Azure ポータルに移動するので、必要な情報を入力して「作成」をクリック。場所や価格レベル、SDK 言語以外は特に変更の必要はなし。
image.png

2. 作成が完了したらリソースに移動して「Web チャットでテスト」をクリック。
image.png

3. ボットの準備が完了したら質問を送信。既定ではマルチターンに対応していないため、回答のみが返ってくる。
image.png

4. チャネルより必要に応じて任意のチャネルと接続。
image.png

LINE とつなぐ場合は Bot Builder v4 : LINE に接続するを参照。

ボットのマルチターン対応

既定のボットはマルチターンに対応していないため、対応版で上書きする必要があります。
C#、Node.js ともに以下の GitHub にコードが提供されています。

GitHub: QnA Maker multi-turn bot

基本的な手順は以下の通りです。

1. レポジトリのダウンロード
2. 設定ファイルの書き換え
3. 作成したボットの Web サービスに新しいコードをデプロイ

基本的にはそれだけでマルチターン対応が完了します。
image.png

ナレッジベースの管理

QnA Maker では作成済のナレッジベースを管理することができます。

1. SETTINGS タブをクリック。まず名前の変更が可能。
image.png

2. 既存の URL で情報の更新があった場合、「Refresh content」にチェックを入れることで更新が可能。また新規に URL やファイルの追加や既存リソースの削除が可能。
image.png

3. ナレッジベースのエクスポート/インポートや共有が可能。
image.png

4. 画面一番下より現在のナレッジベースの削除が可能。
image.png

アクティブラーニング

ナレッジベースの管理として重要な事の 1 つに、既存ナレッジの精度向上があります。QnA Maker ではアクティブラーニングによって精度向上をアシストします。尚、アクティブラーニングは改善の提案を行うだけであり、適用は管理者が手動で行るようになっているため、勝手にナレッジが更新されることはありません。

アクティブラーニングはユーザーからのフィードバックによって提案を作成します。

暗黙的フィードバック
ユーザーの質問に対して得られた複数の回答のスコアが非常に近い場合、自動的にフィードバックとみなします。

明示的フィードバック
ユーザーの質問に対して得られた回答のスコアのバリエーションがが少ない場合、ユーザーに対してどの質問が正しいかを尋ねます。この結果は明示的なフィードバックとして扱われます。この結果は Train API に対して開発者がデータを送る必要があります。

アクティブラーニングの有効化

アクティブラーニングは既定で無効となっています。https://www.qnamaker.ai/UserSettings にアクセスしてバージョンが 4.4.0 以上であることを確認後、任意のサービスに対して「Active Learning」を有効にします。
image.png

※バージョンが古い場合はこちらの手順を確認して最新のバージョンにしてください。

有効にした後は、発行を忘れず行ってください。

アクティブラーニングの提案確認

ナレッジベースの編集画面より提案を確認することができます。

1. View Options より「Show active learning suggestions」をクリック。
image.png

2.「Filter by suggestions」をクリックすることで提案のみを確認可能。
image.png

ボットでのアクティブラーニング対応

アクティブラーニングをボットと連携するためには、ボット側のコードを編集する必要があります。対応したサンプルコードはGitHub: Active learning in QnA Makerで提供されています。

Azure Search

ナレッジベースの検索は Azure Search で行われます。インデックスの作成やバージョニングなどは自動で行われます。

1. Azure ポータル より QnA Maker と一緒に作成された Azure Search を開く。
image.png

2. Indexes より testkb をクリック。ドキュメント数がナレッジベースと同じ数であることを確認。
image.png

3. Fields をクリックして列の情報を確認。

  • questions/answer の「Analyzer」で自動認識されている言語が確認可能
  • QnA Maker のナレッジベースと対応するように列があることを確認

image.png

4.「Search Explorer」より「Surface Go 以外の製品&$top=10」でサーチを実行。
image.png

5. Search スコアなどを含めた結果を確認。

複数のインデックス

QnA Maker で編集中のインデックスは testkb インデックスですが、ナレッジベースを公開したタイミングで GUID を名前に持つインデックスが作成され、その時点のスナップショットが作成されます。

分析

QnA Maker は Application Insights を利用してログを収集しているため、柔軟な分析が行えます。

1. Azure ポータル より QnA Maker と一緒に作成された Application Insights を開く。
image.png

2.「ログ (Analytics)」をクリック。
image.png

3. 実際のリクエストを見るために以下のクエリを実行。

requests
| where url endswith "generateAnswer"
| project timestamp, id, name, resultCode, duration, performanceBucket
| parse kind = regex name with *"(?i)knowledgebases/"KbId"/generateAnswer"
| join kind= inner (
traces | extend id = operation_ParentId
) on id
| extend question = tostring(customDimensions['Question'])
| extend answer = tostring(customDimensions['Answer'])
| extend score = tostring(customDimensions['Score'])
| project timestamp, resultCode, duration, id, question, answer, score, performanceBucket,KbId

image.png

上記以外にもいくつか便利なクエリサンプルが公式ドキュメントにあります。

90 日間のトラフィックの合計

requests
| where url endswith "generateAnswer" and name startswith "POST"
| parse kind = regex name with *"(?i)knowledgebases/"KbId"/generateAnswer" 
| summarize ChatCount=count() by bin(timestamp, 1d), KbId

指定の期間における質問トラフィックの合計

let startDate = todatetime('2018-02-18');
let endDate = todatetime('2018-03-12');
requests
| where timestamp <= endDate and timestamp >=startDate
| where url endswith "generateAnswer" and name startswith "POST" 
| parse kind = regex name with *"(?i)knowledgebases/"KbId"/generateAnswer" 
| summarize ChatCount=count() by KbId

ユーザー トラフィック

requests
| where url endswith "generateAnswer"
| project timestamp, id, name, resultCode, duration
| parse kind = regex name with *"(?i)knowledgebases/"KbId"/generateAnswer"
| join kind= inner (
traces | extend id = operation_ParentId 
) on id
| extend UserId = tostring(customDimensions['UserId'])
| summarize ChatCount=count() by bin(timestamp, 1d), UserId, KbId

質問の待ち時間配布状況

requests
| where url endswith "generateAnswer" and name startswith "POST"
| parse kind = regex name with *"(?i)knowledgebases/"KbId"/generateAnswer"
| project timestamp, id, name, resultCode, performanceBucket, KbId
| summarize count() by performanceBucket, KbId

まとめ

Q&A はボットの用途して非常に多い一方で、自然言語処理やデータソースの管理、バージョン管理やモニタリングなど、要求される機能は高くなります。QnA Maker を活用するとこれらの課題は解決できますので、是非一度ためしてみてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした