上下文 Overlay 管线
wesgine 上下文组装中的三层 Overlay 注入机制。
三层 Overlay
| 层 | 名称 | 注入位置 | 触发条件 |
|---|---|---|---|
| Eager | 系统提示词索引 | System Prompt | 每轮 |
| Lazy | 当轮 Overlay | 用户消息后 | 当轮相关 |
| Cold-start | 跨会话摘要重放 | 用户消息副本 | 新会话首轮 |
Eager 注入(5 个 arm)
在系统提示词中注入的五个数据源:
| arm | 内容 | 来源 |
|---|---|---|
| 1 | Environment 条目 | L1 环境信息 |
| 2 | Constraint/Instruction | 用户约束和指令 |
| 3 | Agent Shared 条目 | Agent 共享命名空间 |
| 4 | Agent Constraint | Agent 特有约束 |
| 5 | Collective 条目 | 部门共识(L2) |
每个 arm 使用 EagerCarriesRow + ActorVisible 判断是否携带。
Lazy 注入(3 个 arm)
在当轮上下文中注入的三个数据源:
| arm | 内容 | 来源 |
|---|---|---|
| 1 | 相关偏好 | about_me 语义匹配 |
| 2 | Agent 记忆 | Agent 命名空间相关条目 |
| 3 | Convention | 项目惯例 |
每个 arm 使用 LazyCarriesRow + EntryVisible 判断。
Cold-start 注入(1 个 arm)
新会话首轮注入的跨会话摘要:
| arm | 内容 | 条件 |
|---|---|---|
| 1 | 前次会话摘要 | CrossSessionDays > 0 且未过期 |
使用 ColdStartCarriesRow + ActorVisible 判断。
质量门控
所有 arm 共用 RecallQualityOK 单点(INV-MEM-50):
Conflicted = true→ 排除stale = true(30+ 天零召回) → 排除- GC 豁免条目对此门惰性
func RecallQualityOK(entry MemoryEntry) bool {
if entry.Conflicted {
return false
}
if entry.Stale {
return false
}
return true
}
显式搜索不受此门约束
memory(search) 回答"我存过什么"——对指名索取者隐藏被取代的行是把错答换成缺答。
记忆中心必须显示冲突,否则无人能解决冲突。
arm 数量契约(INV-MEM-50)
arm 数写死在契约里:三处、共 9 个 arm。
- Eager:5 个
- Lazy:3 个
- Cold-start:1 个
每个漏掉的 arm 都对应一个"那条记忆静默不出现"的用户症状。
Validate 的三面对齐
Store.Validate(entryID) 必须预测三面之 OR:
accessible = EagerCarriesRow(e) || LazyCarriesRow(e) || ColdStartCarriesRow(e)
recallable = accessible && RecallQualityOK(e) && storeVisibleConditions(e)
Validate 与三面的谓词必须成对——手写镜像是漂移的标准入口。
相关不变量
- INV-MEM-50:自动注入面的判据成对
- INV-MEM-29:stale 从全部自动注入面排除
- INV-MEM-30:Conflicted 从全部自动注入面排除
相关文档
- 记忆自动注入 →
memory-auto-injection.md - 记忆召回质量 →
memory-recall-quality.md - 记忆可召回验证 →
memory-validate.md - 上下文管理 →
context-management.md