【问题标题】:Confusion in state saving methods available in MS Bot frameworkMS Bot 框架中可用的状态保存方法的混淆
【发布时间】:2018-05-27 07:13:24
【问题描述】:

我正在使用 Node.JS 中的 MS Bot 框架开发一个机器人。我正在阅读有关保存/检索与机器人的用户对话状态的各种方法的文档。

据我了解,对于每个机器人,每个用户都是不同的对话。例如我有 2 个机器人,BOT-A 和 BOT-B。拥有 Skype ID abc.skype 的用户可以访问这些机器人。将使用每个机器人的不同对话 ID 和用户 ID 来识别此用户。 IE。对于 BOT-A,用户的对话 ID 将为“ABC”,而对于 BOT-B,对话 ID 将为“XYZ”。会话对象中的 userID 字段将保存可以识别用户的数据,例如用户在频道中公开可见的名称。

根据文档 (saving-state)

userData 为用户在所有对话中全局存储信息。

  1. 这里的全局是什么意思?
  2. 所有对话中的含义是什么?

conversationData 为单个对话全局存储信息。此数据对对话中的每个人都是可见的,因此在将数据存储到此属性时要小心谨慎。它默认启用,您可以使用机器人的 persistConversationData 设置禁用它。

  1. 单次对话是什么意思?
  2. 每个人都可以看到哪些数据?数据如何可见 每个人,当由机器人决定时,发送什么响应 回复或每个用户的消息?每个人都是谁?

privateConversationData 为单个对话全局存储信息,但它是特定于当前用户的私有数据。此数据跨越所有对话,因此对于存储您希望在对话结束时清理的临时状态很有用。

dialogData 保留单个对话实例的信息。这对于在对话中的瀑布步骤之间存储临时信息至关重要。

保存状态的实际存储机制/位置是什么?我的意思是,如果我在session.userData 中保存一些数据并在一周后为同一个用户访问它,我怎么会得到相同的数据。数据实际保存在哪里?

如果我将 persistUserDatapersistConversationData 设置为 false 会发生什么?这是否意味着 userData 和 conversationData 不会被持久化。如果是,那么它本质上意味着我无法保存数据。不是吗?或者这意味着什么不同?

任何人都可以分享任何有多个用户在同一个覆盖范围内的例子吗? 或者一个演示这些不同数据保存方法的功能(优点和缺点)的示例。

我参考的资源:

https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-state

【问题讨论】:

    标签: node.js botframework


    【解决方案1】:

    我理解这些概念的混合,当您没有尝试过多个频道并查看所有消息字段时,这有点难以管理!

    关于你最初陈述的几点:

    将使用不同的会话 ID 和用户 ID 识别此用户 每个机器人

    这并不完全正确:

    • UserId:对于某些频道,不同机器人的 userId 可以相同,例如 SMS,其中 userId 是 phoneNumber。对于其他人来说,它在 Messenger 等机器人之间发生了变化,其中 userId 是一个页面范围的 ID。
    • ConversationId:是的,您不能在 2 个单独的机器人中为 2 个用户使用相同的 conversationId。但是,在某些频道中,同一用户也会有多个 conversationId。 在某些聊天机器人可以参与群组对话的频道中,每个用户的 conversationId 都是相同的。

    会话对象中的用户ID字段将保存可以识别的数据 用户,例如用户在频道中公开可见的名称。

    这是User 字段,包含Id(用户密钥)和Name(公开可见的名称)。


    那么对于你的问题:

    userData 在全球范围内为用户存储所有信息 对话。

    userData 在所有对话之间是一致的……对于一个频道,特定的 UserId!这不是跨渠道,因为没有跨渠道的ID


    conversationData 全局存储单个信息 对话。对话中的每个人都可以看到此数据 因此,在将数据存储到此属性时要小心谨慎。它已启用 默认情况下,您可以使用机器人的 persistConversationData 设置。

    正如我所说,在某些频道中,机器人可以处于群组对话中,因此每个用户的 conversationId 都是相同的,并且对话中的信息对于对话中的每个用户来说都是相同的

    如果您想在此对话中保留有关特定用户的信息,请使用 privateConversationData(或 userData,如果必须在此对话中保留更多信息)。

    我认为文档非常清楚地说明了在哪里做什么:

    这四个属性对应四个数据存储容器 可用于存储数据。您使用哪些属性来存储数据 将取决于您存储的数据的适当范围, 您要存储的数据的性质,以及您希望保存多长时间 要持久化的数据。例如,如果您需要存储将 可以在多个对话中使用,请考虑使用 用户数据属性。如果需要临时存储局部变量 对话框范围内的值,请考虑使用 dialogData 财产。如果您需要临时存储必须存储的数据 可跨多个对话框访问,请考虑使用 对话数据属性。


    保存状态的实际存储机制/位置是什么?以此我 意味着如果我在 session.userData 中保存一些数据并在之后访问它 同一个用户一周,我怎么得到相同的数据。哪里是 实际保存的数据?

    如果你在同一个频道并获得相同的 userId,你会得到相同的数据。

    提供了一个用于测试的存储(托管在 Bot 连接器中?),但它不是为生产而设计的,并且已被弃用。对于数据的位置,你必须使用 CosmosDB 或 TableStorage 实现自己的存储:https://docs.microsoft.com/en-us/bot-framework/nodejs/bot-builder-nodejs-state


    如果我将 persistUserData 和 persistConversationData 设置为 错误的?这是否意味着 userData 和 conversationData 不会 坚持。

    是的,在对话结束时不保留。

    如果是,则本质上意味着我无法保存数据。 不是吗?或者这意味着什么不同?

    不,这意味着您将无法在对话后再次获取此数据,仅此而已。


    任何人都可以分享任何有多个用户的例子吗? 对话?或者一个展示能力的例子(优点和 各种数据保存方法的缺点。

    => 以 Slack 频道为例,将机器人部署在“频道”中(而不是在私人 DM 中与机器人交谈)!

    您会看到 ConversationId 看起来像 Bxxxxxxxx:Txxxxxxxx:Cxxxxxxxx 其中 Bxxxxxxxx 是您的机器人的 Slack 的 ID,Txxxxxxxx 是您的 Slack 的团队 ID,Cxxxxxxxx 是您当前的频道 Slack 的 ID

    当我查看活动字段时,我的一项测试中的示例:

    • Conversation.Id= Bxxxxxxxx:Txxxxxxxx:Cxxxxxxxx,
    • Conversation.Name=general,(我使用机器人的 Slack 频道的名称)
    • From.Id= Uxxxxxxxx:Txxxxxxxx,(我的 Slack 的用户 ID)
    • From.Name= nicolas,(我的 Slack 的用户名)
    • Recipient.Id= Bxxxxxxxx:Txxxxxxxx,(我的机器人的 Slack 的 ID)
    • Recipient.Name= myBotName(我的机器人的 Slack 名称)

    【讨论】:

      【解决方案2】:

      我有一个这样的寻呼机模块。

      var Paginator = function (items, limitItems) {
          this.currentPage = 1;
          this.nextPage = this.currentPage + 1;
          this.totalPage = Math.ceil(items.length / limitItems);
          this.count = 0;
          this.delimiter = this.count + limitItems;
          this.limitItems = limitItems;
      }
      Paginator.prototype.getItems = function (items) {
      // My code
      }
      module.exports = Paginator;
      

      我将寻呼机存储在 session.dialogData.paginator 中。 从理论上讲,该区域在瀑布的下一步中应该保持不变,但事实并非如此。 通过 builder.Prompts.confirm 后 Paginator.prototype.getItems 方法丢失。 当说明 session.dialogData 保留在对话框中时,我得出的结论是文档不正确。

      那么,这类信息会在哪里? 谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        相关资源
        最近更新 更多