Gestire la complessità dei dialoghi
SI APPLICA A: SDK v4
Con i dialoghi componenti è possibile creare dialoghi indipendenti per gestire scenari specifici, suddividendo un set di dialoghi di grandi dimensioni in parti più gestibili. Ognuno di questi componenti ha il proprio set di dialoghi ed evita eventuali conflitti di nomi con i set di dialoghi esterni. I dialoghi componenti sono riutilizzabili in quanto possono essere:
- Aggiunto a un altro
ComponentDialog
oDialogSet
nel tuo bot. - Esportati come parte di un pacchetto.
- Utilizzati all'interno di altri bot.
Nota
Gli SDK JavaScript, C# e Python di Bot Framework continueranno a essere supportati, ma Java SDK verrà ritirato con il supporto finale a lungo termine che termina a novembre 2023.
I bot esistenti creati con Java SDK continueranno a funzionare.
Per la creazione di nuovi bot, è consigliabile usare Microsoft Copilot Studio e leggere le informazioni sulla scelta della soluzione copilota appropriata.
Per ulteriori informazioni, vedere Il futuro della creazione di bot.
Prerequisiti
- Conoscenza delle nozioni di base sui bot, della libreria di dialoghi e di come gestire le conversazioni.
- Copia dell'esempio di richiesta a più turni in C#, JavaScript, Java o Python.
Informazioni sull'esempio
Nell'esempio di richiesta a più turni si usa un dialogo a cascata, alcune richieste e un dialogo componente per creare un'interazione che chiede all'utente una serie di domande. Il codice usa un dialogo per scorrere questi passaggi:
Passaggi | Tipo di richiesta |
---|---|
Chiedere all'utente la modalità di trasporto | Richiesta di scelta |
Chiedere all'utente il nome | Richiesta di testo |
Chiedere all'utente se vuole fornire la propria età | Richiesta di conferma |
Se hanno risposto sì, chiedere la loro età | Richiesta di numeri con convalida per accettare solo età maggiori di 0 e minori di 150. |
Chiedere se le informazioni raccolte sono "ok" | Riutilizzo della richiesta di conferma |
Infine, se hanno risposto sì, visualizzare le informazioni raccolte; in caso contrario, indicare all'utente che le informazioni non verranno mantenute.
Implementare la finestra di dialogo del componente
Nell'esempio di richiesta a più turni, usiamo un dialogo a cascata, alcune richieste e un dialogo componente per creare un'interazione che chiede all'utente una serie di domande.
Un dialogo componente racchiude uno o più dialoghi. Il dialogo componente contiene un set di dialoghi interno e i dialoghi e le richieste che si aggiungono a questo set di dialoghi interno hanno propri ID, visibili solo all'interno del dialogo componente.
Per usare i dialoghi, installare il pacchetto NuGet Microsoft.Bot.Builder.Dialogs.
Dialogs\UserProfileDialog.cs
In questo caso la classe UserProfileDialog
deriva dalla classe ComponentDialog
.
public class UserProfileDialog : ComponentDialog
All'interno del costruttore il metodo AddDialog
aggiunge dialoghi e richieste al dialogo componente. Il primo elemento aggiunto con questo metodo viene impostato come finestra di dialogo iniziale. È possibile modificare la finestra di dialogo iniziale impostando in modo esplicito la InitialDialogId
proprietà . Quando si avvia un dialogo componenti, viene avviato il relativo dialogo iniziale.
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);
}
Il codice seguente rappresenta il primo passaggio del dialogo a 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);
}
Per altre informazioni sull'implementazione dei dialoghi a cascata, vedere come implementare un flusso di conversazione sequenziale.
In fase di esecuzione il dialogo componente mantiene il proprio stack di dialoghi. Quando viene avviato il dialogo componente:
- Un'istanza viene creata e aggiunta allo stack di dialoghi esterno
- Crea uno stack di dialoghi interni che aggiunge al proprio stato.
- Inizia il suo dialogo iniziale e lo aggiunge allo stack di dialoghi interno.
Il contesto padre vede il componente come finestra di dialogo attiva. Tuttavia, nel contesto all'interno del componente, sembra che il dialogo iniziale sia il dialogo attivo.
Chiamare il dialogo dal bot
Nel set di dialoghi esterno, quello a cui è stato aggiunto il dialogo componente, la finestra di dialogo componente ha l'ID con cui è stato creato. Nell'insieme esterno, il componente appare come una singola finestra di dialogo, simile a come appaiono i prompt.
Per usare una finestra di dialogo componente, aggiungerla al set di dialoghi del bot.
Bots\DialogBot.cs
Nell'esempio questa operazione viene eseguita usando il metodo RunAsync
che viene chiamato dal metodo 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);
}
Esegui il test del tuo bot
- Se non è già stato fatto, installare Bot Framework Emulator.
- Esegui l'esempio localmente sul tuo computer.
- Avviare l'emulatore, connettersi al bot e inviare messaggi come mostrato di seguito.
Informazioni aggiuntive
Funzionamento dell'annullamento per le finestre di dialogo dei componenti
Se si chiama cancel all dialogs dal contesto del dialogo componente, il dialogo componente annullerà tutti i dialoghi nel relativo stack interno e quindi termina, restituendo il controllo al dialogo successivo nello stack esterno.
Se si chiama annulla tutti i dialoghi dal contesto esterno, il componente viene annullato, insieme agli altri dialoghi nel contesto esterno.
Passaggi successivi
Scopri come creare conversazioni complesse che si ramificano e si ripetono.