出張手配してくれるチャットボットをPower Virtual Agentsで作ってみた

# はじめに
先日参加したイベント[Global Power Platform Bootcamp Sapporo](https://connpass.com/event/159851/)で**Power Virtual Agentsを使ってノーコードでチャットボットを開発できる**ことを知りました。
[Microsoft Bot Framework](https://dev.botframework.com/)はゴリゴリコードを書くのがハードル高くて避けていたのですが、ノーコードならできそうと思ったので会社でのちょっとした手続きを助けてくれるチャットボットを作ってみました。

試してみると非常に高いポテンシャルを感じました。今回作ったのは簡単なボットですが作りようによっては今会社でやっている仕事をかなり効率化できる可能性を秘めたサービスだと思います。

# ボットを使うメリット
**やることは決まりきったことなんだけど少しだけ変数が必要で全自動化が難しいことを楽にする**というメリットがあると思います。
当社は出張の手配を他社へメールでお願いしているのですが、宛先や文面は変わらないのに対しフライトや宿泊地は変わるので、今回このプロセスをボット化してみます。
今回は**Microsoft Teams用のチャットボット**を作りますが他に**Slack**や**LINE**用のボットが作成できるようです。

# Power Virtual Agentsの概要
[**Build chatbots with no code**](https://powervirtualagents.microsoft.com/en-us/)と謳っているようにノーコードでパワフルなチャットボットを開発できるMicrosoft Power Platformのサービスの1つです。
Power BIやPower Automate（旧Microsoft Flow）など他のPower系サービスや他のMicrosoftのサービスと連携できるのが良いですね。
イベントではボットの利用結果をPower BIで可視化するデモが行われました。

## 料金とライセンス
**1テナントあたり2000セッションまで月1000ドル**
[公式サイト](https://powervirtualagents.microsoft.com/en-us/)

テナントとはなんだろうと調べたのですがわからず、ただ、1テナントの中に複数のボットを作ることができるのは間違いなさそうです。（実際複数できました）

料金がお高い印象ですが、Office365（Business Premium）を使っている当社の1ユーザにすぎない自分が購入プロセス無くそのまま使えたのでOffice365のあるプラン以上を契約しているユーザは使えると思います。
また、Office365ユーザでなくても単体でPVAを契約できると思います。

[Microsoft Power Apps,Microsoft Power Automate and Microsoft Power Virtual Agents Licensing Guide]
(https://go.microsoft.com/fwlink/?LinkId=2085130&clcid=0x409)
を見たのですが結局理解できず、ライセンスに詳しい方いらっしゃいましたらコメントいただけると幸いです。

# ボットの作成
それでは、定形である宛先メールアドレスと文面をユーザが気にすることなく、変数である宿泊地やフライト日時を会話で決めて依頼先へメールを送るというボットを作ります。
出張手配のやり方が自社と違うから導入無理という記事ではなく汎用性高い記事を書いたつもりです。
なので、みなさんもボットを作りたいと思ったときのヒントになれば幸いです。

以下の流れで作成していきます。
1. 会話を始めるときのキーワードの設定
2. 会話の流れの設定
3. 会話する場所の設定

## 1. 会話を始めるときのキーワードの設定
https://powerva.microsoft.com/
からPower Virtual Agentsへサインインします。
![FireShot Capture 001 - Sign in - Intelligent Virtual Agents - Microsoft Power Virtual Agents_ - powervirtualagents.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/2e58bf8c-5cd0-e114-4d10-85a644293b23.png)

Homeの右上、ロボットのアイコンをクリックし**New bot**から作成します。
![FireShot Capture 003 - Power Virtual Agents - Home - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/141118f8-2808-ac18-8501-ab2a09eb626b.png)

ボット名を決めます。
![FireShot Capture 004 - Power Virtual Agents - Home - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/a1da6063-bec4-38dc-0f6c-9c68f02dcecc.png)

作ったボットを選び**Topics** > **New topic**をクリックします。
![FireShot Capture 007 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/19efcc0e-ed33-37bc-e1fa-62dd5b48e5cc.png)

**Trigger phrases**を入力します。
これはチャットボットを呼び出すトリガーとなる発話で、ユーザによって「出張手配」や「出張を手配して」など発話がゆれるため吸収するよう似たような文をいくつか登録すると良いです。あとからでも追加できるのでまずは思いつくものだけ入力しましょう。
その後**Go to authoring canvas**から会話の流れを設定していきます。
![FireShot Capture 008 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/02b5c504-c514-1ee7-0240-8f4fc6a1ea8a.png)

## 2. 会話の流れの設定
### ユーザへの質問作成
キャンバスで会話の流れを作ります。
会話のパーツは

- Show a message：ボットの発話
- Call an action：別のアクションを呼び出す（後述します）
- Ask a question：ボットからの質問

がありますが今回はボットの質問に対するユーザのレスポンスを変数として使いたいので**Ask a question**を選びます。
![FireShot Capture 010 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/e114b15c-c112-efcd-a887-aba7c47ba85b.png)

ユーザへの質問を入力し**Indentify**からレスポンスの分類を設定します。
選択肢から選ぶ、都市名など数多くの分類がありますがここでは**User's entire response**（ユーザの応答全体）を選びます。
発話内容がそのまま変数へ格納されるイメージです。
Cityなど多くのものはまだ日本語対応していないとのことでした。

![FireShot Capture 012 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/1fa46de3-199a-586b-982e-0377ed6d594d.png)

**Save response as**はユーザからのレスポンスを格納する変数名です。
名前はあとからわかりやすいよう変えておきましょう。
![FireShot Capture 013 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/2334a36a-0e5f-4e63-6408-4887e028f417.png)

宿泊地のほかフライト日時が必要なのでIdentifyは**Date and time**を選びユーザの発話を日時形式にします。
![FireShot Capture 015 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/8b73a7d6-680d-dc3c-1745-7323c37fe70b.png)

### メール送信処理の設定
次にユーザからのレスポンスを使って出張手配してくれる会社へメールを送る処理を作ります。
ここで、異なる機能のサービスをつなぐPower AutomateをPVAから呼び出すよう設定します。

往路のフライト日時のあとに**Call an action**を追加します。
![FireShot Capture 016 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/f35236be-ba2e-a428-add9-aa8d3127df3d.png)

**Create a flow**からflowを作ります。
![FireShot Capture 017 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/ad239589-265b-d242-9c8b-3730b0c37976.png)

別タブでPower Automateの設定画面が開きます。
ユーザからの入力データの種類を設定します。今回の宿泊地や日時はテキストを選択しました。
![FireShot Capture 020 - 繝輔Ο繝ｼ縺ｮ菴懈・ - Power Automate - japan.flow.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/507c8105-c9aa-a392-b21a-9fc0abb65bee.png)

PVAから受け取る値を定義します。
![FireShot Capture 021 - 繝輔Ο繝ｼ縺ｮ菴懈・ - Power Automate - japan.flow.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/e1f0a94b-ed97-b2a6-4581-ba7190facd0d.png)

入力値を使ってメールを送るアクションを追加します。
![FireShot Capture 022 - 繝輔Ο繝ｼ縺ｮ菴懈・ - Power Automate - japan.flow.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/7d3bf225-0fba-7118-b719-fcdb994da0f5.png)

Outlookを検索し**メールの送信**を選びます。
![FireShot Capture 023 - 繝輔Ο繝ｼ縺ｮ菴懈・ - Power Automate - japan.flow.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/f7f48fb9-c50d-9315-e7a0-81df072034cd.png)

ユーザの発話内容が格納された変数をメールのタイトルや本文で使うことができます。
設定が完了したらflowを保存します。
![FireShot Capture 024 - 繝輔Ο繝ｼ縺ｮ菴懈・ - Power Automate - japan.flow.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/02fb64b7-2a2c-7fef-84fd-9c598af00d10.png)

ここで**ハマりやすいので注意**ですが作成したflowをPVAから呼び出すためにもうひと手間必要です。
Power Automateから**ソリューション** > **新しいソリューション**で右に表示されるスペースへ表示名などを入力して作成します。
![FireShot Capture 027 - 繧ｽ繝ｪ繝･繝ｼ繧ｷ繝ｧ繝ｳ縺ｮ邂｡逅・- Power Automate - japan.flow.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/53309786-cdb7-1910-b260-251876e5438d.png)

作成したソリューションを選択し**既存のものを追加します** > **フロー**
![FireShot Capture 028 - 繧ｽ繝ｪ繝･繝ｼ繧ｷ繝ｧ繝ｳ縺ｮ邂｡逅・- Power Automate - japan.flow.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/be9c7c35-f259-03c3-1a9c-97b40f244266.png)

**ソリューション外部**から作成したflowを選択して**追加**します。
![FireShot Capture 030 - 繧ｽ繝ｪ繝･繝ｼ繧ｷ繝ｧ繝ｳ縺ｮ邂｡逅・- Power Automate - japan.flow.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/e2c7a5b0-5a1c-136c-d5a7-2952dd6b90e6.png)

詳しくは[公式サイト](https://docs.microsoft.com/ja-jp/power-virtual-agents/advanced-flow?fbclid=IwAR388qT2H1ZpZ0MFOvEzEfGSKe39Zbv6S5nVjf8BAqCC9La17J6F_JlgVgA#move-a-flow-to-the-solutions-tab-on-the-power-automate-portal)に掲載されています。

### Power Virtual AgentsからPower Automateを呼び出す
PVAの画面に戻り、先ほどと同じところで**Call an action**を選ぶと作成したflowが表示されるので選択します。
さきほどのソリューションへ追加の手順を飛ばしてしまうとここへ表示されないので注意です。

![FireShot Capture 032 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/cee22d40-5b20-ce98-a2d2-442f3ac991e2.png)

ユーザの発話内容をPower Automateへ渡すようデータを紐づけます。
![FireShot Capture 033 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/4525890d-912f-fd66-5528-256ecdccbd09.png)

紐づけるものを同名にしておくと混乱しないと思います。
すべての変数で設定します。
![FireShot Capture 034 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/d7009c8a-2964-ba44-4abb-620dc173ddfe.png)

会話の流れがすべて設定できたら**Save**します。
![FireShot Capture 033-02 - Power Virtual Agents - Topics - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/560c3fed-9bf6-8db0-4d9d-8df9e5030378.png)

会話の流れとPower Automateの完成版は記事の最後に載せていますので参考にしてください。
ボットの質問に「はい」「いいえ」で答える例も記載しています。

## 3. 会話する場所の設定
PVAの画面でボットの動作テストができますが、これをチャットボットとして自社で公開してTeamsで使う場合は**Publish**をします。
![FireShot Capture 037 - Power Virtual Agents - Publish - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/931763e2-6492-d2e3-fb91-83279e250156.png)

**Manage** > **Channels**からTeamsを選択します。
![FireShot Capture 039 - Power Virtual Agents - Channels - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/5da95654-cf45-e415-351c-b83a918af7fc.png)

**Add**をすると**App ID**が表示されます。
![FireShot Capture 040 - Power Virtual Agents - Channels - powerva.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/daf372fc-d5bf-9d4b-998e-87aa445ed3f2.png)

App IDをコピーしてTeamsで検索するとユーザーのところに作ったボットが出てきます。
クリックして会話してみましょう。
![FireShot Capture 041 - (1) - Microsoft Teams - teams.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/0b874672-6bea-ad72-88d4-14a303a99977.png)

初回呼び出し時は英語でいろいろ出てきますが設定したトリガーフレーズを言うと意図した発話が返ってきます。
![FireShot Capture 042 - (1) Search - Microsoft Teams - teams.microsoft.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/737e530c-f4bc-9765-31ac-b993564a884b.png)

# 実際に使ってみる
もちろんスマートフォンのTeamsアプリでもボットを使えます。
日時はyyyy/mm/dd hh:mmの形式で入力します。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/532bf742-d6cc-54c0-aff1-76fce680d18b.png)

年がなかったり時間がAM、PMどちらかわからない場合はボットが補足してくれます。
該当する日時を選びましょう。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/62208ff0-cc27-9b1f-8b71-f3a6c2cecc09.png)

内容よければ**はい**を選びます。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/72d6361d-7739-f904-705d-4ed99e68ca4f.png)

苗字を聞くのはどこどこの○○ですとメールへ記載するためです。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/c8473d94-45c0-c619-535f-4ea62276850d.png)

このようにメールが送られます。
日時が海外表記になりますがご愛敬です。
もしこのあたりをこだわる場合はAutomateを使ってデータ加工すれば実現できると思います。
![mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/567f0cd7-c1fe-916f-033e-cd4d0e124e12.png)

## 完成形
以下のようになりました。

### Power Virtual Agents
![screencapture-powerva-microsoft-2020-02-22-16_54_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/aa052c47-c6cf-b516-6a84-2706dbf9fd84.png)

### Power Automate
![screencapture-japan-flow-microsoft-manage-environments-Default-926d0409-4eee-4689-979e-9f4e54fa00ca-flows-c6f5dfde-271b-410f-9329-96633e5605b3-2020-02-22-16_58_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172195/a9da02d0-ebf4-7fda-4121-4990afa8f75c.png)

今回は宿泊あり飛行機移動前提のボットですがフライト日時から日帰りか宿泊か自動で判定したり、移動手段を選択肢に加えることで様々なケースに対応できると思います。
しかし、一つのボットであまり多くのことをフォローしようとすると複雑になりメンテナンスが大変になるので例えば日帰り出張の場合はトリガーフレーズを**「日帰り出張」として別のトピックとして切り出す**とシンプルで良いかもしれません。

# さいごに：チャットボット作るときに考えること
**やることは決まりきったことなんだけど少しだけ変数が必要で全自動化が難しいことを楽にする**にはチャットボットが有効ですが、コミュニケーションの取り方には気を付けたいです。
要は**いかにうざいと思われずにユーザの目的を達成できるか**を重視して会話を設計するのが良いです。

## 悪い例
たとえば以下のような会話設計はユーザ体験を損ねます。

ユーザ：出張手配
ボット：出張の手配ですね。手配する前に出張申請をし承認されているか確認してください。申請は承認されましたか？
ユーザ：**（承認されたから手配してるんだけど）**はい
ボット：わかりました。それでは出張先を教えてください。なお移動距離が100㎞未満の場合は日帰り出張となりますのでご注意ください。100㎞を超える場合は宿泊を認めます。宿泊費は1泊につき1万円未満としてください。
ユーザ：**（長いな…結局何を答えればってあぁ）**大阪
ボット：大阪でよろしいですか？
ユーザ：**（だからそう書いたじゃない）**はい
ボット：わかりました。行きはどうしますか？
ユーザ：**（どうしますかって移動手段のこと？出発時間のこと？）**飛行機で移動
ボット：すみませんわかりません。まず出発日時を教えてください。
ユーザ：**（最初から時間だと言ってよ）**

まとめると

- フレーズが長い
- 質問の意図がわかりづらい
- ユーザにとって明確なことを聞かれる
- 明確な選択肢の提示がなくどう回答したらよいか困る
- ボット使わない方が結局楽

あたりはアンチパターンだと思います。
言葉の受け取り方は人それぞれなので会話設計に正解はないですが**一問一答かつ短いやりとりで目的を達成できる**ようにしたいものです。

## Power Virtual Agentsに詳しい人へ聞きたいこと
今回のボットだと
ボット：この内容でよいですか？
ユーザ：いいえ
ボット：最初からやり直してください
となりボットとの会話が終わってしまうので、**もう一度質問のところに戻るようにする方法**があるかどなたご存知でしたらコメントいただけると幸いです。