Verwalten der Dialogkomplexität

GILT FÜR: SDK v4

Mit Komponentendialogen können Sie unabhängige Dialoge für bestimmte Szenarien erstellen, indem ein umfangreicher Dialogsatz in besser verwaltbare Teile unterteilt wird. Jeder dieser Teile verfügt über einen eigenen Dialogsatz, wodurch Namenskonflikte mit anderen Dialogsätzen vermieden werden. Komponentendialoge können wie folgt wiederverwendet werden:

  • Sie können in Ihrem Bot einem anderen ComponentDialog- oder DialogSet-Element hinzugefügt werden.
  • Sie können als Teil eines Pakets exportiert werden.
  • Sie können in anderen Bots verwendet werden.

Hinweis

Die JavaScript-, C#- und Python-SDKs für Bot Framework werden weiterhin unterstützt, das Java-SDK wird jedoch eingestellt und der langfristige Support endet im November 2023.

Bestehende Bots, die mit dem Java SDK erstellt wurden, werden weiterhin funktionieren.

Wenn Sie einen neuen Bot erstellen möchten, sollten Sie den Einsatz von Power Virtual Agents in Betracht ziehen und sich über die Auswahl der richtigen Chatbot-Lösung informieren.

Weitere Informationen finden Sie unter Die Zukunft des Bot-Design.

Voraussetzungen

Über das Beispiel

In diesem Beispiel für Eingabeaufforderungen mit mehreren Turns verwenden wir einen Wasserfalldialog, einige Eingabeaufforderungen und einen Komponentendialog, um eine Interaktion zu erstellen, bei der dem Benutzer eine Reihe von Fragen gestellt wird. Der Code durchläuft die folgenden Schritte in Form eines Dialogs:

Schritte Art der Eingabeaufforderung
Transportmittel des Benutzers erfragen Auswahleingabeaufforderung
Name des Benutzers erfragen Texteingabeaufforderung
Benutzer fragen, ob er sein Alter angeben möchte Bestätigungseingabeaufforderung
Falls ja, Alter des Benutzers erfragen Zahleneingabeaufforderung mit Überprüfung, damit nur Altersangaben zwischen Null und 150 (jeweils ausschließlich) akzeptiert werden.
Fragen, ob die erfassten Informationen korrekt sind Erneute Bestätigungseingabeaufforderung

Falls ja, werden die erfassten Informationen angezeigt. Falls nicht, wird dem Benutzer mitgeteilt, dass seine Informationen nicht gespeichert werden.

Komponentendialog implementieren

In diesem Beispiel für Eingabeaufforderungen mit mehreren Turns verwenden wir einen Wasserfalldialog, einige Eingabeaufforderungen und einen Komponentendialog, um eine Interaktion zu erstellen, bei der dem Benutzer eine Reihe von Fragen gestellt wird.

Ein Komponentendialog umfasst einen oder mehrere Dialoge. Der Komponentendialog verfügt über einen inneren Dialogsatz, und die Dialoge und Eingabeaufforderungen, die Sie diesem inneren Dialogsatz hinzufügen, haben ihre eigenen IDs, die nur über den Komponentendialog sichtbar sind.

Installieren Sie das NuGet-Paket Microsoft.Bot.Builder.Dialogs, um Dialoge verwenden zu können.

Dialogs\UserProfileDialog.cs

Hier wird die UserProfileDialog-Klasse von der ComponentDialog-Klasse abgeleitet.

public class UserProfileDialog : ComponentDialog

Innerhalb des Konstruktors werden dem Komponentendialog mit der AddDialog-Methode Dialoge und Eingabeaufforderungen hinzugefügt. Das erste Element, das Sie mit dieser Methode hinzufügen, wird als erster Dialog festgelegt. Sie können den anfänglichen Dialog ändern, indem Sie die InitialDialogId-Eigenschaft explizit festlegen. Wenn Sie einen Komponentendialog starten, wird sein erster Dialog gestartet.

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

Der folgende Code stellt den ersten Schritt des Wasserfalldialogs dar.

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

Weitere Informationen zur Implementierung von Wasserfalldialogen finden Sie im Artikel zum Thema Implementieren eines sequenziellen Konversationsflusses.

Zur Laufzeit wird im Komponentendialog ein eigener Dialogstapel verwaltet. Wenn der Komponentendialog gestartet wird, wird Folgendes durchgeführt:

  • Eine Instanz wird erstellt und dem äußeren Dialogstapel hinzugefügt.
  • Es wird ein innerer Dialogstapel erstellt, der dem Zustand hinzugefügt wird.
  • Der erste Dialog wird gestartet und dem inneren Dialogstapel hinzugefügt.

Der übergeordnete Kontext sieht die Komponente als aktiven Dialog. Für den Kontext innerhalb der Komponente sieht es jedoch so aus, als sei der erste Dialog der aktive Dialog.

Rufen Sie den Dialog von Ihrem Bot aus auf

Im äußeren Dialogsatz (der Dialogsatz, dem Sie den Komponentendialog hinzufügen) verfügt der Komponentendialog über die ID, die Sie für die Erstellung verwendet haben. Im äußeren Satz sieht die Komponente wie ein einzelner Dialog aus (ähnlich wie bei Eingabeaufforderungen).

Um einen Komponentendialog zu verwenden, müssen Sie eine Instance davon dem Dialogsatz des Bots hinzufügen.

Bots\DialogBot.cs

Im Beispiel erfolgt dies mit der RunAsync-Methode, die von der OnMessageActivityAsync-Methode des Bots aufgerufen wird.

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

Bot testen

  1. Installieren Sie Bot Framework Emulator, sofern noch nicht geschehen.
  2. Führen Sie das Beispiel lokal auf Ihrem Computer aus.
  3. Starten Sie den Emulator, stellen Sie eine Verbindung mit Ihrem Bot her, und senden Sie Nachrichten wie unten dargestellt.

Beispieltranskript aus dem Dialogfeld mit mehrfachen Eingabeaufforderungen.

Weitere Informationen

Funktionsweise des Abbruchs für Komponentendialoge

Wenn Sie im Kontext des Komponentendialogs cancel all dialogs aufrufen, bricht der Komponentendialog alle Dialoge seines inneren Stapels ab und wird anschließend beendet. Die Steuerung wird dann wieder an den nächsten Dialog des äußeren Stapels übergeben.

Wenn Sie cancel all dialogs über den äußeren Kontext aufrufen, wird die Komponente genauso wie die restlichen Dialoge des äußeren Kontexts abgebrochen.

Nächste Schritte

Informieren Sie sich darüber, wie Sie komplexe Konversationen mit Verzweigungen und Schleifen erstellen.