Einstein botsの「質問」を使ってケースレコードを作成する方法

Einstein Botsを構築していくにあたって日本語での情報がなかなかないため、知識のアウトプットも含めて今回記事を作成してみました。

# はじめに
今回はEinstein Bots（以降Bot）の**質問（questions）**という機能と**フロー**を組み合わせてケースレコードを作成していきます。

なお今回はBotsの構築部分については割愛させていただきます。構築については下記のTrailheadを実施することで可能です。

https://trailhead.salesforce.com/ja/content/learn/projects/build-an-einstein-bot

# 全体像
Botsが質問でユーザからの回答を取得し、回答をフローの変数に格納します。その値を元にフローでレコードを作成しチャットのトランスクリプトIdをケースレコードに紐付けてupdateして作成完了したレコードのIdとナンバーをBot側で表示させます。

# 手順
## 1.ケースを作成するフローを作成する。
まずはじめにEinstein Botsの質問で使用するケースレコードを作成するためのフローを作成します。

なおEinstein Botsを有効化するといくつかのフローが自動的に作成されます。

- Intro Bot - Add Case Comment
- Intro Bot - Create Case
- Intro Bot - Create Lead
- Intro Bot - Get Pre-Chat Context
- Intro Bot - Lookup Case
- Intro Bot - Lookup Order

今回はこのうちのIntro Bot - Create Caseを利用していきます。

内容を確認していきます。フローの全体像はこのようになっています。今回はこのフローを特にいじらずこのまま利用していきます。
![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/fd3b82c7-6d0d-7227-a6ec-cc0628004b3c.png)

次にBotでレコードを作成する際に必要な特有の設定について紹介していきます。
※通常のレコード作成、取得、値の更新方法については割愛させていただきます。

### ①Create Case
Botからの入力値を利用してレコードを作成します。
変数にて「入力で使用可能」にチェックを入れることでBot側のフローの設定で値をこの変数に格納することができます。逆に出力で使用可能にチェックすることでフローで作成した値をBotに渡すことができます。
![flow variable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/4b60b28f-1bf7-bc84-ba3f-9d773076cb89.png)

### ②Update Chat Transcript with Case
ここではチャットのトランスクリプトレコードにケースレコードを紐づけています。Botとユーザの会話は「チャットのトランスクリプト」レコードとして保存されます。これによりケースを送るまでにユーザがどのようなやりとりをボットと行ったか確認することができます。


## 2.ケース作成を行うダイアログを作成
ダイアログ管理ページの下記ボタンで「新規ダイアログ」を選択します。
![where is the add dialog button.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/a18d2847-ecc7-5ea1-0ef4-4b2df5909a70.png)

任意のダイアログ名とAPI参照名を設定します。
![create case.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/9dd1caea-fac0-8048-7ac0-9116f2f1ff52.png)

これでダイアログのベースは完成です。次に質問を作成していきます。
![base dialog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/5f289cc3-81b7-90a1-d9fe-275e87b9119b.png)

## 3.質問を追加してレコード作成に必要な情報を収集する。
今回は質問を使って「件名」「Web 会社名」の2つの情報を取得していきます。

### 質問の作成
下記ボタンから作成します。
![create question.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/764d11a1-d4e6-d63f-622c-52c3018c0e88.png)

するとこのようなものが表示されます。今回は基本的な部分のみ説明します。
![question detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/0d974575-dc05-d447-4f80-188df09547aa.png)

#### ①ボットによる質問
ボットがユーザに入力して欲しい情報を聞く部分になります。こちらは必ず入力が必要です。

#### ②エンティティ名
ユーザが入力する回答のデータ型を指定することができます。正規表現を用いることによって良い細かくユーザへ求める情報をコントロールすることができます。なお型と違うデータが入力された場合は回答の修正をユーザに促すことができます。

#### ③変数に回答を保存
ユーザが入力した回答を保管する変数を選択します。

#### ④顧客の入力から回答を認識して保存します
特定のユーザ入力から値を読み取り質問をスキップするという機能です。

これはBotを高度に構築していった場合に例えばユーザがECサイトのチャットボットで「番号12345の配送状況を調べて」と自由入力したとします。すると荷物を調べるためにケースを作成するダイアログが発生するとします。そのダイアログの中に荷物の番号を聞く質問を用意している場合は**Einstein Botsが学習して荷物の番号を質問するステップを飛ばすことができる**というものです。

#### ⑤変数にすでに値が含まれている場合：
変数に回答が格納されている場合、質問するかしないか設定する機能です。スキップを選択した場合は変数に回答が格納されている時その質問をスキップすることができるということです。例えば`companyName`という変数に値がすでに格納されている時、仮に同じ質問を行ったとしても変数に回答はあるのでスキップされるということです。

#### ⑥会話の修正
エンティティを活用してユーザに回答の修正を促す際に利用します。エンティティの活用方法についてはまた別の記事で紹介したいと思います。

#### ⑦選択種別・静的
「はい」や「いいえ」といったユーザの自由回答ではなく、こちらで回答を制御したい場合に利用します。今回は自由入力回答しか使用しないため、使用いたしません。


### 「件名」の質問作成
件名についての質問は今回このように作成いたしました。会話の修正や選択種別の設定などは特にしておりません。
![after create question.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/eb6c3ed2-19b8-3c50-c4c0-2ea3e08861f6.png)


変数についてはこのような設定になっています。
![create variable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/9392d5c7-2f30-07a1-1ae6-b1bb0f071057.png)

### 「Web 会社名」の質問作成
同じ動作を「「Web 会社名」に対しても行います。そうすると現時点で下記2つの質問が作成されているはずです。
![after created questions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/d96ec144-b21d-76e2-1cb5-91b665aaf23e.png)


以上で質問の作成は完了です。最後に作成したフローを追加します。

## ４.フローの追加
フローの追加は下記ボタンから実施します。
![choice action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/268eb10f-7813-99c0-c43e-39c86577781d.png)

フローを選択します。「Create Case」を選択します。
![choice flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/14413c3a-6e2f-e345-cc45-4bcc4c02518c.png)

するとこのような画面が表示されます。**「入力」「出力」というところでグレーにハイライトされているのはフロー側の変数名です**。そして右側に書いてある「変数名を選択」でBot側で作成した変数を選択してあげると**「入力」の場合はフロー側でその変数の値が使用されることになります。一方「出力」ではフロー側で設定した値をBotに渡すことができます。**

なおソースには値と変数2つあり、値であれば直接入力、変数であれば変数選択となります。
![flow detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/a052e165-9885-201a-2c30-155443acef6a.png)


変数を設定するとこんな感じになります。
![set flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/e316a5f1-4e6c-9507-9064-092ac4434ed3.png)
[コンテキスト]レーティング可能IDというのが設定されていますが、これは**チャットのトランスクリプトID**になります。これをケースに紐づけることで**ケースレコードを作成したユーザがBotとどのような会話を行ったか確認することができます**。

今回はレコードが作成された後にケースのIdとナンバーも表示してみるために出力に変数を設定してみました。（出力については設定しなくてもケースは作成できます。）

### 作成したケースの情報を表示する場合
ケースの情報を表示するにはフローの出力を格納した変数とメッセージ機能を利用します。下記のように`{!変数名}`とメッセージ内に記述することで表示することができます。
![display case info.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/8304e2c4-1241-64df-a6c5-90fadaae89ae.png)

## 5.動作確認
Botを実際に動かしている様子は下記gifで確認できます。
![create case.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/376dc663-a6a6-c39b-2032-178582ad760d.gif)

レコードIdと割り当てられた数字が表示されているのが確認できます。
実際にレコードを見てみると下記のようにしっかり作成されていることが確認できます。
![case detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584197/ce3c8616-2ab0-6207-ddf8-b1bd16c0fde1.png)


以上の設定でケースを作成することができました。

# 最後に
Einstein Bots に関しては他の製品と比べて日本語の情報が少ないので今後も継続的にナレッジを記事化していきたいと思います。
最後まで読んでいただきありがとうございました！