【问题标题】:Questions about saving bot state关于保存机器人状态的问题
【发布时间】:2018-04-03 20:53:21
【问题描述】:

我阅读了关于保存状态数据的https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-state。我对此有一些疑问:- 让我们以通过浏览器通道暴露的机器人为例:-

  1. 所存储数据的生命周期是多久?例如,当机器人使用 context.ConversationData.SetValue(..) 保存数据时,会话结束时(用户刷新页面时)是否清除数据?

  2. 来自 Activity 的 From 对象具有 Id 和 Name。这些是每次聊天会话开始时由频道生成的吗?例如,如果我在与 bot 聊天然后刷新网页,现在我的 Id 和 Name 会改变吗?

  3. 关于对话的同样问题。如果我刷新页面并再次开始对话,我是否会获得新的对话 ID?
  4. 我在一些博客中读到,如果您使用对话框,对话框堆栈状态会自动保存在您配置的任何存储中。这个对吗?如果是这样,为什么?假设我刷新页面,我是否能够检索对话框堆栈的状态并从那里恢复对话?

如果您要提供代码示例,请尽可能要求您提供 C# 示例

提前非常感谢!

【问题讨论】:

    标签: botframework


    【解决方案1】:

    您好,希望下面的回答对您有用:

    1.

    存储的数据的生命周期是多久?例如当机器人使用 context.ConversationData.SetValue(..) 保存数据时是数据 会话结束时清除(当用户刷新页面时)?

    回答:->

    根据 Bot Framework 的指南,State API 处于折旧状态。您必须使用自己的状态管理服务来维护 Bot 的状态。参考:https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-state

    因此,假设您在这种情况下使用表存储或 SQL 数据库来存储您的机器人,只要您的存储帐户和数据库可用,数据就会一直存在。

    2.

    来自 Activity 的 From 对象有 Id 和 Name。这些是否生成 每次聊天会话开始时按频道?例如,如果我 正在与机器人聊天,然后刷新网页,现在我的 ID 和 名字改了?

    回答:->

    这取决于您如何初始化聊天。例如,如果您正在使用

    • 网络聊天:ID 为空。
    • Skype:它将是 Skype id 和用户名
    • DirectLine :您可以根据需要定义自己的 id 和 name。

    3.

    关于对话的同样问题。如果我刷新页面并再次开始对话,我会获得新的对话 ID 吗?

    回答:->

    是的。每次刷新网页时,都会为您分配新的对话 ID,但在 DirectLine 的情况下,您可以使用之前的对话 ID 来维护对话的历史记录。您可以将对话 ID 存储在本地存储或浏览器的 cookie 中,并在您想加载聊天历史记录时阅读。如果您不需要保留历史记录,那么我建议让网络频道处理自己的 id。

    4.

    我在一些博客中读到,如果您使用对话框,对话框堆栈状态会自动保存在您配置的任何存储中。这是正确的吗?

    回答:-> 是的。

    5.

    如果是这样,为什么?假设我刷新页面,我是否能够检索对话框堆栈的状态并从那里恢复对话?

    回答:->

    如前所述,您需要迁移您的机器人以使用 DirectLine API 而不是网络聊天频道。由于网络聊天不支持历史记录,所以 DirectLine。

    请参阅 Microsoft 提供的指南和 GitHub 上提供的示例。 https://docs.microsoft.com/en-us/azure/bot-service/rest-api/bot-framework-rest-direct-line-3-0-concepts

    【讨论】:

    • @user3740951,Grad,你觉得我的回答很有用。
    • 感谢您抽出时间回答我的问题!跟进第一个答案。关于已弃用的 State Service API,我对可以使用哪些 API 以及不能使用哪些 API 感到有些困惑:- 1. 我可以使用 StateClient 吗? 2. stateClient.BotState.DeleteStateForUser(), GetUserData(), SetUserData(), GetConversationData() 3. stateClient.BotState.GetUserDataAsync() 4. IDialogContext.UserData.GetValue()
    • 是的。 BotFramework beta 提供免费的状态管理,包括存储空间。所以现在已弃用,这意味着您需要处理的只是存储机器人数据的方式。
    • 好的。所以上述所有 API 都已弃用,而对于我来说要处理 Bot 数据,我需要编写自己的代码来连接到一些 DB 并在其中写入数据。
    • 正确 - 上面列出的所有 API 都将无法使用。但您不需要编写自己的方法。现在,您需要提供有关将存储状态数据的 DB/Storage 帐户的信息。同样,使用 Application_Start : UpdateContainer 方法可以轻松完成。您可以使用 context.UserData 或 context.ConversationData 访问状态数据。
    【解决方案2】:

    快速回答:

    1. 据我所知,没有清除。您可以检查 Azure DocumentDbBotDataStoreTableBotDataStore here 的实现。根据我的实现,我看到存储的数据中有一个 Timestamp 列,因此您可以根据它进行清理。

    2. IdName 字段的生成(对于From,但也适用于Recipient,给定消息来源/目的地):是的,它们取决于通道。我对SO做了详细的回答:Bot Framework User Identification

    3. 在网络聊天中是的

    4. 是的,对话堆栈状态已保存,以便您可以继续对话。 “假设我刷新页面,我是否能够检索对话框堆栈的状态并从那里恢复对话?”:如果您有相同的详细信息(channelId + conversationId,userId),您应该可以。例外是 webchat / directLine,您必须在其中实现保持相同 ID 的事实。对于其他渠道,如 Slack、Facebook Messenger 等,这些项目保持不变,对话可以在之前的消息交换停止的地方继续

    【讨论】:

    • 感谢您的回答!这是否意味着我们必须自己定期从存储中清除旧条目?
    • 可能会更好,但这取决于您的业务案例
    猜你喜欢
    • 2023-02-03
    • 2021-04-03
    • 1970-01-01
    • 2019-09-11
    • 2022-01-16
    • 1970-01-01
    • 2018-03-27
    • 2021-09-13
    • 1970-01-01
    相关资源
    最近更新 更多