Bot Framework Composer で チャットボットをノンコーディング開発 (3) Language Understanding (LUIS) で自然言語処理を追加

Bot Framework Composer は、Bot Framework をベースとしたチャットボットアプリを GUI で作成するツールです。ダイアログの作成や LUIS や QnAMaker を利用した自然言語処理の組み込みをノンコーディングで作成できます。

- Bot Framework Composer で チャットボットをノンコーディング開発 シリーズ
    - (1) [ひとまず EchoBot 編](https://qiita.com/annie/items/93ffbbc2f0981257751e)
    - (2) [Dialog (+ユーザー入力、外部 API 利用、条件分岐) 編](https://qiita.com/annie/items/076994fdaabed0de00f6)
    - (3) [Language Understanding (LUIS) で自然言語処理を追加 編](https://qiita.com/annie/items/bae1067ff3adbe820d08)
 (このページ)

今回は Bot Framework Composer を使って、自然言語処理 (入力された文章の分類) を行う Cognitive Services Language Understanding (LUIS) のエンジン(LUIS App) を作成し、チャットボットに組み込みます。

引き続き、例として今の天気 or 天気予報 を返答するチャットボットを作成します。
今回は、初めに入力された文章を分類して、その分類(挨拶、今の天気、天気予報) を元に返答や動作が異なるようにします。

- 準備
    - Bot Framework Composer
    - Microsoft アカウント
- 手順
    - 1. LUIS のサブスクリプション情報設定
    - 2. LUIS Intent の設定、 Intent ごとのトリガー設定
    - 3. LUIS への Publish 設定
    - 4. チャットボットの起動 (と LUIS への Publish)、動作確認

# 準備

- Bot Framework Composer
    - [(1)ひとまずEchoBot編](https://qiita.com/annie/items/93ffbbc2f0981257751e) の手順で、ダウンロード＆インストールしておきます
    - [(2) Dialog編]((https://qiita.com/annie/items/076994fdaabed0de00f6)) の手順で作成した WeatherBot を利用しても構いません。

- Microsoft アカウント
    - (新規で取得する場合) Microsoft アカウント登録手続き
    - 初めて LUIS を利用する場合は、[LUIS 初期設定](https://qiita.com/annie/items/5fdc9030521f8a0ed61c#%E8%A3%9C%E8%B6%B3-luis-%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A) の手順で初期設定を行っておきます
    - LUIS の Deply 情報
        - [LUIS Portal](https://www.luis.ai/) にアクセスしてサインイン、画面右上の **?** をクリックして User Settings を表示します。*Starter Key* に表示されている Region, Primary Key, Endpoint URL の値をコピーしてローカルに保存しておきます
        - ![20191220_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/2ad32ac4-682f-3d06-6915-02c9d8c908d5.png)


# 手順

## 1. チャットボットアプリに LUIS Intent を設定

[(1)ひとまずEchoBot編](https://qiita.com/annie/items/93ffbbc2f0981257751e) の手順で、Bot Framework Composer を起動し、ブラウザーで開きます。
Home 画面の [+New] をクリックします。

![20191113_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a65ed1d8-da35-57ef-5568-d6944db9a69b.png)

*Create from scratch?* ダイアログボックスが表示されるので、**Create from scratch** に✔(チェック)をつけて 右下の **[Next]** をクリックします。

![20191113_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/24fa89f3-e3c7-b0fd-5796-18f1f7cc1a20.png)

*Define conversation objective* ダイアログボックスで、必要事項を入力します。

- Name **[必須]** : お好きな名前を入力してください。ここでは **WeatherBot** と入力
- Description : お好みで入力
- Location : (デフォルトのままで構いません。必要に応じて変更してください)

入力できたら、右下の **[Next]** をクリックして初期設定を完了します。

![20191113_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/0c1772f3-29e9-c2a3-2077-3ef7c2dd63aa.png)

チャットボットアプリの名前.Main (ここでは *WeatherBot.Main*) と表示されたフロー画面が表示されます。
WeatherBot.Main が選択された状態で、右パネルに表示される *Language Understanding* の欄で *Recognizer Type* のドロップダウンボックスから **LUIS** を選択します。

![20191220_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/cd2cc751-f831-6c83-faa6-0f9c09478b16.png)

*Recognizer Type* の下にあるテキストボックスで、ユーザーから入力される文章の分類名 (Intent) とその例文を入力します。
例えば、ユーザーから入力される文章を Greeting (挨拶など) | CurrentWeather (今の天気を取得したい旨の文章) | WeatherForecast (天気予報を知りたい旨の文章) の3種類に分類したい場合は、以下のように Intent (先頭に **#** をつける) と例文 (先頭に **-** をつけて Intent の後に列記) といったフォーマットで記載します。

```
# Greeting
- hi
- こんにちは
# CurrentWeather
- 今日の天気
- 今の天気を教えて
# WeatherForecast
- 天気予報
```

![20191220_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/19486afd-9d99-f412-e284-af709cdd1092.png)

## 2. 判別された Intent によって起動する Trigger の設定

ユーザー入力 を LUIS で分類した結果 (Intent) を用いて、それぞれ違うアクション (Trigger) を設定できます。

### 2.1 "Greeting" Intent のアクションの設定

画面左側の Trigger | Dialog メニューにある **(+) New Trigger..** をクリックします。

![20191220_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/88c54341-42d7-a4c1-2d18-3ec7b0856f53.png)

*Create Trigger* ダイアログボックスで、以下のように設定します。

- What is the type of this trigger?: **Intent** を選択
- Which intent do you want to handle?: 1. で設定した Intent (ここでは **Greeting**)

**[Submit]** をクリックして Trigger を作成します。

![20191220_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/948b86a1-a89e-02ce-11cd-ad31d4b1d9c4.png)

**Greeting** という Trigger が作成されて表示されます。ユーザー入力 の Intent が "Greeting" であった場合の処理を設定します。

画面中央でデフォルトで作成されている *Greeting* という Trigger の下にある (+) をクリックし、表示されるメニューから **Send a Response** を選択します。

![20191220_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/e9d2ad43-b673-cc9f-2732-c2f0702d2a62.png)

画面右側に表示される Send a response ペインに返答を入力します。
"Greeting" Intent であることが分かるように挨拶を入力してみました。

![20191220_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/26082837-8188-d4eb-9053-a673299528e6.png)

### 2.2 "GetWeather" Intent のアクションの設定

Greeting Intent と同じ要領で他の Intent のアクションを設定します。

[(2) Dialog編]((https://qiita.com/annie/items/076994fdaabed0de00f6)) の手順で作成した *GetWeather* Trigger (と *getCurrentWeather* Dialog) を再利用する場合は、*GetWeather* Trigger をクリックして表示、右パネルに表示される **Intent** のドロップダウンボックスで適切な Intent (ここでは **CurrentWeather**)を選択します。

![20191220_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/d395a33a-4b8e-1722-8706-db09173de191.png)

または "Greeting" Intent と同様に **Send a Response** で (別の) メッセージを表示しても良いでしょう。

### 2.3 "WeatherForecast" Intent のアクションの設定

Greeting Intent と同じ要領で Intent のアクションを設定します。**Send a Response** で "こちらの機能は実装中" というメッセージでも、[(2) Dialog編]((https://qiita.com/annie/items/076994fdaabed0de00f6)) を参考に天気予報を取得、表示する Trigger | Dialog を作成しても良いでしょう。(天気予報編は後日追加します)

## 3. LUIS への Publish 設定

Bot Framework Composer で設定した Intent の定義を用いて LUIS App を作成、Publish して　Web API として利用できるようにするための Publish 設定を行います。

画面の左メニューバーの一番下、歯車マークの Setting (設定)をクリックします。

![20191220_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/fb046a6c-18e6-df40-9600-7fb2e136dde4.png)

Settings の画面で、**Show keys** をクリックしてオンの状態にして入力できるようにします。
LUIS 設定部分で、以下の情報を追加(または変更)します。

- **name**: LUIS App の名前。お好みのものを。(ここでは **WeatherBot201912** という名前にしています)
- **authoringKey**: ローカルに保存しておいた LUIS の Primary key
- **authoringRegion**: ローカルに保存しておいた LUIS の Region
- **defaultLanguage**: ja-jp

```
:
  "luis": {
    "name": "WeatherBot201912",
    "authoringKey": "YOUR_LUIS_PRIMARY_KEY",
    "endpointKey": "",
    "authoringRegion": "westus",
    "defaultLanguage": "ja-jp",
    "environment": "composer"
  },
:
```

![20191220_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/7892f08c-fb77-4891-dd69-36746b3a4a1b.png)


## 4. チャットボットの起動 (と LUIS への Publish)、動作確認

作成したチャットボットを起動して、Bot Framework Emulator から動作を確認します。
チャットボットの(再)起動時に LUIS への Publish が行われます。

Bot Framework Composer の画面右上の **[Start Bot]** (または **[Restart Bot]**)をクリックします。

![20191220_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/e50a9372-accc-d552-80f5-b31d6a587729.png)

*Publish LUIS models* ダイアログボックス が表示されるので、**[OK]** をクリックして、LUIS への Publish を行います。

![20191220_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/3bbf5cf5-caaa-77f8-2bdf-74cc280ed601.png)

[Start Bot] が [Restart Bot] という表記に変わり、 その横に表示される Test in Emulator をクリックして、Bot Framework Emulator を起動します。

![20191220_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/505c0088-4d29-5f36-abd6-41c385690327.png)

Intent の例文として入力した文章(やそれに類する文章) を入力し、"Greeting" Trigger や "GetWeather" Trigger に設定した動作(メッセージ表示など) が確認できれば完成です。

![20191220_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/e3528d6f-e1c0-e298-039d-1aa119372baf.png)