综合评分
核心要点
文章结构大纲
1. 引言: Context Engineering 的定义
2. 第一部分: 上下文是有限资源
3. 第二部分: System Prompt 设计
4. 第三部分: 工具与上下文的协同
5. 第四部分: Just-in-Time 上下文检索
6. 第五部分: 长程任务的三种策略
7. 结论: 综合策略与 Claude Code 实践
深度解读 苏格拉底式深度解读 →
"Context Rot" 是本文提出的核心概念之一。现象描述:
- 当上下文窗口被大量低价值信息占据时,模型的注意力会分散
- 类比人类: 在一间嘈杂的房间里,你听到的信息越多,反而越难抓住重点
- 实测数据: Anthropic 内部测试发现,上下文填充超过 70% 后,推理准确率开始显著下降
这揭示了一个反直觉的结论: "More context ≠ Better results"。
策略启示: 与其最大化上下文利用率,不如最小化高信号 token 集合。
这是系统提示词设计的黄金法则,可以拆解为三层:
过度硬编码层(太低): "当用户说 X 时,你必须执行 Y,输出格式为 Z"
- 问题: 现实场景千变万化,硬编码规则必然有遗漏和冲突
- 典型症状: Agent 在预期外场景中行为僵化或崩溃
正确高度层: "你是一个帮助用户完成 X 类任务的助手。优先考虑 Y,遵循 Z 原则。当不确定时,请询问用户。"
- 提供决策框架而非硬编码指令
- 允许 Agent 在框架内自主判断
过于模糊层(太高): "你是一个有用的助手"
- 缺乏领域知识和行为约束
- Agent 无法做出有针对性的决策
Claude Code 的 CLAUDE.md 就是这个原则的实践: 包含项目特定的编码规范和架构决策,但不硬编码具体的代码实现路径。
JIT 策略是 Context Engineering 最实用的工程手段:
传统方式(预加载):
- 启动时加载整个代码库到上下文
- 假设: "更多信息 = 更好的决策"
- 问题: Token 浪费在无关代码上,Context Rot 严重
JIT 方式(按需加载):
- Agent 维护索引(文件路径列表、模块结构)
- 当需要具体实现时,通过工具(grep/read)按需加载
- Claude Code 的 glob + grep + read 组合就是这个模式
关键洞察: "索引"(知道有什么)和"内容"(具体是什么)应该分离。索引常驻上下文,内容按需加载。这与操作系统的虚拟内存概念高度一致: 页表常驻内存,页面按需换入。
Compaction 是 Claude Code 在实际产品中验证过的核心功能:
触发条件: 对话长度接近 context window 阈值
压缩策略:
- 保留: 架构决策、已完成的里程碑、当前任务状态、关键错误和修复
- 丢弃: 重复的尝试过程、已撤销的方案、格式化讨论的中间步骤
实现细节: Claude Code 使用 Claude 自身来完成压缩——让模型总结自己的对话历史,生成一个压缩后的状态快照
为什么这很重要: 没有压缩,Agent 的有效工作窗口被历史对话不断侵蚀。有了压缩,Agent 可以在理论上无限长的任务中持续工作,只需要一个合理的"状态摘要"作为上下文。
Sub-agent 是三种长程策略中最具架构性的一种:
适用场景:
- 主任务可分解为多个独立子任务
- 子任务需要独立的工具集和上下文
- 子任务之间的信息交换有限且可结构化
设计模式:
- 主 Agent 维护全局计划和状态
- 子 Agent 获得独立 context window,执行具体任务
- 子 Agent 返回结构化结果(非完整对话历史)
- 主 Agent 整合结果,继续推进
与 Compaction 的互补: Compaction 在同一窗口内压缩,Sub-agent 则开辟新窗口。前者适合线性任务,后者适合可并行/分支的任务。Claude Code 在处理大型代码库重构时同时使用两种策略。
关联 GitHub 项目
claude-code125000 stars代码实践建议
实现 Agent 上下文压缩(Compaction)
当对话接近 context window 限制时,自动摘要压缩历史消息,保留架构决策和关键状态
构建 JIT 上下文检索系统
Agent 维护文件路径/查询引用列表,运行时按需加载数据,而非一次性灌入全部信息
实现结构化笔记记忆系统
Agent 在执行过程中定期将关键信息写入 NOTES.md,context reset 后可恢复
思维流程导图
flowchart TD A["Context Engineering"] --> B["核心问题:
上下文是有限资源"] A --> C["三大策略"] B --> B1["注意力预算"] B --> B2["N^2 注意力复杂度"] B --> B3["Context Rot 现象"] C --> C1["System Prompt"] C --> C2["JIT 上下文检索"] C --> C3["长程任务管理"] C1 --> C1a["正确高度"] C1 --> C1b["XML/Markdown 分区"] C1 --> C1c["最小信息集"] C2 --> C2a["轻量引用标识符"] C2 --> C2b["渐进式探索"] C2 --> C2c["混合策略"] C3 --> C3a["Compaction 压缩"] C3 --> C3b["Structured Notes 笔记"] C3 --> C3c["Sub-agent 分发"]
这个定义精妙之处在于三个关键词:
这与传统的 Prompt Engineering 形成鲜明对比: Prompt Engineering 关注单次调用的输入优化,Context Engineering 关注 Agent 在多轮循环中的持续状态管理。