Bot Builder v4 でボット開発 : スキルを開発する - その 1 概要とソリューションの作成

この記事では Bot Framework のスキル機能について紹介します。

# スキルとは

スキルとは、[Bot Framework SDK for .NET v4.6](https://github.com/microsoft/botbuilder-dotnet/releases/tag/4.6.0) でプレビューとして提供された機能で、特定の機能を再利用可能なモジュールとして開発できます。2020年3月時点でもまたプレビューのままですが、SDK 4.8 がリリースされ、Bot Framework で開発したボットから以外にも、Power Virtual Agents (PVA) からも呼べるようになり、またテンプレートを含め色々便利になってきたので、このタイミングで紹介します。

以下の図では「スキル」は画面右側にあり、中央にいる「アシスタントボット」が「Dispatch」機能を使って呼び出しています。
![](https://microsoft.github.io/botframework-solutions/assets/images/virtualassistant-diagram.jpg)

技術的にはボットとスキルはほぼ同じですが、呼び出す側の連携の方法や、PVA から呼ぶための機能サポートなどいくつかの違いがあります。

## マニュフェスト

スキルを開発したら仕様をマニュフェストとして公開します。Web API の OpenAPI と似た感じで、スキルの情報を json 形式で記述します。現在ボットから呼び出す場合と PVA から呼び出す場合でマニフェストのバージョンが異なるため 2 つのマニフェストを管理する必要があります。

# スキル開発

実際にスキルを開発してみましょう。手順は [Tutorial: Create (csharp)](https://microsoft.github.io/botframework-solutions/skills/tutorials/create-skill/csharp/1-intro/) を参考にします。

## 事前準備

Bot Framework の開発環境が既にある前提とします。追加で以下のコンポーネントをインストールしてください。

- [Virtual Assistant and Skill Templates](https://marketplace.visualstudio.com/items?itemName=BotBuilder.VirtualAssistantTemplate) を Visual Studio にインストール
- 最新の [.NET Core SDK](https://dotnet.microsoft.com/download) と [PowerShell Core](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-6) をインストール

npm を使ってツールをインストール

```shell
npm install -g @microsoft/botframework-cli botdispatch luis-apis ludown luisgen
npm install -g botskills@latest
```

## プロジェクトの作成と環境の準備

テンプレートからソリューションを作成し、スキルを実行する環境を Azure に作成します。

1\. Visual Studio 2019 より新規プロジェクトを作成。Skill Template を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/56bc0b6a-ad36-c743-87a1-33832c4f8ac5.png)

2\. 適当な名前を付けてプロジェクト作成。ユニットテストプロジェクトもついてくるので、2 つのプロジェクトが作成される。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2f526e35-55fe-f2ff-bde1-b558bcd26567.png"/>

3\. PowerShell Core を起動してプロジェクトのフォルダへ移動。公式ドキュメントの手順では展開スクリプトの実行となっているが、まずは az login を実行。複数のサブスクリプションがある場合は任意のものを指定しておく。

```powershell
az login
```
4\. 展開スクリプトを実行。このスクリプトで以下のリソースが展開される。自分で組める場合はスクリプトは必須ではないが、設定なども更新してくれるので楽。スクリプトの詳細は次回。

Azure Web App
Azure ストレージアカウント (トラスクリプト)
Azure Application Insights (テレメトリ)
Azure CosmosDb (ステート管理)
Azure Cognitive Services - Language Understanding (自然言語処理)

また必須パラメーターは以下の通り

- name: グローバルでユニークな値 (Prefix つくので比較的なんでも大丈夫)
- location: 各種リソースのロケーション
- appPassword: アプリケーションのパスワード - 最低16文字で強力なやつ
- luisAuthoringRegion: [LUIS のロケーション](https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/luis-reference-regions)

```powershell
.\Deployment\Scripts\deploy.ps1 -name kenakamuhelloskill -location westus -appPassword <強力なパスワード> -luisAuthoringRegion westus
```
5\. Cosmos DB のプロビジョンで少し時間がかかるので、コーヒーなどを飲みながら待つ。焦って Enter キーを連打しない。
全ての処理が終わったらエラーが無いことを慎重に確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/0229a6aa-9b90-847b-19d1-554c4adaa291.png)

6\. [Azure ポータル](https://portal.azure.com) で作成されたリソースを確認。お金がかからないよう App サービスプランを F0 に即座に変更しておく。また Web App Bot も無償プランに切り替え。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/b4df2726-9f6e-8a8b-18b0-190898a3974a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/461d3dcb-e2fe-efbc-2bcc-625a92e7d0d9.png)

7\. [LUIS ポータル](https://www.luis.ai) より作成された LUIS アプリを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/560836f1-0965-f305-bc68-d277b339fdac.png)

## ソリューションのテスト

1\. appsettings.json を開いて、各種情報が更新されていることを確認。botWebAppName と microsoftAppId をコピー。

2\. wwwroot/manifest/manifest-1.1.json を開き、{YOUR_SKILL_URL} と {YOUR_SKILL_APPID} を更新。URL は上記でコピーした botWebAppName に .azurewebsites.net を追加した値。尚、manifest-1.0.json は PVA 用のため、今は変更しません。

3\. F5 を押下してプロジェクトを実行。Bot エミュレーターより接続できることを確認。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/8864239a-725a-057e-963b-af43fb871a08.png"/>

4\. 動作を確認したら、Azure に公開。

- name: appsettings.json の botWebAppName
- resourceGroup: appsettings.json の resourceGroupName　

```shell
 .\Deployment\Scripts\publish.ps1 -name kenakamuhelloskill-om7pvdw -resourceGroup kenakamuhelloskill
```
5\. マニフェストが更新されているか確認。Azure Web App のアドレスに /manifest/manifest-1.1.json を追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3ab083ba-2f17-cfb3-a504-a9c5afcf75dc.png)

# アシスタントボットを作成

スキルを利用するには、ディスパッチ機能を持ったアシスタントボットが必要です。アシスタントボットについてはまた別の記事で詳細を紹介しますがテンプレートで簡単に作成できます。早速作っていきましょう。

1\. Visual Studio 2019 より新規のソリューションで Virtual Assistant Template を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/99cf45f2-59e7-8999-eb48-da70c0a998e6.png)

2\. 任意の名前を付けて作成。先ほど同様展開スクリプトをプロジェクトフォルダより実行。LUIS の Authoring キーは使いまわしてもよい。また10分程度かかるため、お風呂でも入ってくる。

```shell
.\Deployment\Scripts\deploy.ps1 -name kenakamumyassistant -location westus -appPassword <強力なパスワード> -luisAuthoringRegion westus
```
3\. 展開が完了したら App Service のプランを F1 に変更しておく。また Web App Bot も無償プランに切り替え。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/212184d8-18e1-0a9f-2d5e-c8fb503de94c.png)

4\. 同時に QnA サービスのプランも F0 に変更。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/49437c9e-1010-7f3c-413f-0be1736f0a76.png)

5\. F5 でデバッグ実行。エミュレーターより接続する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3d804f11-4264-5fe3-91cf-824a8b65e5dc.png)

6\. 動作を確認したらデバッグを停止する。

# Dispatch にスキルを追加

アシスタントボットの Dispatch 機能にスキルを追加する場合、 botskills CLI を使います。

1\. アシスタントボットのプロジェクトディレクトリへ移動し、以下のコマンドを実行。

- remoteManifest: スキルのマニフェストアドレス
- luisFolder: スキルのプロジェクトにある Deployment\Resources\LU フォルダへのパス

botsSkills を実行することで、アシスタントボットに対して以下の操作が行われる。

- LUIS アプリの更新
- スキル参照の追加
- クラスの追加

```shell
botskills connect --remoteManifest "https://kenakamuhelloskill-om7pvdw.azurewebsites.net/manifest/manifest-1.1.json" --cs --luisFolder "<HelloSkill へのパス>\Deployment\Resources\LU"
```
2\. [LUIS ポータル](https://www.luis.ai) より Dispatch にスキルが追加されている事を確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/4f5c6d84-2593-ed0b-11ab-e2d22eec5319.png)

3\. publish.ps1 で変更を公開。

```shell
.\Deployment\Scripts\publish.ps1 -name kenakamumyassistant-qbp5igb -resourceGroup  kenakamumyassistant
```

4\. エミュレーターより接続して動作を確認。「test dialog」以降でスキルが呼び出されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e67ede54-13f1-829b-6448-98edb65e72ad.png)

# まとめ

今回はまずソリューションをテンプレートのまま作成して構成しました。次回は展開スクリプトや作成されたソリューションの詳細を見ていきます。

[次の記事へ](https://qiita.com/kenakamu/items/cc2b97e9a7b07d73cb6c)
[目次に戻る](https://qiita.com/kenakamu/items/6dc043cfc1f199032883)