需要一些有关如何正确使用Bot Framework SDK的指南

问题描述

我正在构建一个机器人,到目前为止,体验对我来说一直是充满挑战的。这很可能是因为我来自v1,并且我正在尝试以v4样式重建我的机器人,这似乎是一个完全不同的框架。

我发现那里有很多文档,但是由于您可以使用不同的开发框架(例如Node,C#),所以将其分为理论和实践。但是不得不在这些文章之间来回走也无济于事,

经过一番混乱之后,我觉得事情开始变得更加体面了,但我仍然觉得仍有很多改进的余地。目前,我无法共享整个项目,但是我在这里创建了最重要的代码摘要:https://gist.github.com/jsiegmund/831d5337b1a438133991070daba8a27e

所以我对这段代码的疑问/疑问如下:

  1. 添加对话框的方式(主要是添加用于检索答案的提示的需求)令人困惑。我知道这个想法,但内部却没有。例如:现在,我得到了以相应对话框步骤的相同方法名称命名的提示,这是它应该起作用的方式吗?按照惯例,似乎有一些魔术代码将所有内容链接在一起?当瀑布步骤还包含提示时,这对我来说会更有意义。

  2. 为对话框提供信息以使其可以跳过步骤的正确方法是什么?我在主对话框中设置了LUIS意向,然后打开此对话框进行小时预订。假设我的用户说“我想在客户X上预订8个小时”,我希望对话框中预填充金额为8,客户为X。

  3. 在这里,客户/项目解决可能不是一个标准要求。这些来自通过API / SDK检索的第三方应用程序。因此,根据登录用户,我需要转到该应用程序并检索该用户的数据。这以键/值对的形式返回,其中键是GUID。我不希望用户输入GUID,所以我创建了带有客户名称的这些操作按钮,但是为了将ID值用于下一步,现在它在聊天室中而不是客户中“写入” GUID。名称。使用名称非常棘手,因为我不能完全依赖于唯一性。另外,要选择项目,我需要客户GUID并保存最终条目,我还需要ID。但是我不希望用户看到这些。

  4. 我现在制作卡片的方式对我来说也很奇怪。我首先需要为卡片添加一个对话框,然后在调用stepContext.PromptAsync时也需要提供卡片作为附件。给我的感觉很重复,但是删除其中一个步骤失败。普通样式提示对我不起作用,因为它不能处理键/值,而只能处理字符串(请参见数字3)。

好的,这些就是我一直在努力的事情。我到达那里并且现在可以正常工作,但是正如我所说,我无法逃避我做不正确的感觉。如果有人可以对此亮起光芒,将不胜感激。

解决方法

是的,不同版本之间有很多更改。您真的是v1吗?! ?还是v3?

  1. 添加对话框的方式(主要是添加用于检索答案的提示的需求)令人困惑。我知道了,但不是真的 内部运作。例如:我现在有以以下名称命名的提示 相应对话框步骤的方法名称相同,是 它应该如何工作?似乎有一些魔术代码链接 按照惯例,一切都在一起吗?这样做会更有意义 我在瀑布台阶上还会包括提示。

本质上。 Waterfall数组中列出的步骤是您创建的方法名称的名称。基本上,这是您给出机器人应执行的步骤的 order 的位置。提示是用于检索数据的类,并使用AddDialog()填充到(“主”)对话框中,并以唯一的名称存储在对话框状态中,以便可以正确地检索它们。我看到您的观点是,在一个“调用”或声明中设置所有内容可能很简单,并且可能还有其他方法可以实现它。但这就是我们得到的。

  1. 向对话框提供信息以使其可以跳过步骤的正确方法是什么?我在主对话框中设置了LUIS意向 然后打开此对话框进行小时预订。假设我的用户说“我愿意 想在客户X上预订8小时”,我希望对话框 将数量预填充为8,将客户预填充为X。

通常,步骤使用先前的步骤值来答复,操作或继续。在简单的情况下,可以通过检查那些值的状态来完成跳过步骤。在multiturn sample中,如果用户不想提供自己的年龄,则继续进行下一步,然后检查该值并跳过该步骤(实际上不是跳过它,报告没有给出年龄,但是您可以继续进行而无需任何回复)。假设LUIS方面是正确的,并获得正确的意图和实体(例如,“预订”意图和实体['时间“和”客户“]),那么这应该是可行的。您将填充这两个实体的状态信息,然后随后的步骤(例如提示客户步骤)将跳过/跳过。

但是,您真正想要做的是查看自适应对话框。它们是新的,使这种类型的方案更加动态和灵活。看这里:

  1. 在这里解决客户/项目可能不是一个标准要求。这些来自第三方应用程序,已检索 通过API / SDK。因此,根据已登录的用户,我需要出去 该应用程序并检索该用户的数据。这回来了 在键/值对中,其中键是GUID。显然我不想 用户输入GUID,因此我使用以下命令创建了这些操作按钮 客户的名称,但将ID值用于下一步 现在,它将“写入”聊天室中的GUID而不是客户名称。 使用名称非常棘手,因为我不能完全依靠那些唯一性。

我不确定这部分是100%。让我调查一下,然后再回覆您。

此外,要选择项目,我需要客户GUID并保存 最后一个条目我也需要ID的。但是我不希望用户看到 那些。

状态(对话|用户|等)将是管理此问题的好地方。

  1. 我现在制作卡片的方式对我来说也很奇怪。我首先需要为卡添加一个对话框,然后在调用时 stepContext.PromptAsync我需要以附件形式提供卡 好。对我来说感觉很重复,但是删除其中一个步骤就结束了 失败了。普通样式提示对我不起作用 不处理键/值,而只处理字符串(请参见数字3)。

不,是的。我知道这感觉很奇怪,但这就是这样做的方法。基本上,除了简单的文本外,所有内容都将作为附件。卡是JSON,因此是附件,您需要将其发送给用户/客户端。

您所做的一切都正确。再次;我建议您看一下自适应对话框,因为这是较新的技术并且正在向前发展。然而在其他方面;您在正确的道路上!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...