基于 MS Bot Framework 中的响应分支对话框/表单

2024-05-12

我们正在尝试使用 MS Bot Framework,但尚未完全弄清楚如何实现此场景:

我们有一个 LUIS 对话框(类型<object>),它工作正常并且经过适当的培训。以常见的三明治为例,LUIS 意图寻找的基本内容是用户询问订单状态。如果问题中提供了订单号(“订单 1234 的状态是什么?”),则 LUIS 对话框会进行查找并直接报告状态(当前全部正常)。

但是,如果用户只是触发意图而不提供订单号(“我想查找订单的状态。”),我想启动另一个对话框/表单来询问用户是否愿意例如通过地址或订单号查找订单,然后根据他们的回答方式进行适当的数据库查找。

我只是不确定如何配置表单/对话框(或者甚至在这种情况下最好)来根据他们选择地址还是号码查找来进行不同的查找。

这是到目前为止的意图:

private readonly BuildFormDelegate<OrderStatusDialog> OrderStatusDelegate;

[LuisIntent(nameof(LuisIntents.OrderStatus))]
public async Task OrderStatus(IDialogContext context, LuisResult result)
{
    // Order number(s) were provided
    if (result.Entities.Any(Entity => Entity.Type == nameof(LuisEntityTypes.OrderNumber)))
    {
        // Loop in case they asked about multiple orders
        foreach (var entity in result.Entities.Where(Entity => Entity.Type == nameof(LuisEntityTypes.OrderNumber)))
        {
            var orderNum = entity.Entity;

            // Call webservice to check status
            var request = new RestRequest(Properties.Settings.Default.GetOrderByNum, Method.GET);
            request.AddUrlSegment("num", orderNum);
            var response = await RestHelper.SendRestRequestAsync(request);

            var parsedResponse = JObject.Parse(response);

            if ((bool)parsedResponse["errored"])
            {
                await context.PostAsync((string)parsedResponse["errMsg"]);
                continue;
            }

            // Grab status from returned JSON
            var status = parsedResponse["orderStatus"].ToString();

            await context.PostAsync($"The status of order {orderNum} is {status}");
        }

        context.Wait(MessageReceived);
    }
    // Order number was not provided
    else
    {
        var orderStatusForm = new FormDialog<OrderStatusDialog>(new OrderStatusDialog(), OrderStatusDelegate,
            FormOptions.PromptInStart);
        context.Call<OrderStatusDialog>(orderStatusForm, CallBack);
    }
}

private async Task CallBack(IDialogContext context, IAwaitable<object> result)
{
    context.Wait(MessageReceived);
}

以及形式:

public enum OrderStatusLookupOptions
{
    Address,
    OrderNumber
}

[Serializable]
public class OrderStatusDialog
{
    public OrderStatusLookupOptions? LookupOption;

    public static IForm<OrderStatusDialog> BuildForm()
    {
        return new FormBuilder<OrderStatusDialog>()
            .Message("In order to look up the status of a order, we will first need either the order number or your delivery address.")
            .Build();
    }
}

FormFlow 路线是一个有效的选项。您的表单流程中缺少的是在选择查找选项后询问地址/订单号。

在这种情况下,您可以做的就是向OrderStatusDialog class: OrderNumber and DeliveryAddress.

然后你需要使用选择的OrderStatusLookupOptions激活/停用下一个字段。

从我的想法来看,代码应该是这样的:

[Serializable]
public class OrderStatusDialog
{
    public OrderStatusLookupOptions? LookupOption;

    public int OrderNumber;

    public string DeliveryAddress

    public static IForm<OrderStatusDialog> BuildForm()
    {
        return new FormBuilder<OrderStatusDialog>()
            .Message("In order to look up the status of a order, we will first need either the order number or your delivery address.")
            .Field(nameof(OrderStatusDialog.LookupOption))
            .Field(new FieldReflector<OrderStatusDialog>(nameof(OrderStatusDialog.OrderNumber))
                .SetActive(state => state.LookupOption == OrderStatusLookupOptions.OrderNumber))
            .Field(new FieldReflector<OrderStatusDialog>(nameof(OrderStatusDialog.DeliveryAddress))
                .SetActive(state => state.LookupOption == OrderStatusLookupOptions.Address))
            .Build();
    }
}

然后,在您的回调方法中,您将收到填写的表格,并且您可以进行数据库查找。

或者,您可以仅使用 PromptDialogs 并引导用户获得相同的体验。看看多重对话 https://github.com/Microsoft/BotBuilder-Samples/tree/master/CSharp/core-MultiDialogs示例以查看不同的替代方案。

我为此添加了一个工作示例here https://github.com/ejadib/FormFlowBranchBasedOnResponse.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 MS Bot Framework 中的响应分支对话框/表单 的相关文章

随机推荐

  • Bugzilla 还是 Mantis? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • PHP date_sun_info 错误时间

    我正在尝试使用 PHPdate sun info函数获取全天太阳某些位置的时间信息 目前我正在使用类似于中的代码文档 http php net manual en function date sun info php sun info da
  • 使用MockWebServer暂停功能测试

    我正在测试使用 MockWebServer 的挂起函数返回结果的 api 但它不适用于 runBlockingTest testCoroutineDispatcher testCorounieScope 除非launch使用builder
  • 有没有办法列出Git中未修改的文件?

    我从另一个来源以 tarball 的形式获取了一些更改 我想知道哪些文件没有更改 目标是 Git 克隆 因此可以轻松查看新增内容和更改内容 有人知道如何获取未更改内容的列表 不包括未跟踪的内容 吗 编辑 换句话说 我希望利用 Git 来查找
  • django-tastypie:无法访问脱水中的bundle.request(self,bundle)

    我发现有人有同样的问题 但他的安慰对我不起作用 看Django Tastypie 如何访问 Bundle 中的 Http request 对象 https stackoverflow com questions 7389632 我正在尝试应
  • Strapi v4 使用补丁包自定义页面

    我想用我的自定义文本更改登录页面内的文本 我做了一些改变node modules strapi admin src pages AuthPage components Login BaseLogin js 在编辑该文件之前 我安装patch
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • UIView 内的 UIButton 目标操作

    我有一个习惯UIView我创建了一个UIButton 在该视图中 我有以下代码 func setupViews menuControlButton addTarget self action toggleButton forControlE
  • 在Python中整齐地绘制PMF

    有没有一个库可以帮助我在 python 中整齐地绘制样本的概率质量函数 如下所示 通过matplotlib pyplot的stem模块 matplotlib pyplot stem args kwargs from matplotlib p
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • Perl 单元测试只针对模块,而不针对程序吗?

    我在网上找到的文档和我拥有的书 Perl测试 或者说或者建议 Perl 的单元测试通常是在创建模块时完成的 这是真的 有没有办法使用单元测试实际程序Test More和表兄弟姐妹 当然 您可以使用测试脚本测试 更多 http search
  • 全日历与 UTC 和本地日期的混淆

    我确实让 fullcalendar 正常初始化 所以它代表当前日期 午夜 gt 午夜 1 天 1 小时时段 我从其他一些数据源获取带有时间戳的数据 格式为 YYYY MM DD HH mm 作为字符串传输 无时区信息 因此 我将该字符串转换
  • 如何安全地将 CGFloat 降低或提高到 int?

    我经常需要在地板或天花板上安装CGFloat to an int 用于计算数组索引 我永远看到的问题floorf theCGFloat or ceilf theCGFloat 是浮点不准确可能会带来麻烦 那如果我的CGFloat is 2
  • seaborn 箱线图的子图

    我有一个像这样的数据框 import seaborn as sns import pandas as pd pylab inline df pd DataFrame a one one two two one two one one one
  • React Native 中 fontAwesome 图标的圆形轮廓

    我想使用 fontAwesome 图标 使其位于圆圈的中间 我想将它用作一个图标项 我读到我们可以将它与圆形图标一起使用并将其放置在其中 但我无法使其工作 import IconFA from react native vector ico
  • 如何拆分 data.frame -> 将合并应用于子集 -> 合并到 data.frame 中

    我真的不知道如何在不使用 for 循环的情况下实现这一目标 x lt c a b c d gt x 1 a b c d data lt data frame x c a b a b c a a b c d name c one one tw
  • 异步方法中的异常未被捕获

    下面的代码没有捕获我的OperationCancelEException 它是通过调用抛出的ct ThrowIfCancellationRequested public partial class TitleWindow Window IA
  • 单击 btn 而不触发 div 单击未按预期工作

    代码沙盒 https codesandbox io s currying breeze depdc9 file package json https codesandbox io s currying breeze depdc9 file
  • 基于 MS Bot Framework 中的响应分支对话框/表单

    我们正在尝试使用 MS Bot Framework 但尚未完全弄清楚如何实现此场景 我们有一个 LUIS 对话框 类型 它工作正常并且经过适当的培训 以常见的三明治为例 LUIS 意图寻找的基本内容是用户询问订单状态 如果问题中提供了订单号