需要一些关于如何正确使用机器人框架 SDK 的指导
Posted
技术标签:
【中文标题】需要一些关于如何正确使用机器人框架 SDK 的指导【英文标题】:Need some guidance on how to properly use bot framework SDK 【发布时间】:2020-11-30 19:15:49 【问题描述】:我正在构建一个机器人,到目前为止,这种体验对我来说一直充满挑战。这很可能是因为我来自 v1 并且我正在尝试以 v4 风格重建我的机器人,这似乎是一个完全不同的框架。
我发现那里有很多文档,但它被分为理论和实践,可能是由于您可以使用不同的开发框架(即 Node、C#)。但是不得不在这些文章之间来回切换是没有帮助的,
经过一番折腾,我的情况开始变得更体面了,但我仍然觉得还有很大的改进空间。目前我无法分享整个项目,但我在这里创建了最重要代码的要点:https://gist.github.com/jsiegmund/831d5337b1a438133991070daba8a27e
所以我对这段代码的问题/疑问如下:
添加对话框的方式,主要是添加提示以检索答案的需要令人困惑。我明白了这个想法,但不是内部运作。例如:我现在有以相应对话步骤的相同方法名称命名的提示,这是它应该工作的方式吗?按照惯例,似乎有一些神奇的代码将所有东西联系在一起?当瀑布步骤也包含提示时,对我来说会更有意义。
向对话框提供信息以便跳过步骤的正确方法是什么?我在主对话框中设置了 LUIS 意图,然后打开此对话框进行小时预订。假设我的用户说“我想为客户 X 预订 8 小时”,我希望对话框将金额预填充为 8,并将客户预填充到 X。
这里的客户/项目解决可能是一个不那么标准的要求。这些来自第三方应用程序,通过 API/SDK 检索。因此,根据登录用户,我需要访问该应用程序并检索该用户的数据。这以键/值对的形式返回,其中键是 GUID。我不希望用户输入 GUID,所以我创建了这些带有客户姓名的操作按钮,但是为了将 ID 值带入下一步,它现在在聊天中“写入”GUID 而不是客户姓名。使用这个名字很棘手,因为我不能完全依赖那些是独一无二的。此外,为了选择项目,我需要客户 GUID 并保存最终条目,我还需要 ID。但我不希望用户看到这些。
我现在制作卡片的方式对我来说也很奇怪。我首先需要为卡片添加一个对话框,然后在调用stepContext.PromptAsync
时,我还需要将卡片作为附件提供。对我来说感觉重复,但删除任何一个步骤都会失败。正常的样式提示对我不起作用,因为它不处理键/值,而只是处理字符串(参见数字 3)。
好的,这些是我正在努力解决的一些问题。我到了那里,它现在有效,但正如我所说,我无法摆脱我做得不对的感觉。如果有人能对此有所启发,将不胜感激。
【问题讨论】:
仅提出一个问题可能有点多,而且种类繁多,您能否将其归结为您想要回答的一个特定问题并将其分解为多个问题?真的很难这样回答,所以对每个人都有帮助。 【参考方案1】:是的,版本之间有很多变化。你真的是说v1?! ? 还是 v3?
添加对话框的方式,主要是添加提示以检索答案的需求令人困惑。我明白了,但不是真的 内部运作。例如:我现在有以 相应对话步骤的方法名称相同,是 它应该如何工作?似乎有一些魔术代码链接 按照惯例,一切都在一起?这将更有意义 当瀑布步骤也包含提示时,我会发现。
基本上。瀑布数组中列出的步骤是您创建的方法名称的名称。基本上,这是您给出机器人应该完成的步骤的顺序。提示是用于检索数据的类,并使用AddDialog()
填充到(“主”)对话框中,并以唯一名称存储在对话框状态中,以便可以正确检索它们。我明白您的观点,即在一个“调用”或声明中设置所有内容可能很简单,并且可能有其他方法可以实现这一点;但这就是我们得到的。
向对话框提供信息以便跳过步骤的正确方法是什么?我在主对话框中设置了 LUIS 意图 然后打开此对话框进行小时预订。假设我的用户说“我愿意 想在客户 X 上预订 8 小时”,我希望对话 将金额预填充为 8,将客户预填充为 X。
通常,步骤使用前面的步骤值来回复、执行或继续。在简单的场景中,可以通过检查这些值的状态来跳过步骤。在multiturn sample 中,如果用户不想提供他们的年龄,它会继续下一步,然后检查值并跳过该步骤(它真的不会跳过它,它报告没有给出年龄,但你可以继续没有任何回复)。假设事情的 LUIS 方面是正确的并获得正确的意图 + 实体(比如说“预订”意图和实体 [“时间”和“客户”]),那么这应该是可行的。您将为这两个实体填充状态信息,然后后面的步骤(例如提示客户步骤)将跳过/绕过。
但是,您真正想做的是查看自适应对话框。它们是新的,使这种类型的场景更加动态和灵活。看这里:
https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-adaptive-dialog-introduction?view=azure-bot-service-4.0 https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-dialogs-adaptive?view=azure-bot-service-4.0&tabs=csharp https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/csharp_dotnetcore/adaptive-dialog客户/项目解决在这里可能是一个不那么标准的要求。这些来自第三方应用程序,已检索 通过 API/SDK。所以根据登录用户我需要出去 该应用程序并检索该用户的数据。这回来了 在键/值对中,其中键是 GUID。显然我不想 用户输入 GUID,所以我创建了这些操作按钮 客户的姓名,但要在下一步中获取 ID 值 它现在在聊天中“写入”GUID 而不是客户名称。 使用这个名字很棘手,因为我不能完全依赖那些是独一无二的。
我不是 100% 确定这部分。让我调查一下,然后回复你。
另外,为了选择项目,我需要客户 GUID 并保存 最后的条目我还需要ID。但我不希望用户看到 那些。
State (conversation|user|etc) 是管理这个的好地方。
我现在制作卡片的方式对我来说也很奇怪。我首先需要为卡片添加一个对话框,然后在调用时 stepContext.PromptAsync 我需要将卡片作为附件提供为 好吧。对我来说感觉重复,但删除任何一个步骤都会结束 在失败中。正常的样式提示对我不起作用 不处理键/值,只处理字符串(见数字 3)。
不,这是正确的。我知道这感觉很奇怪,但这就是这样做的方式。基本上,除了简单文本之外的任何内容都将是附件。卡片是 JSON,因此是一个附件,您需要将其发送给用户/客户端。
你做的都是正确的。再次;我建议查看自适应对话框,因为这是较新的技术和前进的方向。然而在其他方面;你走在正确的道路上!
【讨论】:
非常感谢@DanaV!有一些确认是好的。与此同时,我也转向了自适应对话框。这又是一次反复试验的旅程,但我确实设法让工作正常进行。对于客户/项目解决方案,我最终使用了自定义输入对话框。也就是说,我仍然不时发现一些令人困惑的事情,并且在我看来,样本/文档还有很多需要改进的地方。能够在某个时候与产品团队讨论这个问题会很棒。恕我直言,该框架的复杂性将阻碍该框架的采用。以上是关于需要一些关于如何正确使用机器人框架 SDK 的指导的主要内容,如果未能解决你的问题,请参考以下文章