对话机器人 Rasa(十二):用户会话 Session 管理

发布时间: 2023-07-03 20:51:54 作者: 大象笔记

Rasa 可以管理用户 session,每个 session 由 conversation_id 唯一标识。

当你从 web 聊天组件或者 telegram app, fackbook messager 等不同的 channel 向 rasa webhook 发送一条消息时, 你所指定的 sender_id 即被转换为 conversation_id, 然后传递给 Rasa Core。

注意,默认情况下,Rasa session 是存储在内存中,即一旦你关闭 rasa 服务,session 就会丢失。 可以通过将对话信息存储到数据库来解决这个问题,例如,MongoTrackerStore, RedisTrackerStore 等。

实际问题

这也就解释了为何我在调试 ChatUI 跟 Rasa Webhook 通信时,一旦出现消息缓存问题,重启 Rasa 服务就能解决。

也给了我很好的跟进 slot 被提前填充的诡异问题的线索,大概率就是 session 及 slot from text 的问题。

合理的 session 逻辑

这个需要分场景:

第一种场景: 对于公用的柜台机,例如餐馆聊天点餐机器人、银行客服柜台机,这种每次会话对应的大概率是不同的客户,所以比较合理的方式是,每次会话发起时,随机一个 session id,即 sender_id,可以使用 uuid 来实现。会话结束时,将 sender_id 清空。以此来规避上一个用户,与下一个用户,信息串了。

第二种场景: 但是对于当前流行的 ChatGPT 这样的应用,或者日常办公助手,都是和同一个用户交互的场景,这种情况 session id 就需要跟用户 id 相关联。这样长期调教的 ChatGPT 会更懂你,体验也更好。

rasa sender id 的格式

在 Rasa 框架中,每个用户都有一个独特的 sender id,用于跟踪每个用户的会话状态。sender id 的格式可以是字符串、整数或其他类型,但必须是唯一的,并且可以用来区分每个用户的会话。

通常情况下,sender id 的格式可以是任何字符串,例如用户的用户名、电子邮件地址、手机号码等。在 Rasa 对话管理器中,sender id 的格式通常是包含两个组成部分的字符串,分别是用户 ID 和渠道 ID。例如:

sender_id = "user1234_channel1"

在上面的例子中,"user1234" 是用户 ID,"channel1" 是渠道 ID。这种格式的 sender id 可以用于跟踪具有相同用户 ID 但来自不同渠道的用户的会话状态。

对于每次都使用不同 sender id 场景,可以尝试生成一个类似 uuid 的值,例如,毫秒时间戳+随机数

function generateSenderId() {
  let timestamp = Date.now();
  let randomSuffix = Math.floor(Math.random() * 10000); // 0-9999 
  return timestamp + "_" + randomSuffix.toString().padStart(4, "0") + "_web";
}

查看合集

📖 对话机器人 Rasa 中文系列教程

参考

https://forum.rasa.com/t/rasa-user-session-management/1931

我是一名山东烟台的开发者,联系作者