最近RPA(あーるぴーえー・事務作業を自動化するロボット)について
色々考える機会がありまして、、、。その中で「わとそん」という言葉が
よく出てきます。たったそれだけの理由ですが、
今回は「わとそん」についてガッツリ書いていきたいと思います。
最終的に自動でおすすめスポットを回答する
BOT(ロボット的な)を作るとこまでやります。
watson(わとそん)とは
まずはwatsonについて簡単に説明します。wikiから
引用です。
ワトソン(英語: Watson)は、IBMが開発した質問応答システム・意思決定支援
システムである。『人工知能』と紹介されることもあるが、IBMはワトソンを、自然言語を理解・学習し人間の意思決定を支援する
『コグニティブ・コンピューティング・システム』と定義している。厳密にはAIではなく,人間の意思決定をサポートするという
位置づけにしているようです。
「自然言語を理解・学習し~」ってこれAIじゃん!と思いましたか?
そうなんです。ものすごくAIっぽいのに、その言葉をあえて使わないのは
IBMの歴史に絡んだ独特の事情があるようです。独特の事情が
気になりますか?気にならない、、、。そうですか。
watson(わとそん)でできる事
それでは、watsonで何ができるかというと、もう沢山のサービスがあります。
これらのサービスはIBMのクラウドサービスでAPIを通して利用することが
できます。
少し抜粋すると以下のようなものがあります。これらを組み合わせて自分の
アプリに導入していく事ができるんですね~。
- Natural Language Classifier(言語の分類)
- Conversation(会話)
- Speech To Text(音声からテキストに変換)
- Text To Speech(テキストから音声に変更)
- Visual Recognition(画像認識)
- Personality Instights(性格診断)
- Knowledge Studio(言語学習)
- Language Translator(翻訳)
- etc
さまざまなことを行うことができます。
watson(ワトソン)の特徴
watsonとほかの機械学習(TensorFlow)等と大きく異なる点は
watsonは機械学習を内部の処理として利用しているという点です。
上記の理由から、watsonは開発者が機械学習の知識がなくても、
機械学習を用いたソフトウェアを組むことが可能です。
例で挙げた別製品のTensorFlowは機械学習の「ライブラリ」であるため、
機械学習の知識がある技術者がプログラムを書いて処理を細かく作成していく
必要があります。人を選ぶんですね。
つまり、watosonは機械学習のパーツ(部品)として組み込むことができる
イメージです。
watsonはIBM cloudで提供されていて、アカウントを作成することで
利用することができます。
watson(わとそん)の利用料金について
こんなに高機能ならお高いんでしょう?
大丈夫です、マドモアゼル。今回利用するnode-red、Discoveryは
無料アカウントのライトプランで構築することが可能です。
無料ということで、メモリやインスタンス数の削除などの制限があります。
個人で利用する分には十分なので挑戦してみましょう。
watson(ワトソン)でtwitterのbotを作る
それではtwitterのbotを作成してみます。
今回作成するのは一問一等形式の簡単なものです。
当スクールが所在している北谷町のおすすめスポットを返してくれる
BOTを作成します。
BOT、、つまりロボットみたいなもんです(笑)
質問に回答するbotを作成するにはbotが質問の意味を理解する必要があります。
この処理に対してwatsonのDiscoveryというサービスを利用します。
Discoveryは大まかに説明すると言葉の意味をある程度判断し、蓄積された文章から
適したものを検索することができます。
ちなみに、このデータを「コレクション」と呼びます。
Discoveryの作成
Discoveryを使用するためにIBM Cloudのカタログからインスタンスを作成します。
Discovery環境の作成
Discoveryは環境の下に作成されるため、まず環境を作成する
必要があります。
環境は以下のコマンドで作成することが可能です。
1 |
curl -X POST -u "ユーザー名":"パスワード" -H "Content-Type: appication/json" -d '{ "name":"my-first-environment", "description":"exploring environments", "language":"ja"}' "https://gateway.watsonplatform.net/discovery/api/v1/environments?version=2017-11-07" |
上記のコマンドでcurlでJSONデータをAPIにPOSTすることで環境が作成されます。
APIからは作成された環境のID等が返信されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "environment_id" : "cf929810-f5b3-43d5-9e64-c1cda08018a1", "name" : "my-first-environment", "description" : "exploring environments", "created" : "2018-04-23T08:50:34.715Z", "updated" : "2018-04-23T08:50:34.715Z", "status" : "active", "read_only" : false, "index_capacity" : { "documents" : { "available" : 0, "maximum_allowed" : 2000 }, "disk_usage" : { "used_bytes" : 0, "maximum_allowed_bytes" : 200000000 }, "collections" : { "available" : 0, "maximum_allowed" : 0 } } |
これは後程利用するため控えておきます。
Discoveryコレクションの作成
それではDiscoveryにコレクションを作成します。
現時点ではWEBから日本語のコレクションが作成できないためAPIを利用して
コレクションを作成していきます。
環境作成と同じようにcurlコマンドで必要な情報をPOSTします。
1 |
curl -X POST -u "ユーザ名":"パスワード" -H "Content-Type: appication/json" -d '{"name":"test_collection","description":"My test Collection", "language":"ja"}' "https://gateway.watsonplatform.net/discovery/api/v1/environments/cf929810-f5b3-43d5-9e64-c1cda08018a1/collections?version=2017-11-07" |
正常に完了すると次のようなレスポンスが得られます
1 2 3 4 5 6 7 8 9 10 |
{ "name" : "test_collection", "collection_id" : "174fc67a-f1dd-47e0-a8fd-d7921babcfd3", "description" : "My test Collection", "created" : "2018-04-23T15:22:47.887Z", "updated" : "2018-04-23T15:22:47.887Z", "configuration_id" : "34eeddc9-9f22-4073-9d3a-91836a7a09b8", "language" : "ja", "status" : "active" } |
そしてWEBにコレクションが追加されたことが確認できます。
コレクションへデータを蓄積する
それではコレクションにデータを追加していきます。
北谷町のおすすめスポットということで下記URLを参考にさせていただきました。
watsonはPDF、テキスト等、様々なデータを取り込むことができますが
今回はHTMLから必要な情報を抜き出して作成しました。
自動でデータを取得するクローラという機能もありますが今回は必要な
情報をテキストにする方法で作成しています。
作成したテキストは次のような形です。
hotel06.json
1 2 3 4 |
{ "title":"北谷ビーチサイドコンドミニアムホテル モンパ", "body":"コンドミニアムホテルをコンセプトに誕生したホテルMONPA(モンパ)チェックインしたその瞬間から自由に沖縄を体感できることでしょう。ホテルのすぐ目の前に広がるサンセットビーチ。エメラルドグリーンの海が夕日で赤く染まる絶景をゆったりとお部屋で堪能できます。" } |
紹介したいスポットの数だけ作成します。
作成が完了したらDiscoveryの画面にドラッグアンドドロップで取り込みが完了します。
Discoveryの動作を確認する
取り込みが完了したら動作を確認してみます。
作成したBuild queriesのSearch for documentsから問い合わせをすると
右側に表示されます。
「アメリカンなパスタが食べたい」と人が人に聞いてる感じで入力しても、
それにマッチした店舗を検索してくれます。
これをtwitterに組み込むことでbotを作成していきます。
Node-RedでtwitterBotを開発する
twitterの作成するにあたり、NodeRedというnode.js上に構築された
サービスを利用して作成していきます。NodeRedはwatsonAPIやtwitterとの
連携がしやすく簡単にサービスを作成することが可能です。NodeRedを
使用するためにIBMCloudからNodeRed Starterを選択します。
Node-Redはブロックを組み合わせてデータの流れを作成していきます。
Node-RedはカタログのNode-Red Starterから作成することができます。
Node-Redにログインすると次の画面が表示されます。
Node-Redは左のノード一覧から左のワークスペースにノードを
ドラッグアンドドロップして組み立てていきます。まず最初に
injectノードを追加します。
injectノードは任意のデータを注入するブロックです。
この問い合わせ文はmsgオブジェクトのpayloadというプロパティに保存され、
ノードを流れていきます。
今回はtwitterが入力になるため、将来的にinjectノードがtwitterに置き換わる
ことになりますが
まずは動作確認のためinjectノードを使います。
そして文字列をインプッットに設定します。
DiscoveryとNode-Redの連携確認
とりあえず入力データは作成できたのでdiscoveryにデータを
送って動作を見てみます。
ワークスペースにDiscoveryのノードを追加してノードを編集していきます。
username, passwordはdiscoveryのインスタンス作成時のものを入力します。
Environment,CollectionIDはそれぞれcurlでAPIから返信された内容を入力します。
Disscoveryへの入力値の変更
injectで作成したブロックはそのままではDiscoveryの入力
として利用できないためchangeノードでmsg.payloadを変更します。
Discoveryはmsg.discoveryparams.queryを検索として使用するので
対象の値をmsg.payload、値の代入をmsg.discoveryparams.queryに変更します。
Discoveryからの出力値の確認
Discoveryからの出力結果を確認するためにデバッグノードを
ワークスペースに追加します。
Discoveryの出力はmsg.payloadではなくmsg.search_resultとなるため、
debugノードの対象はmsgオブジェクト全体とします。
ここまで作成できたら、左上の「デプロイ」をクリックしてinjectノードの
左側をクリックします。
デバッグ欄にDiscoveryの結果が表示されればOKです。
DiscoveryとTwitterの接続
入力側
データの流れができたので、あとは入力と出力をTwitterに
変更するだけです。
左のノード一覧からtwitterのノードを取り出します。
twitterのブロックは2つありますがノードが右につながるものが入力、
左にノードがつながるのがTwitterへの出力のノードになります。
次にtwitterのノードにtwitterのアカウントを登録します。
ワークスペースに置いたノードをダブルクリックして編集します。
twitterIDの右のマークをクリックするとtwitterの認証画面が現れるので
認証します。
認証後TwitterIDが表示されていることを確認してください。
検索対象の欄はすべての公開ツイートとします。
ただしこのBOTに話しかけられたときのみにするため、検索条件の
欄には@WATSON_bot_TESTと、botの名前とします。
出力側
twitterのID設定が完了しているので同じIDが入力されていることが
確認できればOKです。
ツイート文の修正
ツイートされたメッセージはmsg.payloadから取得可能ですが、
@アカウント名が文章に含まれるため、削除する必要があります。
このような簡単な修正はfunctioinノードを使って書くことができます。
今回は入力と出力の前にfunctionノードを追加しました。
入力側のノード
1 2 3 |
msg.payload = msg.payload.replace("@WATSON_bot_TEST",""); context.flow.screen_name = msg.tweet.user.screen_name; return msg; |
出力側のノード
1 2 3 4 |
msg.payload = "@"+ context.flow.screen_name + " "+ msg.search_results.results[0].title + "なんかどうでしょう。" + msg.search_results.results[0].body; return msg; |
これでボットに「ステーキ食べたい」といった内容をツイートすると
回答をくれるはず。
でした。
が、次のようなエラーが発生しました。
Twitter need to be a bit shorter.
そうです。すっかり忘れてました。
twitterは文字数の制限があるのです。
文字数への対応としで出力前の関数で文字数を切り落として
(以下略)としてます。
1 2 3 4 5 6 7 |
msg.payload = "@"+ context.flow.screen_name + " "+ msg.search_results.results[0].title + "なんかどうでしょう。" + msg.search_results.results[0].body; msg.payload = msg.payload.substring( 0, 130 ); msg.payload = msg.payload + '以下略…'; return msg; |
これで動作確認をします。
「海岸を歩きたい」的なざっくりな質問に回答を返してくれました。
ワトソンを気軽に使って自動回答してくるBOTが完成
今回は北谷町のおすすめスポットでしたが、コレクションを
それぞれの地域で作成してNLCという言語をクラス分けする機能を
用いて地域を判断し、それぞれのコレクションに切り替えるだけで
色々な地域の紹介ができそうです。
また、一問一答だけでなく、会話に対応するためのconversation
というサービスも組み込むとより面白いbotができそうです。
是非watsonで遊んでみてください。