最佳实践:上下文工程四策略

上下文窗口是具有机会成本的经济资源。与其被动应对窗口耗尽,不如建立主动防御体系。本节介绍四种递进策略,从预防到应急,构建完整的上下文管理方案。

6.8.1 四策略框架概述

上下文工程四策略框架:缓存优化 → 观察遮蔽 → 压缩策略 → 分区策略

四种策略形成层层防御:

策略 1: 缓存优化(预防)
    ↓ 最大化缓存命中,10 倍成本差异
    ↓ 设计缓存友好的提示结构

策略 2: 观察遮蔽(早期干预)
    ↓ 工具输出 = 83.9% tokens,最大杠杆
    ↓ 固定遮蔽可匹配 LLM 摘要效果

策略 3: 压缩策略(主动管理)
    ↓ 70-80% 利用率时触发
    ↓ 结构化摘要保留信号,丢弃噪音

策略 4: 分区策略(架构解决方案)
    ↓ 子智能体隔离上下文
    ↓ 文件交接策略,避免信息传递损耗

选择策略的决策框架:

上下文状态 首选策略 理由
利用率 < 50% 缓存优化 预防胜于治疗
工具输出占比 > 50% 观察遮蔽 瞄准最大消耗源
利用率 70-80% 压缩策略 主动释放空间
任务可拆分 分区策略 从架构层面解决
重要核心概念

不要等到上下文耗尽才行动。研究表明,在 70-80% 利用率时主动优化,比等到质量下降信号再处理,效果好得多。

6.8.2 缓存优化:10 倍成本差异

API 服务商对缓存命中的输入 token 提供大幅折扣。以 Claude Sonnet 4 为例:

Token 类型 成本
未缓存输入 $3.00/MTok
缓存输入 $0.30/MTok
差异 10 倍

这意味着设计缓存友好的提示结构能带来显著成本节省。

缓存友好的内容排序原则

[稳定内容优先]          ← 可缓存(系统提示、工具定义)
[常用模板次之]          ← 部分可缓存(格式要求、常用指令)
[动态内容最后]          ← 无法缓存(当前查询、实时数据)

什么会破坏缓存

  • 在系统提示中加入时间戳(每次请求都不同)
  • 格式不一致(同一类请求结构不同)
  • 频繁调整系统提示措辞

金融应用示例

假设你的金融分析系统有 4 万 tokens 的稳定前缀(系统提示 + 工具定义 + 分析框架)。每天处理 100 个请求:

无缓存成本:40,000 × 100 × $3/MTok = $12/天 = $360/月
缓存命中成本:40,000 × 100 × $0.3/MTok = $1.2/天 = $36/月

月节省 = $360 - $36 = $324(90%)
提示技巧

AGENTS.md 的内容应保持稳定,不要频繁修改。稳定的系统提示是缓存优化的基础。

6.8.3 观察遮蔽:零开销的高杠杆策略

研究发现,在典型的智能体工作流中,工具输出占据 83.9% 的 tokens。这是优化的最大杠杆点。

观察遮蔽(Observation Masking) 的核心思想是:工具输出在使用后往往不再需要完整保留。可以用简短的占位符替换冗长的原始输出。

原始工具输出(2000 tokens):
{
  "date": "2026-01-27",
  "results": [
    {"symbol": "AAPL", "price": 185.23, "volume": 52341000, ...},
    {"symbol": "MSFT", "price": 412.56, "volume": 28765000, ...},
    ... 更多数据 ...
  ]
}

遮蔽后(50 tokens):
[工具输出已处理:获取了 10 只股票的实时行情数据,已提取关键指标]

关键发现

研究表明,固定遮蔽(如”前 X 行已省略”)的效果可以匹配甚至超过 LLM 生成的摘要,同时零 token 开销(LLM 摘要通常消耗 5-7% 额外 tokens)。

遮蔽策略选择

内容类型 策略 理由
最近一轮工具输出 保留完整 当前任务可能需要
3 轮以上的工具输出 选择性遮蔽 提取关键点,隐藏细节
重复格式的数据 立即遮蔽 格式已知,只需保留结论
已完成处理的中间结果 完全遮蔽 任务已完成,不再需要

6.8.4 压缩策略:结构化摘要

当上下文利用率达到 70-80% 时,应主动触发压缩。但压缩有代价——研究显示,递归摘要会丢失 65% 的准确率。

压缩的代价——DMR 基准测试数据

压缩方法 准确率 关键洞见
时序知识图谱(Zep) 94.8% 时间有效性是关键
MemGPT 93.4% 综合表现良好
GraphRAG 75-85% 保留关系结构
Vector RAG 60-70% 丢失关系结构
递归摘要 35.3% 严重信息损失

结构化摘要模板

与其让模型自由摘要,不如提供结构化模板,强制保留关键信息:

## 会话意图
[用户的核心目标]

## 已修改文件
- file1: 变更内容
- file2: 变更内容

## 已做决策
- 决策 1: 理由
- 决策 2: 理由

## 当前状态
[任务进度:完成/进行中/待开始]

## 下一步
1. 具体步骤 1
2. 具体步骤 2

Opencode 中的实践

# 带指令的定向压缩
/compact 仅保留决策、待办事项和配置更改

# 保留特定主题
/compact 保留所有关于估值模型的讨论
警告注意

文件追踪信息特别容易在压缩中丢失。即使使用最佳压缩方法,文件追踪评分也只有 2.2-2.5/5.0。关键文件操作应写入 AGENTS.md,而非仅依赖会话记忆。

6.8.5 分区策略:子智能体隔离上下文

最彻底的优化是从架构层面解决——将复杂任务拆分给子智能体,每个子智能体有独立的上下文空间。

子智能体的本质是上下文隔离,而非拟人化分工

主智能体上下文:
┌──────────────────────────────────────┐
│ 系统提示 + 用户需求 + 任务规划      │
│ 容量:约 20K tokens                 │
└──────────────────────────────────────┘
          ↓ 分派任务
    ┌─────┴─────┐
    ↓           ↓
┌────────┐  ┌────────┐
│子智能体A│  │子智能体B│
│独立上下文│  │独立上下文│
│处理任务A│  │处理任务B│
└────────┘  └────────┘
    ↓           ↓
    └─────┬─────┘
          ↓ 只返回摘要
┌──────────────────────────────────────┐
│ 主智能体接收:任务 A 完成,任务 B 完成 │
│ 新增消耗:约 200 tokens              │
└──────────────────────────────────────┘

文件交接策略

子智能体不应将完整结果返回给主智能体(这会填满主智能体的上下文),而应:

  1. 将详细结果直接写入文件
  2. 只向主智能体返回状态摘要
错误做法:
子智能体 → [完整分析报告 5000 tokens] → 主智能体

正确做法:
子智能体 → [写入 output/analysis.md]
子智能体 → [状态摘要 100 tokens] → 主智能体

金融场景示例

主智能体(理财顾问)需要生成市场分析报告:

主智能体上下文:
┌────────────────────────────────────┐
│ 客户需求:分析科技股投资价值      │
│ 任务规划:分派给研究子智能体      │
└────────────────────────────────────┘
         ↓ 分派任务
    ┌───────────┐
    │研究子智能体│
    │独立上下文 │
    │分析 AAPL  │
    └───────────┘
         ↓ 写入文件
    output/aapl_analysis.md
         ↓ 返回摘要
┌────────────────────────────────────┐
│ 主智能体接收:                     │
│ ✅ AAPL 分析完成,盈利能力优秀    │
│ 消耗:约 50 tokens                │
└────────────────────────────────────┘

如果子智能体将完整分析(3000 tokens)返回主智能体,会填满上下文。

避免信息传递失真

信息经过多个上下文传递会逐步降级。直接文件交接避免了这种损耗。

6.8.6 常见陷阱与避免方法

陷阱类型 具体表现 解决方案
暴力加载 直接粘贴所有内容到上下文 渐进式加载,按需检索
信息同质化 所有信息同等对待 区分必要复杂度与偶发复杂度
速度优化偏差 优化生成速度而非理解深度 关注输出质量,非延迟
跳过规划 直接执行,缺乏设计 研究-规划-实现三阶段
不主动压缩 频繁触发自动压缩 每 30-50 轮主动 /compact
AGENTS.md 过大 文件超过 200 行 使用 @import 分离配置
敏感数据裸存 未加密存储客户信息 加密敏感字段,环境变量存密钥
注意故障排除

如果发现智能体频繁遗忘早期讨论的关键点、重复之前犯过的错误,很可能是自动压缩时丢失了重要信息。解决方案:

  1. 关键决策立即写入 AGENTS.md 或 REMEMBER.md
  2. 主动压缩时明确指定保留内容
  3. 使用文件而非会话记忆存储重要信息