コンポーネントダイアログとウォーターフォールダイアログについて

適用対象: SDK v4

ダイアログには、いくつかの種類があります。 この記事では、コンポーネント、ウォーターフォール、プロンプトダイアログについて説明します。 ダイアログ全般の詳細については、 ダイアログ ライブラリ の記事を参照してください。 アダプティブ ダイアログの詳細については、 アダプティブ ダイアログの概要を参照してください。

ウォーターフォール ダイアログ (ウォーターフォール) は、一連のステップを定義し、ボットがユーザーに線形プロセスをガイドできるようにします。 これらのダイアログは、 コンポーネント ダイアログのコンテキスト内で動作するように設計されています。

コンポーネント ダイアログは、セット内のダイアログが、プロンプト ダイアログや別のウォーターフォール ダイアログを呼び出すウォーターフォール ダイアログなど、セット内の他のダイアログを呼び出すことができます。 コンポーネント ダイアログは、ウォーターフォール ダイアログ、プロンプトなどの一連の ダイアログを管理します。 コンポーネント ダイアログを設計して、特定のタスクを処理し、同じボットまたは複数のボットで再利用できます。

プロンプト ダイアログ (プロンプト) は、数値、日付、名前などの特定の種類の情報をユーザーに要求するように設計されたダイアログです。 プロンプトは、コンポーネント ダイアログでウォーターフォール ダイアログを操作するように設計されています。

コンポーネント ダイアログ

郵便番号、市区町村、および番地の値を指定するようユーザーに要求する住所用のダイアログなど、さまざまなシナリオで使用する再利用可能なダイアログの作成が必要になる場合があります。

"コンポーネント ダイアログ" は、特定のシナリオを処理するために、大規模なダイアログ セットをより管理しやすい要素に分割した、独立したダイアログを作成するための戦略を提供します。 各要素には独自のダイアログ セットがあり、その要素を含むダイアログ セットとの名前の競合を回避しています。 詳細については、 コンポーネント ダイアログの方法を参照してください。

ウォーターフォール ダイアログ

ウォーターフォール ダイアログはダイアログ特有の実装であり、一般的にユーザーから情報を収集したり、一連のタスクをユーザーに案内したりするときに使用されます。 会話の各ステップは、"ウォーターフォール ステップ コンテキスト" (step) パラメーターを取得する非同期関数として実装されます。 各ステップで、ボットは ユーザーに入力を求めます (または、子ダイアログを開始できますが、多くの場合はプロンプトです)、応答を待ってから、結果を次の手順に渡します。 最初の関数の結果は次の関数の引数として渡され、その次の関数でも同様です。

次の図は、ウォーターフォール ステップの順序と、実行されるスタック操作を示したものです。 ダイアログ スタックの使用方法の詳細は、下の「ダイアログの使用」セクションに記載されています。

メッセージをウォーターフォール ステップにマップする方法の表現。

ウォーターフォール ステップ内で、ウォーターフォール ダイアログのコンテキストは、"ウォーターフォール ステップ コンテキスト" に格納されます。 ステップ コンテキストはダイアログ コンテキストに似ていて、現在のターン コンテキストと状態へのアクセスを提供します。 ウォーターフォール ステップ コンテキスト オブジェクトを使用して、ウォーターフォール ステップ内からダイアログ セットと対話します。

通常、ボットのターン ロジックからのダイアログ ターンの結果の状態のみを確認する必要がある場合であっても、ダイアログのウォーターフォール ステップ内からの戻り値や、ボットのオン ターン ハンドラーのダイアログからの戻り値を処理することができます。 ウォーターフォール ステップ内では、ウォーターフォール ステップ コンテキストの result プロパティに戻り値が返されます。

ウォーターフォール ステップ コンテキスト プロパティ

ウォーターフォール ステップ コンテキストには、次のプロパティが含まれています。

  • オプション: ダイアログの入力情報が格納されます。
  • : コンテキストに追加できる情報が格納され、以降の手順に繰り越されます。
  • 結果: 前の手順の結果が格納されます。

さらに、 のメソッド (C# の NextAsync 、JavaScript と Python の のメソッド) は、同じターン内でウォーターフォール ダイアログの次のステップに進み、必要に応じてボットが特定の手順をスキップできるようにします。

プロンプト

プロンプトは、ユーザーに情報を要求して応答を評価するための簡単な方法をダイアログ ライブラリ内で提供します。 たとえば、 番号プロンプトの場合は、求める質問または情報を指定し、プロンプトは、有効な番号の応答を受信したかどうかを自動的に確認します。 その場合は、会話を続行できます。そうしないと、ユーザーに有効な回答が表示されます。

バックグラウンドでは、プロンプトは 2 つのステップから成るダイアログです。 プロンプトでは、最初のステップで入力を要求し、2 番目のステップで有効な値を返すか、最初からやり直して再度入力を要求します。

プロンプトには、プロンプトの呼び出し時に指定される "プロンプト オプション" があり、プロンプトで使用するテキスト、検証に失敗した場合の再試行プロンプト、およびプロンプトに対する回答の選択肢を指定できます。 一般に、プロンプトと再試行プロンプトのプロパティはアクティビティですが、これはさまざまなプログラミング言語での処理方法に多少の違いがあります。

さらに、プロンプトの作成時に、プロンプト用にいくつかのカスタム検証を追加することができます。 たとえば、数値プロンプトを使用して会合の規模を把握するとします。ただし、その会合の規模は 3 人以上、12 人未満である必要があります。 プロンプトは、最初に有効な番号を受け取ったかどうかを確認し、カスタム検証が指定されている場合は実行します。 カスタム検証が失敗した場合は、上記のようにユーザーに再プロンプトが表示されます。

プロンプトが完了したら、要求された結果の値が明示的に返されます。 その値が返されると、組み込みのプロンプト検証と、指定されている可能性がある追加のカスタム検証の両方に合格していることを確認できます。

さまざまなプロンプトを使用するときの例については、ユーザー入力を収集するダイアログ ライブラリの使用方法を参照してください。

プロンプトの種類

バックグラウンドでは、プロンプトは 2 つのステップから成るダイアログです。 最初に、プロンプトは入力を求めます。2 つ目は、有効な値を返すか、または再プロンプトで先頭から再起動します。 ダイアログ ライブラリには、さまざまな種類の応答を収集するために使用される、さまざまな基本的なプロンプトが用意されています。 基本的なプロンプトでは、数を表す "ten" や "a dozen"、日時を表す "tomorrow" や "Friday at 10am" など、自然言語の入力を解釈できます。

Prompt 説明 戻り値
添付ファイル プロンプト ドキュメントや画像など、1 つ以上の添付ファイルを要求します。 "添付ファイル" オブジェクトのコレクション。
選択プロンプト 一連のオプションから選択するよう求めます。 "見つかった選択肢" オブジェクト。
確認プロンプト 確認を求めます。 ブール値です。
日時プロンプト 日時の入力を求めます。 "日時解決" オブジェクトのコレクション。
数値プロンプト 数値の入力を求めます。 数値。
テキスト プロンプト 一般的なテキスト入力を求めます。 文字列。

ユーザーに入力を求めるには、組み込みクラスのいずれかを使用してプロンプト ( "テキスト プロンプト" など) を定義し、ダイアログ セットに追加します。 プロンプトには固定 ID があります。この ID は、ダイアログ セット内で一意である必要があります。 プロンプトごとにカスタム検証コントロールを含めることができます。一部のプロンプトについては、"既定のロケール" を指定できます。

プロンプトのロケール

ロケールは、選択確認日時数値の各プロンプトの言語固有の動作を決定するために使用されます。 ユーザーからの任意の入力に対して、チャネルがユーザーのメッセージで locale プロパティを提供した場合は、このロケールが使用されます。 それ以外の場合、プロンプトのコンストラクターの呼び出し時に指定するか、後で設定することによって、プロンプトの "既定のロケール" が設定されていれば、それが使用されます。 これらのロケールのいずれも指定されていない場合は、ロケールとして英語 ("en-us") が使用されます。

ロケールは、言語または言語ファミリを表す 2 文字、3 文字、または 4 文字の ISO 639 コードです。

プロンプト オプション

ステップ コンテキストの prompt メソッドの 2 番目のパラメーターは、prompt options オブジェクトを受け取ります。このオブジェクトには、次のプロパティがあります。

プロパティ 説明
Prompt 入力を求めるためにユーザーに送信する最初のアクティビティ。
Retry prompt 最初の入力が検証されなかった場合にユーザーを送信するアクティビティ。
Choices ユーザーが選択できる選択肢のリスト。選択プロンプトで使用されます。
Validations カスタム検証コントロールで使用する追加のパラメーターです。
Style 選択プロンプトまたは確認プロンプトの選択項目をユーザーに提示する方法を定義します。

ユーザーに送信する最初のプロンプト アクティビティと、ユーザーの入力が検証されない場合のインスタンスの再試行プロンプトを常に指定する必要があります。

ユーザーの入力が有効でない場合は、再試行プロンプトがユーザーに送信されます。再試行が指定されていない場合は、最初のプロンプトが使用されます。 ただし、検証コントロール内からアクティビティがユーザーに返送された場合、再試行プロンプトは送信されません。

プロンプトの検証

ウォーターフォールの次のステップに値を返す前にプロンプトの応答を検証できます。 検証関数は、prompt validator context パラメーターを持ち、入力が検証に合格したかどうかを示すブール値を返します。 prompt validator context には、次のプロパティが含まれます。

プロパティ 説明
コンテキスト ボットの現在のターン コンテキスト。
Recognized プロンプト認識エンジンの結果。認識エンジンによって処理された、ユーザー入力に関する情報が含まれます。
[オプション] プロンプトを開始する呼び出しで提供された prompt options が含まれます。

プロンプト認識エンジンの結果には、次のプロパティがあります。

プロパティ 説明
Succeeded 認識エンジンが入力を解析できたかどうかを示します。
Value 認識エンジンからの戻り値。 必要に応じて、検証コードでこの値を変更できます。

ダイアログの使用

ダイアログは、"ダイアログ スタック" と呼ばれるプログラム スタックとして考えることができます。ターン ハンドラーは、ダイアログを振り向け、スタックが空の場合はフォールバックとして機能します。 そのスタックの最上位の項目は アクティブなダイアログと見なされ、ダイアログ コンテキストはすべての入力をアクティブなダイアログに転送します。

ダイアログが開始すると、スタックにプッシュされ、アクティブなダイアログになります。 終了するか、 置換ダイアログ メソッドによって削除されるか、別のダイアログがスタックにプッシュされて (ターン ハンドラーまたはアクティブ なダイアログ自体によって) アクティブなダイアログになるまで、アクティブなダイアログのままになります。 その新しいダイアログが終了すると、スタックからポップされ、次のダイアログが再びアクティブなダイアログになります。 これにより、以下で説明するダイアログの繰り返しまたは会話の分岐が可能になります。

実行ダイアログ拡張メソッドを使用して、ルート ダイアログを開始または続行できます。 ボット コードから、ダイアログ実行拡張メソッドを呼び出すと、既存のダイアログが続行されるか、スタックが現在空の場合はダイアログの新しいインスタンスが開始されます。 コントロールとユーザーの入力は、スタック上のアクティブなダイアログに行きます。

実行メソッドでは、ダイアログの状態にアクセスするには 、状態プロパティ アクセサー が必要です。 このアクセサーは、その他の状態のアクセサーと同じ方法で作成および使用されますが、会話の状態に基づいて独自のプロパティとして作成されます。 状態の管理方法の詳細については、状態の管理に関するトピックに記載され、ダイアログの状態の使用状況については、連続して行われる会話フローの仕組みに関するページに記載されています。

ダイアログ内からダイアログ コンテキストにアクセスでき、それを使用して他のダイアログを開始したり、現在のダイアログを終了したり、その他の操作を実行したりできます。

ダイアログを開始するには

ウォーターフォール ダイアログ内から、開始ダイアログ、プロンプト、または置換ダイアログ メソッドを使用して、開始するダイアログのダイアログID をウォーターフォール ダイアログのコンテキストに渡します。

  • プロンプトと開始ダイアログのメソッドは、参照されるダイアログの新しいインスタンスをスタックの上部にプッシュします。
  • replace dialog メソッドは、現在のダイアログをスタックから取り除き、それに置き換わるダイアログをスタックにプッシュします。 置き換えられたダイアログは取り消され、そのインスタンスに含まれているすべての情報が破棄されます。

options パラメーターを使用して、ダイアログの新しいインスタンスに情報を渡します。 新しいダイアログに渡されたオプションには、ダイアログの任意のステップで、ステップ コンテキストの options プロパティを通じてアクセスできます。 詳細については、 ブランチとループを使用して高度な会話フローを作成する方法を参照してください。

ダイアログを続行するには

ウォーターフォール ダイアログ内で、ステップ コンテキストの values プロパティを使用してターン間の状態を保持します。 先行ターンでこのコレクションに追加された値はすべて、後続のターンで利用できます。 詳細については、 ブランチとループを使用して高度な会話フローを作成する方法を参照してください。

ダイアログを終了するには

ウォーターフォール ダイアログ内で、 ダイアログの終了 メソッドを使用して、スタックからポップしてダイアログを終了します。 終了ダイアログ メソッドは、親コンテキスト (呼び出したダイアログやボットのターン ハンドラーなど) にオプションの結果を返すことができます。 ほとんどの場合は、ダイアログ自体の現在のインスタンスを終了するために、ダイアログ内から呼び出します。

end dialog メソッドは、ダイアログ コンテキストのある任意の場所から呼び出すことができますが、ボットには、現在のアクティブなダイアログから呼び出されたように見えます。

ヒント

ダイアログの 最後にエンド ダイアログ メソッドを明示的に呼び出すのがベスト プラクティスです。

すべてのダイアログをクリアするには

スタックからすべてのダイアログを取り出す場合は、ダイアログ コンテキストの cancel all dialogs メソッドを呼び出すことで、ダイアログ スタックをクリアできます。

ダイアログの繰り返し

replace dialog メソッドを使用して、ダイアログをそれ自体と置き換えることで、ループを作成できます。 これは、 複雑な操作 とメニューを管理するための 1 つの手法を処理するための優れた方法です。

Note

現在のダイアログの内部状態を保持する必要がある場合は、replace ダイアログ メソッドの呼び出しでダイアログの新しいインスタンスに情報を渡し、 ダイアログ を適切に初期化する必要があります。

会話の分岐

ダイアログ コンテキストではダイアログ スタックが保持され、スタックのダイアログごとに、次のステップが追跡されます。 begin dialog メソッドは、子ダイアログを作成してスタックの一番上にプッシュし、end dialog メソッドは一番上のダイアログをスタックから取り除きます。 end dialog は、通常、終了するダイアログ内から呼び出されます。

ダイアログでは、ダイアログ コンテキストの begin dialog メソッドを呼び出し、新しいダイアログの ID を指定することで、同じダイアログ セット内で新しいダイアログを開始できます。これにより、新しいダイアログがアクティブ ダイアログになります。 元のダイアログは引き続きスタック上に残りますが、ダイアログ コンテキストの continue dialog メソッドへの呼び出しは、スタックの一番上のダイアログ ("アクティブ ダイアログ") にのみ送信されます。 ダイアログがスタックから取り除かれると、ダイアログ コンテキストは、スタックのウォーターフォールの次のステップに移り、元のダイアログが中断されたところから再開されます。

つまり、会話フロー内に分岐を作成するには、ダイアログにステップを追加して、利用可能な一連のダイアログの中から、開始するダイアログを条件に応じて選択できるようにします。

関連情報