Delen via


Complexiteit van dialoogvensters beheren

VAN TOEPASSING OP: SDK v4

Met onderdeeldialoogvensters kunt u onafhankelijke dialoogvensters maken voor het afhandelen van specifieke scenario's, waarbij een grote dialoogvensterset wordt opgesplitst in beheerbare onderdelen. Elk van deze onderdelen heeft een eigen dialoogvensterset en voorkomt naamconflicten met de dialoogvensters erbuiten. Dialoogvensters voor onderdelen kunnen opnieuw worden gebruikt:

  • Toegevoegd aan een andere ComponentDialog of DialogSet in uw bot.
  • Geëxporteerd als onderdeel van een pakket.
  • Wordt gebruikt in andere bots.

Notitie

De Sdk's voor Bot Framework JavaScript, C# en Python blijven ondersteund, maar de Java SDK wordt buiten gebruik gesteld met definitieve langetermijnondersteuning die eindigt op november 2023.

Bestaande bots die zijn gebouwd met de Java SDK blijven functioneren.

Voor het bouwen van nieuwe bots kunt u Microsoft Copilot Studio gebruiken en lezen over het kiezen van de juiste copilot-oplossing.

Zie De toekomst van botbouw voor meer informatie.

Vereisten

Over het voorbeeld

In het voorbeeld met meerdere prompts gebruiken we een watervaldialoogvenster, een paar prompts en een onderdeeldialoogvenster om een interactie te maken die de gebruiker een reeks vragen stelt. In de code wordt een dialoogvenster gebruikt om deze stappen te doorlopen:

Stappen Type prompt
Vraag de gebruiker om hun transportmodus Keuzeprompt
Vraag de gebruiker om zijn of haar naam Tekstprompt
Vraag de gebruiker of ze hun leeftijd willen opgeven Prompt bevestigen
Als ze ja hebben beantwoord, vraagt u om hun leeftijd Nummerprompt met validatie om alleen leeftijden van meer dan 0 en minder dan 150 te accepteren.
Vraag of de verzamelde informatie 'ok' is Prompt bevestigen opnieuw gebruiken

Ten slotte, als ze ja hebben beantwoord, geeft u de verzamelde informatie weer; laat de gebruiker anders weten dat de gegevens niet worden bewaard.

Dialoogvenster Uw onderdeel implementeren

In het voorbeeld met meerdere prompts gebruiken we een watervaldialoogvenster, een paar prompts en een onderdeeldialoogvenster om een interactie te maken die de gebruiker een reeks vragen stelt.

Een onderdeeldialoogvenster bevat een of meer dialoogvensters. Het onderdeeldialoogvenster bevat een interne dialoogvensterset en de dialoogvensters en aanwijzingen die u aan deze binnenste dialoogvensterset toevoegt, hebben hun eigen id's, die alleen zichtbaar zijn vanuit het onderdeeldialoogvenster.

Als u dialoogvensters wilt gebruiken, installeert u het NuGet-pakket Microsoft.Bot.Builder.Dialogs .

Dialoogvensters\UserProfileDialog.cs

Hier is de UserProfileDialog klasse afgeleid van de ComponentDialog klasse.

public class UserProfileDialog : ComponentDialog

Binnen de constructor voegt de AddDialog methode dialoogvensters en prompts toe aan het onderdeeldialoogvenster. Het eerste item dat u met deze methode toevoegt, wordt ingesteld als het eerste dialoogvenster. U kunt het eerste dialoogvenster wijzigen door de InitialDialogId eigenschap expliciet in te stellen. Wanneer u een dialoogvenster voor een onderdeel start, wordt het eerste dialoogvenster gestart.

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,
        SummaryStepAsync,
        ConfirmStepAsync,
    };

    // 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);
}

De volgende code vertegenwoordigt de eerste stap van het watervaldialoogvenster.

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);
}

Zie voor meer informatie over het implementeren van watervaldialoogvensters hoe u een sequentiële gespreksstroom implementeert.

Tijdens de uitvoering onderhoudt het dialoogvenster van het onderdeel een eigen dialoogvensterstack. Wanneer het onderdeeldialoogvenster wordt gestart:

  • Er wordt een exemplaar gemaakt en toegevoegd aan de buitenste dialoogvensterstack
  • Er wordt een interne dialoogvensterstack gemaakt die wordt toegevoegd aan de status
  • Het eerste dialoogvenster wordt gestart en voegt dit toe aan de binnenste dialoogvensterstack.

De bovenliggende context ziet het onderdeel als het actieve dialoogvenster. Voor de context in het onderdeel ziet het er echter uit dat het eerste dialoogvenster het actieve dialoogvenster is.

Het dialoogvenster aanroepen vanuit uw bot

In de buitenste dialoogvensterset, de dialoogvenster waarmee u het onderdeeldialoogvenster hebt toegevoegd, heeft het onderdeeldialoogvenster de id waarmee u het hebt gemaakt. In de buitenste set ziet het onderdeel eruit als één dialoogvenster, net als bij prompts.

Als u een onderdeeldialoogvenster wilt gebruiken, voegt u er een exemplaar van toe aan de dialoogvensterset van de bot.

Bots\DialogBot.cs

In het voorbeeld wordt dit gedaan met behulp van de RunAsync methode die wordt aangeroepen vanuit de methode van OnMessageActivityAsync de bot.

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);
}

Uw bot testen

  1. Als u dit nog niet hebt gedaan, installeert u de Bot Framework Emulator.
  2. Voer het voorbeeld lokaal uit op uw computer.
  3. Start de emulator, maak verbinding met uw bot en verzend berichten zoals hieronder wordt weergegeven.

Voorbeeldtranscriptie uit het dialoogvenster voor meerdere keren vragen.

Aanvullende informatie

Hoe annulering werkt voor onderdeeldialoogvensters

Als u alle dialoogvensters annuleert vanuit de context van het onderdeeldialoogvenster, worden alle dialoogvensters op de binnenste stack geannuleerd en wordt vervolgens het besturingselement geretourneerd naar het volgende dialoogvenster op de buitenste stack.

Als u alle dialoogvensters vanuit de buitenste context annuleert, wordt het onderdeel geannuleerd, samen met de rest van de dialoogvensters in de buitenste context.

Volgende stappen

Leer hoe u complexe gesprekken maakt die vertakking en lus vormen.