Dialogflowを使ってみる

## はじめに

[Dialogflow](https://cloud.google.com/dialogflow)でどんなことができるか、実際にチャットボットを作って確認してみたいと思います。

## Dialogflowの種類

まずDialogflowは２つのエディションがあるので確認します。(2020/12/21時点)

エディション | コメント
---------|----------
CX (Customer Experience Edition) | 高度なエージェント タイプで、大規模なエージェントや非常に複雑なエージェントに適しているとのこと。料金高め。テキストで月あたり`100 チャット セッションあたり $20`。日本語未対応。
ES (Essentials Edition) | 標準のエージェント タイプ。料金は`1 リクエストあたり $0.002`。日本語対応している！


今回はESを使います。
エディションの詳細は [ドキュメント](https://cloud.google.com/dialogflow/docs/editions)を参照してください。

## 何を作るか

「来週月曜に私用で休みます」と伝えると、次の項目を判別してくれるような休暇連絡チャットボットを作ります。 

- 日付
- 勤怠種類
    - 有給休暇
    - 欠勤（無給休暇）
- 理由
    - 私用
    - 体調不良

また、ボットがわからなかった項目があればユーザーに聞き返します。

イメージはこのような感じです。
<img width="400" alt="スクリーンショット 2020-12-21 16.49.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/870683/4651e7e9-e45e-8a95-2625-11ecb1f39700.png">

## Dialogflowで作ってみる

それでは早速作っていきます。

### まずエージェントを作成する

Dialogflowを開くとこのような画面が表示されます。
![スクリーンショット 2020-12-21 14.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/870683/54adbe39-7077-81d7-a00d-3aa43eb3cf3e.png)

Create Agentを押して登録します。DEFAULT LANGUAGEをJapanese - jaにします。

![スクリーンショット 2020-12-21 14.03.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/870683/4f51de41-6c12-bdb4-466c-170457b97f94.png)

### エンティティを作成する

次にエンティティと呼ばれる単語辞書を登録していきます。今回は`勤怠種類`と`理由`がこれにあたります。
ユーザーが「有給」と省略しても「有給休暇」とボットが認識できるように言い換え表現を入れていきます。

Dialogflow > Entities を開いて [CREATE ENTITY] ボタンを押して登録します。

`勤怠種類`は次のように作りました。

![スクリーンショット 2020-09-14 15.58.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92665/bf22f213-c7f5-4a66-dc44-34273746e31a.png)

`理由`は次のようにしました。

![スクリーンショット 2020-09-14 16.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92665/c038e77f-7d91-732a-2534-865f584a0dc7.png)


### インテントを作成する

インテント（意図）はユーザーの会話を分類する単位です。
今回はユーザーが休暇連絡について話しているか分類できるように登録していきます。

Dialogflow > Intents を開いて、[CREATE INTENT] ボタンで「Day off reporter intent」という名前でインテントを保存します。
Training phrasesの欄に、ユーザーがどのように話しかけてくるかを想像して文章を登録していきます。

![スクリーンショット 2020-09-14 15.55.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92665/e63c9bb9-933b-81e2-2e8a-090360421895.png)

このとき、さきほど登録したエンティティがマッピングされて色付きでマークされます。
もし意図した単語がマークされていなかったらその単語を選択してエンティティに結びつけてください。


### 聞き返しを設定する

ボットが理解できない項目があったら、ユーザーにどのように聞き返すかを設定していきます。

- `日付`がわからない場合は「いつですか？」
- `勤怠種類`がわからない場合は「休暇種別はなんですか？（有給休暇、欠勤）」
- `理由`がわからない場合は「理由を教えてください（体調不良、私用）」

と聞き返すように設定していきます。

![スクリーンショット 2020-09-14 15.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92665/7c60e95a-1d14-692d-5190-d531a00ee070.png)

### 最後にどのように応答するかを設定する

今回は`日付`、`勤怠種類`、`理由`をボットがどのように理解したかわかるように応答するようにしました。

Dialogflow > Intents でDay off reporter intentを開いて、Responses部分に設定します。

![スクリーンショット 2020-09-14 16.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92665/398728b6-03d0-6cdf-8cef-1ff5cae76838.png)


## テストする

事前に、Integration > Web Demo を有効にして、URLを取得します。

URLを開き、テストします。

![screen-recording.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92665/97a50053-5ba3-cc98-0d97-5532e93758f3.gif)

正しく動作しているようです。


## Dialogflowのその他の機能

### Knowledge

Beta版の機能で、csvやhtmlをアップロードしてQAチャットボットが作れるようです。残念ながら現在は日本語には対応していませんでした。日本語対応したらぜひ使ってみたいとおもいます。

### 複数のIntent

インテントは通常複数作成します。休暇連絡ができたら次は遅刻連絡のインテントを作るといった具合です。今回は試しませんでした。

### Fulfillment

外部のAPIを呼び出すことができます。通常ユーザーからリクエストを受けたら他のサービスを更新したくなると思います。今回の例でいうと休暇であることをGoogle Calendarに登録する、Slackのステータスを休暇に変える、勤怠システムに休暇申請を出す、などです。そのような場合に、休暇連絡のIntentと結びつけてFulfillmentを登録します。


## さいごに

ここまでコードを書くことなく実現できているのにお気づきでしょうか。Dialogflowを使ってユーザーが投げかけてくる投稿を理解するところまではノーコードで設定できるようです。この先もう一歩進めて、他のシステムに連携する場合は少しコードを書かないといけないですが数行でおさまる範囲なのでちょっとがんばればできそうです。

簡単にチャットボットが作れそうだな、おもしろそうだな、と思ってもらえたらうれしいです。

最後までありがとうございました。