聊天机器人项目中使用Dialog实现分支任务
分类: Azure机器人 ◆ 标签: #Azure Bot Framework SDK #Azure Bot Service #机器人 ◆ 发布于: 2023-08-07 23:03:58

我们本节来学习如何通过Bot Framework SDK
的Dialog
库实现分支任务。
什么是分支任务?就是在和聊天机器人对话的过程中,具有条件判断的业务逻辑执行,例如本例中,如果年龄超过35岁会建议购买一份保险,询问购买保险的这个任务就属于一个分支任务。
在开始本章之前,我们需要使用如下两章创建的代码,请在开始本章之前,先阅读并遵循步骤创建一个项目CoreBot
:
- https://www.azuredeveloper.cn/article-create-a-full-function-chat-bot-project
- https://www.azuredeveloper.cn/article-use-dialog-control-chat-bot-session-flow
按照上面两篇文章一步一步做完,就有了一个实现了收集用户昵称和年纪的Dialog
聊天系统了,本章为了说明如何使用分支任务,我们再在waterfalldialog
里添加一个方法,该方法根据年龄来判断,如果用户的年龄大于35岁,询问用户是否愿意购买一份人身意外保险。
开始代码
首先我们需要打开文件MainDialog.cs
, 添加如下的代码:
- 添加一个包的引用:
using Microsoft.Bot.Builder.Dialogs.Choices;
- 添加一个选择框,询问用户是否要购买保险。
- 添加一个用于处理选择框的方法。
在头部添加包引用:
using Microsoft.Bot.Builder.Dialogs.Choices;
更改构造器函数,添加需要的代码, 完成代码如下:
public MainDialog() : base(nameof(MainDialog)) { AddDialog(new TextPrompt("get-nick-name", NickNameNotNull)); AddDialog(new NumberPrompt<int>("get-age")); AddDialog(new ChoicePrompt(nameof(ChoicePrompt))); AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]{ GetNickName, GetAge, SetAgeForHealth, ShowNickNameAndAge, })); InitialDialogId = nameof(WaterfallDialog); }
注意这里添加的AddDialog(new ChoicePrompt(nameof(ChoicePrompt)));
和在waterfallStep
里添加的方法名:SetAgeForHealth
我们现在来实现这个方法:SetAgeForHealth
:
public async Task<DialogTurnResult> SetAgeForHealth(WaterfallStepContext waterfallStepContext, CancellationToken cancellationToken) { var Age = Convert.ToInt32(waterfallStepContext.Result.ToString()); waterfallStepContext.Values["Age"] = Age; if ( Age > 35 ) { var options = new PromptOptions() { Prompt = MessageFactory.Text("您愿意购买一份保险吗?"), RetryPrompt = MessageFactory.Text("请您选择是否要购买保险。"), Choices = GetChoices(), }; return await waterfallStepContext.PromptAsync(nameof(ChoicePrompt), options, cancellationToken); } else { return await waterfallStepContext.NextAsync(cancellationToken); } }
从代码里可以看到当年龄大于35周岁时,这个时候开始做分支任务了。
最后我们还需要修一下方法:ShowNickNameAndAge
, 以便处理分支任务。
public async Task<DialogTurnResult> ShowNickNameAndAge(WaterfallStepContext waterfallStepContext, CancellationToken cancellationToken) { var Age = Convert.ToInt32(waterfallStepContext.Values["Age"]); var NickName = waterfallStepContext.Values["NickName"]; var reply = waterfallStepContext.Context.Activity.CreateReply(); reply.Text = $"您好,您输入的昵称是:{NickName}, 您输入的年龄是: {Age}"; if (Age > 35) { var choice = ((FoundChoice)waterfallStepContext.Result).Value; if (choice.Equals("购买保险")) { reply.Text += "您为自己购买了一份人身保险。"; } } await waterfallStepContext.Context.SendActivityAsync(reply, cancellationToken); return await waterfallStepContext.EndDialogAsync(null, cancellationToken); }
最后,需要注意的是,我们使用了ChoiePrompt
这个Dialog
, 我们需要定义一个返回选项的方法;
private IList<Choice> GetChoices() { var cardOptions = new List<Choice>() { new Choice() { Value = "购买保险", Synonyms = new List<string>() { "买", "购买", "够" } }, new Choice() { Value = "不购买保险", Synonyms = new List<string>() { "不", "不买" } }, }; return cardOptions; }
至此实现分支任务的全部代码都已经完成,运行一下,当问你的年龄的时候,输入36, 可以看到出发了分支任务: