汎用CGSを利用した意図解釈の使用方法をご紹介します。
意図解釈使用例
汎用CGSを利用して、意図解釈APIにリクエストを送信します。
汎用CGSについてはこちら、意図解釈APIについてはこちらをご確認ください。
ご注意
このページで利用しているSUNABAの意図解釈APIのURLは、商用のドコモAIエージェントAPIからはアクセスできません。
商用利用をご希望の方は、別途URLを発行いたしますので、お問い合わせ窓口よりお問い合わせください。
商用利用をご希望の方は、別途URLを発行いたしますので、お問い合わせ窓口よりお問い合わせください。
天気検索
天気検索タスクを使用した例です。
このタスクは必須スロットを持たないため、状態遷移しません。
ポイント
使用例に記載されている以下の用語については、タスク一覧をご確認ください。
- タスクID(taskId)・・・各タスクに振られているID
- コマンドID(commandId)・・・タスクの状態を表すID
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>_</pattern> <template> <think> <!--汎用CGSを利用して意図解釈APIにリクエスト--> <ext name="multicgs"> <arg name="request"> { "method": "POST", <!--今回の例ではSUNABA意図解釈機能のURLを使用--> <!--商用で意図解釈機能を利用する場合は、ドコモAIエージェントAPIから払い出されたURLを記入--> "url": "https://api-sunaba.xaiml.docomo-dialog.com/taskRecognition", "header": { "HTTP-Version": "HTTP/1.1","Content-Type":"application/json;charset=utf-8" }, "body": { "projectInfo":{"projectKey":"DSU"}, "dialogMode":"on", "language":"ja-JP", "userId":"<get name="appId"/>",<!--"userId"にはユーザ登録APIで取得した"appId"を指定--> "dialogStatus":{ "commandId":"00000000000",<!--コマンドID--> "task":{ "taskId":"00000000"<!--タスクID--> }, "loopCount":"0" }, "userUtterance":{ <!--今回の例では、ボットの入力発話をそのまま意図解釈の入力発話とする--> "utteranceText":"<get name="input"/>" } } } </arg> </ext> <!--意図解釈APIのレスポンスからコマンドIDを取得--> <predstore>json_response.setJson(<get name="_ext_multicgs_body"/>)</predstore><!--レスポンスを変数名json_responseに格納--> <set name="commandId"><predstore>json_response.dialogStatus.commandId</predstore></set><!--コマンドIDを取得--> </think> <!--レスポンスのコマンドIDからパターンマッチで回答を分岐--> <srai><get name="commandId"/></srai> </template> </category> <!-- 天気検索 --> <category> <pattern level="exact">ST001001002</pattern> <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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
<category> <pattern>_</pattern> <template> <think> <!--コマンドID、タスクID、要求スロットID、スロット格納状況リストの初期値を指定--> <condition name="commandId"> <li value="undefined"> <set name="commandId">00000000000</set><!--コマンドIDの初期値--> </li> </condition> <condition name="taskId"> <li value="undefined"> <set name="taskId">00000000</set><!--タスクIDの初期値--> </li> </condition> <condition name="required_slotId"> <li value="undefined"> <set name="required_slotId">""</set><!--要求スロットIDの初期値--> </li> </condition> <condition name="slot_status"> <li value="undefined"> <set name="slot_status">[]</set><!--スロット格納状況リストの初期値--> </li> </condition> <!--汎用CGSを利用して意図解釈APIにリクエスト--> <ext name="multicgs"> <arg name="request"> { "method": "POST", <!--今回の例ではSUNABA意図解釈機能のURLを使用--> <!--商用で意図解釈機能を利用する場合は、ドコモAIエージェントAPIから払い出されたURLを記入--> "url": "https://api-sunaba.xaiml.docomo-dialog.com/taskRecognition", "header": { "HTTP-Version": "HTTP/1.1","Content-Type":"application/json;charset=utf-8" }, "body": { "projectInfo":{"projectKey":"DSU"}, "dialogMode":"on", "language":"ja-JP", "userId":"<get name="appId"/>",<!--"userId"にはユーザ登録APIで取得した"appId"を指定--> "dialogStatus":{ "commandId":"<get name="commandId"/>",<!--コマンドID--> "task":{ "taskId":"<get name="taskId"/>"<!--タスクID--> }, "requiredSlot": { "slotId":<get name="required_slotId"/><!--要求スロットID--> }, "slotStatus":<get name="slot_status"/>,<!--スロット格納状況リスト--> "loopCount":"0" }, "userUtterance":{ <!--今回の例では、ボットの入力発話をそのまま意図解釈の入力発話とする--> "utteranceText":"<get name="input"/>" } } } </arg> </ext> <!--意図解釈APIのレスポンスからコマンドID、タスクID、要求スロットID、スロット格納状況リストを更新--> <predstore>json_response.setJson(<get name="_ext_multicgs_body"/>)</predstore><!--レスポンスを変数名json_responseに格納--> <set name="commandId"><predstore>json_response.dialogStatus.commandId</predstore></set><!--コマンドIDを更新--> <set name="taskId"><predstore>json_response.dialogStatus.task.taskId</predstore></set><!--タスクIDを更新--> <set name="required_slotId"><predstore>json_response.dialogStatus.requiredSlot.slotId</predstore></set> <condition name="required_slotId"> <li regex="undefine"> <set name="required_slotId">""</set> <!--レスポンスに要求スロットIDが含まれていなければ初期化--> </li> <li> <set name="required_slotId">"<predstore>json_response.dialogStatus.requiredSlot.slotId</predstore>"</set><!--要求スロットIDを更新--> </li> </condition> <set name="slot_status"><predstore>json_response.dialogStatus.slotStatus.toJson()</predstore></set><!--スロット格納状況リストを更新--> <condition name="slot_status"> <li value="undefine"> <set name="slot_status">[]</set><!--レスポンスにスロット格納状況リストが含まれていなければ初期化--> </li> </condition> </think> <!--レスポンスのコマンドIDからパターンマッチで回答を分岐--> <srai><get name="commandId"/></srai> </template> </category> <!-- 到着駅要求 --> <category> <pattern level="exact">ST001003002</pattern> <template> 到着駅はどちらですか? </template> </category> <!-- 出発駅要求 --> <category> <pattern level="exact">ST001003003</pattern> <template> 出発駅はどちらですか? </template> </category> <!-- 検索開始確認 --> <category> <pattern level="exact">ST001003004</pattern> <template> <think> <!--レスポンスのスロット格納状況リストから出発駅名、到着駅名を取得--> <!--スロット格納状況リストはリスト形式になっているため、ループ処理をして駅名を取得--> <set name="_var_count">1</set><!--ループカウンタを初期化--> <condition name="_var_count"> <li value="4"></li><!--乗換検索のスロットは3つのため、ループカウンタが4になったら終了--> <li> <set name="_var_slot_stationName"><predstore>json_response.dialogStatus.slotStatus.slotName</predstore></set><!--スロット格納状況リストリストの先頭のスロット名を取得--> <condition name="_var_slot_stationName"> <li value="stationTo"> <set name="stationTo"><predstore>json_response.dialogStatus.slotStatus.slotValue</predstore></set><!--スロット名"stationTo"(出発駅)の駅名を取得--> </li> <li value="stationFrom"> <set name="stationFrom"><predstore>json_response.dialogStatus.slotStatus.slotValue</predstore></set><!--スロット名"stationFrom"(到着駅)の駅名を取得--> </li> </condition> <set name="_var_count"><calc operator="+" name="_var_count">1</calc></set><!--ループカウンタを+1--> <predstore>json_response.dialogStatus.slotStatus.shift()</predstore><!--スロット格納状況リストリストの先頭要素を削除--> <loop/><!--conditionへ戻る--> </li> </condition> </think> <!-- stationFrom には出発駅名、stationTo には到着駅名(東京駅、新橋駅、etc...)が格納されています--> <get name="stationFrom"/>から<get name="stationTo"/>までの乗換案内を調べますか? </template> </category> <!-- 検索開始 --> <category> <pattern level="exact">ST001003005</pattern> <template> 検索します。 <!--コマンドID、タスクID、要求スロットID、スロット格納状況リストを初期化--> <think> <set name="commandId">00000000000</set> <set name="taskId">00000000</set> <set name="required_slotId">""</set> <set name="slot_status">[]</set> </think> </template> </category> <!-- キャンセル --> <category> <pattern level="exact">ST001003006</pattern> <template> 終了します。 <!--コマンドID、タスクID、要求スロットID、スロット格納状況リストを初期化--> <think> <set name="commandId">00000000000</set> <set name="taskId">00000000</set> <set name="required_slotId">""</set> <set name="slot_status">[]</set> </think> </template> </category> <!--乗換検索以外のコマンドIDであった場合の回答--> <category> <pattern>*</pattern> <template> すみません。分かりませんでした。 </template> </category> |
実行結果
1 2 3 4 5 6 7 8 |
user > 乗換案内をお願い bot > 到着駅はどちらですか? user > 品川 bot > 出発駅はどちらですか? user > 上野 bot > 上野駅から品川駅までの乗換案内を調べますか? user > はい or いいえ bot > 検索します。 or 終了します。 |