Partilhar via


Gerenciar a complexidade da caixa de diálogo

APLICA-SE A: SDK v4

Com as caixas de diálogo de componentes, você pode criar caixas de diálogo independentes para lidar com cenários específicos, dividindo um grande conjunto de diálogos em partes mais gerenciáveis. Cada uma dessas peças tem seu próprio conjunto de diálogos e evita colisões de nomes com os conjuntos de diálogos fora dele. As caixas de diálogo dos componentes são reutilizáveis, na medida em que podem ser:

  • Adicionado a outro ComponentDialog ou DialogSet no seu bot.
  • Exportado como parte de um pacote.
  • Usado em outros bots.

Nota

Os SDKs JavaScript, C# e Python do Bot Framework continuarão a ser suportados, no entanto, o Java SDK está sendo desativado com suporte final de longo prazo terminando em novembro de 2023.

Os bots existentes construídos com o Java SDK continuarão a funcionar.

Para a criação de novos bots, considere usar o Power Virtual Agents e leia sobre como escolher a solução de chatbot certa.

Para obter mais informações, consulte O futuro da criação de bots.

Pré-requisitos

Sobre a amostra

No exemplo de prompt de várias voltas, usamos uma caixa de diálogo em cascata, alguns prompts e uma caixa de diálogo de componente para criar uma interação que faz uma série de perguntas ao usuário. O código usa uma caixa de diálogo para percorrer estas etapas:

Passos Tipo de prompt
Pergunte ao utilizador o seu modo de transporte Prompt de escolha
Peça ao utilizador o seu nome Prompt de texto
Pergunte ao usuário se ele deseja fornecer sua idade Confirmar prompt
Se responderam que sim, pergunte a sua idade Número prompt com validação para aceitar apenas idades maiores que 0 e menores que 150.
Pergunte se a informação recolhida está "ok" Reutilizar Prompt de confirmação

Por fim, se responderem sim, exiba as informações coletadas; caso contrário, diga ao usuário que suas informações não serão mantidas.

Implementar a caixa de diálogo do componente

No exemplo de prompt de várias voltas, usamos uma caixa de diálogo em cascata, alguns prompts e uma caixa de diálogo de componente para criar uma interação que faz uma série de perguntas ao usuário.

Uma caixa de diálogo de componente encapsula uma ou mais caixas de diálogo. A caixa de diálogo do componente tem um conjunto de diálogos interno e as caixas de diálogo e prompts que você adiciona a esse conjunto de diálogos internos têm suas próprias IDs, visíveis apenas de dentro da caixa de diálogo do componente.

Para usar caixas de diálogo, instale o pacote NuGet Microsoft.Bot.Builder.Dialogs .

Caixas de diálogo\UserProfileDialog.cs

Aqui a UserProfileDialog classe deriva da ComponentDialog classe.

public class UserProfileDialog : ComponentDialog

Dentro do construtor, o AddDialog método adiciona diálogos e prompts para a caixa de diálogo do componente. O primeiro item adicionado com esse método é definido como a caixa de diálogo inicial. Você pode alterar a caixa de diálogo inicial definindo explicitamente a InitialDialogId propriedade. Quando você inicia uma caixa de diálogo de componente, ela inicia sua caixa de diálogo inicial.

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

O código a seguir representa a primeira etapa da caixa de diálogo em cascata.

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 obter mais informações sobre como implementar caixas de diálogo em cascata, consulte como implementar o fluxo de conversação sequencial.

Em tempo de execução, a caixa de diálogo do componente mantém sua própria pilha de diálogo. Quando a caixa de diálogo do componente é iniciada:

  • Uma instância é criada e adicionada à pilha de diálogo externa
  • Ele cria uma pilha de diálogo interna que adiciona ao seu estado
  • Ele inicia sua caixa de diálogo inicial e adiciona isso à pilha de diálogo interna.

O contexto pai vê o componente como a caixa de diálogo ativa. No entanto, para o contexto dentro do componente, parece que a caixa de diálogo inicial é a caixa de diálogo ativa.

Chamar a caixa de diálogo do bot

No conjunto de diálogos externo, aquele ao qual você adicionou a caixa de diálogo do componente, a caixa de diálogo do componente tem a ID com a qual você a criou. No conjunto externo, o componente se parece com uma única caixa de diálogo, muito parecido com os prompts.

Para usar uma caixa de diálogo de componente, adicione uma instância dela ao conjunto de diálogos do bot.

Bots\DialogBot.cs

No exemplo, isso é feito usando o RunAsync método que é chamado a partir do método do OnMessageActivityAsync 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);
}

Teste seu bot

  1. Se você ainda não fez isso, instale o Bot Framework Emulator.
  2. Execute a amostra localmente na sua máquina.
  3. Inicie o emulador, conecte-se ao seu bot e envie mensagens como mostrado abaixo.

Exemplo de transcrição da caixa de diálogo de prompt de várias voltas.

Informações adicionais

Como funciona o cancelamento para caixas de diálogo de componentes

Se você chamar cancelar todas as caixas de diálogo do contexto da caixa de diálogo do componente, a caixa de diálogo do componente cancelará todas as caixas de diálogo em sua pilha interna e, em seguida, terminará, retornando o controle para a próxima caixa de diálogo na pilha externa.

Se você chamar cancelar todas as caixas de diálogo do contexto externo, o componente será cancelado, juntamente com o restante das caixas de diálogo no contexto externo.

Próximos passos

Saiba como criar conversas complexas que se ramificam e fazem loop.