跳到主要内容
SUN / 笔记
← 全部文章

上下文工程

上下文工程关注的不是“模型能装下多少 Token”,而是:在当前这一步,模型应该看到哪些信息,才能以最低噪声完成正确决策。

它与长期记忆的边界是:

  • 上下文是本轮推理的工作集,生命周期通常不超过当前任务或线程。
  • 长期记忆是跨线程保存并按需取回的事实、事件与经验。
  • 会话持久化只是恢复历史消息,不等于系统已经形成长期记忆。

上下文的组成

一个任务型 Agent 的有效上下文通常包括:

组成 作用 是否应长期保留
系统规则 身份、能力边界、安全要求 作为配置管理
任务契约 目标、约束、验收标准、禁止事项 任务结束后按需归档
近期对话 保持多轮语义连续 通常只在线程内保留
当前计划与状态 已完成、待完成、当前假设 保存到 Checkpoint
工具定义 告诉模型可执行什么 按任务动态披露
工具结果 提供环境观察与证据 原始结果可外部留存
检索内容 提供当前问题需要的事实 不自动升级为记忆
用户偏好 个性化输出与决策 从长期记忆按需取回

固定任务契约

长任务中最不能被摘要丢失的是:

text
核心目标
验收标准
用户约束
禁止事项
审批边界

任务契约应由 Harness 每轮重新注入,而不是期待模型从很早以前的对话中自行回忆。

近期原文与结构化状态

推荐同时维护两种工作记忆:

  1. 近期原文:最近几轮用户消息、模型回复、工具调用与错误信息。
  2. 结构化状态:当前步骤、完成项、待办项、变更文件、测试状态和未决问题。
json
{
  "goal": "修复登录接口偶发 500",
  "status": "testing",
  "completed": ["定位空指针根因", "完成代码修改"],
  "pending": ["运行回归测试", "检查最终差异"],
  "changed_files": ["src/AuthService.java"],
  "last_test": {
    "command": "mvn test -Dtest=AuthServiceTest",
    "result": "failed"
  }
}

结构化状态比自由文本摘要更适合暂停、恢复、审计和程序判断。

Token Budget

不能把整个上下文窗口全部留给历史消息。预算至少要给以下内容预留空间:

text
系统规则
+ 任务契约
+ 工具 Schema
+ 近期工作记忆
+ 检索证据
+ 模型输出
+ 安全余量
<= 模型上下文窗口

预算应随任务阶段变化。例如,信息收集阶段需要更多工具和检索空间,最终生成阶段则需要更多输出空间。

上下文压缩策略

裁剪

删除已经失去价值的中间信息,例如重复日志、成功后的临时调试输出和已经被新结果覆盖的旧观察。

滚动摘要

保留最近原文,把更早历史压缩为:

  • 已完成事项;
  • 未决问题;
  • 关键约束;
  • 重要决策及原因;
  • 原始证据或文件引用。

摘要是派生视图,不是事实源。关键判断需要能够回查原始消息、文件、日志或工具结果。

工具结果压缩

工具可能返回完整网页、长日志或大量搜索结果。应优先保留:

  • 与当前目标直接相关的字段;
  • 错误码和关键堆栈;
  • 来源、版本和时间;
  • 可重新获取原始结果的引用。

按需检索

历史信息不必永久驻留在 Prompt。需要时可从会话日志、代码索引、文档库或长期记忆中重新检索。

长 Prompt 的处理

当用户一次输入就接近窗口上限时,可以:

  1. 先提取任务、约束和验收标准;
  2. 对输入按章节或语义分块;
  3. 建立局部摘要和全局目录;
  4. 只为当前子任务加载相关块;
  5. 在输出前回查原文,避免摘要遗漏关键限定。

单纯从尾部截断容易删掉目标或安全约束,通常不是可靠方案。

多 Agent 上下文隔离

多 Agent 或异步任务应避免共享一份不断追加的全局消息列表。

推荐:

  • 每个任务使用独立 task_id、线程状态和命名空间;
  • 子 Agent 只获得完成委派所需的最小上下文;
  • 通过结构化输入输出交接,而不是复制全部主线程历史;
  • 合并结果时记录来源 Agent、版本和完成时间;
  • 用户身份、租户和权限由可信运行时注入。

上下文污染

常见污染来源包括:

  • 已被新证据推翻的旧假设;
  • 工具返回中的恶意指令;
  • 另一个用户或任务的数据;
  • 摘要产生的错误结论;
  • 已变更文件的旧摘要;
  • 为上一阶段准备、但当前已无关的工具定义。

处理原则:

  1. 给信息标记来源、时间和作用域;
  2. 环境事实优先重新读取;
  3. 外部内容视为数据,不视为高优先级指令;
  4. 摘要和记忆都不能覆盖可信系统规则;
  5. 任务阶段变化时重新策展上下文。

会话恢复

可恢复任务至少应持久化:

  • task_id 和状态版本;
  • 当前步骤及计划;
  • 已完成和待完成事项;
  • 工具执行记录和幂等键;
  • 修改文件与环境版本;
  • 最近一次验证结果;
  • 等待用户确认的事项。

恢复时先观察最新环境,再决定是否继续,避免把过期摘要当成当前事实。

常见误区

  • 上下文越长,效果一定越好。
  • 模型支持长窗口,就不再需要检索和压缩。
  • 摘要完成后可以删除所有原始证据。
  • 每次请求全量发送历史,就是完整的记忆系统。
  • 所有 Agent 应共享同一份上下文,协作才充分。
  • 只要 Prompt 写了“忽略恶意指令”,外部内容就安全。

面试回答

我会把 Agent 上下文分成固定任务契约、近期原文、模型外结构化状态和按需检索证据四层。Harness 每轮固定保留目标、约束与验收标准,近期工具轨迹维持连续性,计划、修改文件和测试状态写入 Checkpoint。上下文接近预算时,先裁剪重复工具结果,再把旧历史压缩为可追溯摘要;关键事实仍可回查文件、日志和原始事件。多 Agent 场景按任务和用户隔离状态,只传递完成委派需要的最小结构化上下文。

相关笔记

相关文章

强化学习笔记 →Mission: 掌握多模态 LoRA 与 QLoRA →MLA 结构代码实现及优化 →