记忆 Lazy Recall 机制
Lazy Recall 是 wesgine 三层记忆自动注入中的第二层——在每轮对话时,根据当前轮用户消息的语义相关性动态召回记忆。
三层注入概览
| 层 | 时机 | 内容 |
|---|---|---|
| Eager(系统提示词) | 会话开始 | Constraint / Instruction / Environment 等高优先级条目 |
| Lazy(当轮叠加) | 每轮对话 | 语义搜索命中的相关记忆 |
| Cold-start(跨会话) | 新会话首轮 | 上一次会话的摘要/上下文 |
Lazy Recall 工作流
用户消息 "帮我用 vim 键位配置编辑器"
↓
BuildLazyRecall(actor, query, sessionID)
↓
语义搜索(embedding 相似度)
↓
候选列表 → EntryVisible(actor) 过滤
↓
RecallQualityOK 过滤(排除 stale / conflicted)
↓
LazyCarriesRow 过滤(Kind 白名单)
↓
Hybrid Ranking(BM25 + 向量相似度)
↓
注入到用户消息之后,LLM 调用之前
Hybrid Ranking
Lazy Recall 使用混合排序策略:
- BM25 文本匹配:基于关键词重叠度
- 向量语义相似度:基于 embedding 距离
- 召回频率加权:
accessed_at近且recall_count高的条目排序靠前
同义词零字面重叠的情况(如"vim 键位"对查询"配置编辑器")通过向量语义相似度覆盖。
LazyCarriesRow 白名单
Lazy 层携带的 Kind 子集:
| 携带 | 不携带 |
|---|---|
fact、preference、correction、convention、lesson、collective | constraint、instruction(已在 Eager 层) |
environment(已在 Eager 层) | |
context、episodic(会话级,由 Cold-start 或显式搜索处理) |
与 TouchAccessed 的联动
被 Lazy Recall 选中注入的条目会通过 TouchRecalledFn 更新 accessed_at 和 recall_count:
accessed_at更新为当前时间recall_count += 1
这形成正反馈飞轮:被召回的记忆更容易在未来被召回,而长期未被召回的记忆逐渐被 GC 淘汰。
不变量
INV-MEM-50:Lazy 层的三个 arm 都必须经过 RecallQualityOK 质量门控。
INV-MEM-29:30+ 天零召回的 L4 条目被标记 stale,从全部自动注入面排除。
相关文档
- 记忆自动注入 →
memory-auto-injection.md - 上下文叠加管线 →
context-overlay-pipeline.md - 记忆召回质量门 →
memory-recall-quality.md - 记忆 GC →
memory-gc.md