対話フローを作成したい
はじめに
本書では、コーパス学習データを対話フローで作成する手順について説明します。
チャットボットと自然な対話となるようなフローを構築することで、ユーザーが求める情報を得やすくなります。
まず初めに対話フローの基本的な動作の説明を行っています。その次に、対話フローのサンプルフローについて説明を行います。対話フローのサンプルフローには、「分岐型対話フロー」と「オーダー型対話フロー」の2つがあります。
※詳細は、その他留意点の記述を参照してください。
以下の手順を順に実施することで、「分岐型対話フロー」と「オーダー型対話フロー」をそれぞれ作成することができます。
分岐型対話フロー作成手順
-
エンティティの登録
-
対話フローの作成
-
対話フローの保存
オーダー型対話フロー作成手順
-
エンティティの登録
-
対話フローの作成
-
対話フローの保存
今回は基本的な動作の説明と2つのタイプの対話フローのサンプルを作成しながら作成の手順を紹介します。
基本動作
ボタンの説明

キャンセル
一時保存データを削除して学習データ一覧画面に遷移します。
反映して終了
本番データを登録し、一時保存を削除して学習データ一覧画面に遷移します。
一時保存して終了
一時保存をして学習データ一覧画面に遷移します。
一時保存して継続
一時保存して、学習データ一覧画面に遷移せずそのままフロー編集をする時に使用します。
削除
一時保存と本番データを削除(状態が対話から一問一答になります)してから学習データ一覧画面に遷移します。
※自動保存機能について
フロー編集画面では3分毎に一度、自動的に一時保存されます。
フロー編集再開時のポップアップ機能について
フロー編集画面を開いたときに一時保存データがある場合には、再開を問い合わせるポップアップが表示されます。

更新時刻:最後に更新された時刻を表示しています。
更新者:最後に更新したアカウントを表示しています。
「キャンセル」をクリックすると学習データ一覧画面に遷移します。
「はい」をクリックすると一時保存データからフロー編集を再開することができます。
「いいえ」をクリックすると一時保存データを削除し、保存してある本番データからフロー編集を開始します。
直前に編集していたユーザー以外でフロー編集を開いた場合
直前に編集していたユーザー以外がフロー編集を開いた場合には以下の動きをします。
・最終の一時保存から3分を経過している場合
上項で説明しているフロー再開時のポップアップが表示され、フローの編集を行う事ができます。
・最終の一時保存から3分を経過していない場合
警告が表示され、フローの編集を行う事はできません。
※警告の表示例

OKをクリックすると学習データ一覧画面に遷移します。
操作説明(分岐型対話フロー作成手順)
分岐型対話フロー作成手順
下図のように「はい」と「いいえ」で分岐する対話フローの作成手順を紹介します。

エンティティの登録
まず対話の分岐に使用するエンティティの登録を行います。
※ワークスペースとコーパス学習データは一問一答の際と同様に作成します。
-
左のメニューから「ワークスペース」をクリックします。
-
ワークスペース一覧で分岐型対話フローを登録したいワークスペースをクリックします。
-
「エンティティ」タブをクリックします。
エンティティ一覧画面で以下のようにエンティティを登録します。
-
エンティティ入力欄にエンティティ名を入力します。
(今回の例では「yes_no」と入力) -
エンティティの値入力欄にエンティティの値を入力し、登録ボタンをクリックします。
(今回の例では「yes」と「no」をそれぞれ登録) -
必要であればエンティティの詳細値入力欄に詳細値入力し、登録ボタンをクリックします。
(今回の例では「yes」の詳細値に「はい」、「no」の詳細値に「いいえ」をそれぞれ登録)


対話フローの作成
次に対話フローを作成します。
-
「学習」タブをクリックします。
-
対話フローの登録を行いたい回答クラスのフローボタンをクリックします。
-
「サンプルフロー1 分岐型テンプレート追加」を選択します。

分岐型対話フローの詳細入力画面になるので、以下のように詳細情報を入力します。
まず、回答ノードの設定を行います。
-
チャットボットの聞き返し入力欄に聞き返しの内容を入力します。
※入力する値に$または@を使用する場合は$,@の直前に\を入力してください($または@の直後に文字がある場合のみ)
※「チャットボットの聞き返し」は対象フローが回答された際に表示する回答文です。
(今回の例では「「はい」と「いいえ」で分岐する対話フローです。」と入力)
次に、条件ノードの設定 を行います。
-
エンティティ選択欄にエンティティを選択します。
(今回の例ではa.エンティティの登録で登録した「yes_no」を選択) -
比較演算子選択欄で設定したい分岐の条件と一致する演算子を選択します。
※比較演算子選択欄はエンティティの選択後表示されます。
(今回の例では「is」を選択) -
エンティティの値選択欄で設定したい条件と一致するエンティティの値を選択します。
※エンティティの値選択欄は比較演算子の選択後表示されます。
(今回の例では「yes」を選択) -
条件の回答入力欄に上記設定で設定した条件に分岐した際に表示する回答文を入力します。
(今回の例では「「はい」が入力されました。」と入力)
※入力する値に$または@を使用する場合は$,@の直前に\を入力してください($または@の直後に文字がある場合のみ)

同様の操作を分岐したい回数だけ繰り返して条件ノードを設定します。
※エンティティ選択欄の右にある、プラスマークアイコンをクリックすることで追加の条件ノードを設定できます。
(今回の例ではエンティティ「yes_no」比較演算子「is」エンティティの値「いいえ」のとき、条件の回答が「「いいえ」が入力されました。」となるよう条件ノード設定を追加)
- 必要な条件を入力後、作成ボタンをクリックします。
対話フローの保存
反映して終了ボタンをクリックし、対話フローを保存します。
※いづれかの条件ノードにanything_elseを設定している場合には、ノードの配置場所にかかわらず必ず順位の最後に判定されます。

オーダー型対話フロー作成手順
下図のように「東京」などの入力を保存する対話フローの作成手順を紹介します。

エンティティの登録
まずオーダーの入力に使用するエンティティの登録を行います。
※ワークスペースとコーパス学習データは一問一答の際と同様に作成します。
-
左のメニューから「ワークスペース」をクリックします。
-
ワークスペース一覧でオーダー型対話フローを登録したいワークスペースをクリックします。
-
「エンティティ」タブをクリックします。
エンティティ一覧画面で以下のようにエンティティを登録します。
-
エンティティ入力欄にエンティティ名を入力します。
(今回の例では「入力」と入力) -
エンティティの値入力欄にエンティティの値を入力します。
(今回の例では「自由入力」と入力) -
登録ボタンをクリックします。
※このとき、「正規表現を使用する」にチェックを入れてから登録してください。 -
エンティティ詳細値に「(.*)」を入力し、登録してください。

対話フローの作成
次に対話フローを作成します。
-
「学習」タブをクリックします。
-
対話フローの登録を行いたい回答クラスののフローボタンをクリックします。
-
「サンプルフロー2 オーダー型テンプレート追加」を選択します。

オーダー型対話フローの詳細入力画面になるので、以下のように詳細情報を入力します。
まず、回答ノードの設定を行います。
-
チャットボットの聞き返し入力欄に聞き返しの内容を入力します。
※入力する値に$または@を使用する場合は$,@の直前に\を入力してください($または@の直後に文字がある場合のみ)
※「チャットボットの聞き返し」は対象フローが回答された際に表示する回答文です。
(今回の例では「オーダーノードに場所の名前を保存します。」と入力)
次に、オーダーノードの設定 を行います。
- エンティティ選択欄に入力用エンティティを選択します。
(今回の例ではa.エンティティの登録で登録した「入力」を選択) - 保存する変数名入力欄にオーダーを保存したい変数名を入力します。
※この変数名を使用して回答文内でオーダーの内容を表示できます。
(今回の例では「basyo」と入力) - 保存する変数名入力欄の右に表示される選択肢(エンティティの値、入力値、両方の値)を選択します。
※選択肢はシステムエンティティでないエンティティを選択した時に表示されます。
※エンティティの値と入力値を同時に取得するには、「両方の値」を選択する必要があります。その場合は保存する変数名をもう一つ入力します。先に指定した変数にエンティティの値、後から指定した変数に入力値が入ります。
(今回の例では「入力値」を選択) - 条件が入力されていない場合の聞き返し入力欄に、対話中に正しくオーダーを保存できなかった場合に表示される回答を入力します。
※入力する値に$または@を使用する場合は$,@の直前に\を入力してください($または@の直後に文字がある場合のみ)

-
回答入力欄にオーダーが保存された後に表示される回答を入力します。
(今回は「$(basyo)ですね。」と入力)
※$(保存する変数名)で変数に保存された値を表示できます。 ※入力する値に$または@を使用する場合は$,@の直前に\を入力してください($または@の直後に文字がある場合のみ) -
作成ボタンをクリックします。

対話フローの保存
更新ボタンをクリックし、対話フローを保存します。

回答に「確信度とフィードバックエリア」の表示・非表示を設定する
最終回答に確信度とフィードバックエリアを表示するか、フローに設定する方法を紹介します。
「分岐型対話フロー」と「オーダー型対話フロー」を作成後、最終回答のみに設定することができます。
フローボタンを選択します。

定型フローなしを選択します。

フローが作成済みであれば対話フローが表示されますので、最後に設置している回答を選択します。

「確信度、フィードバックエリアの表示」制御のスイッチが表示されます。
確信度、フィードバックエリアを表示したい場合はスイッチをON、非表示にしたい場合はスイッチをOFFにしてください。
最後に設置している回答全てに、それぞれ表示・非表示の設定をすることができます。

その他留意点(Tips)
対話フローの種類
- 分岐型対話フロー
ユーザーの入力ごとにメッセージを判断し、会話の流れをコントロールするフローです。

入力した結果で出力するメッセージを変更したり、入力された「はい」/「いいえ」を判断し、処理を中断したりする時に使用します。いずれかの条件ノードにanything_elseを設定している場合には、ノードの配置場所にかかわらず必ず順位の最後に判定されます。
- オーダー型対話フロー
一連の流れでユーザーの入力を促し、タスクを実行するのに必要な情報を集めるフローです。

質問する順序を定義して、必要な情報をユーザーから順番に聞き出します。
このフローでは必要な情報がそろうまで質問を繰り返します。
用語説明
ノード
フローの中のアクションをノードと呼びます。
チャットボットが発言する「回答」ノード、対話の分岐の条件となる「条件」ノードなどがあります。
エンティティ
会話の中でユーザーのアクションが判断できた後に、その対象となる名詞をエンティティと呼びます。
例えば、対話のフローとして天気予報を取得したいときは、正確な予報が返されるように、関連する場所や日付のエンティティが必要となります。
- 標準エンティティ
標準的なエンティティです。
エンティティの値を直接指定するか、エンティティの値の類義語としてエンティティの詳細値を使用します。
- 正規表現エンティティ
電話番号やメールアドレスなどを判定したい場合に使用するエンティティです。
エンティティの詳細値には、マッチさせる正規表現を設定します。
- システムエンティティ
IBM Watson Assistantがシステム上で用意しているエンティティです。
以下のシステムエンティティを使用することができます。
sys-date(日付)、sys-time(時刻)、sys-currency(通貨)、sys-number(数値)、sys-percentage(パーセント)
コンテキスト
対話中に、これまでに入力されたエンティティなどを保持している情報をコンテキスト(CONTEXT)と呼びます。
対話フローが開始されてから終了するまでの間、情報を保持しています。
外部連携
チャットボットだけでは実現できない各種タスクを呼び出すために行う連携のことを外部連携と呼びます。
外部連携は事前に登録済のWeb APIを呼び出して、その結果から抽出した情報をチャットボットの回答として返すことができます。
外部連携の呼び出しパラメータは、主に対話フロー内でコンテキストに蓄えられたエンティティの値を使用します。
認証方式
外部連携で使用できる認証方式は以下になります。
- BASIC認証
username/passwordで認証を行います。
平文で通信を行うため、セキュリティレベルは低いです。
username、passwordで”{{“と”}}”を使い、EMBEDDED ITEMSの参照が出来ます。

- Digest認証
username/passwordで認証を行います。
通信するpasswordでhashを用いるためBASIC認証よりもセキュアです。
username、passwordで”{{“と”}}”を使い、EMBEDDED ITEMSの参照が出来ます。
Realm以降のパラメータは通常は設定不要ですが、特別な値が設定されている場合は書き換えることが出来るようになっています。

- API Key認証
事前に取り決めたAPIキーを使って認証します。HTTPヘッダまたはQueryパラメータのどちらかに設定します。
key、valueで”{{“と”}}”を使い、EMBEDDED ITEMSの参照が出来ます。

- Bearer Token
RFC6750によるBearer Token認証をおこないます。
tokenで”{{“と”}}”を使い、EMBEDDED ITEMSの参照が出来ます。
※3. API Key認証でkey=Authorization/value=Bearer {{token}}/Add to=Headerと指定した時と同じです。

- OAuth1.0
※現在未対応
- OAuth2.0
※現在未対応
- OpenID Connect
※現在未対応
- FIDO認証
※現在未対応
セッションパラメーター
CB3 version3.0からEMBEDDED ITEMSでSOURCEにSESSIONを使用することが出来るようになっています。
この値はチャット画面(またはオムニチャネルBot)で会話のやり取りを行う際のセッションの状態を表しています。
| 項目名 | 型 | KEY |
|---|---|---|
| セッションID※ | string | sessionId |
| ユーザーID※ | string | userId |
| ユーザー名※ | string | userName |
| IPアドレス※ | string | ipAddress |
| チャット番号※ | number | chatNum |
| 質問文 | string | askText |
| 質問文(翻訳後) | string | translatedAskText |
| 質問文(正規化後) | string | normalizedAskText |
| NLC互換モード | boolean | modeNlc |
| 言語※ | string | language |
| ワークスペース指定※ | string | is_corpus_selected |
| ワークスペースID | string | workspaceId |
| 継続中のワークスペースID | string | continuingWorkspaceId |
| 翻訳APIサービス名※ | string | translationApiService |
| チャネルID | string | channelId |
| 回答クラス | string | answerClass |
| 確信度 | number | confidence |
| 回答クラスのテキスト | string | answerClassText |
| 空文字出力フラグ | boolean | skipUserInput |
※初期メッセージとカテゴリ選択時メッセージでも利用可
セッションパラメーターの利用例:
- 外部連携のパラメーターにセッションパラメーターを指定する例
EMBEDDE ITEMSでセッションパラメーターを変数に代入し、Bodyで変数を参照します。


※ここで使用しているAPI(http://cb3-external-api-test-driver-service/noauth/test)はテスト用で渡された情報をJSON形式に変換して返却するものです。
回答文で以下の様にAPIタグを設定します。

- 実行例

サンプルフローで作成した対話フローを合成する
サンプルフローで対話フローを合成することができます。
既に対話フローを保存した回答クラスでサンプルフローを利用して対話フローを作成すると下図のような対話フロー編集画面が表示されます。
二度にわたって作成した対話フローが、それぞれ独立して存在していますがこのままでは対話フローを更新することはできません。
そこで二つ目の対話フローの起点となっている開始ノードを削除し、一つ目の終点となっているノードと接続することで、連続した一つの対話フローとなり更新することができます。
※分岐型対話フローの分岐先それぞれにオーダー型対話フローを接続することも可能です。


オーダー型対話フローでオーダーした値を外部連携で使用する
オーダー型対話フローを利用することで外部連携APIの使用に必要なパラメーターを会話中に取得することができます。
外部連携APIの利用については、マニュアル「外部データを組み込んだ回答を作成したい」を参照してください。
- 外部連携API登録画面のパラメーター入力エリア、EMBEDDED ITEMSタブにオーダーノード作成時に設定した、オーダーを保存する変数を登録します。
- VARNAMEにはパラメータ利用の際の名称を設定します。
- SOURCEには「CONTEXT」を選択します。
- KEYにはオーダーノード作成時に設定した、オーダーを保存する変数を設定します。
- DEFAULT VALUEにはテスト接続時に参照する値を設定します。

- EMBEDDED ITEMSタブに設定したパラメーターのVARNAMEをPARAMSタブやHEADERSタブ、BODYタブで設定することで、外部連携API使用時にオーダーの値を参照できます。

※VARNAMEの設定時には、{{VARNAME}}となるようにパラメーターを囲みます