【古い記事です】BluemixのWatson Conversation(beta)を触ってみた


:warning: <Font color="red">当記事は2016/6月に投稿しましたが、現時点(【2019/2月】)では既に古くなっています。記事自体はアーカイブの目的でこのまま残しますが、当記事の内容を参考になさらないようにお願いいたします。代替の記事としては下記などがございます。</font>

- [いまさら聞けない!? 簡単にチャットボットをつくれる「Watson Assistant」の基礎知識](https://qiita.com/ishida330/items/666ced65a04243ce286c)
- [チャットボットを簡単に作れる！Watson Assistant(旧名: Conversation)の色々なTips](https://qiita.com/ishida330/items/ae7277598cd3e08fc3a2)

<hr>
まだ現時点(2016/06)ではベータで一部の機能しか実装されていませんが、Watsonの対話式サービスを簡単に作れるConversationというサービスが公開されていたので、少し触ってみました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3a1491ba-5ed7-c096-6416-ea2282000687.png)

# Conversationとは
要はチャットボットのようなコグニティブなエージェントをサクッと作れる、とのこと。現在でもDialogやNLC、R&R等を組合わせて作ることはできますが、既存のサービス群をラップして、もっと簡単に作れるようにしよう！ってことかな？と理解しました。現在はベータ版のため以下のような制限がありますが、徐々に機能追加されるのでしょう。
* 英語のみ
* NLC( National Language Classifier)相当の機能のみ
* 今はAPIでトレーニングできない。基本UIで行う

[このQA](https://developer.ibm.com/answers/questions/272049/what-is-the-ibm-watson-conversation-service/)によると近々EntityやDialogが使えるようになるよ、[このQA](https://developer.ibm.com/answers/questions/277098/endpoint-for-conversation-apiendpoints-for-convers/)ではAPIのトレーニングも夏遅くには、とのこと。

# やってみる前の前提知識(用語)
## ワークスペース
Conversationのサービスのインスタンスの中に複数のワークスペースを定義できます。（定義はUIにて) QA的な用途を想定すると、サービスの中の個々のワークスペースが個々のQA領域に相当するものと思っておけばよいでしょう。（「トピック」的な感じ？たとえば商品特性の問い合わせ用のワークスペースと製品の操作方法の問い合わせのワークスペースを別々に用意するようなイメージです）
## IntentとExample
現時点ではNLC限定なので、要はIntent = 質問 Example=回答（分類結果）と思っておけばいいでしょう。トレーニングのイメージですが、IntentとExampleが対（ペア）になったCSVファイルを用意してアップロード、その後ブラウザーのUIで個別にトレーニングしていくような感じです（後述）

# やってみる
入門編の[チュートリアル](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/conversation/tutorial_basic.shtml)があるのでやってみます。いくつかハマった点があるので都度書いておきますね。

1.BluemixのIDでログインします(割愛)
2.まだベータなのでＢluemix Catalogの一番下のlabsを選択します
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/f53500de-1025-785b-cf72-3a24ac9a0e46.png)

ここでWatsonの箇所に「会話」があります。(Conversationじゃなくて「会話」かよ！まあ間違ってはいないが、、）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/94a7a628-3259-6518-5371-f85b085fae60.png)

3.インスタンスを作ります
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7f249c3c-0130-7fd3-f9d2-6b0c7b918776.png)

4.以下のような管理パネルになりますが、なぜか管理ツールを起動する方法が表示されません。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e0fc2657-dd95-69a8-62c3-086c6adf50fd.png)

ここで**ブラウザーの言語設定を英語に変えてから**改めて画面をリロードすると出てきます。以下はchromeの場合の例です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/490f006e-ffd3-533d-ad21-8f3c1d9c24c5.png)

今度は「Launch Tooling」のボタンが出てきましたね。押します。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7d96d10e-72c4-f5d1-6d1d-33ba0a634528.png)

5.ワークスペースを作ります（Create＋のボタン→適当な名前を付ける)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/06ba53f9-85f8-376d-ab16-55c122223b46.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0e555225-e530-e5b3-2777-46b4a8a9122d.png)

できました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/063368a8-25a1-18b0-8194-18e81124f152.png)

6.ここまでできたら、初期投入するデータを準備しましょう。[github上のサンプルアプリ](https://github.com/watson-developer-cloud/conversation-simple "conversation-simple")の[ここ](https://github.com/watson-developer-cloud/conversation-simple/blob/master/training/car_intents.csv)にcar_intents.csvとしてIntentとExampleのペアが400個くらい準備してあります。ただ、これ、そのままブラウザーでダウンロードするとHTMLタグが付いているので使えないんですよね。。仕方がないのでコピペしてExcelに貼り付けてCSVで保存します。結果は以下のような感じになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c725c7c3-3816-d432-ece8-22805c981cf1.png)

様々なIntent(質問)に対してExample(分類結果)を割り当てている感じですね。(分類しますので Intent:ExampleはM:1の関係)

7.CSVデータが準備できたらGet Startedを押してファイルをアップロードします。

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4f2c6a42-e3bf-d30e-dee7-0ef57f5c7d40.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/0faababf-46c6-ce09-d650-f7b851b97c6b.png)

8.インポートが終わると一覧画面が表示されますので、10秒くらい待ってブラウザーで画面をリロードすると以下のように入力ファイルがExample毎に分類されています。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/2c7bca00-0ba7-9b92-f590-8f2bce4e5204.png)

右上の矢印で展開すると、そのExampleに紐付いたIntentが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/002bd832-52b4-ee62-deb5-1a995b8b1c3b.png)

9.対話をテストしてみます。右上の下記ボタンをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/612a8cf5-ee19-7046-f173-c37a175bcb70.png)
一番下の入力欄に質問や指示を入力すると対応するExampleが戻ってきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8ae6c1da-e3da-fc8e-ed61-cdc3fda49c6d.png)

Intentのテキストそのまま(I need more lights)が正しく#turn_onに割り当てられるのは当然として、別の表現（Would you please turn the lights on ? )でも#turn_onに割りあてられていますね。でも「light, please」という言い方は#off_topic(わからん）になってしまいました。

10.では「light, please」という言い方でも#turn_onが返ってくるようにトレーニングしましょう。#off_topicの青い部分をクリックすると期待するExampleを入力できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/31dd8f7e-f1e2-d473-6c3c-84cc12d5fe2d.png)
ここを#turn_onに変更すると早速学習が開始されるのでボックス右上の→を押してリロードします。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/cf1e9bc3-ff76-b59c-3ebc-9c674e7fae71.png)

turn_onのIntentに「light,please」が追加されていますね。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/690fcb4d-1fae-642a-2f3e-7f6d8974b2ed.png)

もう一度「Light,please」と入力すると、今度は#turn_onが返ってきました。ちゃんと学習してますね！めでたしめでたし。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/5a2b6380-52e5-c742-0613-4b6a7905cbb5.png)

11.左上のAdd intentでIntentとExampleを手で入力することもできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/55f628fb-7c4c-b4fc-a56b-0e98ef91f940.png)
たとえばこんな感じで年齢に関するものを手で登録しました。(Intentは最低5つは必要だそうです）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8bbaed89-17e9-e73f-5bb7-012dd4136cd9.png)

すると新しく#AgeのExampleが登録されます。ご覧のとおり、パネルで編集や削除もできます。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/6778d615-a928-59f1-bb85-a26f1b70f6f5.png)

質問を入力すると、末尾にSIRがついてる、など多少の表現の「ゆらぎ」があっても、ちゃんと#Ageにわりあてられていますね！
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c59824eb-96ea-7aca-bd38-ed72c1160d04.png)

# サンプルアプリについて
以上、サービスのみで進めてきましたが、[github上のサンプルアプリ](https://github.com/watson-developer-cloud/conversation-simple "conversation-simple")があります。下記の「Deploy to Bluemix」ボタンを使うとNode.jsのインスタンスとConversationのインスタンスを一発で準備してくれるのでとっても便利です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/51ee78fa-4a47-12d2-629b-5b99fc0278eb.png)

アプリの使い方は上記githubのサイトに書いてあるのですが、（このアプリのお約束にすぎませんが）一点だけセットアップの注意点。node.jsのアプリが使うべきワークスペースを識別するためにユーザー環境変数 **WORKSPACE_ID**をセットする必要があります。

サービス上に作ったワークスペースのView Detailsをクリックした結果表示されるIDを
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/855c8a01-568b-43cf-41a9-dffd3b0c1342.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/4b4081a6-a94c-e691-50ea-40863f6ff0e9.png)

Node.jsの環境変数の **ユーザー変数** として設定してからアプリ再起動してください。(VCAP_SERVICESではないですよ～）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3337a498-c1d1-855a-85fe-884ab032bd5d.png)

以下は先ほど「やってみる」で使ったcsvをインポートした結果の画面です
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/e578db13-32cd-acf4-1494-cfa5456de14c.png)


# おわりに
ということで、まだNLC的な機能しか使えませんが、かなり簡単に対話アプリが作れそうな予感。今後の機能追加に期待してます～。

# 参考文献
[Conversationのドキュメント](https://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/conversation/overview.shtml "Conversation")
[github上のサンプルアプリ](https://github.com/watson-developer-cloud/conversation-simple "conversation-simple")