Administración de la complejidad de los diálogos

SE APLICA A: SDK v4

Con los diálogos de componentes se pueden crear diálogos independientes para controlar escenarios concretos, y dividir un conjunto de diálogos grande en elementos más manejables. Cada uno de estos elementos tiene su propio conjunto de diálogos y evita los conflictos de nombres con los conjuntos de diálogos exteriores. Los cuadros de diálogo de componentes son reutilizables porque se pueden:

  • Agregar a otro ComponentDialog o DialogSet en el bot.
  • Exportar como parte de un paquete.
  • Utilizar en otros bots.

Nota:

Los SDK de JavaScript, C# y Python de Bot Framework seguirán siendo compatibles, pero el SDK de Java se va a retirar con la finalización del soporte técnico a largo plazo en noviembre de 2023. Solo se realizarán correcciones de errores y seguridad críticos en este repositorio.

Los bots existentes creados con el SDK de Java seguirán funcionando.

Para la nueva compilación de bots, considere la posibilidad de usar Power Virtual Agents y lea sobre cómo elegir la solución de bot de chat adecuada.

Para obtener más información, consulte El futuro de la creación de bots.

Requisitos previos

Sobre el ejemplo

En el ejemplo de solicitud de varios turnos, usamos un diálogo en cascada, algunas solicitudes y un diálogo de componente para crear una interacción que formula al usuario una serie de preguntas. El código usa un diálogo para desplazarse por estos pasos:

Pasos Tipo de solicitud
Pedir al usuario su modo de transporte Solicitud de elección
Pedir al usuario su nombre Solicitud de texto
Pedir al usuario si desea proporcionar su edad Solicitud de confirmación
Si responde Sí, solicitar su edad Solicitud numérica con validación para que solo acepte edades mayores que 0 y menores de 150.
Preguntar si la información recopilada es correcta Reutilización de la solicitud de confirmación

Por último, si responde Sí, mostrar la información recopilada; de lo contrario, indicar al usuario que no se conservará su información.

Implementar la lógica del diálogo del componente

En el ejemplo de solicitud de varios turnos, usamos un diálogo en cascada, algunas solicitudes y un diálogo de componente para crear una interacción que formula al usuario una serie de preguntas.

Un diálogo de componente encapsula uno o varios diálogos. El diálogo de componente tiene un conjunto de diálogos interno y tanto los diálogos como las solicitudes que agregue a dicho conjunto tienen sus propios identificadores, que solo se pueden ver desde el diálogo de componente.

Para usar diálogos, instale el paquete de NuGet Microsoft.Bot.Builder.Dialogs.

Dialogs\UserProfileDialog.cs

Aquí la UserProfileDialog clase deriva de ka ComponentDialog clase.

public class UserProfileDialog : ComponentDialog

Dentro del constructor, el método AddDialog agrega diálogos y solicitudes al diálogo de componente. El primer elemento que agregue con este método se establece como el diálogo inicial. Puede cambiar el diálogo inicial definiendo explícitamente la propiedad InitialDialogId. Al iniciar un diálogo de componente, se iniciará su 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);
}

El código siguiente representa el primer paso del diálogo en cascada.

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

Para más información acerca de la implementación de los diálogo en cascada, consulte cómo implementar un flujo de conversaciones secuencial.

En tiempo de ejecución, el diálogo de componente mantiene su propia pila de diálogos. Cuando el diálogo de componente se inicia:

  • Se crea una instancia y se agrega a la pila de diálogos externa
  • Crea una pila de diálogos interna que agrega a su estado
  • Comienza su diálogo inicial y lo agrega a la pila de diálogos interna.

El contexto primario ve el componente como el diálogo activo. Sin embargo, para el contexto dentro del componente, parece que el diálogo inicial es el activo.

Llamar al diálogo desde el bot

En el conjunto de diálogos externo, al que ha agregado el diálogo de componente, el diálogo de componente tiene el identificador con el que lo creó. En el conjunto externo, el componente parece un diálogo individual, como si fuera una solicitud.

Para usar un diálogo de componente, agregue una instancia de él al conjunto de diálogos del bot.

Bots\DialogBot.cs

En el ejemplo, esto se hace con el método RunAsync al que se llama desde el método OnMessageActivityAsync del 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);
}

Pruebe su bot

  1. Si aún no lo ha hecho, instale Bot Framework Emulator.
  2. Ejecute el ejemplo localmente en la máquina.
  3. Inicie el emulador, conéctese al bot y envíe mensajes como se muestra a continuación.

Sample transcript from the multi-turn prompt dialog.

Información adicional

Funcionamiento de la cancelación en los diálogos de componentes

Si se llama a cancelar todos los diálogos desde el contexto del diálogo del componente, dicho diálogo cancelará todos los diálogos de su pila interna y, después, finalizará, con lo que devolverá el control al siguiente diálogo de la pila externa.

Si se llama a cancelar todos los diálogos desde el contexto externo, se cancelan tanto el componente como el resto de los diálogos del contexto externo.

Pasos siguientes

Obtenga información sobre cómo crear conversaciones complejas que se ramifican y se repiten.