Rubyから使うCHATBOT（Dialogflow）

# 1. はじめに
**Ruby**から使えるCHATBOTの使い方について紹介していきます。

CHATBOTには**Dialogflow**を使用します。
googleが提供しているサービスで、慣れれば簡単に使えそうです。
Dialogflowの設定の説明はしてますが、項目の意味などの説明は省略してます。

コロナ禍で、CHATBOTの需要も増えてきているそうなので、
サービスにCHATBOTの導入を検討されている方の参考になればうれしいですね。

## 1-1. Dialogflowとは
<img width="400" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/e918690a-6e9b-7904-61ca-a0f6d711ad1c.png">
https://cloud.google.com/dialogflow/docs
> Dialogflow は、会話型のユーザー インターフェースの設計と、モバイルアプリ、ウェブ アプリケーション、デバイス、ボット、対話型の音声応答システムなどへの統合を容易にする自然言語理解プラットフォームです。Dialogflow を使用すると、新しい形の操作方法をユーザーに提供できます。

### プラン
https://cloud.google.com/dialogflow/pricing
無料プランで、テキスト180リクエスト/分の枠があり、検証には十分なボリュームがあります。

### 上限
https://cloud.google.com/dialogflow/quotas
インテント（会話）数が2,000までなので、大きいサービスには物足りないかも・・ぐらいですが、こちらも十分ですね。

# 2. DialogflowでCHATBOTを作成

まずは、DialogflowでCHATBOTの作成をしていきます。
既に作ってあるよーって人はさらっと読み飛ばしてください。

## 2-1. エージェントの作成

エージェントを作成します。エージェントはCHATBOTの単位です。
別のCHATBOTを作成したい場合は、もう一つエージェントを作成するという感じですね。

### DialogFlowにアクセス
- 下記のURLにアクセスして、ログインします。

https://dialogflow.cloud.google.com/
<img width="400" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/00321bcb-1115-684c-49a1-b199052c5b75.png">

### エージェントの作成
- メニューから **[Create new agent]** をクリックします。
- エージェントの情報を入力します。
    - **agent名**、**LANGUAGE**、**TIME ZONE** を入力します。
    - **GOOGLE PROJECT** は自動で生成されます。**GCP（GoogleCloudPlatform）**に、このエージェント用のプロジェクトが生成されるので、エージェントを削除する時はGCPのプロジェクトの削除も忘れないように注意しましょう。

<img width="600" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/1cc00161-cbb7-5087-1861-befc81e9ee09.png">

- **[CREATE]**ボタンをクリックすると、エージェントが生成されます。

### インテントの作成
インテントとは、CHATBOTにおける会話にあたります。
エージェントを作成すると、既に「**Default Welcome Intent**」というのが自動で生成されているので、今回はそれを使用します。インテントについての詳しい説明は割愛しますので、ググってください。

> **Default Welcome Intent について**
> 「久しぶり」「こんにちは」「やあ」などの会話を受けると、「こんにちは！」と返すインテントです。

# 3. 認証情報の取得
RubyプログラムからDialogflowにアクセスするための**鍵ファイル**を生成します。

## 3-1. GoogleProjectを開く

### GoogleProjectにアクセス
- Dialogflowのメニューから**[歯車]**ボタンをクリック

<img width="200" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/4846d790-ae08-1be3-0ff5-4e8303f20c83.png">

- **Project ID にあるリンク**をクリック

<img width="600" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/9898b8c5-fa9f-1ea5-4b54-75bd0639c0b1.png">

## 3-2. 鍵を作成

### サービスアカウントにアクセス
- GoogleProjectの画面になったら、メニューから**[IAM]>[サービスアカウント]**をクリック

<img width="600" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/93ff7efc-e4a7-053a-b111-1e606747af96.png">

### サービスアカウントを作成
- **[サービスアカウントを作成]**を クリックします。
- サービスアカウントの詳細を入力します。
    - **サービスアカウント名**、**サービスアカウントID** を入力します。

<img width="600" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/57107d96-3dc9-5bb5-9db8-ffe0b44b8a98.png">

- **[作成]** ボタンをクリックします。
- サービスアカウントの権限を入力します。
    - **ロール**に、**Dialogflow API管理者** を選択します。

<img width="600" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/5d2f1799-e945-1f4f-9a3f-be3aeeebb043.png">

- **[続行]** ボタンをクリックします。
- 次の画面では、何も入力せずに **[完了]** ボタンをクリックします。

### 鍵を作成
- サービスアカウント一覧画面から、作成したサービスアカウントの**操作**から、**[鍵を作成]** をクリックします。
- 秘密鍵の作成画面で **[JSON]** を選択し、**[作成]** をクリックします。

<img width="600" alt="dialogflow" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/113289/6eb9734e-c4a7-5ae9-5708-bbfa75300a84.png">

すると、JSONファイルがダウンロードされます。
このJSONファイルは、Rubyプログラムを実行する時に使用します。

ダウンロードしたファイルを **milky-agent-xxxxx.json** とします。

# 4. Rubyプログラムを作成

ようやくRubyの話です。
Rubyの実行環境は既にある前提で書いてます。

最初に実行に必要な環境を整えてから、プログラムを実行します。

## 4-1. パッケージインストール

### 環境変数の設定
- JSONファイルを適当なディレクトリに置いて、環境変数に登録します。
**GOOGLE_APPLICATION_CREDENTIALS** に登録することで、プログラム実行時に自動で読み込んでくれます。

```
/// milky-agent-xxxxx.json を ~/tmp ディレクトリに置いたとします。
$ export GOOGLE_APPLICATION_CREDENTIALS=~/tmp/milky-agent-xxxxx.json
```

### パッケージのインストール

- Dialogflowへのアクセスに必要なgemをインストールします。

```
$ gem install google-cloud-core
$ gem install google-cloud-dialogflow
```

## 4-2. プログラム

実行するプログラムを以下に書いてます。
**project_id** と **session_id** は GCPプロジェクトからコピペしてください。

```ruby:milkybot.rb
project_id = "[GCPのプロジェクトID]"
session_id = "[サービスアカウントのキーID]"
text = "こんにちは"
language_code = "jp"

require "google/cloud/dialogflow"

session_client = Google::Cloud::Dialogflow.sessions
session = session_client.session_path project: project_id,
                                      session: session_id

query_input = { text: { text: text, language_code: language_code } }
response = session_client.detect_intent session:     session,
                                        query_input: query_input
query_result = response.query_result

puts "Query text:        #{query_result.query_text}"
puts "Intent detected:   #{query_result.intent.display_name}"
puts "Intent confidence: #{query_result.intent_detection_confidence}"
puts "Fulfillment text:  #{query_result.fulfillment_text}\n"
```

# 5. 実行

- プログラムを実行します。

```
$ ruby milkybot.rb 
Query text:        こんにちは
Intent detected:   Default Welcome Intent
Intent confidence: 1.0
Fulfillment text:  こんにちは！
```

上記のように表示されたら、成功です！
プログラム内の **text** を「久しぶり」「やあ」などに変更してみてください。同じ返答になると思います。

あとは、Dialogflowの方でいろんな会話を登録すれば、自分の好きなCHATBOTを作成することが出来ます。
調査は大変でしたが、やってみると意外と簡単でした。