Watson AssistantとSlackをNode-REDで連携させた話
なんでSlackと連携?
Watson Conversation-Slack間の連携なんて、正直言ってググれば2016年くらいからいろんな人がやってる記事がめちゃくちゃ出てくるんですけど、如何せんオリジナリティを出せるほどの技術力と知識がないので、参考にできる記事がいっぱいある分野で慣れていこうと言う、そういう魂胆です(*´-`)
ちなみに、この記事の続きです。
どうやって連携させる?
Slackと連携となると、どうやらこの二つを使うのが主流なようです。
比較項目 | BotKit | Node-RED |
---|---|---|
概要 | チャットボットを作るためのフレームワーク。Slackでの活用実績が異様に多い(個人の所感)。 | ブラウザベースのフローエディタツール。IOTアプリやWebアプリがビジュアルプログラミングっぽく作れる。 |
公式サイト | https://www.botkit.ai/ | https://nodered.org/ https://nodered.jp/←日本語版 |
開発元 | XOXCO社 | 英国IBM(Hursley研究所) |
必要な環境 | Node.js | Node.js IBM Cloudから動かすのであれば特になし |
便利そうなサイト | Creating a smart ChatBot for Slack←SlackAPI公式チュートリアルから辿れる | Node-REDのデザインパターン10選 Watsonに博多弁をしゃべらせてみた←IBM公式サイトから辿れる |
GitHub | https://github.com/howdyai/botkit | https://github.com/node-red/node-red |
Botkitと(多分)似たようなチャットボット用FWであるHubotもありましたが、これはWatson-Slack間連携においてはそんなに参考になりそうな記事が多くなかったのでパス。
BotKitとNode-REDのどちらを使うかですが、そもそもボットの動作部分はWatson Assistantで前回作ったし、わざわざチャットボットのFWを使うまでもないかなっていうのと、IBM Cloud上で簡単に使えそうってことで、Node-Redを採用することにしました!
Node-REDをIBM Cloudで使う準備
出来るだけ公式ドキュメントを使おうっていうスタンスで頑張っているので、色々と記事はありますが、できる限り公式に沿ってやって行きたいと思います。
というわけでこのページを探し当てました。
Running on IBM Bluemix
ボイラープレートアプリケーション
Node-REDは、IBM Cloud上でボイラープレートアプリケーションとして提供されています。
(´-`).。oO(ボイラープレートってなんだろう)
しばらく調べてようやくそれっぽい記述を見つけました。
ランタイム
アプリケーションの実行に必要な言語環境のことです。JavaやNode.jsなどの言語環境を利用できます。
サービス
アプリケーションが使用する機能を提供する、事前定義済みのミドルウェアやアプリケーションのことです。データベースやモバイルPush通知などがあります。
アドオン
アプリケーション開発や運用を支える機能を提供します。DevOps関連の機能や、負荷に応じて自動的にリソースを拡張するAuto Scalingなどがあります。
ボイラープレート
ランタイムとサービスの典型的な組み合わせを事前に定義したものです。アプリケーションをとにかく作り始めるときに便利です。ボイラープレートから作成した環境に、サービスを追加することも可能です。
IBM CloudではなくIBM Bluemix時代の記事ですが、おそらく意味合い的には変わらないと思います。ボイラープレートはつまり、これさえあればすぐにツールが使えるようになるよっていうツールのセット、DockeでいうDockeイメージみたいな立ち位置ってことですかね!(投げやり)
Node-REDの導入
その便利なボイラープレートアプリケーションであるNode-REDを、早速導入していこうと思います。
ダッシュボードがあるページの上メニューの「カタログ」から見つけることができました。
確かにボイラープレートって書いてますね。
Node-REDが利用できるボイラープレートアプリケーションは、「Node-RED Starter」と「Internet of Things Platform Starter」の2つがあるみたいなんですが、後者はWatson IoT Platformのデフォルトフローが入っているようです。
でも特にIoTで使うわけではないので大人しくNode-RED Starterをクリックします。
アプリ名とホスト名を入力。下部で月額費用計算してるのがちょっと怖いけどライトプランなら無料なはず。
ちょっと下にスクロールしたら、「SDK for Node.js」と「Cloudant NoSQL DB」のプランが別途選べるようになっていました。なるほど、これを一緒に使えるようにしてくれるからボイラープレートなんですね。ランタイムはNode.jsだから必須だとして、きっとDBはIBM Cloudantじゃなくても良いけど、これがおすすめだよってことなのでしょう。
数分待つとアプリケーションが起動するので、https://<yourAppName>.mybluemix.net
というURLでNode-REDにアクセスしました。
セキュリティの設定などなどを行なうと…
はい、英語です。知ってましたのでダメージは軽いです。とりあえずGo to your Node-RED flow editerをクリックしてみます。
導入が簡単すぎる…
Node-REDでフロー作成
Slackノードの追加
デフォルトではSlackノードが左側のパレットにないので、どうやら導入作業が必要らしいです。Slackと連携するためのパッケージは、Node-RED公式サイトのflowから検索できるようなので、Slackというキーワードで検索します。
おお、いっぱい出てき...ん?
node-red-contrib-slacker
Node RED Slack integration built on top of botkit from howdy.ai
howdy.aiがbotkitを作ってて、それを元にNode-REDのSlackノードが構築されている…?
howdy.aiとは!?と思ったんですけど、冒頭でbotkitのGithub調べた時のURLがhttps://github.com/howdyai/botkit
でした。めちゃくちゃhowdy.aiですね…
というか比較までしたのに結局裏でbotkit使ってるものもあるっていう笑
とりあえず使うノードを決めたいんですが、それっぽいのだけでも結構あります。迷います。
でもnode-red-contrib-slack
だけダウンロード数が桁違いなので、これで良さそうな気がします。中身の説明→node-red-contrib-slackを読んでみても、一番説明もしっかりしてるし用途もあってそうです。
ざっくり言うとSlack.comにWebhookでPostを送信するってことですよね。いけそう。
ありがたく使わせていただくことにします。
このありがたいノードを使うには、公式ドキュメントによるとpackage.json
ファイルに依存するパッケージとそのバージョンを記述するらしい(mavenでいうpom.xml的な感じかな?)んですが、わざわざファイルいじらなくてもできるようです。
パレットの管理から「ノードの追加」で検索して
追加!
一瞬何も変わらなくて焦りましたが、F5したらちゃんと追加されてました!
Nodeを作成
各ノードの役割が、ちゃんと「ノードのヘルプ」と言うところに表示されるので、読んでみます。
slack
msg.payloadをSlackに送ります。Slack Channelに簡単に投稿できる方法です。 msg.channelを設定することで投稿するチャンネルを切り替えることもできます。 msg.attachmentsを追加すると、Slack Attachmentも使えます。
Slack Attachmentっていうのはこれのことですね。
Slack Bot In
Slack Botがメンバーになっている任意のChannelにリスナーを提供します。 着信メッセージをmsg.payloadに格納して出力します。 msg.SlackObjには完全なSlackMessageの詳細が格納されています。 edit dialogueでチャンネルを制限することもできます。Slack Bot Out
Bot API Tokenに基づいてmsg.payloadをSlackに送ります。 msg.channelを設定することで投稿するチャンネルを切り替えることもできます。
slackとSlack Bot Outの使い分け方がいまいちピンと来なかったので、ノードの中身をみてみることにします。
これがslack
これがSlack Bot Out
Webhookを使うか、Bot API Tokenを使うかの違いのようです。
正直用途的にはめちゃくちゃどっちでもいい気はするんですが、Slack Bot Inの方がTokenを使うので、出力の方もそれに合わせることにします。
とりあえずざっくりした流れはこんな感じですよね。
Slackの設定
Slackでwatsonという名前のbotを作りました。
API Tokenをコピーして、Node-REDのSlack Bot InとSlack Bot Outのノードに指定します。
(API Tokenの部分を不可視にする画像加工が面倒くさいのでスクショは撮ってないです(*・ω・)ノ)
Watson Conversationの設定
前回作ったWatson AssistantワークスペースのWorkspaceIDとユーザID、パスワードを
Workspaces/(ワークスペース名)/Deploy/Credentials
から取得し、Node-REDのconversationノードに設定します。
(これもスクショなしです)
Nodeを繋げる
このノードたちを繋げていきます。
Slack In - Say Hello間
Slack InはSlackから入力された言葉をそのままmsg.payloadに格納していて、Say Hello(conversation)はmsg.payloadに格納された言葉を分析すると書いているので、とりあえずそのまま繋ぎます。
Say Hello - Slack Out間
Say Hello(conversation)のアウトプットは、
All Results will made available at
msg.payload
in JSON format.
と書いているので、ちょっと一工夫必要そうな気がします。詳細はConversation API Referenceに書いてあるそうです。
…どこやねん…(´・ω・`)
しばらく探して頑張って見つけました。多分これでしょう!
API Reference > Message > Send Message > RESPONSE
の部分です。ちゃんとJSON形式のレスポンスの例も書いてあるし。
Slackに喋らせたい部分→Slack Outのmsg.payloadに格納しなければならない部分はどうやら
"output": { "text": [ "Hi! What can I do for you?" ],
この部分のようなので、fanctionを追加してみます。
こうかな?
全部繋げます。
これでおっけーなはず…!
デプロイ
なんとデプロイボタンを押すだけでデプロイができるらしい。すごい。 ぽち。
Slackでテスト!
さっき作ったSlackBotを、テスト用のチャンネルに招待して話しかけてみます。
わーできた!ちょっとWatsonの方を整備していなさすぎてこれくらいの会話しかまだできませんが、とりあえずSlackとの連携は無事行えました〜
まとめ
今まであまり公式サイトやAPIリファレンスなどを読んで何かするってことはそんなになかった(やってみた系の記事ばっかり見てた)んですが、なんだかんだやっぱり公式が情報量多いし正しいし応用も利くしで一番いいですね。
次にやりたいこと
- Watson Assistantを色々な会話ができるように整備する
- google Homeと連携させて音声でWatsonとおしゃべりする!