ダイアログの処理方法

ダイアログでは、ユーザー入力から検出されたインテントに加えてアプリケーションのコンテキストを使用してユーザーと対話し、最終的に有用な応答を返します。

このダイアログでは、インテント (ユーザーが実行したいこと) と応答 (ボットが返す内容) が一致します。 応答は、What are your store hours? などの質問に対する答えである場合も、注文などのコマンドの実行に対する答えである場合もあります。 検出されたインテントとエンティティーだけで正しい応答を導出できる場合もあれば、正しく応答するためにダイアログでユーザーに追加入力を求めなければならない場合もあります。 例えば、ユーザーがWhere can I get some food?と質問した場合は、レストランに行きたいのかそれとも食料品店に行きたいのか、食事をしたいのかそれともテイクアウトしたいのか、などを明確にする必要があります。 テキストによる応答で詳細を尋ね、新たな入力を処理するための子ノードを 1 つ以上作成することができます。

ダイアログは watsonx Assistant 内でグラフィカルなツリー構造で表されます。 会話で扱うインテントごとに、インテントを処理するブランチを作成します。 1 つのブランチは複数のノードで構成されます。

ダイアログ・ノード

各ダイアログ・ノードには、少なくとも 1 つの条件と 1 つの応答が含まれます。

![Shows user input going to a box that contains the statement If: CONDITION, Then: RESPONSE](images/node1-empty.png

  • 条件: ダイアログのこのノードをトリガーするためにユーザー入力に含まれている必要がある情報を指定します。 情報は通常、特定のインテントです。 情報は、エンティティー・タイプ、エンティティー値、またはコンテキスト変数値の場合もあります。 詳しくは、 条件 を参照してください。
  • 応答: アシスタントがユーザーに応答するために使用する発話。 オプションのイメージまたはリストを表示したり、プログラムによるアクションをトリガーしたりするように、応答を構成することもできます。 詳しくは、 応答 を参照してください。

ノードは if/then 構造を持つものと見なすことができます。その条件が true であれば、その応答が返されます。

例えば、アシスタントの自然言語処理機能が、ユーザー入力に #cupcake-menu インテントが含まれていることを検出した場合は、次のノードがトリガーされます。 ノードがトリガーされた結果として、アシスタントは適切な回答を返します。

ユーザーがカップケーキ・フレーバーについて質問しているのを示します。 If 条件は #cupcakeメニューで、Then 応答はカップケーキ・フレーバーのリストです。
単純な条件と応答 (Simple condition and response)

単純なユーザー要求であれば、条件と応答を 1 つずつ含む 1 つのノードで処理できます。 しかし、多くの場合、ユーザーはより高度な質問をしたり、より複雑な作業のヘルプを求めたりします。 その場合は、アシスタントに必要な追加情報を提供するようにユーザーに求める子ノードを追加します。

ダイアログの最初のノードが、ユーザーが希望するカップケーキのタイプ (グルテン・フリーまたは通常) を尋ね、ユーザーの回答に応じて異なる応答を提供する 2 つの子ノードがあることを示します。
子ノードを持つNode

ダイアログのフロー

作成したダイアログを、アシスタントは、ツリーの最初のノードから最後のノードまで処理します。

3 つのノードの横を指す矢印は、最初のノードから最後の
Node ・フローまでのダイアログ・フローを示します。

アシスタントはツリーを上から下に処理し、満たされている条件を検出すると、そのノードをトリガーします。 その次は、トリガーされたノードに移動し、子ノードの条件とユーザー入力を照合します。 子ノードをチェックすると、再び最初の子ノードから最後の子ノードに移動します。

アシスタントは、ダイアログ・ツリーを最初のノードから最後のノードまでたどります。途中、ノードがトリガーされるたびに、そのノードの最初の子ノードから最後の子ノードまでたどり、また、子ノードがトリガーされるたびに、そのブランチを最後のノードに達するまでたどります。

最初のルート・ノードから最後のルート・ノードを指す矢印 1、トリガーされたノードの長さを指す矢印 2、およびトリガーされたノードの最初の子ノードから最後の子ノードを指す矢印 3 を示しています。
Node ・フロー

ダイアログの作成を始めるには、ツリーに含めるブランチとその配置場所を決める必要があります。 ノードは最初から最後まで評価されるので、ブランチの順序が重要です。 入力と一致する条件を持つ最初のルート・ノードが使用されます。つまり、それより後に位置するツリー内のノードはトリガーされません。

アシスタントがブランチの最後に到達した場合、または、評価対象である現在の子ノードのセットに true と評価される条件がない場合、アシスタントはツリーの基点にジャンプして戻ります。 アシスタントは、ルート・ノードを最初から最後まで処理します。 true と評価される条件がまったくない場合は、ツリー内の最後のノードの応答が返されます。このノードは通常、常に true と評価される特殊な anything_else 条件を持ちます。

以下の方法で、最初から最後までたどる標準的なフローを中断することができます。

  • ノードが処理された後に実行する内容をカスタマイズすることにより。 例えば、ノードが処理された後に別のノードに直接ジャンプするように、あるノードを構成すると、ジャンプ先のノードより前に位置する他のノードがツリー内にあっても無視することができます。 詳しくは、 次の作業の定義 を参照してください。

  • 他のノードにジャンプするように条件付き応答を構成することにより。 詳しくは、 条件付き応答 を参照してください。

  • ダイアログ・ノードの脱線設定を構成することにより。 脱線は、実行時にユーザーがノードを移動する方法にも影響する場合があります。 ほとんどのノードから脱線できるようにして、戻りを構成した場合、ユーザーは簡単に別のノードにジャンプして戻ることができます。 詳しくは、 脱線 を参照してください。

サンプル・ダイアログ

この図は、グラフィカル・ユーザー・インターフェース・ダイアログ・エディターを使用して構築されるダイアログ・ツリーのモックアップを示しています。

コンテンツ例を含むサンプル・ダイアログ・ツリー
ダイアログ・ツリー

この図のダイアログ・ツリーには、2 つのルート・ダイアログ・ノードが含まれています。 標準的なダイアログ・ツリーではノードの数がこれより多いですが、この図はノードのサブセットの概観を表しています。

  • 1 つ目のルート・ノードは、インテント値を条件としています。 2 つの子ノードがあり、各子ノードはエンティティー値を条件としています。 2 つ目の子ノードは、2 つの応答を定義しています。 コンテキスト変数の値が条件で指定された値と一致する場合、最初の応答がユーザーに返されます。 一致しない場合は、2 つ目の応答が戻されます。

    この標準タイプのノードは、特定のトピックに関する質問を取り込んでから、ルート応答の中で、子ノードで対応する補足質問を尋ねるのに役立ちます。 例えば、割引に関するユーザーの質問を認識し、そのユーザーが、会社が用意している特別な割引の対象の団体のメンバーかどうかに関する補足質問を行います。 団体のメンバーかどうかに関する質問に対するユーザーの答えに基づいて、子ノードがさまざまな対応をします。

  • 2 つ目のルート・ノードは、スロットを含むノードです。 このノードも、インテント値を条件としています。 このノードは、ユーザーから収集しようとしている情報の部分ごとに 1 つずつスロットのセットを定義します。 各スロットは、ユーザーから答えを引き出す質問を行います。 プロンプトに対するユーザーの応答内で特定のエンティティー値を探し、スロット・コンテキスト変数にそれを保存します。

    このタイプのノードは、ユーザーの代わりにトランザクションを実行する必要がある可能性がある詳細を収集するのに役立ちます。 例えば、ユーザーのインテントが飛行機の予約である場合は、スロットで発着地の情報や旅程などを収集できます。