概要
- 「あなたのお名前は?」や「生年月日は?」などの固定メッセージを返したい部分はapi.aiを利用して、その他の自由会話はa3rtのtalkAPIに任せる。
- api.aiのwebhookを利用して、特定の会話の時は外部APIを利用して天気/ニュースを返す。
※今回は面倒なので空実装。箱だけ用意しておく。 - webhookの実装はjavaで行う。
api.ai
agent
- agentはbot本体。。と私は思っている。。
- 名前、言語、タイムゾーンの設定くらいで難しいことはない。
- 今回はエージェント名を
kunipon
にした。笑
intent
- intentはユーザーが「何を知りたがっているのか?」や「どんな感情か」などを、ユーザーがどんなことを言ってきそうかを登録することで分類しておく箱。
- ユーザーの会話に対してのレスポンスを複数登録できて、ランダムで返してくれる
- 今回は以下を登録
インテント名 | 登録会話例 | レスポンス |
---|---|---|
acquaintance | 「お名前は」「あなたは誰」 | kuniponです |
age | 「何歳」「あなたの年齢は」 | 9歳です |
teach_me | 「教えてください」「明日の東京の天気は」 | ※ここは後述 |
entity
- インテントに登録した文章の本質を特定するために使用する。
- 例えば今回は天気/ニュースを本質的に知りたがっているかを判別したいので、"teach_me"intentの中でも「明日の天気を教えてください」や「今日のニュースを教えて」などを特定するためにentityを登録する。
- 1つのentityに複数の項目と、項目に対する類義語を登録できる。
※用途によっては類義でなくても構わない。 - 今回以下のように登録した。
エンティティ名 | リファレンス名 | シノニム例 |
---|---|---|
teach_me | weather | 「天気」「晴れ」「暑い」 |
teach_me | news | 「ニュース」「出来事」「トピック」 |
intent2
- ユーザーの会話がteach_meインテントに属することを判別した後に、ユーザーが何に対してteach_meな状態なのかを判別しなくてはならない。そのために、インテントにはエンティティを紐づけることができる。
- 会話の中に紐づけたエンティティが存在しない場合、デフォルトのレスポンスとは別のレスポンスを返すことができる。
- 今回は、例えばユーザーが「教えてください」という文章の場合に「天気かニュースならお調べできますが、どちらになさいますか」というレスポンスを返すように設定
- 以下のようにAction項目ないのテーブルのteach_meエンティティにrequiedチェックがついていて、promptsにレスポンスを登録する
一旦試してみる
- エンティティとして登録した「天気」という単語が入っているのでparameterのteach_meがweatherになっているのがわかると思います。
default fallback
- 登録してあるインテントに合致しない会話が来た時にコイツが反応する。
- actionは自分で決められるが、defaultはinput.unknownか
webhook
- 特定のインテントの時にapi経由でデータを取得して、取得データをレスポンスとして返したい時に使用する
- まずfulfillmentページでwebhookをenableにして、URLをセットする。
- URLはlocalhostなどは登録できず、publicなURLをセットしろと怒られるが、この時点で焦ってherokuやなんやを使う必要はない。ってかherokuあげたらデバッグできないし。。開発時であればngrokを使うようにgoogleも言っている。
Local fulfillment testing with ngrok - ngrokは
brew cask install ngrok
でインストールして、ngrok http 8080
的なことするとForwarding https://abcd1234.ngrok.io -> localhost:8080
的な感じでpublicなURLできる。 - そのあとに対象のインテントページに行って、1番下の方にあるFulfillmentをクリックすると表示される「Use webhook」をチェック
- teach_meインテント(apiで情報を持ってくるようにするため)とdefault fallback(api.aiでunknownの時にa3rtのtalkAPIに流すため)でチェック
facebook messenger
- api.aiとの統合に関しては、こちらにドキュメントあります。
- こんな感じで会話できます。
最後に
- githubのsampleが参考になります。
- 実際のソースです。どなたかの参考になれば。。