如果用户 post 下一个问题,则需要在得到回复前向用户发送通知

Need to Send notifications to user if they post next question before getting response

我开发了一个机器人,并且正在使用中。有时机器人会花更多时间来响应查询。 当时用户连续发了3到4个问题。

是否有任何选项,如果用户在回答之前发布下一个问题,我们必须给出类似“请稍等,我仍在寻找答案”的消息。

我正在使用 Azure 机器人和 Directline 频道。

快速连续获取多条消息可能是个问题,而且很难知道您的机器人应该如何处理它。假设您有一个瀑布对话框,在步骤 1 中显示类似 "Are you satisfied with this?" 的确认提示,并且用户在您的机器人随后同时处理的两条不同消息中说了两次 "yes"。会发生什么?那么有两种可能:

  1. 如果两个线程都在保存机器人状态之前加载了机器人状态,那么它们将以相同的方式处理回合并处理步骤 2 两次。这意味着第 2 步中的任何提示,如 "Okay, do you need anything else?" 都会显示两次。两个线程中的机器人状态将相同,因此在它们都保存机器人状态后,机器人仍将处于第 2 步。这还不错,因为用户可以直观地响应提示并继续下一步3.
  2. 如果第一个线程处理步骤 2 的速度如此之快以至于它在第二个线程加载机器人状态之前保存了机器人状态,那么第二个线程将把用户的第二个 "yes" 视为对步骤 2 的回复第 1 步的。因此,如果第 2 步有另一个确认提示,如 "Okay, do you need anything else?",则第二个 "yes" 将被视为对第 2 步确认提示的回答,而不是第 1 步的确认提示,然后机器人将显示第 3 步。如果用户不想对第二个提示说“是”,这可能会很糟糕,但可以通过良好的导航选项来缓解这个问题。或者,如果第 2 步有一些其他类型的提示,例如选择提示,并且它无法将 "yes" 识别为选项,则第二个线程将只显示重试提示,而机器人将停留在第 2 步。同样,这还不错,因为用户将有机会正确响应提示。

如评论中所示,在解决此问题时有许多途径可供探索。我现在要说的是,推荐的解决方案是不理会这个问题,让机器人 运行 顺其自然。 这是因为它通常不是一个大到需要担心的问题关于,用户很快就会明白他们需要放慢速度,一次输入一条消息。如果您必须解决该问题,您已经在评论中看到了几种可能的解决方案,其中包括客户端解决方案和机器人端解决方案。我现在将专注于机器人端解决方案,因为您说这就是您要寻找的全部内容。

选项 1:发送输入提示

许多频道都有一个指示器,让用户知道有人正在打字。 Bot Framework 机器人可以使用 "typing" activity 类型对此进行模拟。有 a middleware that handles this for you,它内置于 Bot Builder SDK 中。您可以查看其源代码以了解如何手动发送输入activity。

选项 2:发送抢先消息

如果您知道机器人将需要一段时间来处理用户的消息,您可以继续在机器人进行冗长的处理之前将消息发回给用户。这将让用户知道他们不应该再向机器人发送任何消息,直到他们得到真正的回应。这与选项 1 的目的相同,可以与选项 1 结合使用,使其更具魅力。

选项 3:跟踪具有机器人状态的并发线程

不推荐此选项,但它是您最初要求的。为了让机器人知道它当前正在不同线程中处理来自用户的消息,第一个线程需要在机器人状态中保存一些东西,向第二个线程指示机器人正在处理一条消息。这是混乱和复杂的并且容易失败,你需要担心所有常见的多线程问题,如竞争条件和死锁。它必须像这样:

  1. 当机器人开始处理消息时,它会从其机器人状态(即对话状态或用户状态或其他)读取特殊的 属性。这个 属性 可以作为一个信号量,当机器人写入它时从 0 计数到 1,或者它可以作为一个普通的锁,它只是 true 或 false 取决于机器人是否正在处理该对话中的消息.这可能会在某些自定义中间件甚至自定义适配器中发生。
  2. 如果机器人读取 属性 并且表明此时没有其他线程正在处理该会话中的任何消息,则机器人需要立即更改 属性 并将其写入存储.这就是竞争条件可能发挥作用的地方,因为两个线程可能会在写入值之前尝试读取该值,然后它们都认为它们应该继续。您必须测试您的状态存储以确保它可以充分锁定每个对话的条目以防止这种情况发生。
    1. 然后机器人将照常处理转弯。
    2. 机器人必须确保在完成处理后将特殊 属性 更改回之前的状态,以便它能够在下一轮再次处理消息。这非常重要,因此您还应该在适配器的错误处理程序中实现这一点。即使那样,属性 也有可能不会被改回,这会破坏您的机器人。您可能想想出一些方法让它在超时后自动变回。
  3. 如果机器人读取到 属性 并且表明另一个线程正在处理一条消息,那么它将发送您的“请稍等,我仍在寻找答案。”给用户消息并结束回合。

另见 this troubleshooting doc