上下文管理

概述

上下文管理是 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 注入(系统提示词)

在系统提示词中直接嵌入的记忆,每轮对话都会出现:

适合需要始终在场的关键信息。

Lazy 注入(当轮 Overlay)

根据当前对话内容动态召回的记忆,只在相关时出现:

通过语义搜索 + BM25 混合检索,选出与当轮对话最相关的记忆条目。

Cold-start 注入

跨会话摘要重放——将之前会话的认知结算摘要注入新会话的开头,帮助模型理解历史上下文。需要 Cell 配置 CrossSessionDays > 0 才启用。

SessionState

SessionState 是 Run 结束时认知结算(CognitiveSettlement)的产出,是下一轮上下文的唯一历史来源:

引擎不从旧消息推断历史——SessionState 是唯一真相。

MidRunCompression(Run 中途压缩)

当对话消息累积超过模型窗口限制时,引擎在 Run 中途执行压缩:

  1. 检测当前上下文是否超过经济窗口
  2. 如果超过,触发 MidRunHandoff——由主模型生成中间 SessionState
  3. 丢弃旧消息前,通过 ExtractToolEvidence 提取工具证据作为 Pinned 消息
  4. 用新的 SessionState 替换旧历史,继续执行

MidRunCompression 与 EndOfRunSettlement 使用相同的 SessionState schema。

CognitiveSettlement(认知结算)

Run 结束时的强制阶段:

  1. 主模型将本轮对话压缩为 SessionState
  2. 可选地产出记忆条目(memory_entries)
  3. SessionState 持久化到 wes_session_state 表

失败处理:3 次重试 → 机械压缩 fallback(提取工具证据,不做 LLM 判断)。

Settlement 产出对用户不可见——不通过 SSE 推送到前端。

file_card(可重生资源)

file_card 是一种特殊的上下文管理机制——对于文件内容等可重生资源,引擎不在压缩时保留全文,而是标记为"可按需重读":

CompressPipeline(压缩管线)

上下文压缩管线是一个多策略的处理流水线:

策略说明
认知交班首选方案:MidRunHandoff / CognitiveSettlement
机械压缩降级方案:丢弃旧消息,提取工具证据保留
file_card可重生资源按需重读

信息保全首选认知交班;交班不可用或失败时,机械压缩提供确定性 fallback。

配置要点