上下文工程关注的不是“模型能装下多少 Token”,而是:在当前这一步,模型应该看到哪些信息,才能以最低噪声完成正确决策。
它与长期记忆的边界是:
- 上下文是本轮推理的工作集,生命周期通常不超过当前任务或线程。
- 长期记忆是跨线程保存并按需取回的事实、事件与经验。
- 会话持久化只是恢复历史消息,不等于系统已经形成长期记忆。
上下文的组成
一个任务型 Agent 的有效上下文通常包括:
| 组成 | 作用 | 是否应长期保留 |
|---|---|---|
| 系统规则 | 身份、能力边界、安全要求 | 作为配置管理 |
| 任务契约 | 目标、约束、验收标准、禁止事项 | 任务结束后按需归档 |
| 近期对话 | 保持多轮语义连续 | 通常只在线程内保留 |
| 当前计划与状态 | 已完成、待完成、当前假设 | 保存到 Checkpoint |
| 工具定义 | 告诉模型可执行什么 | 按任务动态披露 |
| 工具结果 | 提供环境观察与证据 | 原始结果可外部留存 |
| 检索内容 | 提供当前问题需要的事实 | 不自动升级为记忆 |
| 用户偏好 | 个性化输出与决策 | 从长期记忆按需取回 |
固定任务契约
长任务中最不能被摘要丢失的是:
核心目标
验收标准
用户约束
禁止事项
审批边界
任务契约应由 Harness 每轮重新注入,而不是期待模型从很早以前的对话中自行回忆。
近期原文与结构化状态
推荐同时维护两种工作记忆:
- 近期原文:最近几轮用户消息、模型回复、工具调用与错误信息。
- 结构化状态:当前步骤、完成项、待办项、变更文件、测试状态和未决问题。
{
"goal": "修复登录接口偶发 500",
"status": "testing",
"completed": ["定位空指针根因", "完成代码修改"],
"pending": ["运行回归测试", "检查最终差异"],
"changed_files": ["src/AuthService.java"],
"last_test": {
"command": "mvn test -Dtest=AuthServiceTest",
"result": "failed"
}
}
结构化状态比自由文本摘要更适合暂停、恢复、审计和程序判断。
Token Budget
不能把整个上下文窗口全部留给历史消息。预算至少要给以下内容预留空间:
系统规则
+ 任务契约
+ 工具 Schema
+ 近期工作记忆
+ 检索证据
+ 模型输出
+ 安全余量
<= 模型上下文窗口
预算应随任务阶段变化。例如,信息收集阶段需要更多工具和检索空间,最终生成阶段则需要更多输出空间。
上下文压缩策略
裁剪
删除已经失去价值的中间信息,例如重复日志、成功后的临时调试输出和已经被新结果覆盖的旧观察。
滚动摘要
保留最近原文,把更早历史压缩为:
- 已完成事项;
- 未决问题;
- 关键约束;
- 重要决策及原因;
- 原始证据或文件引用。
摘要是派生视图,不是事实源。关键判断需要能够回查原始消息、文件、日志或工具结果。
工具结果压缩
工具可能返回完整网页、长日志或大量搜索结果。应优先保留:
- 与当前目标直接相关的字段;
- 错误码和关键堆栈;
- 来源、版本和时间;
- 可重新获取原始结果的引用。
按需检索
历史信息不必永久驻留在 Prompt。需要时可从会话日志、代码索引、文档库或长期记忆中重新检索。
长 Prompt 的处理
当用户一次输入就接近窗口上限时,可以:
- 先提取任务、约束和验收标准;
- 对输入按章节或语义分块;
- 建立局部摘要和全局目录;
- 只为当前子任务加载相关块;
- 在输出前回查原文,避免摘要遗漏关键限定。
单纯从尾部截断容易删掉目标或安全约束,通常不是可靠方案。
多 Agent 上下文隔离
多 Agent 或异步任务应避免共享一份不断追加的全局消息列表。
推荐:
- 每个任务使用独立
task_id、线程状态和命名空间; - 子 Agent 只获得完成委派所需的最小上下文;
- 通过结构化输入输出交接,而不是复制全部主线程历史;
- 合并结果时记录来源 Agent、版本和完成时间;
- 用户身份、租户和权限由可信运行时注入。
上下文污染
常见污染来源包括:
- 已被新证据推翻的旧假设;
- 工具返回中的恶意指令;
- 另一个用户或任务的数据;
- 摘要产生的错误结论;
- 已变更文件的旧摘要;
- 为上一阶段准备、但当前已无关的工具定义。
处理原则:
- 给信息标记来源、时间和作用域;
- 环境事实优先重新读取;
- 外部内容视为数据,不视为高优先级指令;
- 摘要和记忆都不能覆盖可信系统规则;
- 任务阶段变化时重新策展上下文。
会话恢复
可恢复任务至少应持久化:
task_id和状态版本;- 当前步骤及计划;
- 已完成和待完成事项;
- 工具执行记录和幂等键;
- 修改文件与环境版本;
- 最近一次验证结果;
- 等待用户确认的事项。
恢复时先观察最新环境,再决定是否继续,避免把过期摘要当成当前事实。
常见误区
- 上下文越长,效果一定越好。
- 模型支持长窗口,就不再需要检索和压缩。
- 摘要完成后可以删除所有原始证据。
- 每次请求全量发送历史,就是完整的记忆系统。
- 所有 Agent 应共享同一份上下文,协作才充分。
- 只要 Prompt 写了“忽略恶意指令”,外部内容就安全。
面试回答
我会把 Agent 上下文分成固定任务契约、近期原文、模型外结构化状态和按需检索证据四层。Harness 每轮固定保留目标、约束与验收标准,近期工具轨迹维持连续性,计划、修改文件和测试状态写入 Checkpoint。上下文接近预算时,先裁剪重复工具结果,再把旧历史压缩为可追溯摘要;关键事实仍可回查文件、日志和原始事件。多 Agent 场景按任务和用户隔离状态,只传递完成委派需要的最小结构化上下文。