Classic/VPC環境で利用できます。
CLOVA AiCallシナリオの作成ガイド
シナリオ構築前の考慮事項
シナリオを構築する前にどのようなサービスを提供するのか、どのようなポリシーを講じるのか、APIでどのような情報を送受信するのかなど、詳細サービスを設計してからシナリオを構築してください。シナリオは以下のように3つに大別できます。
- メインシナリオ
- グローバルシナリオ
- リペアシナリオ
各シナリオの用途に応じてサービスを設計した後、音声ボットシナリオの例を参考にしてAiCallシナリオを構築してください。
メインシナリオ
メインシナリオでは、重点的に処理するサービスが何かを定義した後、該当するサービスを提供するためのプロセスを設計します。
-
重点的に処理するサービスが何かを定義してください。
- 予約サービスを処理する音声ボットであったり、単純にFAQをレスポンスするサービスである場合もあります。または、単純に特定内容を告知するための音声ボットを設計する場合もあります。
-
サービスを処理するためにどのような段階が必要なのか、サービスプロセスを定義してください。
-
例えば、予約サービスを処理するためには予約情報の入力を受け、足りない情報を確認し続けた後、収集された情報が正しいか最終的に確認してから予約を処理することになります。
-
そして、段階別にどのような情報を収集してどのような返答を行い、どのような情報をAPIで予約システムに伝達するかを詳細に定義します。
-
-
各プロセス別の詳細ポリシーを定義してください。
- 例えば、団体予約を何人まで音声ボットで受けるか、1つの号に何件の予約まで許可するかなどの詳細なポリシーを定義します。
グローバルシナリオ
グローバルシナリオは、メインシナリオのように重点的に処理するサービスではありませんが、よくあるお問い合わせとリクエストを定義します。メインシナリオを進行中にグローバルシナリオに進入したり、もう一度元のシナリオに復帰する状況が頻繁に発生します。
例えば、運営時間、駐車場のようなFAQから相談員の接続リクエスト、通話終了リクエストなどがあります。
リペアシナリオ
リペアシナリオは、メインシナリオから外れた際にもう一度メインシナリオの流れに戻して、サービスの主な目的を達成できるようにメンテナンスするシナリオを意味します。例えば、ユーザーが応答しないか、ユーザーの意図が不明確な応答をした場合、またはシステムに再発話をリクエストする場合などが該当します。
サービスの方向性に合ったリペアシナリオのポリシーを樹立してください。
AiCall音声ボットシナリオの例
CLOVA AiCall音声ボットシナリオを設定する一般的な手続きは次のとおりです。当該手続きに沿って音声ボットシナリオを設定する方法を例で説明します。
- サービスの目的及びポリシー定義
- シナリオ設計
- メインシナリオ設計
- グローバルシナリオ設計
- リペアシナリオ設計
- AiCallビルダーにシナリオを入力
以下の内容は特定サービスを仮定した例であるため、実際のユーザーのサービス内容に応じて設定内容は異なる場合があります。全体的なシナリオ設定の流れのみ参考にしてください。
1.サービスの目的及びポリシー定義
音声ボットシナリオで提供するサービスの目的とポリシーを以下のように定義します。
- サービスの目的:レストラン予約サービス
- 予約ポリシー
- メインシナリオ
- 新規予約のみ処理。予約確認/変更/キャンセルは相談員を通じて行う
- 一つの電話番号につき一件の予約のみ許可
- 団体予約は10人以内のみ可能で、それ以上の人数は店舗の相談員を通じて行う
- 希望する予約時間が既にフルブッキングの場合、他の時間帯の予約をリクエスト
- 予約は当日から2週間後までのみ可能
- 営業時間ではない場合、相談員につながずに通話終了処理
- グローバルシナリオ
- 通話終了、相談員に接続リクエスト、駐車場・営業時間に関するお問い合わせなどに対応
- FAQのお問い合わせ時に返答レスポンス後、マーカーが設定された以前のシステムの返答をレスポンスして該当する位置に復帰処理
- リペアシナリオ
- 5秒間レスポンスがない場合、レスポンスなしメッセージでレスポンス
- レスポンスなしイベント/意図不明の発話が連続して3回発生した場合、リペアせずに通話終了
- メインシナリオ
2.シナリオ設計
サービスポリシーに基づいて、各シナリオを設計します。
ⅰ.メインシナリオ設計
- 予約情報の保存やユーザー変数の段階設定
-
予約情報は該当するセッション(該当するコール)に保存し、シナリオを進行するたびに繰り返し使用します。
-
したがって、ユーザー変数という概念を活用して予約情報を保存します。
-
予約を一連の段階別に処理するために、ユーザー変数間での段階を以下のように設定します。

- current段階:ユーザーが発話したそのままの状態の情報を保存
予約日_current、予約時間_current、予約人数_current、電話番号_current - checked段階:有効性チェックを完了した状態の情報を保存
予約日_checked、予約時間_checked、予約人数_checked - completed段階:実際に予約処理された状態の情報を保存
予約日_completed、予約時間_completed、予約人数_completed、電話番号_completed - その他にも、対応するシナリオの詳細内容に応じて段階追加または簡素化が可能
- current段階:ユーザーが発話したそのままの状態の情報を保存
- 予約プロセス設計
- 予約意図把握 → 予約情報入力 → 予約情報の有効性チェック → 足りない予約情報の再確認 → 予約最終確認 → 電話番号の確認 → 予約処理の順に予約できるようにコンテキストを接続します。
- メインシナリオの返答のうち、ユーザーの発話を誘導する返答の吹き出しには再発話マーカーを有効化し、メインシナリオから離脱した際、もう一度マーカーが設定された元の位置に戻ることができます。
- 例えば、以下のように主な発話にのみマーカーを有効化すると、メインシナリオから離脱するとリペアシナリオで
${`previousChatbotAnswer}を呼び出す際にマーカーを有効化したメッセージ(別の日を言っていただけますか?)のみ再発話されます。

- 例えば、以下のように主な発話にのみマーカーを有効化すると、メインシナリオから離脱するとリペアシナリオで
- 予約意図把握
- 予約意図が把握された場合、該当する番号に予約された履歴があるかを確認します。
- カスタム条件V2.0を活用します。
- カスタム条件のAPI URLを呼び出して、ビルトインユーザー変数
*{cicRequest.session.callInfo.caller}に保存された電話番号をもとに該当する番号で予約された履歴があるかを確認 - 予約履歴がない場合は
validでnoReservationを、予約履歴がある場合はreservedをレスポンスするようにAPIを設計
- カスタム条件のAPI URLを呼び出して、ビルトインユーザー変数
- カスタム条件V2.0を活用します。
- 電話をかけた番号に予約履歴がある場合の返答は、以下のように設定します。

- 電話をかけた番号に予約履歴がない場合の返答は、以下のように設定します。

- 予約情報入力
-
日付、時間、人数、電話番号のエンティティを作成して、予約情報を受けられるように設計してください。
-
タスクを通じて当該情報を収集し、収集されたそのままの予約情報をユーザー変数current段階に保存します。
-
予約情報の有効性チェック
-
current段階の変数のうち、予約情報の有効性がチェックされた項目はchecked段階に情報を移します。
-
有効性をチェックする項目は、次のとおりです。
- 有効ではない日付、時間形式:
2020年99月32日、0時99分のように存在しない日付、時間形式を確認 - 予約可能日:過去の日付/時間であったり、営業日/営業時間かどうかを確認
- フルブッキングかどうか:該当する時間に既に予約がいっぱいであるかを確認
- 予約可能な人数:10人を超える人数であるかを確認
- その他にも、予約ポリシーに基づいて有効性チェック項目の追加が可能
- 有効ではない日付、時間形式:
-
カスタム条件V2.0を活用して有効性を確認します。
-
ユーザー変数の
予約日_current、予約時間_current、予約人数_currentに保存された情報をもとに上記で定義した項目を確認 -
有効性が適合した場合、
validでpassをレスポンスするようにAPIを設計
-
また、有効性が適合した場合、
予約日_current、予約時間_current、予約人数_currentから予約日_checked、予約時間_checked、予約人数_checkedに情報を継承 -
有効性が適合しない場合、
validでunavailableDate(有効ではない日付形式)、unavailableTime(有効ではない時間形式)、fullBooking(該当する日付/時間にフルブッキング)、groupReservaion(団体予約)などをレスポンスするようにAPIを設計

-
-
- 足りない予約情報の再確認
- 予約日、予約時間、予約人数のうち受けられなかった情報がある場合は、もう一度情報入力を誘導します。
- 予約日の情報が必要な場合

- 予約時間の情報が必要な場合

- 予約人数の情報が必要な場合

予約日_checked、予約時間_checked、予約人数_checkedに情報が保存されているかを確認して、保存された情報がない場合は当該情報を誘導する発話をレスポンスし、もう一度予約情報の入力会話にコンテキストを接続

- 予約日の情報が必要な場合
- すべての情報の有効性チェックが完了したら、予約最終確認の会話に移動します。

- 予約最終確認
-
すべての情報が収集されたら、収集された情報で予約を処理することをユーザーに確認する必要があります。

-
もしユーザーが予約情報を修正する場合は、もう一度予約情報の入力会話に接続します。


-
ユーザーの最終確認が完了したら、
予約日_checked、予約時間_checked、予約人数_checkedから予約日_completed、予約時間_completed、予約人数_completedに情報を継承した後、予約する電話番号を確認します。
- 電話番号の確認
-
現在、顧客が使用している電話番号で予約を処理するか、別の番号で予約を処理するかをユーザーに確認します。

-
現在の番号で予約する場合、ビルトインユーザー変数の
*{cicRequest.session.callInfo.caller}に保存されたユーザーの電話番号情報を電話番号_completedに継承します。

-
別の番号で予約する場合は、新しい電話番号を受け付けます。

-
キーパッド入力モードに変更
-
11~12桁の電話番号をすべて受けるために、12桁を入力できるように設定
- 12桁未満の電話番号の場合、ユーザーが電話番号を入力した後、
#ボタンを入力するとキーパッド入力モードを終了 - 12桁の電話番号の場合、ユーザーが電話番号12桁を入力した時点でキーパッド入力するとモードを自動終了
- 12桁未満の電話番号の場合、ユーザーが電話番号を入力した後、
-
キーパッド入力モードに変更した際のレスポンスなしメッセージと失敗メッセージは、共通のリペアシナリオとは別に設定。
上記と同様にキーパッド入力モードで事後動作の設定が必要

-
新しく受け取った電話番号情報は、
@{電話番号}値を電話番号_currentに保存してユーザーに最終確認

-
電話番号の最終確認まで完了したら、
電話番号_checkedに保存された値を電話番号_completedに継承

-
- 予約最終処理
- 電話番号の確認を完了すると、カスタム条件V2.0を活用して予約を最終処理してください。
- 予約処理を行う際にユーザー変数の
予約日_completed、予約時間_completed、予約人数_completed、電話番号_completedに保存された情報をもとに活用 - 正常に予約処理が完了した場合、
validでreservationCompletedをレスポンスするようにAPIを設計

- 正常に予約処理が完了しなかった場合、
validでreservationFailedをレスポンスするようにAPIを設計

- 予約が完了した後、
予約日_current、予約時間_current、予約人数_current、電話番号_current、予約日_checked、予約時間_checked、予約人数_checkedに保存された値をすべて初期化

- 予約処理を行う際にユーザー変数の
ⅱ.グローバルシナリオ
グローバルシナリオのインプットコンテキストにglobalを入力します。メインシナリオとリペアシナリオのアウトプットコンテキストにもglobalを入力して、メインシナリオの進行中でもいつでもグローバルシナリオに接続できるようにします。

- FAQ
- 営業時間、駐車場の使用可否、メニュー及び商品説明、ベビーチェアの有無など、個別のお問い合わせに関する会話を作成します。
- 返答を作成した後、ビルトインアクションメソッドの
${`previousChatbotAnswerContext}を入力して、以前のメインシナリオのコンテキストにアップデートすると同時に、以前の返答を再発話するように設計します。

- 相談員に接続リクエスト
- 運営時間内にリクエストが入った場合、相談員の番号に接続します。

- 運営時間外にリクエストが入った場合、相談員に接続できないことを案内して通話を終了処理します。

- 通話終了
- 通話終了の案内メッセージをレスポンスして通話を終了します。

ⅲ.リペアシナリオ設計
リペアシナリオのインプットコンテキストにsilence1とundefined1を入力します。メインシナリオのアウトプットコンテキストにsilence1とundefined1を入力して、メインシナリオの進行中でもいつでもリペアシナリオに接続できるようにします。
- ユーザーのレスポンスなし
- 連続2回までは直近のメインシナリオのチャットボット返答を再発話するように設計します。
- 連続3回レスポンスがない場合には、通話終了処理するように設計します。
- レスポンスなしメッセージを3つ作成します。
-
レスポンスなしメッセージ1


- インプットコンテキストで
silence1を入力 - アウトプットコンテキストで
silence1削除、silence2追加、すべてのコンテキスト維持に設定 - すべてのメインシナリオのアウトプットコンテキストには
silence1を入力して、いつでもレスポンスなしメッセージ1に接続 - ユーザーの発話を誘導する返答とビルトインアクションメソッドの
${`previousChatbotAnswer}を入力して、以前のメインシナリオの直近の発話をレスポンスするように設計 - ただし、レスポンスなしメッセージ1はマーカーを無効化して、リペアするための発話をシステムが再発話しないように防止
- インプットコンテキストで
-
レスポンスなしメッセージ2


- インプットコンテキストで
silence2を入力 - アウトプットコンテキストで
silence2削除、silence3追加、すべてのコンテキスト維持に設定 - ユーザーの発話を誘導する返答とビルトインアクションメソッドの
${`previousChatbotAnswer}を入力して、以前のメインシナリオの直近の発話をレスポンスするように設計 - ただし、レスポンスなしメッセージ2はマーカーを無効化して、リペアするための発話をシステムが再発話しないように防止
- インプットコンテキストで
-
レスポンスなしメッセージ3


- インプットコンテキストで
silence3を入力 - 案内できないという返答をレスポンスして通話終了処理
- インプットコンテキストで
-
- 意図不明のユーザーの発話
- 連続2回までは直近のメインシナリオのチャットボット返答を再発話するように設計します。
- 連続3回意図不明の発話をする場合には、運営時間内にのみ相談員に接続し、運営時間外には通話を終了処理します。
- 失敗メッセージを3つ作成します。
-
失敗メッセージ1


- インプットコンテキストで
undefined1を入力 - アウトプットコンテキストで
undefined1削除、undefined2追加、すべてのコンテキスト維持に設定 - すべてのメインシナリオのアウトプットコンテキストには
undefined1を入力して、いつでも失敗メッセージ1に接続 - 返答としては、ユーザーの発話を誘導する返答とビルトインアクションメソッドの
${`previousChatbotAnswer}を入力して、以前のメインシナリオの直近の発話をレスポンスするように設計 - ただし、失敗メッセージ1はマーカーを無効化して、リペアするための発話をシステムが再発話しないように防止
- インプットコンテキストで
-
失敗メッセージ2


- インプットコンテキストで
undefined2を入力 - アウトプットコンテキストで
undefined2削除、undefined3追加、すべてのコンテキスト維持に設定 - 返答としては、ユーザーの発話を誘導する返答とビルトインアクションメソッドの
${`previousChatbotAnswer}を入力して、以前のメインシナリオの直近の発話をレスポンスするように設計 - ただし、失敗メッセージ2はマーカーを無効化して、リペアするための発話をシステムが再発話しないように防止
- インプットコンテキストで
-
失敗メッセージ3


- インプットコンテキストで
undefined3を入力 - 案内できないという返答をレスポンスして通話終了処理
- インプットコンテキストで
-
2.AiCallビルダーにシナリオを入力
以下の順に設計した内容をビルダーに入力すると、より迅速に音声ボットを制作できます。
ⅰ.ドメイン設定
- 音声ボットはAiCallドメインで作成できます。サービスタイプを確認してください。
- 音声ボットは会話の流れが重要です。そのため、コンテキストの強度設定をhardに変更し、会話の接続強度をhardに制限することをお勧めします。
- チャットボットの発話をリアルタイムにロギングして直近にレスポンスした会話の情報を活用するためには、会話ログの一時保存設定を有効化します。有効化すると、ビルトインアクションメソッドの
${`previousChatbotAnswer}を使用できます。
ⅱ.エンティティ作成
- 予約音声ボットで活用する予約日、予約時間、予約人数エンティティを作成してください。
ⅲ.ユーザー変数作成
- 予約音声ボットで活用する予約日、予約時間、予約人数情報を保存するユーザー変数を作成してください。
- それぞれ段階別に作成し、基本値には
nullを入力してください。
ⅳ.アクションメソッド作成
- もしアクションメソッドを使用するシナリオの場合は、会話を作成する前に作成してください。
ⅴ.会話タイプ作成
- 大量の会話を簡単に管理するための機能です。
- メインシナリオやグローバルシナリオなど、管理が簡単なタグを作成してください。
ⅵ.共通メッセージ作成
- 設計したとおりにウェルカムメッセージ、失敗メッセージ、レスポンスなしメッセージを入力してください。
ⅶ.会話作成
- 会話名を入力して会話を作成し、まず会話タイプをタギングしてください。
- 会話を作成して質問と返答をすべて一度に入力するよりも、設計したとおりに会話のみ作成した後、順に会話の要素を満たす方式で構築するとより簡単でスピーディーです。
ⅷ.会話の返答入力
- チャットボットの返答を入力してください。
ⅸ.会話の流れ接続
- コンテキストを通じて会話と共通メッセージ間の流れを接続してください。
- コンテキストを設定する場合、まず共通メッセージのコンテキストを設定してから会話のコンテキストを設定する順で作業するとより簡単でスピーディーです。
ⅹ.会話の質問入力
- ユーザーの予想発話を収集した後、エクセルで一括アップロードする方式をお勧めします。