More than 5 years have passed since last update.
Watson ConversationのTutorialを日本語でやってみた (後編)
はじめに(前編のおさらい)
本記事は、Watson ConversationのTutorialを日本語でやってみた (前編)に続く後編です。前回に引き続き、Watson Conversation(以下、Conversation)のチュートリアルの題材である自動車チュートリアルを日本語で実施していきます。
前回では、まずチュートリアルに先立ち、Conversationの3要素、目的を示すintent, それを補足するキーワードのentity, ユーザーからの呼びかけとWatsonからの応答の組み合わせであるdialogについて解説しました。そしてチュートリアルでは、Conversationサービスとワークスペースを作成し、その中でintentとentityの作成を完了しました。最後にこの状態でWatsonとの会話において実際にintentとentityを使っての会話を試みましたが、まだこの段階では、Watsonはこれらを認識こそするものの、応答を返すまでには至らなかったのでした。
今回では、Conversationの最後の1要素、dialogを作成することにより、Watsonが応答を返せるようにします。
チュートリアルの前に
実際にチュートリアルを再開する前に、ふたたび必要最低限の事項を説明します。
前回(前編)、dialogを次のように説明しました。
-
dialog:
ユーザーからの呼びかけとそれに対するWatsonからの応答の組み合わせです。
ユーザーからの呼びかけを受け取るとそのintentとentityが識別され、dialogの中でそれらに対応する正しい応答が選択されます。
一度のやりとりに対応する単一のdialogであることもあれば、何回かのやりとりに対応する木構造のdialogであることもあります。
自動車チュートリアルにおいては、次のような会話をさせるべく、次に示す図のようなdialogを作成します。
- 自動車チュートリアルのdialog
- 図表はクリックすると拡大します。
- 会話開始時にWatsonに
自動車デモへようこそ!と応答させる。
- ユーザーからの呼びかけを待ち、そのユーザーの呼びかけにWatsonが識別できるintentが含まれるかどうかによって、Watsonにそれぞれ下記の応答をさせる。
- 2-1.
#あいさつintentを含む場合:こんにちは!ご用件は何でしょうか?- 2-2.
#起動intentを含む場合:後述の3. により追加の処理を行う。- 2-3. いずれのintentも含まない場合:
すみません。わかりません。もう一度お願いします。
- 前述2-2.の場合はさらに、ユーザーからの呼びかけに
@機器entityが含まれるかどうか、含まれる場合はそのentity値が何かによって、Watsonにそれぞれ下記の応答をさせる。
- 3-1.
@機器entityを含み、それが@機器:音楽entity値である場合:後述の4. により追加の処理を行う。- 3-2.
@機器entityを含み、それが@機器:音楽entity値でない場合:わかりました。@機器を起動します。(@機器の部分に、ユーザーからの呼びかけに含まれる@機器entityのentity値が入ります)- 3-3.
@機器entityを含まない場合:すみません。どのようにするのかわかりません。起動可能なものは、音楽、ヘッドライト、エアコンです。
- 前述3-1.の場合はさらに、Watsonに
わかりました。どんな音楽が聞きたいですか?と応答させることでユーザーに追加の呼びかけをさせた上で、そのユーザーからの呼びかけに@ジャンルentityが含まれるかどうかによって、Watsonにそれぞれ下記の応答をさせる。
- 4-1.
@ジャンルentityを含む場合:わかりました。@ジャンルを流します。(@ジャンルの部分に、ユーザーからの呼びかけに含まれる@ジャンルentityのentity値が入ります)- 4-2.
@ジャンルentityを含まない場合:すみません。ジャンルがわかりません。選べるジャンルはクラシック、リズムアンドブルース、ロックです。
ところで、前回(前編)では3つの会話例(1)-(3)が登場しました。この3つの会話例はこの自動車チュートリアルのdialogの一例となっており、それぞれの会話例では下記のようなdialogの分岐が発生しています。
- 会話例(1):(1.) → **2-1.**と分岐
ユーザー:こんにちは。
Watson:こんにちは!ご用件はなんでしょうか?
- 会話例(2):(1.) → 2-2. → **3-2.**と分岐
ユーザー:ヘッドライトをつけて。
Watson:わかりました。ヘッドライトを起動します。
- 会話例(3):(1.) → 2-2. → 3-1. → **4-1.**と分岐
ユーザー:音楽を流して。
Watson:わかりました。どんな音楽が聞きたいですか?
ユーザー:クラシックにして。
Watson:わかりました。クラシックを流します。
チュートリアル
では、チュートリアルを再開します。
Stage 6: dialog作成
dialogを作成するためにはノードと呼ばれる箱を作成します。ひとつのノードはひとつの会話に対応します。それぞれのノードに対して、そのノードが真となる条件と、そのときにWatsonからユーザーに返す応答を記述していきます。ノードを作成したら、そのノードを他のノードのサブノートまたは並列ノードとして接続します。
会話が始まると、dialog内で接続されたノードを順番に評価していき、現在のノードが真となった場合はそのノードに記述された応答を返し、そのノードのサブノートがあればそちらの評価に移ります。現在のノードが偽となった場合はそのノードに記述された応答は返さず、そのノードの並列ノードがあればそちらの評価に移ります。
前述した自動車チュートリアルのdialogの流れに対応して、次の順序でノードを作成していきます。
- 始点ノードの作成
-
#あいさつノード,#起動ノードの作成 -
@機器ノードの作成 -
@機器:音楽ノードの作成
始点ノードの作成
はじめに会話の始点となるノードを設定します。
自動車チュートリアルワークスペースページにてDialogタブをクリックします。
DialogタブにてCreateをクリックします。
👁 WS000031.JPG
単一のノードでdialogが作成されます。
👁 WS000032.JPG
Enter a condition欄にconversation_startと入力します。
入力するとドロップダウンリストが表示されますが、そこでconversation_start(create new condition)を選択します。
👁 WS000037.JPG
Watson says欄に自動車デモへようこそ!と入力します。
これは指定した条件(この場合はconversation_start)が真の場合に返す応答です。
👁 WS000038.JPG
Anything elseノードをクリックします。
このノードはconversation_startノードが定義されたとき自動的に作成されるノードです。
👁 WS000039.JPG
Anything elseノードのWatson says欄にすみません。わかりません。もう一度お願いします。と入力します。
これはユーザーからの呼びかけが他のどのノードにも一致しない場合に返す応答です。
👁 WS000040.JPG
会話をテストします。
- 右上の会話アイコンをクリックします。
👁 WS000042.JPG
チャットウインドウに応答「自動車デモへようこそ!」が自動的に表示されます。
👁 WS000041.JPG
- 好きな文章を入力しEnterを押します。
👁 WS000044.JPG
始点以外の他のノードをまだ何も定義していないため、応答「すみません。わかりません。もう一度お願いします。」が表示されます。
👁 WS000045.JPG
#あいさつノード, #起動ノードの作成
次に、始点ノードと並列なノードとして、2つのintentに対応する#あいさつノードと#起動ノードを作成します。さらに、ユーザーからの呼びかけに#あいさつintentおよび#起動intentを含むとき、それぞれ対応するノードに分岐するように条件を設定します。
#あいさつノードの作成
Conversation_startノード下部の+アイコンをクリックして、並列に新たなノードを作成します。
👁 WS000046.JPG
Enter a condition欄に#あいさつと入力します。ドロップダウンリストが表示されたら#あいさつを選択します。
👁 WS000048.JPG
Watson says欄にこんにちは!ご用件は何でしょうか?と入力します。
👁 WS000049.JPG
- チャットウインドウで会話をテストします。
こんにちはと入力します。
#あいさつintentが認識され、正しい応答が表示されます。
👁 WS000050.JPG
#起動ノードの作成
#あいさつノード下部の+アイコンをクリックして、並列に新たなノードを作成します。
👁 WS000051.JPG
Enter a condition欄に#起動と入力します。ドロップダウンリストが表示されたら#起動を選択します。
👁 WS000052.JPG
@機器ノードの作成
2つのintentのうち、#あいさつintentに対する応答は一種類であるため、#あいさつノードは単一ノードからなります。一方で、#起動intentに対する応答は、ユーザーがどの機器の起動を要求したか、またそれが有効な機器であるか(有効な#機器entity値を含んでいるか)どうかによって異なるため、#起動ノードから2つのサブノートを追加します。
有効な機器が指定された場合
まず、ユーザーからの呼びかけが有効な@機器entity値を含むときに分岐する@機器ノードを作成します。
#起動ノード右部の+アイコンをクリックして、新たなサブノードを作成します。
👁 WS000053.JPG
Enter a condition欄に@機器と入力します。ドロップダウンリストが表示されたら@機器を選択します。
👁 WS000054.JPG
#起動ノード右上端のOptionsアイコンをクリックしContinue fromをクリックします。
👁 WS000056.JPG
@機器ノードをクリックしGo to Conditionをクリックします。
👁 WS000057.JPG
👁 WS000058.JPG
途中で登場した#起動ノードから@機器ノードへのContinue fromリンクは、#起動ノードへ分岐したとき次のユーザーからの呼びかけを待つことなくそのまま@機器ノードへ分岐することを意味します。
有効な機器が指定されなかった場合
次に、ユーザーからの呼びかけが有効な@機器entity値を含まないときに分岐するノードを作成します。
@機器ノード下部の+アイコンをクリックして、並列に新たなノードを作成します。
👁 WS000059.JPG
Enter a condition欄にtrueと入力します。ドロップダウンリストが表示されたらtrue (create new condition)を選択します。
👁 WS000088.JPG
Watson says欄にすみません。どのようにするのかわかりません。起動可能なものは、音楽、ヘッドライト、エアコンです。と入力します。
👁 WS000089.JPG
@機器ノードが偽であると評価された場合はこのノードに分岐しますが、このノードの条件にtrueを選択することによってこのノードは常に真であると評価されるようになり、それより下の並列ノードに遷移することはなくなります。
@機器:音楽ノードの作成
同様に、ユーザーが有効な機器を指定した場合の適切な応答を決定するための、@機器ノードの2つのサブノートを追加します。2つのノードはそれぞれ、起動する機器が音楽である場合とない場合に対応します。
起動する機器が音楽である場合
まず、ユーザーからの呼びかけが@機器:音楽entity値を含むときに分岐する@機器:音楽ノードを作成します。
このノードに分岐する場合、追加情報として音楽のジャンルを必要とするため、さらにサブノートもあわせて作成します。
@機器ノード右部の+アイコンをクリックして、新たなサブノードを作成します。
👁 WS000090.JPG
Enter a condition欄に@機器と入力します。ドロップダウンリストが表示されたら@機器:音楽を選択します。
👁 WS000091.JPG
Watson says欄にわかりました。どんな音楽が聞きたいですか?と入力します。
👁 WS000092.JPG
@機器ノード右上端のOptionsアイコンをクリックしContinue fromをクリックします。
👁 WS000093.JPG
@機器:音楽ノードをクリックしGo to Conditionをクリックします。
👁 WS000094.JPG
途中で登場した@機器ノードから@機器:音楽ノードへのContinue fromリンクは、@機器ノードへ分岐したとき次のユーザーからの呼びかけを待つことなくそのまま@機器:音楽ノードへ分岐することを意味します。
有効なジャンルが指定された場合
ユーザーからの呼びかけが有効なジャンルentity値を含むときに分岐するノードを作成します。
@機器:音楽ノード右部の+アイコンをクリックして、新たなサブノードを作成します。
👁 WS000095.JPG
Enter a condition欄に@ジャンルと入力します。ドロップダウンリストが表示されたら@ジャンルを選択します。
👁 WS000096.JPG
Watson says欄にわかりました。@ジャンル を流します。と入力します。
👁 WS000097.JPG
今回は@機器:音楽ノードから@ジャンルノードへのContinue fromリンクを設定しませんでした。この場合、@機器:音楽ノードへ分岐したときには次のユーザーからの呼びかけを待ってから@機器:音楽ノードへ分岐することを意味します。
有効なジャンルが指定されなかった場合
ユーザーからの呼びかけが有効なジャンルentity値を含まないときに分岐するノードを作成します。
@ジャンルノード下部の+アイコンをクリックして、並列の新たなサブノードを作成します。
👁 WS000098.JPG
Enter a condition欄にtrueと入力します。ドロップダウンリストが表示されたらtrue (create new condition)を選択します。
👁 WS000099.JPG
Watson says欄にすみません。ジャンルがわかりません。選べるジャンルはクラシック、リズムアンドブルース、ロックです。と入力します。
👁 WS000100.JPG
@ジャンルノードが偽であると評価された場合はこのノードに分岐しますが、このノードの条件にtrueを選択することによってこのノードは常に真であると評価されるようになり、それより下の並列ノードに遷移することはなくなります。
会話をテストします。
- チャットウインドウに
音楽を流してと入力します。
👁 WS000078.JPG
#起動intentと@機器:音楽entityが認識され、音楽のジャンルの入力を求められます。
- 有効な
@ジャンルentity値の名前または類義語を入力します。
👁 WS000079.JPG
@ジャンルentityが認識され適切な応答が返されます。
- チャットウインドウに再び
音楽を流してと入力し、今度は無効なジャンルを入力します。
👁 WS000080.JPG
認識できなかったことを示す応答が返されます。
起動する機器が音楽以外である場合
つぎに、ユーザーからの呼びかけが@機器:音楽entity値をまないときに分岐するノードを作成します。
このノードに分岐する場合、他に追加情報を必要としないため、サブノートは作成しません。
@機器:音楽ノード下部の+アイコンをクリックして、並列の新たなサブノードを作成します。
👁 WS000081.JPG
Enter a condition欄にtrueと入力します。ドロップダウンリストが表示されたらtrue (create new condition)を選択します。
👁 WS000082.JPG
Watson says欄にわかりました。@機器 を起動します。と入力します。
👁 WS000083.JPG
@機器:音楽ノードが偽であると評価された場合はこのノードに分岐しますが、このノードの条件にtrueを選択することによってこのノードは常に真であると評価されるようになり、それより下の並列ノードに遷移することはなくなります。
会話をテストします。
- チャットウインドウに
ヘッドライトをつけてと入力すると、#起動intentと@機器:ヘッドライトentityが認識され、わかりました。ヘッドライトを起動します。という応答が返ります。
エアコンをつけてと入力すると、#起動intentと@機器:エアコンentityが認識され、わかりました。エアコンを起動します。という応答が返ります。
👁 WS000084.JPG
- 定義した類義語に基づく入力を試してみます。
👁 WS000085.JPG
類義語でも正しく識別されることがわかります。
おわりに
今回dialogを作成したことによって、ユーザーからの呼びかけに対してWatsonが応答を返せるようになりました。
前回(前編)と今回(後編)を通して、以上でConversationのチュートリアルを完了しました。
本記事によって、Conversationを使った応答システム実現の手順を手軽と感じていただければ、何よりの幸いです。
お問い合わせ
ご質問がございましたら、こちらにもお問い合わせいただけます。
すくすくワトソン編集室: eb17685@jp.ibm.com
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme
