Pepper for Biz3.0のAI会話のカスタマイズ (2)

#はじめに
 前回は、[pepper for Biz 3.0](https://www.softbankrobotics.com/jp/product/biz3/#_ga=2.243209858.1074538764.1556501867-850404903.1513303852) の AI会話のカスタマイズ機能を使用して、[Pepper チャットボックス コンバーター](https://softbankrobotics.com/portal/chatbox/convertDialogFlow/)のサンプルシナリオ(空のテンプレート)を、単純にPepperで動かすということを行いました。
　今回は、Dialogflow側の設定内容について細かく確認していこうと思います。

 前回の記事は、こちらになります。
 [Pepper for Biz3.0のAI会話のカスタマイズ (1)](https://qiita.com/HiroyukiYasui/items/d080f5cd9589569b61cb)

#環境について
 - pepper for Biz3.0
 - お仕事かんたん生成3.0
 - Dialogflow
 - Microsoft Excel

#Dialogflow - Agent
　前回使用したDialogflowのAgentを参照してください。
　テンプレートによって、次の5つのIntentが作成、Default Fall Intentが更新されていると思います。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/bacd54dc-ffd8-f2b0-8088-c217e4dbf452.png)
　Excelのテンプレートには、たくさんのIntentXXX行が用意されていますが、実際に使用されるのは「アクションタイプ」列に「-」が設定されてる行の手前までとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/74a1c4c0-b6b9-609e-139a-58ae58a8db77.png)
　また、2019/5段階のテンプレートでは、Agentに作成されるのはIntentのみで、Entityは作成されません。

##サンプルIntentの関係
 サンプルのインテントの関係は、次の通りです。大きく２つのシナリオに分かれています。「名前についてのシナリオ」と、「好きな食べ物についてのシナリオ」（Intent2～Intent5_fellback)です。「好きな食べ物についてのシナリオ」は、会話を継続させる仕組みとして、Contextを使用しています。このサンプルでは、「food」というContextをIntent2が設定し、Intent3～Intent5_fellbackは、その「food」Contextが有効な間だけ、受け付けるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/f20bb37b-031e-6c98-d9b6-7fe330ca06a5.png)

 このContextの有効期間は、Contextに設定した回数分、対応するIntentを消費した場合か、Intentの一致から20分後になくなります。
テンプレートのサンプルでは、「food」Contextの回数は3になっていました。つまり3回Intent3～Intent5_fellbackが実行されると、「food」Contextはなくなります。新たに設定するには、Intent2が実行されなければなりません。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/2b744898-f844-29fc-b962-caea1e9885b3.png) 
　また、余談ですが、サンプルではIntent2で好きな食べ物の質問をして、Intent3に該当する答え「焼肉」と回答をしたとします。これで会話は終了ではなく、まだ「Food」Contextのカウンタは、3->2になっただけですので、まだ有効です。続いて、Intent4に該当する答え「お寿司」と答えることができてしまいます。これは時と場合によりますが、食べ物の回答後にContextをクリアしたい場合は、Intent3とIntent4のoutput contextに次のように指定します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/f15d2740-07ca-6e3e-62ef-ace87f1abafb.png)
 指定の方法は、output context欄に「food」と入力し、設定された数字を5から0にします。こうすることでContextがクリアされます。

##IntentとEvent名について
 Intentには、それぞれ固有のEvent名が設定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/3290dcc7-4591-efae-e043-fcb52a9cac2a.png)
Intentは音声テキスト（音声認識後の文字列）をもとに、Dialogflowの機械学習によって選ばれたIntentが実行されますが、直接Intentを指定して実行したい場合があります。そのときにこのEvent名を使用します。
 Event名による実行そのものは、「お仕事かんたん生成」側が行うのですが、テンプレート上ではボタンに対応するインテントのEvent名、連続してPepperに発話させる場合の次のインテントのEvent名などで使用します。
　また、「AI会話」ボックス実行時に最初に起動するインテントのEvent名を指定することで、Pepperから話しかけることができます。例えばサンプルのIntent2のEvent名「event2」を指定しておくと、「AI会話」ボックス実行時に「食事についてのシナリオ」からスタートすることができます。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/7fca579d-d44c-aea3-011e-ef10b97cfeb2.png)

##テンプレートとIntentの関係
　次にExcelテンプレートに設定した内容が、どのようにIntentに設定されているのかを確認していこうと思います。
###Intent1
　Intent1は、ユーザが名前について話しかけると、Pepperが発話とディスプレイ（テキスト）で答えるシナリオです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/b2753334-75c8-0e0c-32e6-25bcab01cf03.png)
　Excelのテンプレートの「インテント名」「イベント名」「ユーザー発話」は、dialogflowの「Intent」「Events」「Training phrases」にそれぞれ設定されます。
　Excelテンプレートの「アクションタイプ」以降は、「Custom payload」に独自のJsonデータとして設定されます。
　この「アクションタイプ」は、「テキスト」「画像」「動画」「ボタン」の４種類あり、このIntent1は、「アクションタイプ」-「テキスト」のサンプルです。
　また、「テキスト」にはタブレットに表示する文字列、「スピーチ」には、Pepperの発話文字列を指定します。発話文字列は、発話タグを入れて発話を調整することが可能です。テンプレートに設定されている「テキスト」には、発話タグが指定されていませんが、コンバーター側でPepperの標準の音声となる¥rspd=110¥¥vct=135¥が設定されるようです。

```json:CustomPayload
{
  "list": [
    {
      "speechText": "\\rspd=110\\\\vct=135\\ボクの名前はペッパーです",
      "action": {
        "actionType": "showText",
        "content": {
          "displayText": "ボクの名前はPepperです！"
        }
      },
      "issueEvent": "",
      "endConversation": false,
      "animation": ""
    }
  ]
}
```

###Intent2
 Intent2は、好きな食べ物の質問シナリオで、「好きな食べ物について」の最初のIntentです。
 AI会話のユーザの回答として、音声による回答と、タブレットのボタンによる回答が可能となっており、このIntent2はそのタブレットにボタンを表示する例となります。「アクションタイプ」は「ボタン」です。
 このIntent2が実行されたあと、Context「food」を有効にするため、「output context」に「food」を設定します。
　Excelテンプレートでは「コンテキスト」-「出力」に指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/82733a84-267c-e567-8307-dd20d97ce259.png)
 また、ボタンそれぞれには対応するインテントのEvent名が指定されており、「焼肉」ボタンではevent3(Intent3)を、「お寿司」ボタンではevent4(Intent4)を実行するように指定されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/7d92d127-c8e4-685e-abd9-c8f516143f3c.png)

```json:CustomPayload
{
  "list": [
    {
      "speechText": "\\rspd=110\\\\vct=135\\ボクは電気が好きです。ところでお客様は、焼肉とお寿司ならどっちが好きですか",
      "action": {
        "actionType": "showButtons",
        "content": {
          "title": "焼肉とお寿司どっちが好き？",
          "buttons": [
            {
              "label": "焼肉",
              "event": "event3"
            },
            {
              "label": "お寿司",
              "event": "event4"
            }
          ]
        }
      },
      "issueEvent": "",
      "endConversation": false,
      "animation": ""
    }
  ]
}
```
###Intent3
 Intent3は、Intent2の質問の回答の１つの「焼肉」を選んだ場合のシナリオです。
 「アクションタイプ」は「テキスト」でIntent1と同じです。Intent1と異なるのは、「コンテキスト」が指定されている点です。
 Context「food」が有効な間だけ、このIntentを有効とするために、「input context」に「food」を設定します。
 　Excelテンプレートでは「コンテキスト」-「入力」に指定します。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/7812db74-4954-f4e1-7b8a-00f4eaec28e4.png)

```json:CustomPayload
{
  "list": [
    {
      "speechText": "\\rspd=110\\\\vct=135\\やっぱり焼肉美味しいですよね",
      "action": {
        "actionType": "showText",
        "content": {
          "displayText": "やっぱり焼肉美味しいですよね！"
        }
      },
      "issueEvent": "",
      "endConversation": false,
      "animation": ""
    }
  ]
}
``` 

###Intent4
 Intent4は、Intent2の質問の回答の１つの「お寿司」を選んだ場合のシナリオです。
 Intent3とほぼ同様ですので、説明を省略します。

###Intent5_fallback
 Intent5_fallbackは、好きな食べ物のシナリオで、どのIntentにも該当しない発話だった場合に、実行されるIntentです。
 Excelテンプレートの「インテント名」に**_fallback**を付けるとFallback Intentとして作成されます。
 Context「food」が有効な間だけ、このFallback Intentを有効とするために、「input context」に「food」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/4b3b792e-7f02-8b1b-8473-11034c760ee3.png)

###Default Fallback Intent
 Default Fallback Intentは、ユーザの発話が、どのインテントにも該当しなかった場合に、実行されるIntentです。テンプレートインポート時に自動でCustom payloadが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/431d0b5c-c605-6b2c-c74f-b52dc06a7b1f.png)

```json:CustomPayload
{
  "speechText": "\\rspd=110\\\\vct=135\\すみません。別の言い方でお願いします",
  "action": {
     "actionType": "fallback"
  }
}
```

　Pepperの発話を変更したい場合は、このCustom payloadを修正する必要があります。
　サンプルでは１つだけの回答になっていますが、複数回答も可能なようです。
  複数の回答にするには、"list:[]" 内に記入します。
　次のように書き換えてみました。該当しない場合でもちょっと聞いてくれる？感がでるんじゃないでしょうか。

```json:CustomPayload(修正後)
{
  "list": [
    {
      "speechText": "\\rspd=110\\\\vct=135\\なるほど、なるほど",
      "action": {
        "actionType": "fallback"
      }
    },
    {
      "speechText": "\\rspd=110\\\\vct=135\\うん|うん。",
      "action": {
        "actionType": "fallback"
      }
    },
    {
      "speechText": "\\rspd=110\\\\vct=135\\ですよねー",
      "action": {
        "actionType": "fallback"
      }
    }
  ]
}
```
 ちなみに「AI会話」ボックスで「想定外のユーザ発話」を「対応する」に設定していると、会話リストで選択した標準の会話（この例では「日常会話」）に発話が渡されますので、このDefault Fallback Intentで定義した発話は行われません。試す場合は、「対応しない」に設定し、お仕事を再配信した後でご確認ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/830f76cf-1769-46ea-3b23-cc903290e810.png)

##Intentのテスト
 IntentをDialogflowのコンソール上で確認できます。
 Dialogflowのコンソールの左側の「Try it now!」欄に想定するユーザ発話を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/ee4cd6ff-d8e6-87c7-170b-2077e62f920b.png)
 実行すると機械学習によってどのINTENTが実行されたのか、またContextの状態も表示されます。ただ、CustomPayloadの値はここでは確認できません。「DIAGNOSTIC INFO」をクリックすることで、RESPONSEの内容を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/a17efe37-2657-fed4-86ee-d73ae009e2d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131693/f2d91dff-873b-358b-dd94-c01d77665ca2.png)

#次回について
 今回も解説だけで終わってしましました。
 次回は、会話でちょっとした遊びをしてみたいと思います。

---
**前の記事：[Pepper for Biz3.0のAI会話のカスタマイズ (1)](https://qiita.com/HiroyukiYasui/items/d080f5cd9589569b61cb)**
**次の記事(作成中)：[Pepper for Biz3.0のAI会話のカスタマイズ (3)]()**