Power Virtual Agents と Cognitive Services によるボットの利用状況分析

### はじめに

この記事は、[過去にご紹介した Power Virtual Agents と Cognitive Services によるボット開発](https://qiita.com/fsdg-honda/items/30cc711d064d96850958)に引き続き、Power Virtual Agents と Azure Cognitive Services for Language のカスタム質問応答機能について、調査、動作検証した内容を記載しています。
今回はボットの利用状況分析に関する内容となっています。

### Power Virtual Agents での分析

Power Virtual Agents の分析ページで利用状況や顧客満足度といった指標を確認できます。
概要タブでは、下記のような指標の変化を示すグラフや関連するトピックが表示されます。

![スクリーンショット_20230222_152159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/bae2fe55-fb63-264c-b4d3-52a03065b853.png)

- **セッションの合計数**: 指定された期間内のセッションの合計数。
- **エンゲージメント率**: エンゲージ（トピックがトリガーされる、エスカレートされる）になった全セッションの割合。
- **解決率**: 解決された従事セッションの割合。
- **エスカレーション率**: エスカレートされた従事セッションの割合。
- **破棄率**: タイムアウトで破棄された従事セッションの割合。
- **CSAT**: 顧客がセッション終了時のアンケート依頼に応じたセッションの顧客満足度 (CSAT) の平均スコアを示すグラフィカル表示。

CSAT は下記のようにセッション終了時にボットから問い合わせ、ユーザが回答する形で収集されます。

![スクリーンショット_20230222_153102.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/6ad9d95f-e528-3521-dcde-8102416521f5.png)

顧客満足度タブでは、CSAT の詳細が表示されます。

![スクリーンショット_20230222_152935.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/ce3d607c-c8d9-5206-70f7-228d17b0bf45.png)

CSAT 影響欄には、全体的な平均 CSAT 調査スコアから、トピックを除いた全体的な平均 CSAT 調査スコアを差し引いたスコアが表示され、この値が低いトピックには改善の余地があると思われます。

### カスタム質問応答 での分析

カスタム質問応答の Language リソースを Azure ポータルで開き、診断設定を有効にすると、カスタム質問応答のログが保存されるようになります。
下図の例では、全ログを Log Analytics ワークスペースに送るように設定しています。

![スクリーンショット_20230222_163446.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/d83acc8e-f5eb-335c-a2e0-336ff9213a8b.png)


設定後、対象のカスタム質問応答を利用したボットに対して質問すると、セッションのログが Log Analytics ワークスペースに保存されまます。
Azure ポータルでログ送信先の Log Analytics ワークスペースを開き、Kusto クエリを発行することで分析を行うことが可能です。
下記にいくつか Kusto クエリの例を記載します。

#### ナレッジベース、ユーザあたりのトラフィック

下記 Kusto クエリでは、1 日のナレッジベース、ユーザあたりのトラフィック数をグラフで表示します。

```
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where OperationName=="CustomQuestionAnswering QueryKnowledgebases"
| extend kbId_ = tostring(parse_json(properties_s).kbId)
| extend userId_ = tostring(parse_json(properties_s).userId)
| summarize ChatCount=count() by bin(TimeGenerated, 1d), kbId_, userId_
| render timechart
```

![スクリーンショット_20230222_165505.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/08bdd1e1-69a5-0919-cf9a-e7967472db3e.png)

#### 未回答の質問

下記 Kusto クエリでは、スコアが 0 で未回答となった質問を検索しています。
なお、スコアの閾値はデフォルトが 0 となっていますが、カスタム質問応答へのリクエスト毎に指定可能です。
(閾値を変更した場合は下記クエリも変更必要です)

```
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.COGNITIVESERVICES"
| where OperationName=="CustomQuestionAnswering QueryKnowledgebases"
| extend answer_ = tostring(parse_json(properties_s).answer)
| extend question_ = tostring(parse_json(properties_s).question)
| extend score_ = toint(parse_json(properties_s).score)
| extend kbId_ = tostring(parse_json(properties_s).kbId)
| where score_ == 0
| project question_, answer_, score_, kbId_
```

![スクリーンショット_20230222_171149.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/98c6f854-2b69-edaf-a76c-1108c6d9235d.png)

#### Log Analytics ワークスペースのクエリのエクスポート

上記のような Log Analytics ワークスペースのクエリは、都度入力して確認するだけでなく、Azure ダッシュボードにピン留めして Azure ポータルからすぐ確認するようにできます。Power BI のクエリとしてエクスポートすることも可能です。

![スクリーンショット_20230222_172152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/f3b6d09a-2118-1949-e918-d7d67be6f2e4.png)

未回答となった質問が発生したときにアラートを設定したり、Logic Apps で定期的に分析情報を通知するようなことも可能です。

### まとめ

Power Virtual Agents、Azure Cognitive Services for Language のカスタム質問応答機能ともにボットの利用状況を分析するための仕組みが提供されています。
ただ、Power Virtual Agents の CSAT を確認するための問い合わせ自体がユーザーの不満とならないか、カスタム質問応答で（未回答ではなく）誤回答したことが検知できるか、これら以外にも配慮が必要な点はあるように思います。