记忆 TTL 批处理

wesgine 记忆系统按 Kind 分配生存时间(TTL),并进行批量回收。


TTL 分配

不同 Kind 的记忆条目有不同的默认 TTL:

Kind典型 TTL说明
constraint无 TTL(GC 豁免)用户显式设定的约束
instruction无 TTL(GC 豁免)用户显式指令
environment无 TTL(GC 豁免)宿主环境事实
fact较长持久事实
preference较长个人偏好
correction中等行为纠正
lesson中等经验教训
context较短会话摘要
episodic较短情景片段
collective较长部门共识

具体值由 DefaultMemoryConfig().TTL 映射。


批处理回收

GC 定期扫描超过 TTL 的条目:

  1. 按 Kind 分组查询过期条目
  2. 每批回收固定数量(gcTTLBatch)
  3. 单次只回收一批——剩余留给下一轮

为什么不一次全清? 节流。TTL 回收的条目不会被再访问一次,所以分批不影响正确性,但避免了一次性大量删除对数据库的冲击。


与 retentionScore 的区别

机制触发条件回收策略
TTL 批处理条目超过固定时间按 Kind 固定期限
retentionScore条目总数超过配额按综合评分淘汰

两者独立运行,TTL 是硬期限(到期必删),retentionScore 是软排名(超额才删)。


GC 豁免

三种 Kind 永不被 GC 删除:

但它们仍计入配额——豁免只豁免删除,不豁免计数。


Digest 触发

GC 还会按间隔触发 Digest:

type GCConfig struct {
    DigestInterval time.Duration
}

Digest 执行语义去重、冲突检测、陈旧标记、取代检测、晋升等认知级清理。


相关文档