Amazon lexで音声チャットボットを作成してみた

天気の良い週末にやることがなく、昼の12時ごろ、趣味の長時間歯磨きをしながらtechCrunchを見ていたら、amazonのlexの記事が乗っていた。

http://jp.techcrunch.com/2017/04/21/20170420amazon-lex-the-technology-behind-alexa-opens-up-to-developers/

Amazonの仮想アシスタントAlexaを支えているテクノロジーであるAmazon Lexが、今朝(米国時間20日)のロイターの記事によれば、プレビュー段階を終了したということだ。

↓↓↓
https://aws.amazon.com/jp/lex/

Amazon Lex は、音声やテキストを使用した会話型インターフェイスをさまざまなアプリケーションに構築するためのサービスです。
Lex では、自動音声認識 (ASR) という音声をテキストに変換するための高度な深層学習機能と、
テキストの意図を理解するための自然言語理解 (NLU) を利用できます。
これにより、非常に魅力的なサービスと生き生きとした音声対話を実現するアプリケーションを構築できます。
Amazon Lex を使うと、すべての開発者が Amazon Alexa に採用されている深層学習技術と同じ技術を利用し、
自然言語での高度な対話ボット (チャットボット) を短時間で簡単に構築できるようになります。

このページにある動画は去年の11月末のものだ。
その頃、某ゲームの開発と並行して走る運営の現場の両方が修羅場で、毎日トラブルと戦っていた。さらにトラブルは現場だけとは限らず、外野がキナ臭くなり、モヒカンと肩パッドの荒くれ供から平和を守るために北斗百烈拳を繰り出していた。明日を見失って、CV千葉繁になっていた記憶がうっすらとある。
当然re:InventのKeynoteなど見る暇はなかった。

Try a sample

まずはこちらのページでサンプルを作ってみる。
https://console.aws.amazon.com/lex/home?region=us-east-1#bot-create:

cb-1.png
BookTripをクリック。

cb-2.png

IAM:自動的に作ってくれるんはありがたい。念のため後でデタッチされた権限を見ることにするけどな。
Child-Directed?:子供専用ではないからNo。

Createを押しやす。


マイクを許可しますかのプロンプトが出るので、許可にする。
このmacには内臓マイクがないので、iPhoneのヘッドホンを繋いでおく。

cb-3.png

しかしこの後、何をどうしたらいいのか、説明がないからさっぱりわからない。。。。。。
困った。

tutorialの動画をみながらもう一度sample chat botをつくる

AWS Lex Demo Tutorial (Jan 2017)
https://www.youtube.com/watch?v=7uG9cuxNo5k
「花の注文をするチャットボット」を10分くらいで作る様子。

4ヶ月ほど前に親切な人が投稿してくれたチュートリアル動画で、
やさしい英語をえらんで説明してくれているが、
英語のききとりがやっとの自分はYoutobeの字幕機能で補いながらみた。
この通りやってみると、なんとなくわかる。

なおこの動画の中では、まだ「Channels」がFacebookしかないが、
3ヶ月後の現在は、3つに増えている。

  • Facebook
  • Twilio SMS ←増えた
  • Slack ←増えた

花屋のサンプルをそのまま真似して、以下のように作ってみた。

name:OrderFlowersSitopp
Description:Bot to order flowers on the behalf of a user
Output voice:Joey

cb-8.png

Buildをするとtest Botでtext入力できるようになる。
Sample Utterancesの1個めをコピペして、
I would like to pick up flowers
と記入してエンターしてみるとすぐ答えが返ってきた。ほうほう。
cb-7.png
あっ、これもうできちゃったのか。早いなぁ。(΄◉◞౪◟◉`)

音声入力してみる

AWSのLexのコンソールに行く
https://console.aws.amazon.com/lex/home?region=us-east-1#bots:

さっき作った「name:OrderFlowersSitopp」を選ぶcb-15.png

右側にチャットボットのタブが現れるので、
入力欄のマイク部分をクリックする。そうすると音声入力モードになった。

cb-13.png


Macに繋いだiPhone用のヘッドフォンのマイクのあたりに話しかけると、テキスト化して、チャットにしてくれます。

上の例だと、私の発音が悪いので、rosesがlosesとかclosesになっている。ひどい(笑)
しかもボットはそのまま「Ok your closes will be ready 」と予約終了してしまった。
いったいなんの花が届くのか。。笑

もちろん、これはサンプルだから何も届かないけど、
ちゃんとカスタムスロットに無いものはエラーにしないと、そのまま注文を受け取ったことになってしまうから、
注意が必要ということで。

sampleを作ってわかったこと

  • サンプルの3種類は以下の通り。主たる目的はこういうものなのかな。

    • 旅行の予約
    • 花屋のオーダー
    • 歯医者の予約

考えられる用途

  • 保険の見積もり
  • 通販サイトのパスワード忘れた
  • 美容院の予約
  • ゲームの進行不具合の通報
  • ゲームのチート疑惑の通報
  • ゲーム掲示板の炎上の通報
  • ゲームの..いかん、つい仕事が

これがFacebookのお店のページに備わってたら、確かに気楽に呼び出しやすい。
でも受け取る側はどうなんだろう? botが応答して解決しない場合もあるだろうし、ちゃんと過去の履歴を呼び出せるのかな?

大変そうな点

Sample UtterancesとSlot typesの用意が大変そう。

Sample Utterancesとは、ユーザーがこういったらこの部分をパラメタとして受け取るという設定。花屋の予約sampleでは2個しかなかったけど、こんなんで済むはずがない。

  • I would like to pick up flowers
  • I would like to order some flowers

様々な言い方を網羅しておかないと、「おっしゃることがわかりません」を連発するポンコツbotになってしまう。
(参考動画 Virgin Flight – Saturday Night Live

Slot typesは、ユーザーの返答の中から受け付けるキーワードの種類で、花屋の予約sampleでは花の種類3つが該当する。だがこんな少なくて済むはずがない。3種類しか売ってない花屋っていうのだったら別だけど。
– roses
– lilies
– tulips

Sample utterancesもSlot TypesもAlexa Skillsにも同様の設定項目があり、これらをいかにきめ細かに定義できるかでbotの優秀さが決まると思う。

まとめ

  • AWSのlexを使ってchatbotが作れる。
  • 連携先は、Facebook、Twilio SMS、slackが選べる。ただし音声入力は、声の入力装置があるプラットフォームじゃないとダメ。(Twilioは電話と連携してるから、これが候補か。)
  • Utterancesとslot typesをちゃんと定義しないと、ポンコツbotになってしまう。人工知能というより人工無能。これはAlexa skillsも同じ。
  • しゃべった言葉を分解してテキストにするところが人工知能。ここはブラックボックス。
  • サンプルでは必要なかったが、ちゃんとbotを作るときにはLambda関数も書く必要がある。(http://docs.aws.amazon.com/ja_jp/lex/latest/dg/getting-started-ex2.html)
  • botの会話ログを見るのってどうするんだろ?

以上!

続きを読む

AWS X-RayでLambda→Athenaのアクセスを可視化してみた

以前こんなものを作りましたが、これをAWS X-Rayで可視化してみたら、何がわかるのか、実験してみました。

Amazon AthenaをAWS Lambdaから操作できるようにしてみた

AWS X-Ray デーモンの実行

AWS X-Ray SDK は、AWS X-Ray に Trace データを直接送信しないらしいので、送付用のEC2インスタンスを作成します。ユーザデータとして以下を登録してインスタンスを生成するだけなので、簡単です。

#!/bin/bash
curl https://s3.dualstack.us-east-1.amazonaws.com/aws-xray-assets.us-east-1/xray-daemon/aws-xray-daemon-2.x.rpm -o /home/ec2-user/xray.rpm
yum install -y /home/ec2-user/xray.rpm

システムログにxrayのインストールログが出力されていたのでOKでしょう。

Examining /home/ec2-user/xray.rpm: xray-2.0.0-1.x86_64
Marking /home/ec2-user/xray.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package xray.x86_64 0:2.0.0-1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package         Arch              Version               Repository        Size
================================================================================
Installing:
 xray            x86_64            2.0.0-1               /xray            6.6 M

Transaction Summary
================================================================================
Install  1 Package

Total size: 6.6 M
Installed size: 6.6 M
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : xray-2.0.0-1.x86_64                                          1/1 
xray start/running, process 2576
  Verifying  : xray-2.0.0-1.x86_64                                          1/1 

Installed:
  xray.x86_64 0:2.0.0-1                                                         

Complete!

Lambdaアプリ側の準備

今回Javaアプリケーションを動かすわけですが、LambdaアプリケーションをX-Rayで監視したい場合は、Lambdaアプリケーションの「設定」タブの中で以下のチェックボックスをONにするだけで良いようです。

スクリーンショット 2017-04-23 22.21.44.png

参考:http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/xray-services.html

またX-Rayを操作するための権限をIAMで設定する必要もあります。今回は試験的な運用だったため「AWSXrayFullAccess」をつけてしまいましたが、実際の運用に合わせてこの辺りは慎重に選びたいですね。

アプリを起動して可視化してみる

ここまでできれば、普通にLambdaアプリを動かしてみてX-Rayでどのように見えるのか確認ができます。今回Lambdaアプリケーションには以下のJSONをインプットとして与えるようにしました。以前の記事でサンプルとしてAthenaのテーブルからデータを取得するようにした際の入力値です。

{
  "region": "us-east-1",
  "s3Path": "s3://ishida-athena-staging-dir/",
  "sql": "SELECT elbname, requestip,  requestport, backendip, backendport, requestprocessingtime, backendprocessingtime, timestamp FROM sampledb.elb_logs order by timestamp desc limit 10",
  "columnListStr": "elbname, requestip,  requestport, backendip, backendport, requestprocessingtime, backendprocessingtime,  timestamp"
}

実行後1分ほど待つと、以下のような表示がX-Rayで確認できました。無事可視化ができたようです。

スクリーンショット 2017-04-23 22.56.40.png

X-Rayの中身を確認してみる

表示されたService Mapの右側のオブジェクトをクリックすると以下のような表示がされました。
スクリーンショット 2017-04-23 22.56.51.png

それぞれの処理にどの程度時間がかかってレスポンスとして何を返しているのかが一覧でわかります。
表示されているIDをクリックすると、そのTraceの詳細が確認できました。

スクリーンショット 2017-04-23 22.56.58.png

これをみる限り、Lambdaアプリの初期化に230ms程度、実際のAthena接続部分に約3秒程度かかっている、という風にみればいいんですかね。この処理全体としては4.6秒かかっているので、実際にAthenaにアクセスするため以外に1.5秒ほどは時間が取られている、と理解すればいいんでしょうか。この辺はもっと勉強が必要だ(^^;

ちなみにエラーが出ている場合は、その例外の中身も確認することができるようです。

まとめ

それぞれの処理がどの程度時間にかかっていて、さらに呼び出し関係までこれほど簡単にセットアップしつつ可視化ができるのは強力ですね。これからMicroservicesなどで分散して処理をさせることが当たり前になることを考えると、必須の技術と言えると思います。Springで言えばZipkinとSleuthをAWS上で実現しているような感じですね。

続きを読む

AMLのシステム構成

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
AMLのシステム構成

完全マネージドの機械学習サービス

Amazon Machine Learning(AML)は、機械学習を行うためのインフラストラクチャやワークフローなどが不要の完全マネージド型機械学習サービスです。

そのため、
・ハードウェアのプロビジョニング
・コンピュータの負荷の分散やスケーリング
・リソース間の依存関係の管理
などに配慮する必要はありません。

ユーザーは使用するデータを用意するだけで、機械学習を行う事が出来ます。

システム構成

Amazon Machine Learningを使った機械学習システムは、
・データソースなどの入出力をするために使うS3、RedShift、RDS
・学習モデルの構築を構築して予測を行うAmazon Machine Learning
から構成されます。
シンプルなシステム構成となっているので、手軽に利用する事が出来ます。

複数の予測を一度に行うバッチ予測をするために、AWS APIを使ったクライアントアプリケーションを利用する事も可能です。

可用性の高いシステム構成

・モデルのトレーニング、評価、予測などは、Amazonのデータセンターで実行
・AWSのリージョン別に、サービススタックレプリケーションが複数の施設に分散
・メンテナンスなどによるダウンタイムはない

などの工夫がされています。

そのため、サーバーの障害やアベイラビリティーゾーンの機能停止に対しても、万全の対策が施されています。

続きを読む

Amazon Machine Learning

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
Amazon Machine Learning

Amazon Machine Learningとは

Amazon Machine Learningとは、機械学習に関する技術やアルゴリズムを十分に理解していない人でも、簡単に利用出来るサービスです。

Amazon Machine Learningは、
・エンドツーエンドのモデル作成ツール
・モニタリングツール
などの開発環境が全て提供されるマネージドサービスなので、訓練用のデータなどの用意が整っていれば、直ぐに機械学習モデルを構築する事が出来ます。

機械学習システムの構築と維持するために、労力と費用を使う必要がなくなります。

使いやすいAPIが用意されている

Amazon Machine Learningは利用可能なアルゴリズムが限定されているものの、モデル可視化ツールやインタラクティブなデータの遣り取りなどを使う事で、機械学習モデルの構築と調整を効率的に行えます。

構築した学習モデルを使って予測をする場合も、Amazon Machine Learningの予測APIを使うと、即座に予測結果を取得する事が可能です。

APIは、
・多数の予測を一度にリクエスト出来るバッチ予測API
・個別の予測を取得出来るリアルタイムAPI
の2種類が用意されていますので、用途に合った使い方が出来ます。

低コストで機械学習モデルの構築が可能

低コストで機械学習モデルを構築出来る事も、Amazon Machine Learningの特徴です。

・初期費用は不要
・従量制の料金体系
なので、用途に合わせた機械学習モデルを構築出来ますし、必要に応じてスケールを拡大したり縮小する事も簡単です。

続きを読む

メモ: Route 53 で Privacy Protection がなかなか有効にならないときには、ドメインのロックを有効にして Don’t hide にしてから hide にするといいよ

Amazon Route 53で汎用JPドメインを申請してみた

の方法を参考にしつつ、自分も Privacy Protection を有効化しました。

とても些細なハマりどころなのですが、
1 日ほど待っても WHOIS 情報が自分の住所のまま、ということがありました。

ワークアラウンドで解決したのでやり方を書いておきます。

1. Privacy Protection を有効化するにはドメインのロックが必要

連絡先情報を非表示にできるのは、移管できないようにドメインがロックされている場合のみです。ドメインを Amazon Route 53 に移管する場合または から移管する場合は、WHOIS クエリでお客様の連絡先情報が表示されるように、プライバシー保護を無効にする必要があります。移管が完了したらプライバシー保護を再度有効にすることができます。

http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/domain-privacy-protection.html

わすれがちです。ドメインのロックを有効にしましょう。

Registered Domains > ドメインを選択 > Transfer lock で (enable) をクリックすると有効になります。

2. ドメインのロックと Privacy Protection を有効にする順番

ここが私の躓きのポイントでした。

ドメインのロックを有効化しても、その前に既に Privacy Protection が有効化されている状態だと、自動的に WHOIS 情報は更新されることはないようです。

一度 Privacy Protection を無効にしてから有効にすることで強制的に更新する、というワークアラウンドが必要になります。

つまり

  1. ドメインのロックを有効化
  2. Privacy Protection を無効化 (Edit contacts からラジオボタンを Don’t hide contact information と選んで Save)
  3. (無効化処理が完了するまで数十秒ほど待つ)
  4. Privacy Protection を有効化 (Edit concats からラジオボタンを Hide contact information if … と選んで Save)

という手順になります。

ここに気が付かないと「おかしいな、ちゃんと有効化にしてるのにな〜、すぐには反映されないのかな〜」と何度も Edit contacts したり、何時間か反映を待ってみたり、無駄な時間を過ごす羽目になります……。

続きを読む

Amazon Lex でサンプルbotを試した

Amazon Lex

Lexがついに一般公開されました。
Alexa Voice Serviceで色々と頑張らなくても手軽にAlexaを使えそうです。

サンプルbotのモデル

公式ドキュメントのExercise2を通して、Lexの使い方を学んでいきたいと思います。

Pizza Ordering Bot

早速作っていきましょう。
※Lexはus-east-1(バージニア北部)のみで利用可能です。

1. lambda関数の用意

1-1: IAMロールの作成

マネジメントコンソールからIAMを選択し、サイドバーのロールから新しいロールの作成に進みましょう。
ロールタイプはAWSサービスロールのlambdaを選んでください。
ポリシーのアタッチ画面で検索窓に lex と入力し、
AmazonLexRunBotsOnlyを選択してロールを作成します。

スクリーンショット 2017-04-23 9.31.06.png

1-2: 関数の作成

ここを参考に作れば問題ないです。

ざっくり言うと lambda→ブランク関数→Node.js v4.3 を選択し、ドキュメントのコードをそのまま貼り付ければ問題ないです。
ロールについては、既存のロールを選択より先程作成したものをアタッチしてください。

2. Lex botの作成

コンソールの LexBotsCreate からbotを作成します。
名前は適当に(e.g. PizzaOrderingBot)、好きな声を選んで、Session timeout は5分で。Child-DirectedNo で大丈夫です。

3. SlotTypeとIntentの設定

3-1: Slotの追加

EditorタブのサイドバーからSlot typesにある+ボタンより新しいスロットを追加。
今回は以下のように追加します

  • Crusts というslotを作成し、valueに thickthin
  • Sizes というslotを作成し、valueに small, medium, large
  • PizzaKind というslotを作成し、valueに cheeseveg

※↓ではPizzaSizeになってますが、SizesでもPizzaSizeでも好きな名前をつけてください
スクリーンショット 2017-04-23 8.58.28.png

※ Slotとは

Alexaの質問に対して答えるべき単語のまとまり、といった感じです。
(Alexaが回答として期待している単語のまとまりと言うべきか。)
主要な都市や日時、空港や俳優などAmazonが用意しているものも利用可能です。
Amazonが用意したBuilt-in SlotはAMAZON.xxxで定義されており、インストールなどの必要もありません。

3-2: Intentの追加

EditorタブのサイドバーからIntentにある+ボタン、Create New Intentより作成しましょう。

3-2-1: Sample utterancesの編集

ここに入れた文章でAlexaに呼びかけると、反応して処理を開始します。
以下のような文章を追加します。

  • I want to order pizza please
  • I want to order a pizza
  • I want to order a {pizzaKind} pizza
  • I want to order a {size} {pizzaKind} pizza
  • I want a {size} {crust} crust {pizzaKind} pizza
  • Can I get a pizza please
  • Can I get a {pizzaKind} pizza
  • Can I get a {size} {pizzaKind} pizza
3-2-2: Slotsの編集

作成したslotを追加していきます。
Nameで登録した名前は、上のutterancesの文章や、lambdaの処理で利用する際のkeyとなります。
Slot typeは先程作成したものを選択、PromptにはAlexaから投げられる質問を入れます。
また、Requiredにはすべてチェックを入れましょう。

※ Promptの例
– pizzaKind: Do you want a cheese or veg pizza?
– size: What size pizza?
– crust: Thick or thin crust?

スクリーンショット 2017-04-23 9.37.54.png

3-3: その他設定

FulfillmentでAWS Lambda functionを選択し、先程作ったlambda関数を選択します。
Lambda initialization and validationConfirmation promptはとりあえずそのまま空白で問題ありません。

※ Intentとは

utterancesに追加した文章で我々が呼びかけるとAlexaが質問を投げかけてくるので、それに対してslotに入ってる単語で回答。また、promptでAlexaは別の質問を行いデータをさらに集める。それらのデータを用いてAlexaが回答、またはlambdaに処理が投げられる。
このような一連の流れをIntentとしてまとめています。

4. テスト

早速テストしましょう。画面上部の Build ボタンよりビルド完了後、画面右下のチャット欄からチェックできます。

スクリーンショット 2017-04-23 9.49.23.png

ビルド後はIntentが保存されて編集できなくなるのですが、画面上部でversionをLatestに変更すると再び編集が可能になります。

スクリーンショット 2017-04-23 9.37.39.png

5. おつかれさまでした😌

lambda関数の動きについては触れていませんが、今後何か書くかもしれません。
あとは音声入力などについても調べたいと思います。
(Alexa Voice ServiceのSkill Kitに追加できないのかしら…)

続きを読む