记忆 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 的条目:
- 按 Kind 分组查询过期条目
- 每批回收固定数量(
gcTTLBatch) - 单次只回收一批——剩余留给下一轮
为什么不一次全清? 节流。TTL 回收的条目不会被再访问一次,所以分批不影响正确性,但避免了一次性大量删除对数据库的冲击。
与 retentionScore 的区别
| 机制 | 触发条件 | 回收策略 |
|---|---|---|
| TTL 批处理 | 条目超过固定时间 | 按 Kind 固定期限 |
| retentionScore | 条目总数超过配额 | 按综合评分淘汰 |
两者独立运行,TTL 是硬期限(到期必删),retentionScore 是软排名(超额才删)。
GC 豁免
三种 Kind 永不被 GC 删除:
KindConstraint:用户约束KindInstruction:用户指令KindEnvironment:宿主环境
但它们仍计入配额——豁免只豁免删除,不豁免计数。
Digest 触发
GC 还会按间隔触发 Digest:
type GCConfig struct {
DigestInterval time.Duration
}
Digest 执行语义去重、冲突检测、陈旧标记、取代检测、晋升等认知级清理。
相关文档
- 记忆 GC 详情 →
memory-gc-details.md - 记忆 GC 配额联动 →
memory-gc-quota.md - 记忆 Digest 压缩 →
memory-digest.md - 记忆召回质量门 →
memory-recall-quality.md