Az összetevők párbeszédpaneleivel önálló párbeszédablakokat hozhat létre adott forgatókönyvek kezelésére, így a nagy párbeszédpanelek kezelhetőbb részekre bonthatók. Mindegyik darab saját párbeszédpanelkészlettel rendelkezik, és elkerüli, hogy a név összeütközjön a rajta kívüli párbeszédpanel-csoportokkal. Az összetevők párbeszédpanelei a következő módon használhatók újra:
Hozzáadva egy másikhoz ComponentDialog vagy DialogSet a robothoz.
Csomag részeként exportálva.
Más robotokon belül használatos.
Feljegyzés
A Bot Framework JavaScript, C# és Python SDK-k továbbra is támogatottak lesznek, a Java SDK-t azonban 2023 novemberében végső hosszú távú támogatással kivonják.
A Java SDK-val létrehozott meglévő robotok továbbra is működni fognak.
Új robotépítéshez fontolja meg a Power Virtual Agents használatát, és olvassa el a megfelelő csevegőrobot-megoldás kiválasztását.
A robot alapjainak, a párbeszédtárnak és a beszélgetések kezelésének ismerete.
A többfordulós parancssori minta másolata c#, JavaScript, Java vagy Python nyelven.
Tudnivalók a mintáról
A többfordulós parancssori mintában egy vízesés párbeszédpanelt, néhány kérdést és egy összetevő párbeszédpanelt használunk egy olyan interakció létrehozásához, amely kérdések sorozatát kérdezi fel a felhasználótól. A kód egy párbeszédpanel használatával lépeget az alábbi lépéseken:
Lépések
Parancssor típusa
Kérje meg a felhasználót a szállítás módjára
Választási lehetőségekre vonatkozó kérdés
Kérje meg a felhasználót, hogy adja meg a nevét
Szöveges üzenet
Kérdezze meg a felhasználót, hogy meg szeretné-e adni az életkorát
Megerősítési kérés
Ha igennel válaszoltak, kérjék meg a korukat
0-nál nagyobb és 150-nél kisebb korú, érvényesítéssel rendelkező számkérés.
Kérdezze meg, hogy az összegyűjtött adatok "rendben" vannak-e
Ismételt megerősítési kérés
Végül, ha igennel válaszoltak, jelenítse meg az összegyűjtött információkat; ellenkező esetben közölje a felhasználóval, hogy az adatai nem lesznek megőrzve.
Az összetevő implementálása párbeszédpanel
A többfordulós parancssori mintában egy vízesés párbeszédpanelt, néhány kérdést és egy összetevő párbeszédpanelt használunk egy olyan interakció létrehozásához, amely kérdések sorozatát kérdezi fel a felhasználótól.
Az összetevők párbeszédpaneljei egy vagy több párbeszédpanelt foglalnak össze. Az összetevő párbeszédpaneljének belső párbeszédpanel-készlete van, és a belső párbeszédpanel-készlethez hozzáadott párbeszédpanelek és kérések saját azonosítókkal rendelkeznek, amelyek csak az összetevő párbeszédpaneljén belül láthatók.
A párbeszédpanelek használatához telepítse a Microsoft.Bot.Builder.Dialogs NuGet csomagot.
Párbeszédpanelek\UserProfileDialog.cs
Itt az UserProfileDialog osztály az ComponentDialog osztályból származik.
public class UserProfileDialog : ComponentDialog
A konstruktoron belül a AddDialog metódus párbeszédpaneleket és utasításokat ad hozzá az összetevő párbeszédpaneléhez. Az ezzel a módszerrel hozzáadott első elem a kezdeti párbeszédpanel. A kezdeti párbeszédpanelt módosíthatja a InitialDialogId tulajdonság explicit beállításával. Amikor elindít egy összetevő párbeszédpanelt, az elindítja a kezdeti párbeszédpanelt.
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);
}
Az alábbi kód a vízesés párbeszédpanel első lépését jelöli.
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);
}
A párbeszédpanelek használatához a projektnek telepítenie kell a botbuilder-dialogs npm csomagot.
párbeszédpanelek/userProfileDialog.js
Itt az osztály kiterjeszti ComponentDialog.UserProfileDialog
class UserProfileDialog extends ComponentDialog {
A konstruktoron belül a AddDialog metódus párbeszédpaneleket és utasításokat ad hozzá az összetevő párbeszédpaneléhez. Az ezzel a módszerrel hozzáadott első elem a kezdeti párbeszédpanel. A kezdeti párbeszédpanelt módosíthatja a InitialDialogId tulajdonság explicit beállításával. Amikor elindít egy összetevő párbeszédpanelt, az elindítja a kezdeti párbeszédpanelt.
Az alábbi kód a vízesés párbeszédpanel első lépését jelöli.
async transportStep(step) {
// WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog.
// Running a prompt here means the next WaterfallStep will be run when the user's response is received.
return await step.prompt(CHOICE_PROMPT, {
prompt: 'Please enter your mode of transport.',
choices: ChoiceFactory.toChoices(['Car', 'Bus', 'Bicycle'])
});
}
Itt az UserProfileDialog osztály az ComponentDialog osztályból származik.
public class UserProfileDialog extends ComponentDialog {
A konstruktoron belül a addDialog metódus párbeszédpaneleket és utasításokat ad hozzá az összetevő párbeszédpaneléhez. Az ezzel a módszerrel hozzáadott első elem a kezdeti párbeszédpanel. A kezdeti párbeszédpanelt a metódus meghívásával setInitialDialogId és a kezdeti párbeszédpanel nevének megadásával módosíthatja. Amikor elindít egy összetevő párbeszédpanelt, az elindítja a kezdeti párbeszédpanelt.
public UserProfileDialog(UserState withUserState) {
super("UserProfileDialog");
userProfileAccessor = withUserState.createProperty("UserProfile");
WaterfallStep[] waterfallSteps = {
UserProfileDialog::transportStep,
UserProfileDialog::nameStep,
this::nameConfirmStep,
this::ageStep,
UserProfileDialog::pictureStep,
this::confirmStep,
this::summaryStep
};
// Add named dialogs to the DialogSet. These names are saved in the dialog state.
addDialog(new WaterfallDialog("WaterfallDialog", Arrays.asList(waterfallSteps)));
addDialog(new TextPrompt("TextPrompt"));
addDialog(new NumberPrompt<Integer>("NumberPrompt", UserProfileDialog::agePromptValidator, Integer.class));
addDialog(new ChoicePrompt("ChoicePrompt"));
addDialog(new ConfirmPrompt("ConfirmPrompt"));
addDialog(new AttachmentPrompt("AttachmentPrompt", UserProfileDialog::picturePromptValidator));
// The initial child Dialog to run.
setInitialDialogId("WaterfallDialog");
}
Az alábbi kód a vízesés párbeszédpanel első lépését jelöli.
private static CompletableFuture<DialogTurnResult> nameStep(WaterfallStepContext stepContext) {
stepContext.getValues().put("transport", ((FoundChoice) stepContext.getResult()).getValue());
PromptOptions promptOptions = new PromptOptions();
promptOptions.setPrompt(MessageFactory.text("Please enter your name."));
return stepContext.prompt("TextPrompt", promptOptions);
}
A párbeszédpanelek használatához telepítse a botbuilder-dialogs és botbuilder-aiPyPI csomagokat egy terminál futtatásával pip install botbuilder-dialogs és pip install botbuilder-aihasználatával.
párbeszédpanelek/user_profile_dialog.py
Itt az osztály kiterjeszti ComponentDialog.UserProfileDialog
class UserProfileDialog(ComponentDialog):
A konstruktoron belül a add_dialog metódus párbeszédpaneleket és utasításokat ad hozzá az összetevő párbeszédpaneléhez. Az ezzel a módszerrel hozzáadott első elem a kezdeti párbeszédpanel. A kezdeti párbeszédpanelt módosíthatja a initial_dialog_id tulajdonság explicit beállításával. Amikor elindít egy összetevő párbeszédpanelt, az elindítja a kezdeti párbeszédpanelt.
Az alábbi kód a vízesés párbeszédpanel első lépését jelöli.
async def transport_step(
self, step_context: WaterfallStepContext
) -> DialogTurnResult:
# WaterfallStep always finishes with the end of the Waterfall or with another dialog;
# here it is a Prompt Dialog. Running a prompt here means the next WaterfallStep will
# be run when the users response is received.
return await step_context.prompt(
ChoicePrompt.__name__,
PromptOptions(
prompt=MessageFactory.text("Please enter your mode of transport."),
choices=[Choice("Car"), Choice("Bus"), Choice("Bicycle")],
),
)
Futtatáskor az összetevő párbeszédpanelje saját párbeszédpanel-vermet tart fenn. Az összetevő párbeszédpaneljének indításakor:
Létrejön egy példány, és hozzáadódik a külső párbeszédpanel-veremhez
Létrehoz egy belső párbeszédpanel-vermet, amelyet hozzáad az állapotához
Elindítja a kezdeti párbeszédpanelt, és hozzáadja azt a belső párbeszédpanel-veremhez.
A szülőkörnyezet aktív párbeszédpanelként látja az összetevőt. Az összetevő környezetében azonban úgy tűnik, hogy a kezdeti párbeszédpanel az aktív párbeszédpanel.
A párbeszédpanel meghívása a robotból
A külső párbeszédpanel-készletben, amelyhez hozzáadta az összetevő párbeszédpanelt, az összetevő párbeszédpanelje rendelkezik azzal az azonosítóval, amellyel létrehozta. A külső csoportban az összetevő egyetlen párbeszédpanelnek tűnik, hasonlóan a parancssorokhoz.
Összetevő párbeszédpanel használatához adjon hozzá egy példányt a robot párbeszédpanelkészletéhez.
A mintában ez a RunAsync robot OnMessageActivityAsync metódusából meghívott metódussal történik.
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);
}
párbeszédpanelek/userProfileDialog.js
A mintában hozzáadtunk egy metódust run a felhasználói profil párbeszédpanelhez.
A run metódust a robot metódusából hívjuk onMessage meg.
this.onMessage(async (context, next) => {
console.log('Running dialog with Message Activity.');
// Run the Dialog with the new message Activity.
await this.dialog.run(context, this.dialogState);
await next();
});
DialogBot.java
A mintában ez a run robot onMessageActivity metódusából meghívott metódussal történik.
@Override
protected CompletableFuture<Void> onMessageActivity(
TurnContext turnContext
) {
LoggerFactory.getLogger(DialogBot.class).info("Running dialog with Message Activity.");
// Run the Dialog with the new message Activity.
return Dialog.run(dialog, turnContext, conversationState.createProperty("DialogState"));
}
segítők/dialog_helper.py
A mintában hozzáadtunk egy metódust run_dialog a felhasználói profil párbeszédpanelhez.
Indítsa el az Emulátort, csatlakozzon a robothoz, és küldjön üzeneteket az alábbiak szerint.
További információk
A lemondás működése az összetevők párbeszédpaneljeinél
Ha az összetevő párbeszédpaneljének környezetéből az összes párbeszédpanel lemondását hívja meg, az összetevő párbeszédpanelje megszakítja a belső verem összes párbeszédpaneljét, majd véget ér, és visszakerül a külső verem következő párbeszédpaneljére.
Ha a külső környezet összes párbeszédpaneljének megszakítását hívja meg, az összetevőt a külső környezet többi párbeszédpanelével együtt a rendszer megszakítja.
Következő lépések
Megtudhatja, hogyan hozhat létre olyan összetett beszélgetéseket, amelyek elágaznak és hurkolnak.