主题
上下文、状态与能力资产
一句话:上下文不是拼出来的,是编译出来的。窗口有限而任务世界持续增长,模型每轮看见什么,必须由一层独立的确定性管线决定,而不是让调用方随手拼接。
对应原书:第 5 章《信息:上下文、状态与可复用能力资产》。
为什么需要
把资料塞进窗口,看起来最省事,但它同时破坏三件事:
- 成本与注意力:窗口越满,单位 token 的信息密度越低,关键约束越容易被淹没;
- 一致性:重复注入同一事实,不同位置说法不一致时,模型只能猜;
- 可追溯:出问题时无法回答“模型当时到底看到了什么”。
更根本的问题是作用域:如果先跨租户召回、再在提示词里提醒“不要泄漏”,数据其实已经进入了模型输入,隔离在那一刻就失败了。上下文必须在进入模型之前就完成过滤与编译。
核心机制
一、上下文的固定分层
系统侧六层,约束强度自上而下:Platform Policy(不可被项目文档覆盖)→ Agent Contract(职责与禁区)→ Tenant / Project Rule(附加约束)→ Runtime Reminder(阶段、预算、等待原因)→ Selected Skill(本轮方法资产)→ Tool Descriptors(工具说明与参数)。任务侧七项:用户目标、Plan/Todo、最近交互、压缩后的历史、检索到的记忆、检索到的知识、工作区引用。
冲突按层级与权威来源取舍:用户最新要求可以改方向,但不能突破安全边界;记忆里的偏好不替代当前业务事实;工具返回的内容不自动升级为系统指令。
二、Context Builder:一条确定性管线
两个顺序不能反:先过滤再排序,否则排序阶段就已经跨作用域看到了不该看的内容;先提交事实再压缩,否则压缩会改变任务事实。
Manifest 是这条管线的产出,也是排障入口。它记录每个条目的来源、作用域、版本、可信度、权限依据、入选原因、token 数、变换方式、内容哈希。出问题时先看 Manifest,再怀疑模型。
预算不是平均分:规则与目标设固定下限,动态额度随阶段浮动,并且必须预留输出与 Observation 的空间。优先级按七个维度排:约束强度、任务相关性、时间有效性、来源可信度、执行依赖、信息增量、token 成本。
三、压缩的四个动作
压缩不是一次摘要,而是四步循环:
- Commit:把结构化事实提交到 Task State 或工作区;
- Compact:把叙述性历史转成摘要,带来源与覆盖范围;
- Rebuild:用摘要、状态和最近消息重建上下文;
- Validate:检查目标、未决项、权限、证据是否完整,并用续行用例验证。
任何一步不满足,回到 Commit。数万行的大结果不能留在窗口里,要卸载到工作区或制品库,活动上下文只保留摘要和稳定引用——引用要受权限保护、带版本与时间戳,按需取回。
“最近”也不只按时间算:目标的最新修改、未解决的工具错误、待审批动作、验收失败的证据,即使更早,也属于活动状态。
四、三个边界与三种状态表示
| 概念 | 边界 | 说明 |
|---|---|---|
| Call | 一次请求,秒到分钟 | 模型调用与工具调用的最小单位 |
| Session | 一段交互,分钟到数天 | 一个 Session 可以发起多个 Task |
| Task | 一个可验收目标 | 可跨 Call、Session、进程与节点 |
状态有三表示,互不可替代:
- Event Log 记过程,用于审计与重建;
- Snapshot 看当前,用于快速读取;
- Checkpoint 是安全恢复点,包含续行位置、幂等信息与环境依赖。
只有含完整状态变更和必要输入的事件才能重放;诊断日志不能冒充事件日志。
五、工作区、制品与四类记忆
工作区分六个区:inputs、scratch、state、artifacts、evidence、manifest。各区的生命周期与保留策略不同,混在一起会导致“临时文件被当成交付物”或“证据被清理掉”。
制品有完整生命周期:Draft → Validating → Ready → Published/Rejected → Archived/Deleted。模型写出文件不等于产物完成——前者是动作,后者要经过校验与验收。
记忆分四类:
| 类型 | 内容 | 来源 |
|---|---|---|
| Working | 当前任务的事实 | Task State / 工作区 |
| Episodic | 过往任务的经验 | 任务轨迹 + 结果质量 |
| Semantic | 稳定事实、偏好、实体 | 用户确认或权威系统 |
| Procedural | 已验证的方法 | 多次验证后升级为 Skill |
写入前要过六问:未来有没有价值、是环境验证还是推测、归属与保留周期、是否含敏感数据、是新增还是合并、出错时谁纠正以及派生索引怎么清。四类记忆的权威责任不同,混用会导致把“某次任务的经验”当成“组织事实”。
六、Skill 的三层披露与治理
Skill 是“在某类任务中如何正确使用若干动作”,不是 Prompt,不是工具的别名,也不直接拥有权限。它的加载分三层:
- 发现:只暴露名称与描述;
- 选择:加载 Manifest,判断是否适用;
- 执行:读取详细指令与脚本。
选择时要看六件事:模型兼容性、工具依赖、环境条件、租户许可、数据范围、版本状态。Skill Registry 的生命周期是 Draft → Test → Review → Publish → Observe → Update;Trace 必须能定位到具体 Skill 版本,Agent 版本要锁定 Skill 集。
七、多租户与真正的删除
作用域分六级:Global、Tenant、Project、User、Session、Task。先定身份作用域再检索,这条顺序就是隔离本身。
删除不是删原文。完整动作是七步:用稳定资产 ID 追踪派生链 → 禁止读取 → 删除原文 → 清理索引、缓存、摘要 → 更新 Manifest 与 Skill → 保留最小审计 → 触发验证。只删向量库,下次重建会把内容带回来。
最小上手
yaml
context:
system_layers: [platform_policy, agent_contract, tenant_rule, runtime_reminder, skill, tools]
task_items: [goal, plan, recent, compacted, memory, knowledge, workspace_refs]
budget:
fixed_floor: [policy, contract, goal]
reserve_output: true
manifest_fields: [source, scope, version, trust, permission_basis, reason, tokens, transform, hash]
compression:
order: [commit, compact, rebuild, validate]
keep_active: [goal_changes, unresolved_tool_errors, pending_approvals, verification_failures]
workspace:
zones: [inputs, scratch, state, artifacts, evidence, manifest]验收看三件事:任一轮都能导出 Manifest;压缩后用续行用例能接着跑;跨作用域检索在过滤阶段就被挡住。
生产动作
- 把 Manifest 当排障第一入口。模型答错时,先确认它看到了什么、没看到什么,再谈提示词。
- 资产变更走反退化闭环:结构校验 → 影响分析 → 离线回放 → 灰度新版本 → 观察成本、延迟、引用准确性、泄漏、误选、膨胀 → 保留、修订或回滚。
- 删除要可验证。删完跑一次召回测试,确认原文、摘要、索引、缓存都取不到。
- Skill 版本要进 Trace。否则无法判断“是方法变了,还是模型变了”。
边界
- 全塞窗口不可持续。成本只是表面,真正的问题是约束被稀释、事实重复且互相矛盾。
- 只留最近几轮会丢关键状态。目标变更、已确认事实、外部副作用、验收缺口、恢复位置,都可能不在最近几轮里。
- 压缩会改事实。摘要没有来源与覆盖范围,重建后约束会悄悄消失。
- 提示词补救不了隔离。跨作用域召回一旦发生,泄漏已经完成。
- 统一存储不等于统一引擎。运行时状态、工作区、记忆、本体对一致性的要求不同,强行一个引擎会牺牲其中一类。
讲清楚
上下文是编译产物:先定身份与作用域,再收集候选、过滤、排序、分配预算、压缩引用化、按层级编译,最后产出可解释的 Manifest。顺序里有两个硬约束——先过滤再排序,先提交事实再压缩。
状态要分成 Call、Session、Task 三层,用 Event Log 记过程、Snapshot 看当前、Checkpoint 做恢复点。工作区、制品、记忆、Skill 各有一套生命周期,混用会让“临时结果”变成“组织事实”。
Skill 按发现、选择、执行三层披露,Agent 版本锁定 Skill 集;多租户隔离在检索之前完成;删除要连派生物一起清。做到这些,上下文才既省 token,又能被追责。
适用:Agent 上下文工程与知识资产管理 | 初稿 2026-10