Dela via


Hantera dialogkomplexitet

GÄLLER FÖR: SDK v4

Med komponentdialogrutor kan du skapa oberoende dialogrutor för att hantera specifika scenarier och dela upp en stor dialogruta i mer hanterbara delar. Var och en av dessa delar har en egen dialogruta och undviker eventuella namnkollisioner med dialogrutorna utanför den. Komponentdialogrutor kan återanvändas på så sätt att de kan vara:

  • Har lagts till i en annan ComponentDialog eller DialogSet i din robot.
  • Exporteras som en del av ett paket.
  • Används i andra robotar.

Kommentar

Bot Framework JavaScript-, C#- och Python-SDK:erna fortsätter att stödjas, men Java SDK dras tillbaka med slutligt långsiktigt stöd som slutar i november 2023.

Befintliga robotar som skapats med Java SDK fortsätter att fungera.

Om du vill skapa en ny robot kan du använda Microsoft Copilot Studio och läsa om hur du väljer rätt copilot-lösning.

Mer information finns i Framtiden för robotbygge.

Förutsättningar

Om exemplet

I exemplet med fråga med flera svar använder vi en vattenfallsdialogruta, några frågor och en komponentdialogruta för att skapa en interaktion som ställer en rad frågor till användaren. Koden använder en dialogruta för att gå igenom följande steg:

Steg Typ av fråga
Be användaren om deras transportsätt Kommandotolk för val
Be användaren om deras namn Textprompt
Fråga användaren om de vill ange sin ålder Bekräfta uppmaning
Om de svarade ja, be om deras ålder Talprompt med validering för att endast acceptera åldrar som är större än 0 och mindre än 150.
Fråga om den insamlade informationen är "ok" Fråga om att bekräfta återanvändning

Slutligen, om de svarade ja, visa den insamlade informationen; Annars kan du tala om för användaren att deras information inte sparas.

Implementera din komponentdialogruta

I exemplet med fråga med flera svar använder vi en vattenfallsdialogruta, några frågor och en komponentdialogruta för att skapa en interaktion som ställer en rad frågor till användaren.

En komponentdialogruta kapslar in en eller flera dialogrutor. Komponentdialogrutan har en inre dialogruta, och dialogrutorna och uppmaningarna som du lägger till i den inre dialogrutan har egna ID:n som endast visas inifrån komponentdialogrutan.

Om du vill använda dialogrutor installerar du NuGet-paketet Microsoft.Bot.Builder.Dialogs .

Dialogrutor\UserProfileDialog.cs

UserProfileDialog Här härleds klassen från ComponentDialog klassen.

public class UserProfileDialog : ComponentDialog

I konstruktorn AddDialog lägger metoden till dialogrutor och uppmaningar i komponentdialogrutan. Det första objektet som du lägger till med den här metoden anges som den inledande dialogrutan. Du kan ändra den inledande dialogrutan genom att uttryckligen ange egenskapen InitialDialogId . När du startar en komponentdialogruta startar den sin inledande dialogruta.

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

Följande kod representerar det första steget i vattenfallsdialogrutan.

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

Mer information om hur du implementerar vattenfallsdialogrutor finns i implementera sekventiellt konversationsflöde.

Vid körning behåller komponentdialogrutan en egen dialogstack. När komponentdialogrutan startas:

  • En instans skapas och läggs till i den yttre dialogstacken
  • Den skapar en inre dialogstack som läggs till i dess tillstånd
  • Den startar den inledande dialogrutan och lägger till den i den inre dialogstacken.

Den överordnade kontexten ser komponenten som den aktiva dialogrutan. För kontexten i komponenten ser det dock ut som att den inledande dialogrutan är den aktiva dialogrutan.

Anropa dialogrutan från din robot

I den yttre dialogrutan, den som du lade till komponentdialogrutan till, har komponentdialogrutan det ID som du skapade den med. I den yttre uppsättningen ser komponenten ut som en enda dialogruta, ungefär som prompterna gör.

Om du vill använda en komponentdialogruta lägger du till en instans av den i robotens dialogruta.

Robotar\DialogBot.cs

I exemplet görs detta med hjälp av metoden RunAsync som anropas från robotens OnMessageActivityAsync metod.

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

Testa din robot

  1. Om du inte redan har gjort det installerar du Bot Framework-emulatorn.
  2. Kör exemplet lokalt på datorn.
  3. Starta emulatorn, anslut till roboten och skicka meddelanden enligt nedan.

Exempelavskrift från dialogrutan för fråga med flera svängar.

Ytterligare information

Så här fungerar annullering för komponentdialogrutor

Om du anropar avbryt alla dialogrutor från komponentdialogrutans kontext kommer komponentdialogrutan att avbryta alla dialogrutor i den inre stacken och sedan avslutas, vilket returnerar kontrollen till nästa dialogruta i den yttre stacken.

Om du anropar avbryt alla dialogrutor från den yttre kontexten avbryts komponenten, tillsammans med resten av dialogrutorna i den yttre kontexten.

Nästa steg

Lär dig hur du skapar komplexa konversationer som förgrenar och loopar.