上下文管理
概述
上下文管理是 wesgine 的核心能力之一——它决定了每次 LLM 调用时模型看到什么信息。wesgine 通过 Context Assembly(上下文组装)将系统提示词、记忆、技能指令和对话历史组合成完整的上下文,并通过压缩管线确保上下文始终在模型的窗口限制内。
Context Assembly(上下文组装)
每次 LLM 调用前,引擎执行上下文组装,按以下结构构建系统提示词:
┌─────────────────────────────────┐
│ 系统提示词 │
│ ├── 环境信息(L1) │
│ ├── 记忆注入(L2/L3/L4) │
│ ├── 技能指令(Tier E + Tier C) │
│ ├── SessionState(历史摘要) │
│ ├── 治理规则 │
│ └── Agent 配置 │
├─────────────────────────────────┤
│ 对话消息(user/assistant/tool) │
└─────────────────────────────────┘
系统提示词在会话生命周期内保持字节稳定,以利用 Provider 的 prompt cache。
三种记忆注入面
记忆通过三种方式注入到上下文中:
Eager 注入(系统提示词)
在系统提示词中直接嵌入的记忆,每轮对话都会出现:
- 约束(Constraint)和指令(Instruction)
- 环境信息(Environment)
- 部门共识(Consensus)
适合需要始终在场的关键信息。
Lazy 注入(当轮 Overlay)
根据当前对话内容动态召回的记忆,只在相关时出现:
- 用户偏好(About Me)
- 角色记忆(Agent Memory)
- 经验教训(Lesson)
通过语义搜索 + BM25 混合检索,选出与当轮对话最相关的记忆条目。
Cold-start 注入
跨会话摘要重放——将之前会话的认知结算摘要注入新会话的开头,帮助模型理解历史上下文。需要 Cell 配置 CrossSessionDays > 0 才启用。
SessionState
SessionState 是 Run 结束时认知结算(CognitiveSettlement)的产出,是下一轮上下文的唯一历史来源:
- 由主对话模型产出(不使用辅助模型)
- 包含对话摘要、关键决策、未完成任务等结构化信息
- Plan 状态是 SessionState 的子字段
引擎不从旧消息推断历史——SessionState 是唯一真相。
MidRunCompression(Run 中途压缩)
当对话消息累积超过模型窗口限制时,引擎在 Run 中途执行压缩:
- 检测当前上下文是否超过经济窗口
- 如果超过,触发 MidRunHandoff——由主模型生成中间 SessionState
- 丢弃旧消息前,通过
ExtractToolEvidence提取工具证据作为 Pinned 消息 - 用新的 SessionState 替换旧历史,继续执行
MidRunCompression 与 EndOfRunSettlement 使用相同的 SessionState schema。
CognitiveSettlement(认知结算)
Run 结束时的强制阶段:
- 主模型将本轮对话压缩为 SessionState
- 可选地产出记忆条目(memory_entries)
- SessionState 持久化到
wes_session_state表
失败处理:3 次重试 → 机械压缩 fallback(提取工具证据,不做 LLM 判断)。
Settlement 产出对用户不可见——不通过 SSE 推送到前端。
file_card(可重生资源)
file_card 是一种特殊的上下文管理机制——对于文件内容等可重生资源,引擎不在压缩时保留全文,而是标记为"可按需重读":
- 压缩时将文件内容替换为 file_card(文件引用卡片)
- 模型需要时通过
read工具重新读取 - 减少上下文中的冗余内容
CompressPipeline(压缩管线)
上下文压缩管线是一个多策略的处理流水线:
| 策略 | 说明 |
|---|---|
| 认知交班 | 首选方案:MidRunHandoff / CognitiveSettlement |
| 机械压缩 | 降级方案:丢弃旧消息,提取工具证据保留 |
| file_card | 可重生资源按需重读 |
信息保全首选认知交班;交班不可用或失败时,机械压缩提供确定性 fallback。
配置要点
- ContextWindow:必须在 Provider 配置中声明模型的上下文窗口大小(引擎不含 LLM 模型知识)
- CrossSessionDays:配置跨会话摘要的有效天数(默认 0 = 关闭 Cold-start 注入)
- EconomicWindow:未配置 ContextWindow 时的经济预算降级值