Skip to main content

聊天机器人项目中使用Dialog实现分支任务

分类:  Azure机器人 标签:  #Azure Bot Framework SDK #Azure Bot Service #机器人 发布于: 2023-08-07 23:03:58

我们本节来学习如何通过Bot Framework SDKDialog库实现分支任务。

什么是分支任务?就是在和聊天机器人对话的过程中,具有条件判断的业务逻辑执行,例如本例中,如果年龄超过35岁会建议购买一份保险,询问购买保险的这个任务就属于一个分支任务。

在开始本章之前,我们需要使用如下两章创建的代码,请在开始本章之前,先阅读并遵循步骤创建一个项目CoreBot:

按照上面两篇文章一步一步做完,就有了一个实现了收集用户昵称和年纪的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, 可以看到出发了分支任务: