意図解釈とは、ユーザ発話からユーザが求めているタスクを判定し、そのタスクに必要な情報の抽出を行う技術です。
これらの判定や抽出は、すべて自然対話プラットフォームの意図解釈エンジンによって行われるため、xAIMLに大量の<pattern>
を書く必要がなく、CGS連携処理など、タスク実行部分の記述に専念することができます。
意図解釈エンジンは、「しゃべってコンシェル」で培ってきた機械学習技術を組み込んでいます。
SUNABAでは、「基本タスク」と呼ばれるタスクへの分類のみを提供していますが、一覧に記載のないタスクを独自に追加することも可能です。独自タスクのご利用をご検討の場合は、お問い合わせください。
タスクとスロット
タスクとは、意図解釈エンジンがユーザ発話の内容を分析して得た「ユーザが求めている動作」です。
また、タスクごとに関連する情報を格納するスロットが存在し、タスクの実行に必ず必要なものを必須スロットと呼びます。
天気検索や乗換案内、そして知識検索など、デフォルトでいろいろなタスクを準備しています。
利用できる全てのタスクを確認するには、タスク一覧をご覧ください。
タスク判定の例
ユーザ発話 | タスク、スロット |
今日の東京の天気を教えて | タスク 天気検索 エリア 東京 日時 今日 |
東京から横浜までの乗り換え方法を教えて | タスク 乗換案内 到着駅 横浜 出発駅 東京 実行確認 – |
ニュースを教えて | タスク ニュース検索 ジャンル – 日時 – |
タスク状態
タスクは3つの状態に分けることができ、スロットの格納状況によって以下のとおり状態が遷移します。
天気検索などの必須スロットを持たないタスクは状態遷移しません。タスクの状態遷移
状態が初期より後に遷移したタスクがある場合、意図解釈エンジンは新たなタスクを開始しません。
このような状態で新たなタスクを開始するには、遷移中のタスクを初期状態に戻す必要があります。
(ex. 乗換案内タスクの場合は、「キャンセル」で状態を初期に戻すことができます)
スロットの格納状況とタスク状態
スロット格納状況 | タスク状態 |
全てのスロットに値なし | 初期 |
必須スロットの一部に値あり | スロットフィリング |
必須スロット全てに値あり | 実行可能 |
コマンドとスロットフィリング
1回のユーザ発話で必須スロットの全てを埋められなかった場合に、ユーザに不足している情報を要求することを、スロットフィルと呼びます。
スロットフィルは、必須スロットに対応するコマンドをxAIML上に記述しておくことで、意図解釈エンジンから自動的に実行されます。
これらの全ての必須スロットを埋める一連の流れを、スロットフィリングと呼びます。
意図解釈使用例
意図解釈の結果を使用した対話シナリオの例をご紹介します。
天気検索
天気検索タスクを使用した例です。
このタスクは必須スロットを持たないため、状態遷移しません。
xAIML
1 2 3 4 5 6 7 |
<category> <pattern label="ST001001002"/> <template> 天気を調べます。 <!-- ここに天気検索処理を記述してください --> </template> </category> |
実行結果
1 2 |
user > 天気を調べて bot > 天気を調べます。 |
乗換検索
乗換検索タスクを使用する例です。
このタスクは必須スロットを持つため、状態遷移します。
xAIML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<!-- 到着駅要求 --> <category> <pattern label="ST001003002"/> <template> <think> <!-- レスポンスに対話ステータスを反映させます。 --> <!-- trueに設定することでタスクの状態遷移が可能となります。 --> <set name="_task_keep_dialog_status">true</set> </think> 到着駅はどちらですか? </template> </category> <!-- 出発駅要求 --> <category> <pattern label="ST001003003"/> <template> <think> <set name="_task_keep_dialog_status">true</set> <!-- 到着駅情報を取得 --> <!-- _task_slot_stationTo には駅名(東京駅、新橋駅、etc...)が格納されています--> <set name="stationTo"><get name="_task_slot_stationTo"/></set> </think> 出発駅はどちらですか? </template> </category> <!-- 検索開始確認 --> <category> <pattern label="ST001003004"/> <template> <think> <set name="_task_keep_dialog_status">true</set> </think> <!-- _task_slot_stationFrom には駅名(東京駅、新橋駅、etc...)が格納されています--> <get name="_task_slot_stationFrom"/>から<get name="stationTo"/>までの乗換案内を調べますか? </template> </category> <!-- 検索開始 --> <category> <pattern label="ST001003005"/> <template> 検索します。 </template> </category> <!-- キャンセル --> <category> <pattern label="ST001003006"/> <template> 終了します。 </template> </category> |
実行結果
1 2 3 4 5 6 7 8 |
user > 乗換案内をお願い bot > 到着駅はどちらですか? user > 品川 bot > 出発駅はどちらですか? user > 上野 bot > 上野駅から品川駅までの乗換案内を調べますか? user > はい or いいえ bot > 検索します。 or 終了します。 |
意図解釈結果取得方法
意図解釈の結果をxAIMLで取得する方法をご紹介します。
意図解釈結果を取得するには、<get>
タグなどで下表のPredicateを取得します。
Predicate一覧
対話ステータス
Predicate名 | 説明 |
_task_status |
検索結果ステータス true/false |
_task_error_code |
エラーコード success/fail/timeout |
_task_error_message |
エラーメッセージ |
_task_commandId |
コマンドID(<pattern>のlabel属性に相当) |
_task_id |
タスクID |
_task_name |
タスク名 |
_task_loopCount |
同じ対話状態が続いた回数 |
_task_slot_[スロット名] |
スロット名が存在する場合、slotValueに値を設定する。 スロット名が存在しない場合、リストに追加する。 |
_task_keep_dialog_status |
レスポンスに対話ステータスを反映させる場合は、”true”を設定する 対話ステータスを更新しない場合は、”stay”を設定する |
抽出文字列
Predicate名 | 説明 |
_task_extractedWords_[wordsType値] |
抽出文字列結果リストから、[wordsType]に該当するwordsValue値を取得する 抽出文字列結果リスト内に同じwordsTypeが存在する場合は、カンマで連結した値を取得する 例:_task_extractedWords_snounの場合、山田,電話 ※利用できる全てのwordsTypeを確認するには、WordsType一覧をご覧ください。 |
_task_extractedWords_N_value |
抽出文字列結果リストのN番目のwordsValue値 例: _task_extractedWords_1_valueの場合、山田 |
_task_extractedWords_N_type |
抽出文字列結果リストのN番目のwordsTypeリストをカンマで連結した値 例: _task_extractedWords_1_typeの場、lastName,station,upoi,snoun |
_task_extractedWords_N_type_J |
抽出文字列結果リストのN番目のwordsType値のうち、J番目のtypeを取得する 例:_task_extractedWords_1_type_2の場合、station |