Správa složitosti dialogů

PLATÍ PRO: SDK v4

V dialogových oknech komponent můžete vytvořit nezávislá dialogová okna pro zpracování konkrétních scénářů a rozdělit velké dialogové okno na lépe spravovatelné části. Každá z těchto částí má vlastní sadu dialogových oken a zabraňuje kolizím názvů s dialogovými sadami mimo ni. Dialogy komponent jsou opakovaně použitelné v tom, že můžou být:

  • Přidáno do jiného ComponentDialog nebo DialogSet do robota.
  • Exportován jako součást balíčku.
  • Používá se v jiných robotech.

Poznámka:

Sady SDK služby Bot Framework JavaScript, C# a Python budou nadále podporovány, ale sada Java SDK se vyřazuje s konečnou dlouhodobou podporou končící v listopadu 2023.

Stávající roboti sestavení pomocí sady Java SDK budou i nadále fungovat.

Pro nové vytváření robotů zvažte použití Power Virtual Agents a přečtěte si o výběru správného řešení chatovacího robota.

Další informace najdete v tématu Budoucnost vytváření robotů.

Požadavky

Informace o ukázce

V ukázce vícenásobných výzev použijeme vodopádový dialog, několik výzev a dialogové okno komponent k vytvoření interakce, která uživatele zeptá na řadu otázek. Kód pomocí dialogového okna prochází těmito kroky:

Kroky Typ výzvy
Požádejte uživatele o způsob dopravy. Výzva k volbě
Požádejte uživatele o své jméno. Výzva k zadání textu
Zeptejte se uživatele, jestli chce poskytnout svůj věk. Potvrdit výzvu
Pokud odpověděli ano, požádejte o svůj věk. Výzva k zadání čísla s ověřením, aby přijímala pouze věky větší než 0 a menší než 150.
Zeptejte se, jestli jsou shromážděné informace "ok". Znovu použít výzvu k potvrzení

A konečně, pokud odpověděli ano, zobrazte shromážděné informace; jinak dejte uživateli vědět, že se jejich informace neuchovávají.

Dialogové okno Implementace komponenty

V ukázce vícenásobných výzev použijeme vodopádový dialog, několik výzev a dialogové okno komponent k vytvoření interakce, která uživatele zeptá na řadu otázek.

Dialogové okno komponenty zapouzdřuje jedno nebo více dialogů. Dialogové okno komponenty obsahuje vnitřní sadu dialogových oken a dialogová okna a výzvy, které přidáte do této vnitřní sady dialogů, mají vlastní ID, která jsou viditelná pouze v dialogovém okně komponenty.

Pokud chcete použít dialogy, nainstalujte balíček NuGet Microsoft.Bot.Builder.Dialogs .

Dialogy\UserProfileDialog.cs

Zde třída UserProfileDialog je odvozena od ComponentDialog třídy.

public class UserProfileDialog : ComponentDialog

V konstruktoru AddDialog metoda přidá dialogy a zobrazí výzvu k dialogovému okně komponenty. První položka, kterou přidáte pomocí této metody, je nastavena jako počáteční dialogové okno. Počáteční dialogové okno můžete změnit explicitním nastavením InitialDialogId vlastnosti. Když spustíte dialogové okno komponenty, spustí se jeho počáteční dialogové okno.

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

Následující kód představuje první krok vodopádového dialogového okna.

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

Další informace o implementaci vodopádových dialogových oken najdete v tématu implementace sekvenčního toku konverzace.

V době běhu dialogové okno komponenty udržuje vlastní sadu dialogových oken. Po spuštění dialogového okna komponenty:

  • Vytvoří se instance a přidá se do vnějšího zásobníku dialogových oken.
  • Vytvoří vnitřní zásobník dialogů, který se přidá do jeho stavu.
  • Spustí počáteční dialogové okno a přidá ho do vnitřního zásobníku dialogových oken.

Nadřazený kontext vidí komponentu jako aktivní dialogové okno. Kontext uvnitř komponenty však vypadá, že počáteční dialogové okno je aktivní dialogové okno.

Volání dialogového okna z robota

Ve vnější sadě dialogového okna, do kterého jste přidali dialogové okno komponenty, má dialogové okno komponenty ID, se kterým jste ho vytvořili. Ve vnější sadě komponenta vypadá jako jeden dialog, podobně jako výzvy.

Pokud chcete použít dialogové okno komponenty, přidejte jeho instanci do sady dialogových oken robota.

Roboti\DialogBot.cs

V ukázce se to provádí pomocí RunAsync metody volané z metody robota OnMessageActivityAsync .

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

Otestovat robota

  1. Pokud jste to ještě neudělali, nainstalujte bot Framework Emulator.
  2. Spusťte ukázku místně na svém počítači.
  3. Spusťte emulátor, připojte se k robotovi a odešlete zprávy, jak je znázorněno níže.

Ukázkový přepis z dialogového okna s více výzvami

Další informace

Jak funguje zrušení v dialogových oknech komponent

Pokud voláte zrušení všech dialogových oken z kontextu dialogového okna komponenty, dialogové okno komponenty zruší všechna dialogová okna ve svém vnitřním zásobníku a pak ukončí a vrátí ovládací prvek do dalšího dialogového okna na vnějším zásobníku.

Pokud voláte zrušit všechna dialogová okna z vnějšího kontextu, komponenta se zruší spolu se zbývajícími dialogy na vnějším kontextu.

Další kroky

Naučte se vytvářet složité konverzace ve větvi a smyčce.