IBM Watson Conversationサービスの初心者向け講座 (1) 環境設定とDialogの基本

[IBM Watson Conversation](https://www.ibm.com/watson/jp-ja/developercloud/conversation.html)はチャットボットのようなUIサービスを簡単に作成できるサービスです。

サービス内容も興味深いのですが、実は、プログラミング環境としても面白いものです。また変更がすぐにチャットに反映されわかりやすいので、実はプログラミング初心者にも良い入門教材かもしれません。

私も初心者ですが、情報を整理してまとめつつ学んでいきますので、一緒に慣れていきましょう。まず第一回は環境のセットアップとDialog の理解から始めます。

## Conversationサービスの作成と利用

IBM Watson Conversationの利用には、Bluemixアカウントが必要です。お持ちでない方は[無料アカウントを作成](https://console.ng.bluemix.net/registration)してください。

Bluemixのカタログで「Watson」カテゴリにある「Conversation」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/08c85ef9-97cf-7bcf-866e-7836cd8a92b8.png)

サービス名を入力し「作成」でConversationサービスが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/33bb9212-13cb-8de0-631a-abdbc683fd52.png)

作成されたサービスの「管理」メニューにある「Lunch tool」アイコンからIBM Watson Conversationツールを起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/66ec98b7-306f-7738-8cf2-112f17455312.png)

## ワークスペースの新規作成

IBM Watson Conversationツールが起動したら上部にある「Create」ボタンでワークスペースを新規作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/0b450c3b-df41-75e1-1f31-faf436f9c92d.png)

ワークスペース名を入力して「Create」ボタンでワークスペースが新規作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/3cac7662-86e5-15ef-555b-712aec392b5a.png)


## Dialogの新規作成

新規作成したワークスペースをクリックして開き、Dialog のタブを選択すると以下のように表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/338b9d96-dd85-7ea8-e664-ded257b695b6.png)

ここの文章は翻訳されていないので、簡単に訳しておきます。

> **Dialog がまだ作成されていません**
> Dialog は intents(意図)、entities(要素,エンティティ)、あなたのアプリケーションからのcontext(文脈)を使用して、それぞれのユーザーの入力にresponse(応答)を返します。あなたのユーザーが何を入力すれば、あなたのbot(ボット,自動応答プログラム)がどのように返答するのか、Dialogを作成して定義してください。

「Create」で新しい Dialog の作成を開始すると、以下の画面になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/8bf47500-94a8-f61e-7380-0067e54d6003.png)

## 初期状態の確認

Dialog は空ではなく、既に2つのノードが定義されていますね。作業を始める前に、この2つのノードを確認しておきましょう。

### ようこそ(welcome)ノード

Dialog も他の多くの開発環境と同様に、処理は上から下に、そして左から右へと流れていきます。なので会話が開始されると、最初に実行されるノードはいちばん上にある「ようこそ」と表示されたノードになります。

ノードをクリックしてノードの詳細画面を表示してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/4bb34382-0fe9-f7a9-a666-1fd368c41226.png)

#### condition(実行条件)

最初のセクションは「If bot recognizes:」で、これはノードの前提条件を設定するところです。

上にある赤枠、"welcome" をみてみましょう。これがこのノードのconditionで、このノードの**実行条件**を設定しています。ここに記載された条件が成立していればこのノードは実行されますし、条件が成立していなければノードはスキップされます。

condition(実行条件)とは何でしょう？より理解を深めるため、右側にある＋アイコンをクリックしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/3e812726-4181-5b29-65e0-5396f53667f1.png)

＋アイコンで追加の入力欄が表示されますが、その下に簡単なヘルプもあります。welcome についても記載がありますので、全体を訳しておきましょう。

> **以下による選択:**
> \# intents (意図)
> @ entities (要素,エンティティ)
> $ context variables (文脈における変数)
> **共通の条件:**
> **welcome** システムによって会話が開始された時に条件が成立する
> **anything_else** 利用者の入力が全く条件にあわなかった時に成立する

"welcome" が指定されたこのノードの実行条件は「会話が開始した時」のようです。

#### respond(実行内容)

そして条件が成立した時、実行される内容が二番目の「Then respond with:」のセクションで定義されています。

今回は「いらっしゃいませ。ご用件を入力してください。」という文が指定されていますので、これがそのまま利用者に表示されます。

右側にあるアイコンから「Open JSON editor」を選択すると、実行内容の定義が JSON 形式で編集できます。より高度な処理を記載したい場合に利用する、感じでしょうか。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/b7b9a17a-8380-2545-8861-6469c2721913.png)

#### finally(実行後の対応)

最後のセクション「And finally」は、ノードの実行後にどうするか、を設定するところです。

選択肢はシンプルで、以下の2つしかありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/e5e5d79c-2dfd-68c8-e385-b2ba9d38693f.png)

今回、選択されている "Wait for user input" は、そのままの意味で「利用者の入力を待つ」ことを示しています。

それに対して "Jump to..." は、他のノードへの移動を指定します。これはもう少し先で説明します。

### その他(anything_else)ノード

では、もうひとつ定義されているノードに移動しましょう。さきほどのノードと違うところを中心に見ていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/0beb9220-6819-3c3e-77b5-387c1a57625f.png)

#### condition(実行条件)

condition(実行条件)は "anything_else" が指定されており、これは先ほどのヘルプにありましたね。「利用者の入力が全く条件にあわなかった時に成立する」でした。

最後にこの "anything_else" ノードがあるのは、Dialog 定義では必須のことのようです。

#### respond(実行内容)

respond(実行内容)ですが、今回は文章が二種類登録されているのが注目点です。複数の返答文が登録されている場合、これらのなかのひとつが選択され、ユーザーに表示されるようです。

複数の返答がある場合、その下にその選択条件が示されています。このノードでは "sequential(連続的な)" つまり用意された文書を順に選択して表示してくれるようです。

これは "random(無作為の)" に変更することができ、この場合は順番ではなく、ランダム(無作為)に返答が選ばれるようです。ただ無作為でも、同じ返答が連続することはないそうです。

#### finally(実行後の対応)

このセクションは同じ "Wait for user input" なので説明を省略します。

### 会話の実行例

さて、この初期状態のままで、まず会話を試してみましょう。右上のチャットアイコンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/222b77ac-860a-eb62-6e6c-cfc7afa8afdb.png)

チャット用の領域(Try it out)が表示されますが、ここで左側に注目です。会話を実行していくなかで、現在、選択されているノードがわかるようになっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/46e3b793-76c7-c3f3-4727-76ecc1760d42.png)

いまこの状態は最初の「ようこそ」ノードのfinallyで指定された "Wait for user input" で入力待ちしている状態ですね。

では、適当に何か入力してみましょう。処理が先に進みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/49a2c934-a52e-2fe1-2a32-b8bff3e54a0e.png)

特に他の処理もないので、anything_else 条件が成立し、最後の「その他」ノードの実行になりました。"sequential"の設定どおり、最初の返答文が表示されています。

そして finallyで指定された "Wait for user input" でまたもや入力待ちをしています。

では、また適当に何か入力してみましょう。処理が先に進みます。といってもこの先に処理は無いので、最初(一番上)に戻ります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/ed4429f3-b67a-7e95-73a3-05f6b8ef3952.png)

処理が進みました… が、また「その他」ノードに戻ってきていますね。これはどうしてでしょうか？

勘の良い方は予想通り！だと思いますが、私は最初、ここで驚かされました… 処理は最初に戻ったのに、「ようこそ」ノードではなく、「その他」ノードにまた戻っているのはどうして？かと。

これ、実はconditionによる結果なんですね。処理は確かに最初に戻り、一番上にある「ようこそ」ノードから実行されそうになりました。しかし「ようこそ」ノードのconditionは "welcome" でした。これは会話の最初にしか成立しない条件なのです。

つまり処理は最初に戻ったのですが、「ようこそ」ノードは条件があわずスキップされたわけです。だから二番目の「その他」ノードが実行の対象になったのです。

というわけで実行された「その他」ノードですが、二度目の実行なので "sequential"の設定どおり、二番目の返答文が表示されています。

そして finallyで指定された "Wait for user input" でまたもや入力待ちになります。

以降は同じ流れで、入力するたびに「その他」ノードの返答文が順に表示されていくだけ、になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193519/08b12bf5-c913-3d8c-038b-f803617b576b.png)

これで初期ノード2つをだいたい理解できましたね。

## まとめ

以上、今回は Dialog の初期ノード2つの説明だけで終わってしまいました。

しかしノードの3つの構成要素、condition(実行条件)、respond(実行内容)、finally(実行後の対応)は説明できましたし、実行の様子を観察する方法も紹介できました。スタート地点としては必要十分でないかとおもいます。

[次回](https://qiita.com/yamachan360/items/1f9680aa8b4680b8a691) からはDialogの実際の設定をいろいろ試していきましょう！