対話モデル作成画面のスロットの使い方
では、前回触れなかった対話モデルのスロットについて解説します。対話モデル、インテントの概念については前回の記事をご確認ください。
スロットとは
スロットとは会話から意図(インテント)と別に対象を抜き出すための仕組みです。宅配ピザを注文できるスキルを例にとって考えてみます。
例えば「ペパロニピザを注文して」「ミックスピザを注文して」等の多数の要求に答えたい場合にそれぞれインテントを作るのではなく、インテントは「ピザを注文したがっている」、スロットとして「ペパロニピザ or ミックスピザ or ○○ピザ」等のように構造化して取得することができ、利便性が増します。
また1つの会話に複数の対象が含まれるような場合にも、スロットを利用することでインテントを1つ作成し対象をスロットとすることでシンプルに管理することが可能になります。
公式に分かりやすい図解と解説がありますので、そちらも併せてご覧ください。
スロットの値の取得
ユーザーの発話がスロットを適用したインテントであると判断された場合、ソースコードからスロットの値を取得することができます。
第1回で利用したプロジェクトの中盤にインテントを取得している部分がありますが、これと同様にスロットも取得することが可能です。
.onIntentRequest(async responseHelper => {
const intent = responseHelper.getIntentName();
// slotの値を辞書型で取得する
const slots = responseHelper.getSlots()
...
})
ビルトインスロット
インテントの中にスロットを適用するにはあらかじめスロットを作成しておく必要があるのですが、数字や日時、期間等よく使われるであろうスロットに関してはCEKに用意されており、自分で作成する必要はありません。
例えば「商品を5個カートに入れて」というような発話から「5」の部分を抜き出したい場合等にサンプル発話の「5」の部分をスロットとして登録することで、インテントは同じまま、スロットに「10」や「100」等のユーザーが発言した数字が格納されるようになります。
CEKには多数のビルトインスロットが用意されています。詳しくはドキュメントをご覧ください。
カスタムスロット
ビルトインスロットにないスロット、例えばレストランのメニューの一覧やショップの商品カテゴリ一覧等は自分で作成する必要があります。
詳しくはドキュメントをご覧ください。
ビルトインスロットとカスタムスロットを含むインテントの例
スロットの準備
では第1回で作成した挨拶サンプルスキルに、新たなインテントを作成してみましょう。
このインテントはユーザーの発話が商品の注文を指している時に呼ばれ、スロットとして商品名と個数が適用されています。
まず、ビルトインのCLOVA.NUMBERの利用準備をしましょう。対話モデル設定画面を開き、左サイドバーから「ビルトインスロットタイプ」の横の「+」をクリック、次にCLOVA.NUMBERのチェックボックスをオンにし、保存をクリックします。
これでインテントにCLOVA.NUMBERスロットを適用することができるようになりました。
次にカスタムスロットです。
左サイドバーから「カスタムスロットタイプ」の横の「+」をクリック、フォームに「slot_item」と入力し、作成をクリックします。
代表語と同義語を入力し、保存をクリックします。その対象を表し、かつリクエストに含めたい言葉を入力します。
同義語には、代表語と同じ意味でユーザーが発話する可能性のある言葉を、半角カンマで区切って入力します。同義語が発話された場合はスロットの値として代表語がリクエストに含まれます。
インテントの作成
ではこれらのスロットを含むインテントを作ってみましょう。前回と同様にインテントを作成します。名前はBuyGameIntentとしましょう。
サンプル発話を入力したら、スロットを適用したい部分をマウス、トラックパッド等でドラッグします。
スロットの登録ダイアログが表示されます。テキストフィールドにhardwareと入力しreturnキーを押下します。
スロットタイプからslot_itemを選択します。
同様に個数の部分にビルトインスロットを適用します。スロット名はamountとします。
できたら全てのサンプル発話に同様に適用してください。終わると以下のようになります。
ビルドを忘れずにしておいてください。終わればインテントの作成は完了し、以後のリクエストに適用されます。
ソースコードの変更
では実際にスロットの値を取得しそれによって返答を変えられるようソースを変更しましょう。先程一から作成したプロジェクトか、第1回でダウンロードしたプロジェクトのindex.jsを以下のように変更します。
case 'GreetingsIntent':
....
break;
// 追加ここから
case 'BuyGameIntent':
const slots = responseHelper.getSlots()
speech = {
lang: 'ja',
type: 'PlainText',
value: `${slots.hardware}を${slots.amount}個ですね。かしこまりました。${TEMPLATE_INQUIRY}`
}
responseHelper.setSimpleSpeech(speech)
break;
// 追加ここまで
case 'Clova.GuideIntent':
動作チェック
ではClovaに実際に話しかけて動作をチェックしてみましょう。
「挨拶サンプルを起動して」の後にスタンバイモードになったことを確認してから、「プレステ4を3個購入して」と話しかけてみます。「PS4を3個ですね。かしこまりました」と返ってくれば成功です。うまくいかない場合は対話モデルが正常に設定されているか、ビルドが終わっているかを確認してください。どちらも問題ない場合は音声認識の結果を確認して下さい。
最後に
第2回はHerokuの使い方やログの出力方法、シンプルなスキルを実現するためのプロジェクトの構成について踏み込んで解説を行いました。アイディアのある方は本記事を参考にしながら是非自分だけのスキルを開発してみてください。
尚、スキルの開発には公式のデザインガイドラインが役に立ちます。審査で落ちてしまい無駄な時間を使わないためにも、構想段階から審査提出前まで意識しながら開発をするよう心がけることをおすすめいたします。
次回は機能的で実際に役に立ちそうなスキルの開発手法を解説します。お楽しみに。
