api ai を使ってコードを書かずにbotを作る

api_ai_usage-001

ちょうど今日こんなニュースを目にして驚いた所でした、、
自然言語によるコンピューターとの会話を実現するAPI集のAPI.AIをGoogleが買収
めでたいぃ〜〜( ´∀`)

API.AIは、チャットBotのインターフェースをコーディング無しで開発できるWebコンソールを提供しています。
最近、対話型のインターフェースを持つWebサービスやアプリが急速に発展してきていますが、裏側の仕組みを簡単にする物で、今回Googleに買収されたことでより一層API.AIの普及が進むかもしれません。

Googleに買収されたので、今後の開発者向けインターフェースはFirebaseとか何かしらのGoogleプラットフォームに吸収されるかもですが、すぐに使ってみたい系の人用に簡単な使い方をPOSTしてみます。

準備

まず、apiのDocumentは全てここにあります
https://docs.api.ai/docs/welcome

何はともあれ、まずAgentと呼ばれるAIを登録する必要があります。
https://console.api.ai/api-client/#/login
ここから登録しましょう。
ちなみに、アカウントはGithubかGoogleカウントの認証が使えます。

自分専用のAIを作ってみる

API.AIには、「天気を聞く」だったり「画像を探す」などのよくある会話パターンはDomainsという機能で標準提供されていますが、このAPIの醍醐味は
オリジナルの会話を作成し、専用サービスのコンシェルジュを簡単につくれる
という点だと思うので、オリジナル会話パタンを作ってみます。

ログインをしたら、早速これから作るaiの名前を入力しましょう。
今回は、人工知能kitamuuu さんを開発する事にしました。
お客さんが食べたい寿司のネタをオーダーするので、それを受け付けるAIを作ってみます。

api_ai

※ちなみに自分用にメモのため大分前にスクショ撮ったので載っていないですが、最近はTraining機能も追加されてます。

名前を入力したら、言語の選択に移ります。
去年まで日本語が対応していなかったのですが、いつの間にか追加されたみたいです。

screen_shot_0028-02-04_at_7_26_00_pm

agentを生成したら、さっそくEntitiesを作りましょう。
Entitiesは最初なんだかよく分からないと思うんですが、
「サービスで使う単語のセット」
くらいに考えておいて良いかもです。

api_ai

まず、お寿司のネタのセットを作成します。Entity名をNETAにします。(この単語は後で使います)
ID maguro に対して、このBotは「まぐろ」「赤身」「ツナ(訪日観光客向け)」の3つの呼び名を定義します。
今回まぐろ以外に「のどぐろ」もメニューに加えました。

api_ai_%f0%9f%94%8a

Entityを一つ作ったら、次にIntentsを追加します。
これは、会話の定型文みたいなもんです。

screen_shot_0028-02-04_at_8_08_34_pm

お客さんがお寿司を注文する際に
何のネタを、何個受け付けるのか?
という雛形を定義する事が可能です。

api_ai_%f0%9f%94%8a

キャプチャを見ると分かるやもしれませんが、今回は
「まぐろください」
のパタンと
「まぐろを2つください」
の2パタンに対応させてみます。

UserExpressionのフォームに会話を入れるんですが、ここで最初に作ったEntityを指定すると
(実際に使う)ユーザの喋った単語がEntitiesで定義されたセットの中の呼称とHITすると指定した変数に入れてくれる仕組みです。
とりあえず最後のJsonを見るとわかると思います。

また、この世の単語を全部自分でEntitiesとして定義しなくても数値や時間、日付曜日などは Systemに予め定義されているので Expressionの中で @system.number 等で指定すればその箇所は数値として受取り、こちらも指定の変数にセットしてくれます。

今回の場合は「まぐろ」が $NETA に、「2つ」などの数字も喋った(入力した)場合は $number にセットされます。

Action名も指定しておきます。
これは複数のIntensがある場合、どのAction(Intent)かクライアントに教えてあげるためです。
今回はorder_sushi というAction名をセットしました。

最後に、SpeechResponseの欄へ このIntentを受け付けた際にbotに喋ってほしい文などを入れれば一旦は完成です。

この時点ですぐに動作チェックが可能です。
コンソール右上にある「Try it now… 」の箇所に「まぐろを2つください」と、入れてみます。

すると、(今回は1つしかIntentつくってないですけど)Intents内にあるどのパタンかを識別してAPIが実際に返却するjsonの中身をその場で確認する事ができます。

{
  "id": "206e8abe-560a-478e-9ef9-229f13303a84",
  "timestamp": "2016-09-20T15:12:53.532Z",
  "result": {
    "source": "agent",
    "resolvedQuery": "まぐろを2つください",
    "action": "order_sushi",
    "actionIncomplete": false,
    "parameters": {
      "NETA": "maguro",
      "number": "2"
    },
    "contexts": [],
    "metadata": {
      "intentId": "0d2222a1-2ef8-43d2-92a8-f90a58992aa2",
      "webhookUsed": "false",
      "intentName": "@NETA:ください"
    },
    "fulfillment": {
      "speech": "はいよー!"
    },
    "score": 1
  },
  "status": {
    "code": 200,
    "errorType": "success"
  },
  "sessionId": "1aced55f-b626-4de5-8501-86d0141e83fc"
}

Actionがorder_sushiで、指定のネタが「まぐろ」、個数が「2」という事が解析されて変数にセットされているのが確認できます。
クライアント等には fulfillment.speech の「はいよー!」の部分を適当なTextToSpeechライブラリなどを使って喋らせればいい感じですね。

自分で解析器を作るよりも簡単になる理由

こうやって見ると、「全部の会話セットを定義するなら、コード書いた方が早いかも」と思う場合があるかもしれません。
たぶんケース・バイ・ケースだと思うんですが、例えば、今日 という文字をdatetimeに変換するには、最初から
「今日」「明日」「明後日」「来月」
などの品詞を全て登録しておく必要がありますが、api.aiではこういった入力に使える汎用的なシステムの変数が最初から用意されています。
これらを使うだけでもある程度はbot開発が簡単になるのではないでしょうか。

また、自然な会話の流れを作りたい場合は個々のIntentに応じた追加のIntentも指定する事ができたりします。
その場合は、contextを付与します。
例えば、お寿司の出前を頼んだ時に、AIが
「いつがいいですか?」
と聞いてきたときに、 order-dateというcontextをInでセットして新しいIntentを作成すれば、その条件が発生するときにしか呼ばれないIntentを作成する事ができます。

各種PF向けのAPIクライアントライブラリが公開されていますが、JSで実装するのが一番手軽かと思います。
こちら → https://github.com/api-ai/api-ai-javascript
SpeechRecognitionをONにすればChromeですぐに動作が確認できます。

それでは素敵なBot開発ライフを〜
おわり 

2016-09-21 | Posted in 技術的なポエムNo Comments » 


関連記事

Comment





Comment



*