発想と実装の間をつなぐ AI:人工知能特化型メディア

自分だけのAlexaが作れちゃう? Amazonのbotプラットフォーム「Amazon Lex」ためしてみた

こんにちは、岡田です。

先日、Amazonから「Amazon Lex」なるbot作成プラットフォームが正式リリースされました。
Lexではご存知あのAlexaで培った技術を開放しているとのこと。そりゃあ期待が高まります!

というわけで、早速試してみました。

ざっくり前提知識としてお伝えしておくと、Amazon Lexの特徴は下記2つ。

  • 自然言語処理に対応
  • 音声認識・音声合成の技術が使用可能

曖昧なワードにも対応できる、いわゆる自然言語型。さらに、音声認識・音声合成などの開発環境も整っているのが一番の特徴で「音声対話アプリケーションをつくりたい人向け」という印象が強いです。

いわゆる自然言語型。高度なシナリオは苦手だけど、ミクロな機能に特化

さっそく中身をみてみましょう。管理画面はこんなカンジ。

画面右下のボックスから、作成中のbotをデモすることができます。
ボックス内、左下のマイクアイコンをクリックすると、音声対話モードに切り替わります。



マイクで喋りかけた音声を認識。返事も音声で喋ってくれます!Alexaっぽい!

さて、Lexを使う上で重要なキーワードは下記3つです。

  • インテント Intents: ユーザーが達成したいこと=意図。
  • スロット Slots: インテントの中にある、意味ある単語。
  • フルフィルメント Fulfillment: 達成アクション

インテントやスロット(エンティティとも呼ぶ)といった概念は、LUISやAPI.AIといった、自然言語処理に対応したAPI/Bot作成プラットフォームと同じですね。

達成アクションには、Amazon Lamdaでつくった関数を適用することが前提です。

Amazon Lamdaとは
サーバレス(サーバをレンタルしたり維持したりを、ユーザーが考えなくていい)で、プログラムの1部となる、ミクロな機能を作成・実行できるサービス。こちらを扱うには、プログラミング知識が必要です。

実際の会話の流れを、公式サンプルの「BookTrip」をみてみましょう。

まず、ユーザーのインテントを判断し、車を借りるために必要な情報(スロット)を聞き出します。会話の最後には、裏側で達成アクションが呼び出されます。


▲会話の最後に、どういうアクションを実行するか設定する部分。

  • まずはユーザーのインテントを判別
  • スロットを聞き出すために、補足質問(プロンプト)を繰り返す
  • 達成アクションで終わる

これで1つの会話フローになります。「達成アクションで何をするか」が前提になっているので、ひとつひとつのミクロな機能を処理するbot向けと言えそうです。

※たとえば、「アラームをセットする」「資料請求する」「簡単なチケット予約」など。
イメージとしては、SiriやAlexaなどにできそうな処理・短いフォーム入力でできそうな処理、といったカンジ。

現時点では、高度な会話フロー構築・途中からのシナリオ分岐といった機能はないようです。高度なシナリオのbotをつくりたい場合には、Watson Conversationhachidoriといったプラットフォームを選ぶのが良さそうですね。

気になる日本語対応は?

残念ながら現段階では、自然言語処理、音声認識・音声合成のすべてが、英語対応のみです。(2017年5月現在)

やってみよう!Lexでのbot設計

人工無脳型botであれば「キーワードに合致する、発話パターンをたくさん作っていく…」というような設計方法が挙げられますが、自然言語系のbotは、ユーザーの発話をインテントに分類するところから、会話が始まります。

ですので、まずはユーザーから予測されるインテント、つまり「ユーザーは、botに何を求めるだろう?」ということを洗い出す必要があります。

  • 「ユーザー側の、インテント」
  • 「bot側が提供する、達成アクション」

のペア構成を考えていく、という形でLexでのbot設計を進めます。制約がある分、わかりやすいですね。

ただ、逆にいうと、ユーザーのニーズ+自分たちが何を提供できるか、を明文化できてないと難しいです。そこは、bot設計者の腕の見せどころですね。

今回は簡単に「ホテルの部屋を予約する」という想定のbotをつくってみました。
このbotでは、下記のインテント・アクションのペアを設計します。

  • 「部屋を予約する」というインテント
  • 予約する日付の情報を、外部のシステムに送信する達成アクション

インテントを作成

まずは、BookRoomというインテントを作成します。

プロンプト・スロットを作成

次はスロットです。「意図を満たすために、重要となる情報はなにか」を考えます。また、その情報はプログラムに引き渡すことが前提なことも忘れてはいけません。

部屋の予約に必要な情報とは何か?

たとえば、部屋のタイプ、宿泊人数、禁煙かどうか…… などいろいろ考えられますね。
スロットの新規作成は、管理画面左のメニューからできます。

また、よく使いそうなスロットについては公式が既に用意してくれています。

今回のbotの場合は「PickDate」というスロット名で、日付を取得します。

Slot typeには公式の「AMAZON.DATE」を使用しました。便利ですね!

達成アクションを作成

最終的には達成アクションで、外部システムと連携し、これまでのスロットをプログラムで処理します。今回はサンプルとして、部屋の予約日をSlack上に通知するような処理を書きました。
くわしい実装方法は、公式が提供しているLex用のLamdaブループリント(サンプルテンプレート)も参考にしてください。



 

会話が最後まで行われると、無事Slackに通知してくれました。

実際には、この部分を自社システムのAPIと連携させるよう書き換えれば、実用的な予約botを作成することなどができますね。

展開可能なチャンネル・開発環境はこんなカンジ

つくったbotと接続可能なのは、いまのところ下記の3チャンネル。

  • Facebook Messenger
  • Twillio SMS
  • Slack

どうやらAlexaはないみたいです。(2017年5月現在)

※ Alexa上でアプリケーションをつくりたい場合は、Alexa Skills Kitという専用の開発環境が提供されているので、そちらを使う形なのでしょう。

さらにアプリ用のSDKも提供されています。

  • iOS
  • Android
  • Xamalin
  • React Native
  • Unity

ってカンジで、最近のクロスプラットフォームの開発環境も完備。これは嬉しいですね。ちゃっかりUnityもあるので、VRなんかでも使えそうです!

音声対話アプリケーション開発向き!簡単にbotを作りたいなら、他の選択を

Watson Conversation, hachidoriのように、表現豊かなシナリオをつくりたいbot向きではなさそう。
それでも、したいことがハッキリ明確になっているならピッタリかも。Facebookなら予約bot、Slackならタスクの自動化やChatOpsとして、といった使い道が考えられそうです。

ただ、本格に使うならAmazon Lamdaを学習する必要があるし、想定メインユーザーは開発者という印象。「プログラミングを必要とせず、簡単に素早くチャットボットをつくりたい」というニーズなら、hachidoriなどを検討するべきでしょう。

Lexはそういったニーズより、「音声対話アプリケーションをつくる」という点に強みを置いている印象。

最近では音声対話UIが注目されてるので、今後、提案の選択肢となり得る可能性はありそうです。覚えておいて損はないかもしれません。

 
botプラットフォームが乱立する現在、「できること/できないこと」「向き/不向き」をシッカリ把握して、最適な選択をしたいですね。

ところで「botつくりたいんだけど、もう何からしたらいいかワカラン」なんて方は、botオタクが集まってるデジマラボにご相談を。フォームからお気軽にメッセージどうぞ。
それではまたー!

岡田 孟典 by
AIのリアルを追う、“やってみた”ライター兼エンジニア。過去には、海外向けにチャットボットをリリースした実績もある。エンジニアとしての成長も目指して日々奮闘中。