前記事「 IBM Watson®を使って社内手続きのことを教えてくれるbotを作成してみた① 」の続きです。
前回の内容を簡単にまとめると、
人事総務部門へ社員から社内手続きに関する問い合わせ対応を少しでも軽減するために 、社内コミュニケーションツールとして利用しているSlack上に問い合わせに対する回答を自動で返信してくれるbotの作成に取り組んでいました。
今回は、Slack上で動くbotを作成して完成させます。 内容は以下の3つになります。
「①Slackのbotアプリを設定する。」
「②AWS上に立てたEC2の仮想サーバを設定する。」
「③問い合わせに応答するプログラムを作成する。」
Slackのbotアプリを設定する
①利用しているSlackのワークスペースにBotsを追加する ※投稿日時点の手順となります。
①-1 「その他管理項目」⇒「App管理」⇒Appディレクトリを検索に「Bots」と入力
(画像をクリックすると拡大します)
①-2 「設定を追加」をクリック
(画像をクリックすると拡大します)
①-3 ユーザー名に作成するBotの名前を入力し、「ボットインテグレーションを追加する」をクリック
(画像をクリックすると拡大します)
※bot作成が2回目以降の場合は、「その他管理項目」⇒「App管理」⇒「カスタムインテグレーション」と進むことで、Bots追加画面(①-2)に遷移るので、Botsを追加してください。
②Botsの設定を編集する
②-1 設定の鉛筆マークをクリックして、Bots編集画面に遷移する
(画像をクリックすると拡大します)
②-2 APIトークンは、プログラムで使用するためコピーしておく。Slack上に表示されるBotのアイコンを設定する
画像をクリックすると拡大します)
これで、SlackのBot設定は、完了になります。
AWS上に立てたEC2の仮想サーバを設定する
EC2の仮想サーバ構築に関しては、 参考になるサイトが沢山あるので、ここでは 省略します。サーバサイドの言語はNode.jsを使用しており、Node.js及び、パッケージ管理であるnpmが利用可能な状態であることを前提に記載致します。
Slackのbotを動かす上で、必要なパッケージbotkitとIBM Watson® のAPI(Watson Developer Cloud)をインストールします。
※botkitとは、Slackのbotを作るフレームワークになります。
|
npm install botkit npm install watson-developer-cloud<br /><br /> |
問い合わせに応答するプログラムを作成する
作成するプログラムの大まかな流れは以下の通りです。
①Slackからメッセージを受け取る
↓
②①のメッセージをNLCに問い合わせする
↓
③②の問い合わせ結果から該当するイベントのメッセージを作成する
↓
④③で作成したメッセージをSlackへ返す
実際に作成したプログラムの一部を以下に記載致します。
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
|
const Botkit = require('botkit'); const winston = require('winston'); const Utility = require('/common/Utility'); const controller = Botkit.slackbot({ debug: false, retry: 3, json_file_store: 'slack_bot_db', logger: new winston.Logger({ levels: winston.config.syslog.levels, transports: [ new (winston.transports.Console)(), new (winston.transports.File)({ filename: './logs/bot.log', level: 'error' }) ] }) }); const bot = controller.spawn({ token: [②-2でコピーしたslackbotのAPIトークン] }).startRTM(function (err, bot) { if (err) { console.error(err); throw new Error('start slack not failed.'); } }); |
|
const Utility = require('/common/Utility'); const MessageObject = require('/common/MessageObject'); module.exports = function CommonController(ctrl, bot) { /** * ダイレクトメッセージ(ダイレクトメッセージのみに反応) */ ctrl.hears('', ['direct_message'], function (bot, msg) { // メッセージに対して返答する文言の処理 Utility.getLifeEventMessage(msg).then(res => bot.reply(msg, new MessageObject(res))); }); }; |
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
|
const MessageObject = require(process.env.root_path + '/common/MessageObject'); const Fs = require('fs'); const Path = require('path'); const Request = require('request'); module.exports = class Utility { /** * イベントメッセージを取得 */ static async getLifeEventMessage(msg) { // Slackからのメッセージ const inputmassage = msg.text; // NLCへ問い合わせ実行 const nlcjson = await Utility.getNLCMessage(inputmassage); // 一番結果の割合が一番高いイベントを取得 let json_class_name = nlcjson['classes'][0]['class_name'];//イベント let json_confidence = nlcjson['classes'][0]['confidence'];//割合 // 判定および表示メッセージの作成 var output_message; if (json_confidence > 0.7){ // イベントの割合が7割以上の場合、該当するメッセージを作成 output_message = ['該当メッセージをここに入れる']; }else{ // イベントの割合が7割以下の場合、該当するメッセージを作成 output_message = ['すみませんが、候補となるイベントが見つかりませんでした。再度、入力をお願い致します。']; } return output_message ; } /** * NLC結果を取得 */ static getNLCMessage(strMessage) { // watsonに接続して値を取得 var NaturalLanguageClassifierV1 = require('watson-developer-cloud/natural-language-classifier/v1'); var naturalLanguageClassifier = new NaturalLanguageClassifierV1({ username: [NLCのUSER_ID], password: [NLCのUSER_PASS] }); // 結果取得 return new Promise(function(resolve, reject){ naturalLanguageClassifier.classify({ text: strMessage, classifier_id: [NLCのCLASSSIFIERのID] }, function(err, response) { if (err){ console.log('error:', err); reject(err); // errがあればrejectを呼び出す return; } resolve(response); // errがなければ成功とみなしresolveを呼び出す } ); }); } }; |
動作テストを行う
実際に、メッセージを入れて問い合わせしてみます。
※作成したSlackbotは、ダイレクトメッセージで反応するようにしています。
・回答が得られそうなメッセージ「結婚します。」での結果
該当する問い合わせ結果が7割を超えたため、該当イベントとして回答がされました。
・回答が得られなさそうなメッセージ「てすと」での結果
該当する問い合わせ内容が不明確で一番高い割合が7割を下回ったため、該当イベント無しとして、再度入力を促す回答になりました。
動作テストでは、入力が予想されるメッセージで何度もテストをしました。
Slackに入力できる内容は自由となっているため、想定外の入力も多々でてくるかと思いますが、今後は、実際に入力された内容を追加で定期的に学習させることにより、精度の高いイベントの回答ができるbotになっていくと思います。
これまで2回にわたってbotの作成について紹介してきました。実際にbotの開発を行ってみるとプログラムは簡単に作ることができましたが、今回のようにIBM Watson® と組み合わせた場合、実用レベルまでに回答ができる精度を上げるには時間がかかることが分かりました。今後は、他のAPIと組み合わせたbotの作成もしてみたいと思います。