フュージョン開発アプローチによるボットの開発: Power Virtual Agents と Bot Framework Composer の統合

### フュージョン開発アプローチ

Microsoft の Power Apps など、ノーコード、ローコードでアプリケーションを開発するツールにより、ビジネスプロセスを改善するアプリケーションをユーザー側で開発できるようになりましたが、このようなツールでできることには、限界があります。例えば、Power Apps にコネクタが提供されていない既存システムと連携する場合、Power Apps の標準機能だけではソリューションを提供することができません。
ただし、プロの開発者が既存システムと連携するためのカスタムコネクタを開発し、ユーザー側の開発者（「市民開発者」と呼びます）が Power Apps 上で自身の開発したフロントエンドアプリケーションと、このカスタムコネクタを連携するようにすれば、全体としてソリューションを提供できるようになります。

ビジネス要件をよく理解している市民開発者と、高度なプログラミング技術を持つプロの開発者、セキュリティに詳しい IT システム管理者など、複数のメンバーが互いの専門性を活かして一つのソリューションを提供、改善していく方法をフュージョン開発アプローチと呼びますが、チャットボットの開発においてもこのアプローチが可能です。

Microsoft は、「[The future of bot building](https://powervirtualagents.microsoft.com/ja-jp/blog/the-future-of-bot-building/)」という記事で、フュージョン開発アプローチをサポートするものとして、下記を紹介しています。

- Power Virtual Agents と Bot Framework Composer の統合
- Power Virtual Agents と Microsoft Azure Bot Service の両方を双方向のスキルとして使用する機能

上記 2 点の具体的な方法を確認していきたいと思いますが、この記事では、前者について記載します。

### Power Virtual Agents と Bot Framework Composer の統合

Power Virtual Agents は[過去の記事](https://qiita.com/fsdg-honda/items/30cc711d064d96850958#power-virtual-agents)でも紹介しましたが、ノーコード、ローコードでインテリジェントなチャットボットを作成できるサービスです。

Bot Framework Composer は、Power Virtual Agents 同様、ノーコード、ローコードでインテリジェントなチャットボットを作成できるサービスですが、構成要素や UI は異なります。また、デスクトップアプリケーション上で開発する形式となります。  
Power Virtual Agents と Bot Framework Composer を統合すると、Bot Framework Composer から、Power Virtual Agents で定義された変数を含む会話メモリとコンテキストにアクセスすることができます。ただし、この統合は、Teams Power Virtual Agents ライセンス のみを持っているユーザーでは利用できず、試用版、もしくは Power Virtual Agents ライセンスの完全版が必要です。

この記事では、Power Virtual Agents で作成したチャットボットが外部システムの API を呼び出せるように、Bot Framework Composer で機能拡張してみます。

### 郵便番号検索 API

外部システムの API として、株式会社アイビスが提供している[郵便番号検索 API](http://zipcloud.ibsnet.co.jp/doc/api)を呼び出すことにします。
この API を利用し、郵便番号を伝えると、対応する住所を返してくれるチャットボットを作ってみます。

### Power Virtual Agents からチャットボットを作成する

Power Virtual Agents の[ポータル](https://web.powerva.microsoft.com)にログインし、チャットボットを作成します。  
作成メニューから「Build for production」を選択し、「郵便番号検索ボット」という名称で新規チャットボットを作成します。

### Bot Framework Composer の使用を開始する

「トピック」メニューを開き、「新しいトピック」のプルダウンボタンから「Bot Framework Composer を開く」を選択します。

Bot Framework Composer が起動され、確認画面が表示されます。Bot Framework Composer をインストールしていない場合は、確認画面からダウンロード、インストールします。アクセス許可を求められた場合は許可を選択し、サインインを要求された場合は、サインインします。  
Bot Framework Composer が起動できなかったり、インポートが開始されなかった場合は、確認画面の「リンクのコピー」ボタンでコピーしたリンクをブラウザで開くと、再度 Bot Framework Composer の起動、インポートが行われます。

インポートが開始されると、プロジェクトの名前と保存場所を入力する画面が表示されます。任意の名前（ここでは「ZipCode」とします）を入力し、「作成」ボタンを押すと、Power Virtual Agents で作成したデータがインポートされたプロジェクトが作成されます。

![スクリーンショット 2023-03-21 135559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/43c17d4e-bb0c-b325-1242-62ac78f2cc07.png)


### 入力された内容を外部 API に連携する

入力された郵便番号文字列をそのまま外部 API のパラメータとして渡し、レスポンスが正常かどうかを判定した上でメッセージを返すフローを作成します。

Bot Framework Composer のエクスプローラー表示で ZipCode -> ZipCode 横にあるメニューから「Add new trigger」を選択します。  

![スクリーンショット 2023-03-21 140047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/63cc26f8-4e6c-3847-b5f6-e28837be920a.png)


トリガーの種類として「不明なインテント」を選択します。これは特定のトリガーパターンに該当しないメッセージが送られてくるトリガーとなります。  
フローの追加ボタンから「外部リソースにアクセス」->「HTTP 要求の送信」を選択し、「HTTP 要求の送信」を追加します。

「HTTP 要求の送信」の内容として下記を設定します。

```
HTTP method: GET
Url: https://zipcloud.ibsnet.co.jp/api/search?zipcode=${turn.activity.text}
Result property: dialog.api_response
Content type: application/json
Response type: json
```

`${turn.activity.text`はチャットボットがユーザーから受信したテキストが格納されているプロパティです。  
`Result property`は API から受信したレスポンスを格納するプロパティです。

API から受信したレスポンスがエラーかどうかの判定を追加します。

フローの追加ボタンから「条件の作成」->「分岐: if/else」を選択し、条件に HTTP ステータスコードが 200（成功）かどうかを判定する下記を指定します。

```
dialog.api_response.statusCode == 200
```

郵便番号検索 API のドキュメントによれば、HTTP ステータスコードとは別に、レスポンスボディにも、正常応答かどうかを示す status フィールドが存在しています。  
そこで、前回の分岐が True の場合のフローにおいて、再度フローの追加ボタンから「条件の作成」->「分岐: if/else」を選択し、下記条件を追加します。

```
dialog.api_response.content.status == 200
```

この分岐も True の場合、住所が格納されているとみなし、都道府県名、市区町村名、町域名を含めた応答を送信します。  
フローの追加ボタンから「応答の送信」を選択し、応答に下記を指定します。

```
${dialog.api_response.content.results[0].address1}
${dialog.api_response.content.results[0].address2}
${dialog.api_response.content.results[0].address3}
```

分岐が False となる場合もエラーメッセージを返す「応答の送信」を追加します。  
レスポンスボディの status がエラーの場合、message にエラー要因が格納されているので、下記応答でエラー要因も含めるようにしてみます。
```
次の理由により住所が検索できませんでした: ${dialog.api_response.content.message}
```

最終的には下記のようなフローとなります。

![スクリーンショット 2023-03-21 155959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/3a6f3414-46c1-54c3-9001-12b32f82e84e.png)

### ボットの公開

Bot Framework Composer で編集した内容を Power Virtual Agents に反映するには、ボットの公開を行います。
「公開」メニューを開き、公開するボットにチェックを付けて「選択したボットを公開する」ボタンを押します。

### Power Virtual Agents で動作確認

公開処理完了後、Power Virtual Agents ポータルから「郵便番号検索ボット」の「トピック」メニューを開きます。  
Bot Framework Composer で作成した「不明なインテント」が追加されています。  
「ボットのテスト」画面で郵便番号を入力すると、対応する住所が返ってきます。

![スクリーンショット 2023-03-21 160834.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/f19d2384-de77-5e3d-8680-93ed81b2965c.png)

エラーケースも確認してみます。不正な郵便番号を送ると、API のエラー要因を含むメッセージが返ってきています。

![スクリーンショット 2023-03-21 171030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104149/7055b7d8-95ce-3ba0-0d5e-34ab7edbeb83.png)

### Composer で Power Virtual Agents のボットコンテンツを作成するためのガイドライン

[Composer で Power Virtual Agents のボットコンテンツを作成するためのガイドライン](https://learn.microsoft.com/ja-jp/power-virtual-agents/advanced-bot-framework-composer#guidelines-for-creating-bot-content-for-power-virtual-agents-in-composer)には、Bot Framework Composer を使用して Power Virtual Agents 用のボット コンテンツを作成する際の注意事項が記載されています。  
Bot Framework Composer の UI で表示されていても利用できない機能が存在したり、Bot Framework Composer と Power Virtual Agents との間でグローバル変数にアクセスする際の名称が異なっていたり、事前に目を通しておかないと混乱する内容もありますので、利用する際には一読されることをお薦めします。

### Power Virtual Agents の機能拡張は Bot Framework Composer が唯一の手段ではない

この記事では、Power Virtual Agents と Bot Framework Composer の統合機能を使うことにより、現状の Power Virtual Agents だけでは対応できない、外部システムとの連携が行えることを確認しました。  
ただし、Power Virtual Agents には、Unified Canvas という現在プレビュー状態の新たな開発フローがあり、そこにはアダプティブカードの送信など、従来 Bot Framework Composer でしか行えなかった機能も含まれています。また、外部システムとの連携についても、Power Automate 上でカスタムコネクタを作成し、Power Virtual Agents から呼び出す方法もあります。
Power Virtual Agents 本体および周辺の機能リリース状況や予定を踏まえた上でソリューションの構成を検討するのがよいと思います。