ダイアログの複雑さを管理する

この記事の対象: SDK v4

コンポーネント ダイアログを使用すると、大規模なダイアログ セットをより管理しやすい要素に分割して、特定のシナリオを処理する独立したダイアログを作成できます。 各要素には独自のダイアログ セットがあり、その要素外にあるダイアログ セットとの名前の競合を回避しています。 コンポーネント ダイアログは、次のことができるという点で再利用可能です。

  • ボット内の別の ComponentDialog または DialogSet へ追加。
  • パッケージの一部としてエクスポート。
  • 他のボット内で使用。

Note

Bot Framework JavaScript SDK、C#、Python SDK は引き続きサポートされますが、Java SDK については、最終的な長期サポートは 2023 年 11 月に終了する予定です。 このリポジトリ内の重要なセキュリティとバグの修正のみが行われます。

Java SDK を使用して構築された既存のボットは引き続き機能します。

新しいボットの構築については、Power Virtual Agents の使用を検討し、適切なチャットボット ソリューションの選択についてお読みください。

詳細については、「The future of bot building」をご覧ください。

前提条件

サンプルについて

マルチターン プロンプト サンプルでは、ウォーターフォール ダイアログ、いくつかのプロンプト、および コンポーネント ダイアログを使用して、ユーザーに一連の質問を行う対話を作成します。 コードはダイアログを使用して、これらの手順を順番に切り替えます。

手順 プロンプトの種類
移動手段をユーザーに聞きます 選択プロンプト
名前をユーザーに聞きます テキスト プロンプト
年齢を指定するかどうかをユーザーに聞きます 確認プロンプト
「はい」と回答した場合は、年齢を聞きます。 数値プロンプト。数値を検証し、0 より大きく 150 未満の場合のみ受け入れます。
収集された情報が正しいかどうかを聞きます 再利用確認プロンプト

最後に、回答が「はい」なら、収集された情報を表示します。それ以外の場合は、ユーザー情報が保持されないことをユーザーに通知します。

コンポーネントのロジックを実装する

マルチターン プロンプト サンプルでは、ウォーターフォール ダイアログ、いくつかのプロンプト、および コンポーネント ダイアログを使用して、ユーザーに一連の質問を行う対話を作成します。

コンポーネント ダイアログによって 1 つ以上のダイアログがカプセル化されます。 コンポーネント ダイアログには内部ダイアログ セットがあり、この内部ダイアログ セットに追加したダイアログとプロンプトは独自の ID を持っています。これらの ID は、コンポーネント ダイアログ内からのみ表示できます。

ダイアログを使用するには、Microsoft.Bot.Builder.Dialogs NuGet パッケージをインストールします。

Dialogs\UserProfileDialog.cs

ここでは UserProfileDialog クラスは、ComponentDialog クラスから派生しています。

public class UserProfileDialog : ComponentDialog

コンストラクター内で、AddDialog メソッドによって、ダイアログとプロンプトがコンポーネント ダイアログに追加されます。 このメソッドで追加する最初のアイテムは、初期ダイアログとして設定されます。 InitialDialogIdプロパティを明示的に設定することで、初期ダイアログを変更できます。 コンポーネント ダイアログを開始すると、その initial dialog が開始されます。

public UserProfileDialog(UserState userState)
    : base(nameof(UserProfileDialog))
{
    _userProfileAccessor = userState.CreateProperty<UserProfile>("UserProfile");

    // This array defines how the Waterfall will execute.
    var waterfallSteps = new WaterfallStep[]
    {
        TransportStepAsync,
        NameStepAsync,
        NameConfirmStepAsync,
        AgeStepAsync,
        PictureStepAsync,
        ConfirmStepAsync,
        SummaryStepAsync,
    };

    // Add named dialogs to the DialogSet. These names are saved in the dialog state.
    AddDialog(new WaterfallDialog(nameof(WaterfallDialog), waterfallSteps));
    AddDialog(new TextPrompt(nameof(TextPrompt)));
    AddDialog(new NumberPrompt<int>(nameof(NumberPrompt<int>), AgePromptValidatorAsync));
    AddDialog(new ChoicePrompt(nameof(ChoicePrompt)));
    AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));
    AddDialog(new AttachmentPrompt(nameof(AttachmentPrompt), PicturePromptValidatorAsync));

    // The initial child Dialog to run.
    InitialDialogId = nameof(WaterfallDialog);
}

次のコードは、ウォーターフォール ダイアログの最初の手順を表します。

private static async Task<DialogTurnResult> NameStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    stepContext.Values["transport"] = ((FoundChoice)stepContext.Result).Value;

    return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = MessageFactory.Text("Please enter your name.") }, cancellationToken);
}

ウォーターフォール ダイアログの実装の詳細については、連続して行われる会話フローを実装する方法をご覧ください。

実行時、コンポーネント ダイアログに独自のダイアログ スタックが保持されます。 コンポーネント ダイアログが開始すると、以下が行われます。

  • インスタンスが作成され、外部ダイアログ スタックに追加されます
  • 内部ダイアログ スタックが作成され、その状態が追加されます
  • 初期ダイアログが開始され、内部ダイアログ スタックに追加されます。

親コンテキストでは、コンポーネントがアクティブなダイアログとして表示されます。 しかし、コンポーネント内のコンテキストには、初期ダイアログがアクティブなダイアログに見えます。

ボットからダイアログを呼び出します

コンポーネント ダイアログを追加した外部ダイアログ セットでは、コンポーネント ダイアログの ID は、それを作成したときに使用したものです。 外部セットでは、コンポーネントは 1 つのダイアログのように見えます。これはプロンプトの動作と似ています。

コンポーネント ダイアログを使用するには、そのインスタンスをボットのダイアログ セットに追加します。

Bots\DialogBot.cs

サンプルでは、これはボットの OnMessageActivityAsync メソッドから呼び出される RunAsync メソッドを使用して行います。

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    Logger.LogInformation("Running dialog with Message Activity.");

    // Run the Dialog with the new message Activity.
    await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
}

ボットをテストする

  1. Bot Framework Emulator をインストールします (まだインストールしていない場合)。
  2. ご自身のマシンを使ってローカルでサンプルを実行します。
  3. 以下に示すように、エミュレーターを起動し、お使いのボットに接続して、メッセージを送信します。

Sample transcript from the multi-turn prompt dialog.

追加情報

コンポーネント ダイアログのキャンセルのしくみ

コンポーネント ダイアログのコンテキストから cancel all dialogs を呼び出すと、コンポーネント ダイアログによって、その内部スタックのすべてのダイアログがキャンセルされた後、終了します。そして外部スタックの次のダイアログに制御が戻ります。

外部コンテキストからすべてのダイアログをキャンセルするを呼び出すと、コンポーネントは、外部コンテキストの残りのダイアログとともにキャンセルされます。

次のステップ

分岐とループを行う複雑な会話を作成する方法について説明します。