Rasa 2.5.0:如何用max_event_history避免拉取大量数据库记录?
Rasa 2.5.0 大用户事件记录导致内存过高的解决方案及max_event_history配置验证
问题背景
生产环境基于Rasa 2.5.0运行超1年,采用MariaDB作为存储数据库。部分用户(sender_id)的事件记录数已超400万条,近期应用内存占用突破10GB,推测是这类用户与系统交互时,全量加载所有历史事件到内存导致。
当前Tracker Store配置
tracker_store = SQLTrackerStore(domain=domain, dialect="mysql", host=self.tracker_store_host, port=self.tracker_store_port, db=self.tracker_store_db, username=self.tracker_store_user, password=self.tracker_store_password)
疑问解答:动态设置max_event_history是否有效?
在Rasa 2.5.0版本中,这种动态赋值的方式是有效的,但更推荐初始化时直接配置,同时需要注意以下细节:
核心作用说明
max_event_history用于限制Tracker加载的历史事件数量,设置为100后,系统只会加载每个sender_id最新的100条事件到内存,旧事件不会被加载,直接解决全量加载导致的内存占用过高问题。
关键注意事项
- 该配置是全局生效的,对所有sender_id的Tracker都会应用这个限制,无法单独针对特定用户配置。
- 已加载到内存中的Tracker不会立即生效,需要重启服务,或等待该用户的Tracker被重新加载(比如服务重启后用户再次发起交互)。
- 数据库中的旧事件不会被自动删除,只是加载时不读取。如果需要减少数据库存储压力,需手动编写脚本清理MariaDB中
events表的历史数据(保留每个sender_id最新的N条)。
更规范的配置方式
建议在初始化SQLTrackerStore时直接传入参数,避免后续赋值可能带来的潜在问题:
tracker_store = SQLTrackerStore( domain=domain, dialect="mysql", host=self.tracker_store_host, port=self.tracker_store_port, db=self.tracker_store_db, username=self.tracker_store_user, password=self.tracker_store_password, max_event_history=100 # 直接在初始化时配置 )
额外优化建议
- 定期清理数据库旧事件:编写定时任务,针对每个sender_id保留最新的100条事件,删除更早的记录,避免数据库持续膨胀。
- 监控调整数值:设置后观察高记录用户交互时的内存变化,根据业务逻辑需求调整
max_event_history的数值(比如业务需要更多历史上下文,可适当调高到200条)。
内容的提问来源于stack exchange,提问作者Swastik
相关产品推荐
相关产品推荐

