IBM Cloudでは、数多くのAPI群が提供されていますが、その中に、Watson Conversationサービスという、“エンド・ユーザーとの会話フローを自動化”するAPIがあります。このWatson Conversationを利用することで、ユーザーからの質問に自動応答するチャットボットを作成できます。
私は業務で、このWatson Conversationを使用する機会がとても多いのですが、人気のビジネス向けチャット「Slack」とは連携したことがありません。そこで、この2つを利用してSlackのチャットボット―Slack botを作ってみたらどんなものかと、試してみました。この記事では、その作成手順を紹介します。
目次
Slackの設定
Slackアカウントの作成
まず、Slackのアカウントを作成するところから始めます。以下のリンク先から手順に沿って進めれば、簡単に作成できるはずです。
Slack botの追加
アプリ検索からBotsアプリを追加します。
「bot」で検索すると、「Bots」が一覧に表示されるので、選択します。
「設定を追加」をクリックします。
ユーザー名は何でもOKです。今回は「watson-bot」としておきました。
ユーザー名を入力したら、「ボットインテグレーションを追加する」をクリックします。
そうすると、APIトークンが発行されます。後々使用しますので、必ずメモしておいて下さい。(※1)
Slackのチーム画面に戻ると、設定したbotが追加されています。
IBM CloudでのWatson Conversationの設定
Watson Conversationの作成
ここからはIBM Cloud 上の、Watson Conversationで作業を行います。
ちなみに、2018年1月時点では、Watson Conversationは、IBM Cloudライト・アカウントで無料で利用できます。(詳細はIBM Watsonの情報をご覧ください)
まずはWatson Conversationサービスを作成しましょう。作成方法は、以下のQiita記事が参考になります。
※「Bluemix」は「IBM Cloud」の旧名称です。
今回は、「slack-bot」という名称のWorkspaceを作成しました。
資格情報の取得
Watson ConversationのWorkspace ID(※2)をメモします。
Workspace IDはWatson Conversationの開発toolから取得します。これはアプリ編集の際に必要になります。
次に、IBM CloudのダッシュボードからWatson Conversationサービスを選択し、サービス資格情報のusername(※3)とpassword(※4)をメモします。こちらもアプリ編集の際に必要になります。
インテントの作成
せっかくWatson Conversationと連携させるので、チャットボットと挨拶程度でも会話をできるようにしたいところです。
会話するには、インテント(=会話内容の意図)を作成する必要があります。今回は挨拶全般ではなく、もう少し粒度の細かくし、「おはよう」をインテントにしました。
「おはよう」の同義の言葉を登録して、インテントのトレーニングを行います。これで、「グッドモーニング」と入力されても、「これは“おはよう”の意図である」とWatson Conversationは認識します。
なお、トレーニングデータは最低でも5つ必要です。
Dialogの編集
「おはよう」インテントを検知した時のレスポンスを定義します。
Watson Conversationでは、Dialogに会話を定義します。
Watson Conversationでは、Dialogに会話を定義します。
ここでは、「おはよう」のNodeを作成しています。
アプリの作成
最後に、SlackとWatson Conversationの中継役となるアプリを作成します。今回は、Node.jsを使用します。
IBM CloudでCloud Foundry アプリのNode.jsを作成します。
package.jsonの編集
Slack botとの通信はSlackが公開しているbotkitを使用します。
Watson Conversationとの連携はwatson-developer-cloudを使用します。
9行目と12行目を追加しましたが、その他はデフォルトのままでOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "name": "NodejsStarterApp", "version": "0.0.1", "private": true, "scripts": { "start": "node app.js" }, "dependencies": { "botkit": "^0.6.7", "cfenv": "1.0.x", "express": "4.15.x", "watson-developer-cloud": "^3.0.2" }, "repository": {}, "engines": { "node": "6.x" } } |
app.js編集
今回は「Slack⇔Nodeアプリ⇔Watson Conversation」だけの簡単なやりとりなので、app.jsファイルに処理をまとめました。
実際に編集したロジックは24行目~55行目で、その他はデフォルトのままです。
ここで、先ほどメモしたIDやパスワードを使用します。
- 37行目のtokenに、slack bot作成時の(※1)を転記
- 47行目のworkspace_idに、Workspace ID(※2)を転記
- 30行目のusernameに資格情報のusername(※3)を転記
- 31行目のpasswordに資格情報のpassword(※4)を転記
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
/*eslint-env node*/ //------------------------------------------------------------------------------ // node.js starter application for Bluemix //------------------------------------------------------------------------------ // This application uses express as its web server // for more info, see: http://expressjs.com var express = require('express'); // cfenv provides access to your Cloud Foundry environment // for more info, see: https://www.npmjs.com/package/cfenv var cfenv = require('cfenv'); // create a new express server var app = express(); // serve the files out of ./public as our main files app.use(express.static(__dirname + '/public')); // get the app environment from Cloud Foundry var appEnv = cfenv.getAppEnv(); // bot var watson = require('watson-developer-cloud'); var Botkit = require('botkit'); var controller = Botkit.slackbot(); var conversation = watson.conversation({ username: '', password: '', version: 'v1', version_date: '2017-05-26' }); var bot = controller.spawn({ token: '' }) bot.startRTM(function(err,bot,payload) { if (err) { throw new Error('Could not connect to Slack'); } }); controller.hears([""],["direct_message","direct_mention","mention","ambient"],function(bot,message) { conversation.message({ workspace_id: '', input: {'text': message.text} }, function(err, response) { if (err) console.log('error:', err); else bot.reply(message,JSON.stringify(response.output.text[0], null, 2)); }); }); // start server on the specified port and binding host app.listen(appEnv.port, '0.0.0.0', function() { // print a message when the server starts listening console.log("server starting on " + appEnv.url); }); |
30行程度のプログラムを追加しただけですが、これでやりたいことは実現できそうです。
IBM Cloudへのデプロイを忘れずに。
動作検証
Slack botと朝の挨拶ができ、期待動作となったことが確認できました。
まとめ
Node.jsを中継に、slackとWatson Conversationの連携ができました。これをベースに、Watson Conversationでインテントを増やしていけば、会話をどんどん増やすことができます。
Node.jsを利用しているので、Watson Conversationだけでやりたいことが実現できない場合に、他のAPIを利用するなど、カスタマイズも容易です。
IBM CloudにはWeather Company Dataというサービスもあり、気象情報も取得できるようなので天気予報をbotで返すようなものを作るのも楽しそうですね。
執筆者プロフィール
- 組み込み業界を15年経験した後、2016年からIBM Watsonの業界へ。最近はチャットボット案件を中心に活動中。働き方改革を模索しており、早朝出勤や立ちワークを実践中。