適用対象: SDK v4
ダイアログには、いくつかの種類があります。 この記事では、コンポーネント、ウォーターフォール、プロンプトダイアログについて説明します。 ダイアログ全般については、 ダイアログ ライブラリ の記事を参照してください。 アダプティブ ダイアログの詳細については、 アダプティブ ダイアログの概要を参照してください。
ウォーターフォール ダイアログ (ウォーターフォール) は一連のステップを定義し、ボットが線形プロセスを通じてユーザーをガイドできるようにします。 これらのダイアログは、 コンポーネント ダイアログのコンテキスト内で動作するように設計されています。
コンポーネント ダイアログは、セット内のダイアログ同士が連携できるようにするコンテナ ダイアログの一種であり、例えば、ウォーターフォール ダイアログがプロンプト ダイアログや他のウォーターフォール ダイアログを呼び出すことができます。 コンポーネント ダイアログは、ウォーターフォール ダイアログ、プロンプトなどの一連の 子 ダイアログを管理します。 コンポーネント ダイアログを設計して、特定のタスクを処理し、同じボットまたは複数のボットで再利用できます。
プロンプト ダイアログ (プロンプト) は、数値、日付、名前などの特定の種類の情報をユーザーに要求するように設計されたダイアログです。 プロンプトは、コンポーネント ダイアログでウォーターフォール ダイアログを操作するように設計されています。
コンポーネント ダイアログ
道路、市区町村、郵便番号の値を指定するようにユーザーに求める住所ダイアログなど、さまざまなシナリオで使用する再利用可能なダイアログを記述したい場合があります。
コンポーネント ダイアログには、特定のシナリオを処理するための独立したダイアログを作成し、大きなダイアログ セットをより管理しやすい部分に分割するための戦略が用意されています。 これらの各要素には独自のダイアログセットがあり、包含しているダイアログセットとの名前の競合を回避します。 詳細については、 コンポーネント ダイアログの方法を参照してください。
ウォーターフォール ダイアログ
ウォーターフォール ダイアログは、ユーザーから情報を収集したり、一連のタスクをユーザーに案内したりするために一般的に使用されるダイアログの特定の実装です。 会話の各ステップは、 ウォーターフォール ステップ コンテキスト (step) パラメーターを受け取る非同期関数として実装されます。 各ステップで、ボットは ユーザーに入力を求めます (または、子ダイアログを開始できますが、多くの場合はプロンプトです)、応答を待ってから、結果を次の手順に渡します。 最初の関数の結果は、次の関数に引数として渡されます。
次の図は、ウォーターフォール ステップのシーケンスと、実行されるスタック操作を示しています。 ダイアログ スタックの使用方法の詳細については、「using dialogs 」セクションを参照してください。
ウォーターフォール ステップ内では、ウォーターフォール ダイアログのコンテキストは ウォーターフォール ステップ コンテキストに格納されます。 ステップ コンテキストはダイアログ コンテキストに似ていて、現在のターン コンテキストと状態へのアクセスを提供します。 ウォーターフォール ステップ コンテキスト オブジェクトを使用して、ウォーターフォール ステップ内からダイアログ セットを操作します。
ダイアログのウォーターフォール ステップ内またはボットのターン ハンドラーから、ダイアログから戻り値を処理できますが、通常はボットのターン ロジックからのダイアログ ターン結果の状態を確認する必要があります。 ウォーターフォール ステップ内では、ダイアログはウォーターフォール ステップ コンテキストの 結果 プロパティにリターン値を提供します。
ウォーターフォール ステップコンテキストプロパティ
ウォーターフォール ステップ コンテキストには、次のプロパティが含まれています。
- オプション: ダイアログの入力情報が含まれます。
- 値: コンテキストに追加できる情報が含まれており、後続の手順に進みます。
- 結果: 前の手順の結果が含まれます。
さらに、 次 のメソッド (C# の NextAsync 、 JavaScript と Python の次のメソッド) は、同じターン内のウォーターフォール ダイアログの次のステップに進み、必要に応じてボットが特定の手順をスキップできるようにします。
プロンプト
ダイアログ ライブラリ内のプロンプトは、ユーザーに情報を求め、応答を評価する簡単な方法を提供します。 たとえば、 番号プロンプトの場合、質問または情報を指定すると、プロンプトは自動的に有効な番号応答を受け取ったかどうかを確認します。 その場合は、会話を続行できます。そうでない場合は、ユーザーに有効な回答を求めます。
バックグラウンドでは、プロンプトは 2 つのステップから成るダイアログです。 最初に、プロンプトで入力が求められます。次に、有効な値を返すか、先頭から再プロンプトで開始します。
プロンプトには、 プロンプト が呼び出されたときにプロンプト オプションが指定されます。プロンプトのテキスト、検証に失敗した場合の再試行プロンプト、およびプロンプトに応答するための選択肢を指定できます。 一般に、プロンプトと再試行プロンプトのプロパティはアクティビティですが、これはさまざまなプログラミング言語で処理される方法に多少の違いがあります。
さらに、プロンプトを作成するときに、プロンプトのカスタム検証を追加することもできます。 たとえば、番号プロンプトを使用してパーティー サイズを取得したいが、そのパーティー サイズは 2 より大きく、12 未満である必要があるとします。 プロンプトは、最初に有効な番号を受け取ったかどうかを確認し、カスタム検証が指定されている場合は実行します。 カスタム検証が失敗した場合は、上記のようにユーザーに再プロンプトが表示されます。
プロンプトが完了すると、要求された結果の値が明示的に返されます。 その値が返されると、組み込みのプロンプト検証と、指定された可能性がある追加のカスタム検証の両方に合格したことを確認できます。
さまざまなプロンプトの使用例については、ダイアログ ライブラリを使用して ユーザー入力を収集する方法を参照してください。
プロンプトの種類
バックグラウンドでは、プロンプトは 2 つのステップから成るダイアログです。 最初に、プロンプトで入力が求められます。次に、有効な値を返すか、先頭から再プロンプトで再起動します。 ダイアログ ライブラリには、さまざまな基本的なプロンプトが用意されています。それぞれ異なる種類の応答を収集するために使用されます。 基本的なプロンプトでは、数値の場合は「10」や「ダース」など、自然言語の入力を読み取りできます。日付時刻の場合は「明日」や「金曜日の午前10時」を読み取りできます。
| プロンプト | 説明 | 返品ポリシー |
|---|---|---|
| 添付ファイルのプロンプト | ドキュメントや画像などの 1 つ以上の添付ファイルを要求します。 | 添付ファイル オブジェクトのコレクション。 |
| 選択プロンプト | 一連のオプションから選択を求めます。 | 見つかった選択オブジェクト。 |
| プロンプトを確認する | 確認を求めます。 | ブール値。 |
| 日付/時刻プロンプト | 日付と時刻を要求します。 | 日時解像度オブジェクトのコレクションです。 |
| 番号プロンプト | 数値を要求します。 | 数値。 |
| テキスト プロンプト | 一般的なテキスト入力を要求します。 | 文字列。 |
ユーザーに入力を求めるメッセージを表示するには、テキスト プロンプトなどの組み込みクラスのいずれかを使用して プロンプトを定義し、ダイアログ セットに追加します。 プロンプトには、ダイアログ セット内で一意である必要がある固定 ID があります。 プロンプトごとにカスタム 検証コントロールを作成できます。一部のプロンプトでは、 既定のロケールを指定できます。
プロンプト指定ロケール
ロケールは、 選択した言語固有の動作、 確認、 日付/時刻、および 番号 プロンプトを決定するために使用されます。 ユーザーからの特定の入力に対して、チャネルがユーザーのメッセージに ロケール プロパティを指定した場合、それが使用されます。 それ以外では、プロンプトの既定のロケールがプロンプトのコンストラクターを呼び出す際に指定されるか、後から設定される場合、そのロケールが使用されます。 これらのロケールがどちらも指定されていない場合は、ロケールとして英語 ("en-us") が使用されます。
ロケールは、言語または言語ファミリを表す 2 文字、3 文字、または 4 文字の ISO 639 コードです。
プロンプト オプション
ステップ コンテキストの prompt メソッドの 2 番目のパラメーターは、次のプロパティを持つ プロンプト オプション オブジェクトを受け取ります。
| プロパティ | 説明 |
|---|---|
| プロンプト | ユーザーに入力を求める最初のアクティビティ。 |
| 再試行プロンプト | 最初の入力が検証されなかった場合にユーザーを送信するアクティビティ。 |
| 選択肢 | 選択プロンプトで使用するために、ユーザーが選択する選択肢の一覧。 |
| 検証 | カスタム 検証コントロールで使用する追加のパラメーター。 |
| スタイル | 選択プロンプトまたは確認プロンプトの選択肢をユーザーに表示する方法を定義します。 |
ユーザーに送信する最初のプロンプト アクティビティと、ユーザーの入力が検証されない場合のインスタンスの再試行プロンプトを常に指定する必要があります。
ユーザーの入力が有効でない場合は、再試行プロンプトがユーザーに送信されます。再試行が指定されていない場合は、最初のプロンプトが使用されます。 ただし、検証コントロール内からアクティビティがユーザーに送り返された場合、再試行プロンプトは送信されません。
プロンプトの検証
ウォーターフォールの次のステップに値を返す前に、プロンプト応答を検証できます。 検証コントロール関数には プロンプト 検証コントロール コンテキスト パラメーターがあり、入力が検証に合格するかどうかを示すブール値を返します。 プロンプト検証コントロール コンテキストには、次のプロパティが含まれています。
| プロパティ | 説明 |
|---|---|
| コンテキスト | ボットの現在のターン コンテキスト。 |
| 認識 | 認識エンジンによって処理される、ユーザー入力に関する情報を含むプロンプト認識エンジンの結果。 |
| [オプション] | プロンプトを開始するための呼び出しで指定されたプロンプト オプション が含まれています。 |
プロンプト認識エンジンの結果には、次のプロパティがあります。
| プロパティ | 説明 |
|---|---|
| 成功しました | 認識エンジンが入力を解析できたかどうかを示します。 |
| 価値 | 認識エンジンからの戻り値。 必要に応じて、検証コードでこの値を変更できます。 |
ダイアログの使用
ダイアログはプログラム スタックと考えることができます。このスタックは ダイアログ スタックを呼び出し、ターン ハンドラーを指示し、スタックが空の場合はフォールバックとして機能します。 そのスタックの最上位の項目は アクティブなダイアログと見なされ、ダイアログ コンテキストはすべての入力をアクティブなダイアログに送ります。
ダイアログが開始されると、スタックにプッシュされ、アクティブなダイアログになります。 終了するか、 置換ダイアログ メソッドによって削除されるか、別のダイアログがスタックにプッシュされて (ターン ハンドラーまたはアクティブ ダイアログ自体によって) アクティブなダイアログになるまで、アクティブなダイアログのままになります。 その新しいダイアログが終了すると、スタックからポップされ、次のダイアログが再びアクティブなダイアログになります。 これにより、 ダイアログを繰り返 したり 、会話を分岐させたりすることができます。これについては、以下で説明します。
実行ダイアログ拡張メソッドを使用して、ルート ダイアログを開始または続行できます。 ボット コードから、ダイアログ実行拡張メソッドを呼び出すと、既存のダイアログが続行されるか、スタックが現在空の場合はダイアログの新しいインスタンスが開始されます。 コントロールとユーザー入力は、スタック上のアクティブなダイアログに表示されます。
run メソッドでは、ダイアログの状態にアクセスするために 状態プロパティ アクセサー が必要です。 アクセサーは、他の状態アクセサーと同じ方法で作成および使用されますが、会話状態に基づく独自のプロパティとして作成されます。 状態の管理の詳細については、状態の 管理に関するトピックを参照してください。ダイアログ状態の使用方法は、 シーケンシャルな会話フロー の操作方法に示されています。
ダイアログ内からダイアログ コンテキストにアクセスでき、それを使用して他のダイアログを開始したり、現在のダイアログを終了したり、他の操作を実行したりできます。
ダイアログを開始するには
ウォーターフォール ダイアログ内から、開始するダイアログの ID を、開始ダイアログ、プロンプト、または置換ダイアログ メソッドを使用して、ウォーターフォールダイアログのコンテキストに渡して開始します。
- プロンプトメソッドと begin ダイアログ メソッドは、参照されるダイアログの新しいインスタンスをスタックの一番上にプッシュします。
- replace ダイアログ メソッドは、現在のダイアログをスタックからポップし、置換ダイアログをスタックにプッシュします。 置き換えられたダイアログは取り消され、インスタンスに含まれる情報はすべて破棄されます。
options パラメーターを使用して、ダイアログの新しいインスタンスに情報を渡します。 新しいダイアログに渡されるオプションには、ダイアログの任意のステップでステップ コンテキストの options プロパティを使用してアクセスできます。 詳細については、 分岐とループを使用して高度な会話フローを作成する方法を参照してください。
ダイアログを続行するには
ウォーターフォール ダイアログ内で、ステップ コンテキストの values プロパティを使用して、ターン間の状態を保持します。 前のターンでこのコレクションに追加された値は、後続のターンで使用できます。 詳細については、 分岐とループを使用して高度な会話フローを作成する方法を参照してください。
ダイアログを終了するには
ウォーターフォール ダイアログ内で、 end dialog メソッドを使用して、スタックからダイアログをポップしてダイアログを終了します。 end dialog メソッドは、オプションの結果を親コンテキスト (呼び出したダイアログやボットのターン ハンドラーなど) に返すことができます。 これは、ダイアログ内から呼び出されて、現在のインスタンス自体を終了するために最も頻繁に呼び出されます。
ダイアログ コンテキストがある任意の場所から end ダイアログ メソッドを呼び出すことができますが、ボットにはそれが現在アクティブなダイアログから呼び出されたように見えます。
ヒント
ダイアログの 最後に end dialog メソッドを明示的に呼び出すのがベスト プラクティスです。
すべてのダイアログをクリアするには
すべてのダイアログをスタックからポップする場合は、ダイアログ コンテキストの cancel all dialogs メソッドを呼び出してダイアログ スタックをクリアできます。
ダイアログの繰り返し
ダイアログをそれ自体に置き換えてループを作成するには、 replace dialog メソッドを使用します。 これは、 複雑な操作 とメニューを管理するための 1 つの手法を処理するための優れた方法です。
注
現在のダイアログの内部状態を保持する必要がある場合は、 replace ダイアログ メソッドの呼び出しでダイアログの新しいインスタンスに情報を渡し、ダイアログを適切に初期化する必要があります。
会話の流れを変える
ダイアログ コンテキストはダイアログ スタックを維持し、スタック上の各ダイアログで次のステップを追跡します。 その begin dialog メソッドは子ダイアログを作成し、そのダイアログをスタックの一番上にプッシュします。end dialog メソッドはスタックの一番上のダイアログをポップします。 終了ダイアログ は、通常、終了するダイアログ内から呼び出されます。
ダイアログは、ダイアログ コンテキストの begin dialog メソッドを呼び出し、新しいダイアログの ID を指定することで、同じ ダイアログ セット内で新しいダイアログを開始できます。これにより、新しいダイアログが現在アクティブなダイアログになります。 元のダイアログはまだスタック上にありますが、ダイアログ コンテキストの continue ダイアログ メソッドの呼び出しは、スタックの上部にあるダイアログ ( アクティブなダイアログ) にのみ送信されます。 ダイアログがスタックからポップされると、元のダイアログから中断したスタック上のウォーターフォールの次のステップでダイアログ コンテキストが再開されます。
したがって、会話フロー内に分岐を作成するには、1 つのダイアログにステップを含めて、使用可能な一連のダイアログから開始するダイアログを条件付きで選択できます。
追加情報
- アダプティブ ダイアログの詳細については、 アダプティブ ダイアログの概要を参照してください。
- スキルの詳細については、スキル に関する情報を参照してください。