Watson Assistantの返答をランダムに設定する

#はじめに
今回は、想定された2つのパターンの会話をWatson Assistantで作成していきます。この記事を進めた上での最終的な成果物としては、ランダムに調子を答えるChatbotと、ランダムになぞなぞを出すChatbotを予定しています。
この記事はある程度Watson Assistantを触ったことがある人を想定して書いているので、基本的な操作（Intentの作成方法等）の説明は省略しています。
操作方法が不安な方はこちらの[公式取り扱い説明書](https://cloud.ibm.com/docs/services/assistant?topic=assistant-intents)を片手に操作してください。

#環境および事前準備
IBM Watson Assistant : Lite版
言語を日本語に設定したSkillを作成しておく

#想定ケース
返答をランダムに設定する、ということで今回想定しているケースは２パターンあります。

##①ランダムに設定したい返答の後は分岐しない
以下の図のように、一言のみランダムに返答させたいパターンです。
返答は一言でもその後分岐させたい場合はもう一方のパターンになります。
![スクリーンショット 2019-08-15 17.39.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/b84327ac-6599-2c87-aa84-027708312219.png)


##②ランダムに設定したい返答の後に分岐する
こちらは以下の図のように、ランダム設定した返答の後に分岐した会話が続くパターンです。
![スクリーンショット 2019-08-15 18.12.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/792ccefe-b99e-d153-a878-8fe9a8ceda7f.png)

#本題
では以上の２ケースを実際に作成していきましょう。

##ケース①の会話作成方法
こちらが「調子はどう？」と聞くと、ランダムで返答を返す会話を作成します。

###1. Intentの作成
Intent編集画面にて「#調子を聞く」Intentを作成します。
例文はなんとなく3つ設定しましたが、一つだけやそれ以上でも何も問題はありません。
![スクリーンショット 2019-08-16 10.58.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/15aeba00-dd11-720b-c0c0-75390bdba299.png)

###2. Nodeを作成・設定する
Dialog編集画面にて「ようこそ」Nodeの下にNodeを追加し、以下の設定を入力します。
・Node Name: `調子を聞く`
・If assistant recognizes: `#調子を聞く`
![スクリーンショット 2019-08-16 11.11.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/322265f6-fc11-0b46-7a25-02cc6ac8aee9.png)

###3. 返答内容を入力・設定する
続いて、「Then respond with」 に返答内容を設定します。
・Then respond with: `元気です`、`まあまあです`、`お腹痛い`
入力が完了したら、入力欄の下にデフォルトでは「Response variations are set to sequential」になっているところを、横の「Random」を選択します。
![スクリーンショット 2019-08-16 11.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/cc04d975-f72f-cdbe-ee49-9e44c1697d16.png)
設定は完了です。
###4. 動作確認
Try itで動作確認をします。
![スクリーンショット 2019-08-16 11.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/18c81afa-00f7-f278-0264-ff34acfdeafa.png)
ランダムで調子を答えているので問題なさそうです。

こちらのケース①は、要はResponse variationを「Random」に設定するとvariationの中から1つランダムで返答してくれるよ！という話でした。簡単ですね。
しかし、「Random」に設定したvariation以降の会話はvariationに付随させる形で分岐させることはできません。つまり出したなぞなぞごとに答えを変えるということができないため、この設定だけでランダムでなぞなぞを出す会話を作ろうとすると、全ての種類のなぞなぞの答えが一括して正解として扱われてしまいます。
![スクリーンショット 2019-08-16 11.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/251503ee-98fc-a382-6244-40fc9585d2fa.png)
そこでケース②が出てきます。


##ケース②の会話作成方法
ケース②ではなぞなぞをランダムで出してくれる会話を作成します。

###1. Intentを作成する
Intent作成画面で新規で「なぞなぞをせがむ」Intentを作成します。
![スクリーンショット 2019-08-16 13.21.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/0b1af686-4857-afc3-245a-39454e114f35.png)

###2. Nodeを作成・設定する
Dialog編集画面にて「ようこそ」Nodeの下にNodeを追加し、以下の設定を入力します。
・Node Name: `なぞなぞをせがむ`
・If assistant recognizes: `#なぞなぞをせがむ`
![スクリーンショット 2019-08-16 13.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/b9de5bfa-5154-0ad7-7543-d14b3a4ebf1b.png)

###3. contextを設定する
続いて同じNodeでcontextを設定します。
context editorは「Then respond with」の右にあるアイコンをクリックすると出てくる「Open context editor」を選択すると出てきます。
![スクリーンショット 2019-08-16 13.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/f406df49-2c73-c31e-46fa-638a417b6c2f.png)
contextには以下を設定します。

・VARIABLE: `nazonazo_random`
・VALUE: `"<?('nazonazo-').append(new Random().nextInt(2)+1) ?>"`
![スクリーンショット 2019-08-16 13.45.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/832a4cd1-3308-e04a-29dc-10117ca2f94f.png)
何をしているかというと、「nazonazo_random」というcontextを作成して、その値として1と2で乱数を発生させて「nazonazo-」の後につけています。

###4. 返答を設定
同じNodeのAnd respond withに返答を設定します。
・Then respond with: `わかりました！`
![スクリーンショット 2019-08-16 13.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/333225d8-7e6f-8f5e-3746-c7df16a0b46c.png)

###5. 子Nodeを二つ作成
「なぞなぞをせがむ」Nodeの子Nodeを二つ作成します。
また、「なぞなぞをせがむ」Nodeから上の子NodeへのJump toを設定するのですが、「Evaluate condition」を選択してください。
![スクリーンショット 2019-08-16 14.04.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/bcdf98f2-8670-98db-8f51-010c2b507ae6.png)

###6. 子Nodeを編集する
上の子Nodeに以下の設定をしてください。
・Node name: `なぞなぞ①`
・If assistant recognizes: `$nazonazo_random=='nazonazo-1'`
・Then respond with: `パンはパンでも食べられないパンは？`
![スクリーンショット 2019-08-16 14.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/b8ec75b8-5e0c-1880-921d-bcf626b1216c.png)

下の子Nodeには以下の設定をします。
・Node name: `なぞなぞ②`
・If assistant recognizes: `$nazonazo_random=='nazonazo-2'`
・Then respond with: `フランスはフランスでも食べられるフランスは？`
![スクリーンショット 2019-08-16 14.32.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/bd03aa7b-2451-f84d-4c92-42f7bc72bb9c.png)

###7. 子Nodeの子Nodeを作成する
なぞなぞ①、②にそれぞれ子Nodeを2つ作成します。
![スクリーンショット 2019-08-16 14.41.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/34b5551b-d0fa-4ad5-25db-84e6bc930b85.png)

###8. 子Nodeの子Nodeを編集する
なぞなぞ①の上の子Nodeから設定をしていきます。
・Node name: `正解`
・If assistant recognizes: `input.text=='フライパン'`
・Then respond with: `正解です！`
ユーザが「フライパン」と答えたときのみ反応する設定です。
![スクリーンショット 2019-08-16 14.47.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/396be141-7063-c3ab-46ab-5f89d6251b46.png)

なぞなぞ①の下の子Nodeは以下の通りに設定をします。
・Node name: `不正解`
・If assistant recognizes: `anything_else`
・Then respond with: `ぶっぶ〜`
anything_elseの設定により、「フライパン」という正解以外に反応させることができます。
![スクリーンショット 2019-08-16 15.06.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/b806e732-2334-c7dc-182e-24d695874590.png)

続いてなぞなぞ②の上の子Nodeです。
正解を「フランスパン」にする以外は同じような設定をします。
・Node name: `正解`
・If assistant recognizes: `input.text=='フランスパン'`
・Then respond with: `正解です！`
![スクリーンショット 2019-08-16 15.12.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/b6ceb548-bcb0-ed3b-4109-dd12868cdf29.png)

最後になぞなぞ②の下の子Nodeです。
こちらはなぞなぞ①の下の子Nodeとまったく一緒の設定です。
・Node name: `不正解`
・If assistant recognizes: `anything_else`
・Then respond with: `ぶっぶ〜`
![スクリーンショット 2019-08-16 15.24.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/a267aaaa-102c-6aa8-3836-debc7dc43c97.png)

以上で設定は完了です。

###9. 動作確認
Try itで動作を確認します。
![スクリーンショット 2019-08-16 15.32.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/89d415ec-658d-de4f-5d21-9a02ee65f5bf.png)
きちんとランダムになぞなぞを出し、正解にも反応しています。
![スクリーンショット 2019-08-16 15.36.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411784/e8f21784-d59d-83b5-e059-3f0329d3a2e6.png)
正解以外の言葉の判定もきちんと機能しているようです。
ケース②完成です。

#まとめ
ランダムで返答を返す２種類の方法を紹介させていただきました。
ケース②ではなぞなぞを例として出してみましたが、他にも色々活用法はあると思うので、ぜひ色々試してみてください。
また他にもランダムで返す方法があったら追加していきたいと思います。