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";
}
查看合集
参考
https://forum.rasa.com/t/rasa-user-session-management/1931
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式