はじめに
最近、コグニティブ・コンピューティングを使用したサービスが何かと話題になっています。
コンピュータが自ら考え、答えを出してくれるというSFのようなサービスですが、SNSなど身近なところでどんどん導入されています。
入社一年目の筆者ですが、コグニティブ・コンピューティングを利用してなにか作りたいと思い立ち、弊社の自由なカスタマイズができるリアルタイムチャットソリューションである「Spika for Business」(以下、Spika)とIBMが提供するコグニティブ・コンピューティングの会話サービスである「IBM Watson Conversation Service」(以下、Watson Conversation)を連携し、チャットボットを作ってみることにしました。
どうやって作る?
チャットボット(Chatbot)」とは、「チャット」と「ボット」を組み合わせた言葉で、人工知能を活用した「自動会話プログラム」のこと。(参照URL http://it-trend.jp/words/chatbot)とあります。
これを実現するために、今回はSpikaのチャット画面に入力された文章を、Watson Conversationに渡し、その回答文章をチャットボットからのメッセージとしてSpikaのチャット画面に表示します。
Spikaには外部システムと連携可能なWebHook機能というものがあるので、これを利用してWatson Conversationと連携させます。 ただし、このWebHook機能では入出力できるデータの形が決まっており、Watson Conversationとやりとりできる形に整形する必要がありますので、データ整形するWebAPIをIBM Node-RED(以下、Node-RED)というブラウザ上でパズルのような感覚でプログラミングできるツールで作成します。
Watson Conversationの学習を行う
Watson Conversationはコグニティブ・コンピューティングの会話サービスで、チャットボットを作成するのに適しています。前もって学習させておくことで、何か問いかけると、それに対応した返事を返してくれます。
Watson Conversationの学習を行い、会話部分を作ります。 以下のように例文を5件以上入力し、インテントを設定する必要があります。
その後、ダイアログで返す言葉を設定します。
以上で学習が完了します。
SpikaのWebHook機能でWebAPIとの連携部分の設定する
まず、UIとなるSpikaのグループ(Spikaでは”ルーム”と呼びます)を用意します。 画面右側の下部に文章を入力すると、グループ内に入力した文章が表示されます。
次に、Spikaのグループごとに設定できるWebHook機能の設定を行っていきます。
WebHook機能とは…
アプリケーションの更新情報を他のアプリケーションへリアルタイム提供する仕組みや概念のこと。
イベント(リポジトリにプッシュなど)発生時、指定したURLにPOSTリクエストする仕組みのこと。
とあります。Spika側のWebHook機能を使用し受取先URL(グループのURL)と送信先URL(WebAPIのURL)を設定し、POST送信でデータの受け渡しを行っていきます。
以上で送信先URLに入力内容を送信、受信先URL(このグループ)で同形式のデータの受け取りが可能となります。
Node-REDでデータ整形するWebAPIを作成する
SpikaとWatson Conversationを連携するために、両システムの間でデータ整形を行うWebAPIを作成します。Node-REDを使用することで、ノードという各機能の固まりを繋いでデータの処理フローを作成します。BluemixのNode-REDでは、Bluemixの様々なサービスを簡単に利用することができます。
・全体概要
左側のノード一覧から、必要な機能を持ったノードをドラッグし、その後それぞれのノードを繋いでいきます。 このFlowでは左上のノード「[post]/isn-blog-test」で受け取ったSpikaからのデータが、右下のノード「http request」(Spikaへデータを送る)に向かってデータの値や形式を変えながら進んでいきます。 以下で処理の内容を見ていきます。
・Spikaから受け取ったデータをWatson Conversationに渡すまでの処理
まずSpikaから入力情報のJSONデータを受け取ります。JSONデータの内容は以下になります。(今回使用する部分のみ抜粋)
{ “name”: “IsanaBlog”, ・・・,”message”: “test”,・・・}
次に、Spikaのグループへの投稿が、Conversationの応答対象となるデータかどうかをチェックするための処理の分岐を作ります。Spikaから受けとったデータ内のname要素を利用して、チャットボットの投稿かユーザの投稿かを判断します。ユーザの投稿であれば次の処理に進みます。
ユーザの投稿と判断されたデータ内の、message要素を取り出し、Watson Conversationに渡します。
・Watson Conversationの利用
「Edit conversation node」を使用し[Workspace ID]を設定するだけで、本チャットボット用に学習を行ったWatson Conversationを利用することができます。
・Watson Conversationから返ってきたデータをSpikaに渡すまでの処理
Watson Conversationからは以下のようなJSON形式のデータが返ってきます。 (今回使用する部分のみ抜粋)
{ “intents”: [ { “intent”: “痛み”, “confidence”: 0.5129926751305015} ],・・・, “output”: { ・・・, “text”: [ “大丈夫ですか?心配です…” ],・・・}, ・・・}
JSONデータ内の、text要素のみを取り出します。 Spikaに受け渡しができる形の連想配列を作成し、その中のmessage要素に上で取り出したtext要素の値をセットします。この連想配列をJSON形式のデータに変換したものを、Spika側でセットした受信用WebHookを利用してSpikaにPOST送信します。
以上でデータ整形を行なうWebAPIが完成しました。
動かしてみる
Spika、API、Watson Conversationが繋がり、Spikaの指定のグループで、以下のような受け答えができるようになりました。
優しい。。
終わりに
今回作ってみてわかったのは、思っていたより敷居が高くないということでした。 実装もとてもシンプルに行うことができました。 Watson Conversationの学習も簡単で、作り込むことで様々なバリエーションの会話に対応できるようになると感じました。
今回はWatson Conversationを利用しましたが、他にもチャットボットに利用できるようなコグニティブ・コンピューティングのサービスがあります。使い勝手や精度の検証のため、他サービスとSpikaも連携させ、違いを発見できたらいいと思いました。