![f845dcfdd33fe2e1fd9cc919682fde32.png](https://img-blog.csdnimg.cn/img_convert/f845dcfdd33fe2e1fd9cc919682fde32.png)
写在前面:本文为个人实际项目开发过程中的趟坑记录,部分细节不方便说的太细,也肯定有很多错误之处,所提供的方案大概率也不是最优解,主要是提供几种思路,欢迎大家批评指正!
背景与目的
Rasa状态日志以sender_id为key存储
利用Rasa构建对话机器人时,若使用TrackerStore记录日志,则默认以senderid(sender,conversation_id,都一样)作为key进行存储,意味着对于用户sender_id=user1,无论何时与机器人对话,其对话记录永远会更新到以user1为key的字典中。
同一用户的状态日志越积越多
表面看起来没有问题,但存在隐含风险,因为Rasa Core的机制是,每次接收到用户message,会根据sender_id召回历史日志,解析历史状态,进而预测下一步该执行的Action。Rasa对历史日志默认使用InMemoryTrackerStore,保存在内存中,所以不太影响速度,但对于实际业务场景,Rasa的历史状态日志会记录到Redis、Mongo、ES等其他存储空间中,用户的历史状态日志会越来越大,召回日志会变得越来越困难,影响系统性能。
期望能按session切分日志
所以我们期望对日志进行分隔,很直观的思路就是按照用户回复是否超时进行会话session切分,每次只召回当前session的状态日志,进入到新session时丢弃上一session的所有状态。例如用户超过60分钟未回复,则下次再回复时,分配新的session_id,并以新session_id为key记录状态日志。
要点
- 默认情况下,conversation_id就是sender_id。
- 重启session不重启conversation。
思路与方案
方案一二三都失败了,仅作为