はじめに
今回は、想定された2つのパターンの会話をWatson Assistantで作成していきます。この記事を進めた上での最終的な成果物としては、ランダムに調子を答えるChatbotと、ランダムになぞなぞを出すChatbotを予定しています。
この記事はある程度Watson Assistantを触ったことがある人を想定して書いているので、基本的な操作(Intentの作成方法等)の説明は省略しています。
操作方法が不安な方はこちらの公式取り扱い説明書を片手に操作してください。
環境および事前準備
IBM Watson Assistant : Lite版
言語を日本語に設定したSkillを作成しておく
想定ケース
返答をランダムに設定する、ということで今回想定しているケースは2パターンあります。
①ランダムに設定したい返答の後は分岐しない
以下の図のように、一言のみランダムに返答させたいパターンです。
返答は一言でもその後分岐させたい場合はもう一方のパターンになります。

②ランダムに設定したい返答の後に分岐する
こちらは以下の図のように、ランダム設定した返答の後に分岐した会話が続くパターンです。

本題
では以上の2ケースを実際に作成していきましょう。
ケース①の会話作成方法
こちらが「調子はどう?」と聞くと、ランダムで返答を返す会話を作成します。
1. Intentの作成
Intent編集画面にて「#調子を聞く」Intentを作成します。
例文はなんとなく3つ設定しましたが、一つだけやそれ以上でも何も問題はありません。

2. Nodeを作成・設定する
Dialog編集画面にて「ようこそ」Nodeの下にNodeを追加し、以下の設定を入力します。
・Node Name: 調子を聞く
・If assistant recognizes: #調子を聞く

3. 返答内容を入力・設定する
続いて、「Then respond with」 に返答内容を設定します。
・Then respond with: 元気です、まあまあです、お腹痛い
入力が完了したら、入力欄の下にデフォルトでは「Response variations are set to sequential」になっているところを、横の「Random」を選択します。

設定は完了です。
4. 動作確認
Try itで動作確認をします。

ランダムで調子を答えているので問題なさそうです。
こちらのケース①は、要はResponse variationを「Random」に設定するとvariationの中から1つランダムで返答してくれるよ!という話でした。簡単ですね。
しかし、「Random」に設定したvariation以降の会話はvariationに付随させる形で分岐させることはできません。つまり出したなぞなぞごとに答えを変えるということができないため、この設定だけでランダムでなぞなぞを出す会話を作ろうとすると、全ての種類のなぞなぞの答えが一括して正解として扱われてしまいます。

そこでケース②が出てきます。
ケース②の会話作成方法
ケース②ではなぞなぞをランダムで出してくれる会話を作成します。
1. Intentを作成する
Intent作成画面で新規で「なぞなぞをせがむ」Intentを作成します。

2. Nodeを作成・設定する
Dialog編集画面にて「ようこそ」Nodeの下にNodeを追加し、以下の設定を入力します。
・Node Name: なぞなぞをせがむ
・If assistant recognizes: #なぞなぞをせがむ

3. contextを設定する
続いて同じNodeでcontextを設定します。
context editorは「Then respond with」の右にあるアイコンをクリックすると出てくる「Open context editor」を選択すると出てきます。

contextには以下を設定します。
・VARIABLE: nazonazo_random
・VALUE: "<?('nazonazo-').append(new Random().nextInt(2)+1) ?>"

何をしているかというと、「nazonazo_random」というcontextを作成して、その値として1と2で乱数を発生させて「nazonazo-」の後につけています。
4. 返答を設定
同じNodeのAnd respond withに返答を設定します。
・Then respond with: わかりました!

5. 子Nodeを二つ作成
「なぞなぞをせがむ」Nodeの子Nodeを二つ作成します。
また、「なぞなぞをせがむ」Nodeから上の子NodeへのJump toを設定するのですが、「Evaluate condition」を選択してください。

6. 子Nodeを編集する
上の子Nodeに以下の設定をしてください。
・Node name: なぞなぞ①
・If assistant recognizes: $nazonazo_random=='nazonazo-1'
・Then respond with: パンはパンでも食べられないパンは?

下の子Nodeには以下の設定をします。
・Node name: なぞなぞ②
・If assistant recognizes: $nazonazo_random=='nazonazo-2'
・Then respond with: フランスはフランスでも食べられるフランスは?

7. 子Nodeの子Nodeを作成する
8. 子Nodeの子Nodeを編集する
なぞなぞ①の上の子Nodeから設定をしていきます。
・Node name: 正解
・If assistant recognizes: input.text=='フライパン'
・Then respond with: 正解です!
ユーザが「フライパン」と答えたときのみ反応する設定です。

なぞなぞ①の下の子Nodeは以下の通りに設定をします。
・Node name: 不正解
・If assistant recognizes: anything_else
・Then respond with: ぶっぶ〜
anything_elseの設定により、「フライパン」という正解以外に反応させることができます。

続いてなぞなぞ②の上の子Nodeです。
正解を「フランスパン」にする以外は同じような設定をします。
・Node name: 正解
・If assistant recognizes: input.text=='フランスパン'
・Then respond with: 正解です!

最後になぞなぞ②の下の子Nodeです。
こちらはなぞなぞ①の下の子Nodeとまったく一緒の設定です。
・Node name: 不正解
・If assistant recognizes: anything_else
・Then respond with: ぶっぶ〜

以上で設定は完了です。
9. 動作確認
Try itで動作を確認します。

きちんとランダムになぞなぞを出し、正解にも反応しています。

正解以外の言葉の判定もきちんと機能しているようです。
ケース②完成です。
まとめ
ランダムで返答を返す2種類の方法を紹介させていただきました。
ケース②ではなぞなぞを例として出してみましたが、他にも色々活用法はあると思うので、ぜひ色々試してみてください。
また他にもランダムで返す方法があったら追加していきたいと思います。
