IT関係」カテゴリーアーカイブ

Dialogflowを使ったAIアシスタントアプリのプロトタイピング

この記事は Goodpatch Advent Calendar 2017 – Qiita 8日目の記事です。
昨日は @enpipiさん、明日は @koyachiさんの予定です。

僕は普段、Prottと呼ばれるプロトタイピングツールの開発に携わっていて、今年はチーム内でデザインスプリントユーザーテストも経験することができました。
そんな経験を生かして、最近流行りのAIアシスタントをプロトタイピングできる環境を作ってみました。

今回は、このブログでも以前とりあげた
Dialogflow(旧API.AI)を使って、AIアシスタントアプリをプロトタイピングしてみます。

DialogflowでAgentを作成する

DialogflowはGoogleアカウントでサインアップすることができます。
アカウントを作ったらさっそく始めましょう。

Agentの作成

まずはDialogflowでAgentを作成しましょう。
AgentとはDialogflowで作ることが出来る自然言語処理のモジュールです。

Default languageをJapaneseに設定しました。

作成に成功すると、 Default Welcome Intent が作成されます。
このIntentを選択して、User saysに何かキーワードを入れて保存してみましょう。

この状態で、画面右上の Try it nowに試しになにか文字を入れてみると・・・

認識してくれましたね!!

Welcome Intentは、Agentが起動された時に最初に応答するIntentです。
このタイミングで、対応する機能の説明を出力して次に自分で作成するIntentへ繋げるのが一般的な流れのようです。
もちろん、Welcome Intentをスキップして応答することもできます。

Intentを作る

さて、いよいよここからが本番です。
あなたの試したいアイデアをIntentで表現してみましょう。

簡単なプロトタイプであれば、特定のキーワードに対して固定のメッセージを応答するだけで作れてしまいます。
難しく考えなくても、プロトタイピングは検証するユーザーに実際に使っている場面を想起してもらえればいいんです。
(「オズの魔法使い」テストのように実装を前提としない手法も存在します。)

例えばこんな感じ。

Dialogflowは入力メッセージを学習して、Intentと紐付けることができるので、定義していない類似のメッセージであっても応答を返してくれます。
手間をかけなくても、テストしてもらうユーザーに自然な体験を提供できそうですね。

Androidアプリをさくっと作る

さて、Dialogflowの設定はひとまず置いておいて、今度は呼び出す側のアプリを作ります。

Dialogflowは、Google Assistantを始め、LINEやFacebook Messengerとのサービス連携に加えて、SDKを使ったアプリケーションへの組み込みにも対応しています。

Dialogflow SDKs

今回はAndroid SDKを使って簡単なAndroidアプリを作ります。
(自分にとってAndroidで作るのが一番速そうだからです。)

というわけで数時間使って作成したアプリがこちらです。
ChatUIのライブラリを使って、AIエージェント風のアプリを作成しました。
ymegane/DialogflowSample | GitHub

このプロジェクトの gradle.propertiesに定義している、CLIENT_ACCESS_TOKENにトークンを設定します。

Dialogflowのコンソールに戻って、トークンを取得しましょう。

動かしてみる

CLIENT_ACCESS_TOKEN にトークンを設定したらビルドして実行します。

動いていますね・・・!
超かしこそうなAIアシスタント(のプロトタイプ)があっという間に作れてしまいました。

おわりに

冒頭に挙げたデザインスプリントでは短い時間(1日とか)でプロトタイプを作ってユーザーインタビューを実施するという事もあります。
そんな時に、時間をかけずに出来るだけ実際に使っている場面を想像させることができるこのような手法は役に立つことがあるやもしれません。

今回は、Dialogflowの最も基本的な機能だけを使いましたが、EntityやWebhookを使えば、実際に使ってもらえる高度なサービスを作ることも可能です。
もうちょっと使いこなしていきたいですね。

ポエム

2017年はGoogle HomeやAmazon Alexa、LINEのClovaなど、AIアシスタントを搭載したスマートスピーカーと呼ばれる製品が日本に投入された年でした。

現状は、文脈の理解に限界があることや、利用できる機能を使う側が事前に把握しておく必要がある点など、一般の方がイメージするAIアシスタント(アイアンマンのJarvisみたいな)になるには、まだまだ越えるべきハードルが様々存在する分野だと思っています。

ただ、今の製品でも一旦使える環境を作ってしまえばかなり便利に使えることは確かです。
先日はかなりの安価でGoogle Homeが売られているのを目の当たりにして、これはひょっとすると本当に普及してしまうのかもしれない、と思ってしまいました。

今後も発展が楽しみな分野です。

Google Homeでごみ収集日botを動かしました

物欲の秋ですね。
Google Homeを買ったので遊んでみました。

Google Homeとは

Googleが発売したスマートスピーカーです。
スマートスピーカーとは、話しかけることで、インターネットを通じてさまざまな機器と連携したり、ニュースや天気予報なんかを教えてくれる機器の総称です。
競合としては、AmazonのEchoやLINEのClovaなんかが挙げられます。
ちなみに今のところシェアはEchoが1位です。

Google Homeで出来ること

こちらのビデオをどうぞ。

Google HomeにはGoogleアシスタントと呼ばれるAIが搭載されていて、様々な問いかけに答えてくれます。

個人的にはリラックスする音楽かけて〜でいい感じに流してくれるのが気に入りました。

今後、連携サービスが増えていくみたいですね。
http://japanese.engadget.com/2017/10/04/ai-google-home/

それと、スマホのGoogleアシスタントやSiriは結構声を張らないと認識してくれない印象なのですが、こいつは割とボソボソ喋っても認識してくれます。
日常に溶け込むと言う点でこれはありがたかったです。

api.aiとActions on Googleで遊んでみたよ

api.ai : https://api.ai/
Actions on Google : https://developers.google.com/actions/

api.aiを使えば、Google Homeアプリが手軽に作れると聞いて、触ってみました。
Google Home(Google アシスタント)との接続にはActions on Googleを使用します。

この連携のはじめの一歩には、こちらの記事を参考にさせて頂きました。
Actions on Googleでapi.aiを使ってGoogle Homeに何か言わせてみる – Qiita

api.aiは自然言語処理をいい感じにやってくれてAPI化してくれるサービスです。
Googleが買収したので、Googleアシスタントとの連携も簡単。
プロジェクトを作るとGCP/Firebaseにも同名でプロジェクトが作られます。

今回作るのは、

「今日は何ゴミの日?」
今日は燃えるゴミの日です。

みたいな会話が出来るbotです。

まずapi.aiについて調べました。
大きくEntitiesとIntentsと呼ばれる2つの概念と、外部サービスとのIntegrationが存在します。

Entities

AI用のデータベースみたいなものです。

@genki-naiは、体力、精神、仕事、子育て
みたいなヒモ付ができます。
ここで定義した単語を次のIntentsでのトリガーに使用することができます。

Intents

トリガーとレスポンスを定義します。

トリガーの例 : @genki-naiがつらい
レスポンスの例 : げんき

あらかじめ定義したいくつかの単語をフックして特定の返答をする例です。

予め、「今日」→「日付」とか、「浜田山」→「緯度経度」
みたいなEntitiyが定義されていて、言語解析に使用できます。

try

Entitiesで定義した人生という単語と、子育てや仕事などを紐付けて返答が返ってきました。

JSONで見ると、このように解析されています。

{
  "id": "e84bec73-b2da-4485-868c-129d81b311a5",
  "timestamp": "2017-10-09T04:05:25.277Z",
  "lang": "ja",
  "result": {
    "source": "agent",
    "resolvedQuery": "子育てがつらい",
    "action": "",
    "actionIncomplete": false,
    "parameters": {
      "genki-nai": "人生"
    },
    "contexts": [],
    "metadata": {
      "intentId": "fa350d49-7a1c-4191-844b-1d4f9ceff956",
      "webhookUsed": "false",
      "webhookForSlotFillingUsed": "false",
      "intentName": "元気出して"
    },
    "fulfillment": {
      "speech": "人生 がつらいだって? 元気出して!",
      "messages": [
        {
          "type": 0,
          "id": "3dc30f75-1ba6-4ed2-b061-aea17e777844",
          "speech": "人生 がつらいだって? 元気出して!"
        }
      ]
    },
    "score": 1
  },
  "status": {
    "code": 200,
    "errorType": "success"
  },
  "sessionId": "4d5fe34c-59d7-49f8-808a-8e6a77418fae"
}

発せられた特定のワードをフックして動作するbotのようなものが作れそうです。

Integrations

入力と出力に外部サービスが使えます。
今回のGoogle Assistantの他にSlackやFacebook Messengerなどとも連携できます。

ゴミの日bot

本題に戻って、ゴミの日botです。

今日は 何ゴミの日?

僕の住んでいる住所に限定するのであれば、今日と言う単語から曜日を拾ってしまえば単純なマッピングから何ゴミの日か返せばよさそうです。

そう思って調べたところ、「今日は」から日時は取れるけど曜日が取れませんでした。
よくよく見てみると、条件分岐も1つのIntentでの定義はできないようです。
(複数のIntentを組み合わせればできる気もします。)

api.aiはシンプルに言語解析のハブのようなイメージなのだなーと改めて理解しました。

そこで、外部サービスとの連携を試します。

Fulfillmentを使って外部サービスと連携する

Fulfillment  |  API.AI

ようはWebhookです。
Intentsで解析した結果をJsonで外部サービスに渡すことができます。
今のところ、現在地の天気を取得するような高度なことをしたければこれを使う想定のようです。

今回はこんな構成にしてみました。

Actions on Google -> api.ai -> Firebase functions

今の日時の自分の地域のゴミ予定を返すだけのAPIを作りました。
https://github.com/ymegane/suginami-garbage-date/blob/master/functions/index.js

これで、Google Assistantから要求を受けたら、api.aiでリクエストを受けて、
Webhookで今日と明日のごみ収集予定を返すことができました。
Actions on Google側の設定も多少必要ですが、今回は端折ります。

動作イメージ(Actions on Google上のシミュレーターで確認)

Google Home上での確認

振り返ってみると、これくらいならapi.aiは不要な感じがしますが、Slackなんかとも連携するのであれば便利そうです。


まとめ

api.aiとActions on Googleを使うと、ユーザーの文脈をいい感じに取得できます。

  • デバイスの位置情報から適切な地域のゴミ予定を返す
  • ログインさせて場所を設定させる
  • 火曜日は?みたいな自然な問いかけに対応する

などなど、色々可能性はありそうです。

Actions on Googleは今回はDRAFT機能を使ってテストアプリとして動作させました。
正式なアプリとして配布するには申請が必要です。
情報が少なすぎて、まだ良くわかっていません。
申請時に、他のアプリとトリガーワードが被ってたりするとまずそうな雰囲気を感じました。
(つよいトリガーワードをとったベンダーが勝つみたいなのありそうです。)

取り急ぎ、奥さんにやや喜ばれたので成功ということにしておきます。