文脈的に関連するサブインテントを追加することは、会話型ボットを構築する上で重要な要素の1つです。文脈的に関連するインテントは、ダイアログフローの中で異なるパスを利用して、過去に提供されたエンティティ値を修正するなど、さまざまな目的で必要となります。
コンテクスト切り替えの管理方法では、より自然で人間らしいボットとの対話を実現するために、コンテクストデータの割り込み処理と組み合わせて使用する方法を見てきました。
この機能の主な目的は、任意の2つのインテント間の割り込み動作を定義することです。
この機能を使用して、カスタムフルフィルメント動作を持つコンテクストに関連するインテントの動作を定義することは困難です。
コンテクストNLUを簡素化する目的で、グループノードの機能が強化され、インテントのスコープ、トレーニング、フルフィルメントの設定が可能になりました。詳細はこちらをご覧ください。
この手引きでは、余談、入力値の修正、文脈に沿ったフォローアップの質問等を含むフライト予約ボットのシナリオを探ります。グループノードを使用して、これらすべてを簡単かつ一か所から実現していきます。
問題点
航空券を予約する過程で、ユーザーが
- 目的地や日程を変更する場合、
- 予約を確定する前に、フライト予約タスクに含まれていない気象情報を確認したい場合
- 予約に関して質問がある場合
- タスクをキャンセルする場合
ステップ2a: サブインテントを定義し、目的地と日程の変更に対する動作をトレーニングしてプロパティを設定する
次に、サブインテントを定義し、トレーニングを追加し、オプションとして、サブインテントが特定されるべき条件と、その場合のボットの動作を設定する必要があります。
まず、目的地と日程の変更を可能にする場合を考えてみましょう。
- エンティティグループウィンドウからインテントの追加ボタンをクリックします
- 日程と目的地の変更を許可するインテントを作成します
- インテントの名前を「変更日および変更先」のように入力します
- 説明を入力します
- 「トレーニング」の「機械学習」オプションを使用して、このインテントを特定できるようユーザーの発話でトレーニングしてみましょう
- 「別の日付と目的地を試してみましょう」というように、発話を追加します
- 「気が変わったから、もう一度やり直そう」というように、オプションで別の発話を追加します
- この発話のサブインテントをトレーニングします。
- 目的地と日程をリセットする
- 「フルフィルメント」の「コンテクストの変数を設定する」オプションで、以下のキー/値ペアを使用して、目的地の都市と日程をリセットします。
キー 値 context.entities.To null context.entities.When null
- 「フルフィルメント」の「コンテクストの変数を設定する」オプションで、以下のキー/値ペアを使用して、目的地の都市と日程をリセットします。
- オプションで、変更について「分かりました、最初からやり直しましょう」というように、メッセージをユーザーに提示します
- 「切り替えフロー」の「ノードへ移動」オプションを使用して、フローを「Fromエンティティノード」に戻します。
Fromエンティティの値は変更されていないので、フローは次のエンティティToとWhenに移動します。
- 日程と目的地の変更を許可するインテントを作成します
ステップ2b: NERのトレーニングと一緒に、目的地変更のためのサブインテントの定義、トレーニング、動作プロパティの設定を行います
元のエンティティ値を変更するという上記の使用例の続きとして、ユーザーが自分の発話の中で変更を指定する場合があります。ここでは、ユーザが発話の中で目的地の変更を指示する場合を想定します。
- 「インテントの追加」ボタンをクリックすると、新しいサブインテントが追加されます。
- 目的地の変更を許可するインテントの作成
- インテントの名前を「目的地を変更する」のように入力します
- 説明を入力します
- 「トレーニング」の「機械学習」オプションを使用して、このインテントを特定できるようユーザーの発話でトレーニングしてみましょう
- 「代わりにシカゴへ行きましょう 」という発話を追加します
- NERアプローチを使用して、発話中のToエンティティに注釈を付けます。
- この発話のためのサブインテントをトレーニングします。
- キャプチャした値に目的地の値を設定します。この値は、コンテクストオブジェクトの identifiedSubIntents 配列として格納されます。なお、特定された最新のサブインテントは、常に配列の0番目のインデックスに格納されます。
- 「フルフィルメント」の「コンテクストの変数を設定する」オプションで、以下のキーと値のペアを使用して宛先の都市を設定します:
キー 値 context.entities.To context.identifiedSubIntents[0].entities.To
- 「フルフィルメント」の「コンテクストの変数を設定する」オプションで、以下のキーと値のペアを使用して宛先の都市を設定します:
- 「目的地を{{context.identifiedSubIntents[0].entities.To}}へ変更します」というように、オプションでユーザにメッセージを表示することができます
- 「切り替えフロー」の「ノードへ移動」オプションを使用して、フローを「Fromエンティティノード」に戻します。
- 目的地の変更を許可するインテントの作成
文脈上の脱線
会話は決して直線的に起こるものではありません。ユーザーは会話が脱線しても話を戻すでしょう。
これを実現するために、グループを使った手順を見てみましょう。
飛行機を予約する際、ユーザーは日程を決定する前に目的地の天気を確認したいと思うかもしれません。ボットが日程の入力を待っている間に、「明日のXYZ市の天気はどうですか」と質問するかもしれません。このような場合、ユーザーは日付の再入力を求められる前に、天気情報を表示する必要があります。
上記のエンティティを修正する場合と同様に、手順としては、天気予報ダイアログの範囲を設定し、トレーニングを行い、動作を設定します。
- 天気予報に関連するクエリの範囲は、実際の予約の前の時点であるため、「エンティティの修正」の事例で使用したのと同じエンティティグループを使用します。
- ダイアログノードを追加して、現在のダイアログから天気予報ダイアログを実行します。
ヒント: 既存のノードに天気予報ダイアログタスクを追加してから、接続から外し、他のノードに接続されていないフローティングノードにします。 - このタスクは位置情報の入力を必要とし、今回の場合は、ユーザーが入力した目的地の都市に設定することができます。
- このダイアログの接続ルールは、Fromエンティティにループバックする必要があります。これにより、ユーザーは元の会話の流れの中で中断したところから再開することができます。
- エンティティグループの設定ダイアログから
- 「ボットと話す」を使用して、シナリオをテストします。
コンテクストに関するよくあるご質問
グループノードは、コンテクストの質問に答えるためにも使用できます。
ユーザーは、予約完了後のチェックインプロセスに関する問い合わせをするかもしれません。
その確認手順は入力値の修正、文脈的な脱線 – スコーピング、トレーニング、動作の定義と同じです。
- ここでは予約確定後を対象としているため、予約後の手続きのノードをまとめます
- グループに名前を付けます。たとえば、問い合わせグループとします
- 説明を入力します
- 問い合わせグループの設定ダイアログから、新しいインテントの追加を選択します
- ユーザーからの問い合わせを許可するインテントの作成をクリックします
- インテントの名前を「チェックインに関する問い合わせ」と入力します
- 説明を入力します
- 「トレーニング」の「機械学習」オプションを使用して、このインテントを特定できるようユーザーの発話でトレーニングしてみましょう
- 「空港には何時に到着すればいいですか」 という発話を追加します
- オプションで、「チェックインの時間は?」という別の発話を追加します
- この発話のためのサブインテントをトレーニングします。
- 「メッセージの表示」を使って、「オンラインチェックインをご利用になりましたので、出発の30分前までにお越しください」などと、ユーザーに答えます
- 「切り替えフロー」が「ダイアログを再開」に設定されていることを確認します
- ユーザーからの問い合わせを許可するインテントの作成をクリックします
- 「ボットと話す」オプションを使用して、シナリオをテストします。