如果用户在获得响应之前发布下一个问题,则需要向用户发送通知

问题描述 投票:0回答:1

我已经开发了一个机器人,它正在使用中。有时,bot需要花费更多时间来响应查询。那时,用户连续发布3到4个问题。

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

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

c# botframework bots direct-line-botframework
1个回答
0
投票

快速连续获取多条消息可能是个问题,而且很难知道您的机器人应该如何处理。假设您有一个瀑布对话框,显示一个确认提示,例如“您对此满意吗?”在步骤1上,用户在两条不同的消息中说两次“是”,然后您的机器人会同时进行处理。会发生什么?好,有两种可能性:

  1. 如果两个线程都在其中一个保存了bot状态之前加载了bot状态,则它们将以相同的方式处理转弯并两次处理步骤2。这意味着第2步中出现的任何提示,例如“好,您还需要其他吗?”。将显示两次。僵尸程序的状态在两个线程中都相同,因此在它们都保存了僵尸程序状态后,僵尸程序仍将处于第2步。这并不是很糟糕,因为用户可以直观地响应提示并继续进行3。
  2. [如果第一个线程处理步骤2的速度如此之快,以至于在第二个线程加载bot状态之前它保存了bot状态,那么第二个线程将用户的第二个“是”视为对步骤2的答复,而不是对步骤1的答复。如果步骤2出现另一个确认提示,例如“好,您还需要其他吗?”然后第二个“是”将被视为对步骤2的确认提示的回答,而不是对步骤1的确认提示的回答,然后该漫游器将显示步骤3。如果用户不想对第二个说“是”,则可能很糟糕。提示,但是使用良好的导航选项可以缓解该问题。或者,如果第2步有其他提示,例如选择提示,并且不能将“ yes”识别为选项,则第二个线程将仅显示重试提示,而bot将保留在第2步。还不错,因为用户随后将有机会正确响应提示。

如评论中所见,在解决这个问题时有许多途径可以探索。我现在要说的是[[推荐的解决方案是让问题独自解决,让机器人自行运行。这是因为通常这不是一个值得担心的大问题,并且用户会很快理解它们需要放慢速度并一次输入一条消息。如果必须解决该问题,那么您已经看到注释中提到的几种可能的解决方案,其中包括客户端解决方案和机器人端解决方案。我现在将重点放在机器人端解决方案上,因为您说的就是这些。选项1:发送打字指示符

[许多频道都有一个指示器,使用户知道有人在打字。 Bot Framework机器人可以使用“键入”活动类型来模拟这种情况。有a middleware that handles this for you,它内置在Bot Builder SDK中。您可以查看其源代码,以了解如何手动发送打字活动。

选项2:发送抢先消息

[如果您知道该机器人将花费一些时间来处理用户的消息,则可以在该机器人进行冗长的处理之前,继续向用户发送消息。这将使用户知道在得到真正的响应之前,他们不应该再向机器人发送任何消息。它的作用与选项1相同,可以与选项1结合使用,以使其具有更大的动感。

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

不建议使用此选项,但这是您最初要求的。为了使bot知道它当前正在不同线程中处理来自用户的消息,第一个线程将需要以bot状态保存某些内容,以向第二个线程指示该bot正在处理消息。这是混乱且复杂的,并且容易出错,并且您将需要担心所有通常的多线程问题,例如竞争条件和死锁。它必须像这样:

    [bot开始处理消息时,它会从其bot状态(即会话状态或用户状态或其他状态)中读取特殊属性。该属性可以充当信号量,当bot对其进行写操作时从0到1递增,或者可以充当正常的锁,其正确与否取决于机器人是否在该会话中处理消息。这可能会在某些自定义中间件甚至自定义适配器中发生。
  1. 如果漫游器读取了该属性,并且指示此刻该会话中没有其他线程正在处理任何消息,则漫游器需要立即更改该属性并将其写入存储。这是竞争条件发挥作用的地方,因为两个线程可以在它们中的任何一个写入值之前尝试读取该值,然后他们都认为应该继续进行。您必须测试状态存储,以确保它可以充分锁定每个对话的条目,以防止这种情况发生。
    1. 然后,机器人将照常处理转弯。
  2. 机器人必须确保将特殊属性更改回处理完成之前的状态,因此它可以在下一回合再次处理消息。这真的很重要,因此您也应该在适配器的错误处理程序中进行此操作。即使那样,该属性也有可能不会变回原来的状态,这会破坏您的机器人。您可能想提出一些方法,使它在一段时间后自动恢复。
  • [如果漫游器读取了该属性,并且它指示另一个线程正在处理一条消息,那么它将向用户发送“请稍等,还在寻找答案的消息。并结束转弯。
  • 另请参阅this troubleshooting doc
  • © www.soinside.com 2019 - 2024. All rights reserved.