跳到正文
第二级 · 上下文工程

第二级 · 上下文工程

压缩、卸载、子代理、Skills、记忆、检索

上下文工程是在每一步精心策划进入模型有限注意力预算的那组 Token——系统指令、工具、外部数据、历史记录,到底放哪些、放多少,目标是找到能最大化期望结果的、最小的高信号 Token 集合。Prompt 工程关心把单次的话说得多漂亮;上下文工程关心在多轮里系统化地往窗口塞进恰好正确的信息。后者是 2026 年的核心技能。

先引入一个概念上的拆分:把 Agent 经历过的一切叫 Context(上下文,记作 C),其中真正喂进模型的只是一部分,叫 Prompt(P),剩下那些暂存、模型当下看不见的,叫 M。课程里给了一个公式刻画这件事:没有上下文工程时系统只是把输入输出无脑累加进 C;有了上下文工程,则引入一个转换函数 f 来更新上下文,而 f 最核心的功能就是压缩。

上下文工程的形式化:不做上下文工程时,系统只是把每轮输入 I 和输出 O 无脑累加进 C(左);做上下文工程时,把 C 拆成 C = P, M——P 是这一轮真正喂进 LLM 的部分,M 是暂存、当下不喂的部分,并用转换函数 F 在每轮更新上下文(右)

左边是没有上下文工程的退化情形:每轮把输入 I 和输出 O 直接累加进上下文 C。右边引入转换函数 F 之后,C 被拆成 C = {P, M}——P 是这一轮真正放进 LLM 的部分,M 是暂存、当下不喂进去的部分;F 每轮决定留什么、压什么、再调什么进来,而它最核心的功能就是压缩。

为什么窗口大了也不够:上下文腐烂#

你可能会想,等模型厂商把窗口做大不就行了。2026 年窗口确实大了(Opus、Sonnet 都到了 100 万 Token),但这并不能解决问题,原因叫 context rot(上下文腐烂):Token 越多,模型的注意力预算就越被稀释,召回和推理质量反而下降。

Anthropic MRCR v2 检索基准

窗口从 25.6 万拉到 100 万 Token,检索准确率掉了 17 个百分点。

256K Tokens
93%
1M Tokens
76%

等更大的窗口是条死路,窗口够大也不该塞满。这就逼出了主动的上下文管理。管理的第一招最直觉:历史太长,就压缩它。

压缩:摘要,还是干脆"遮住"?#

压缩有两种思路,繁简悬殊:一是 LLM 摘要,再请一个语言模型把久远的历史总结成一段摘要,聪明但要额外花钱花时间;二是观察遮蔽(Observation Masking),直接把工具输出那一大段替换成一句"此处曾有工具输出",几乎不花钱。

直觉上摘要应该更好,但研究给出了相反的结论。JetBrains 的论文《The Complexity Trap》(2508.21433The Complexity Trap)在 SWE-bench Verified 上用 5 种模型配置系统比较,发现简单的观察遮蔽就能把成本砍掉一半,而解决率与昂贵的 LLM 摘要相当甚至略高;两者结合的混合方案再省 7% 到 11%。复杂方法不一定更好。

The Complexity Trap 核心对比:5 种模型配置下,解决率(纵轴)对单题成本(横轴),不同标记代表不同上下文管理策略

每个小图是一种模型配置,标记区分不同的上下文管理策略(The Complexity Trap 论文 Figure 2)。成本更低的那些点普遍偏左,纵向的解决率却并不比偏右、更贵的策略差——简单的观察遮蔽把成本砍掉一半,解决率仍与昂贵的 LLM 摘要相当甚至略高。复杂方法没买到更好的结果,这正是"复杂度陷阱"。

压缩也有副作用。一是"轨迹延长":关键步骤被压掉后模型可能忘了自己做过某事,于是重做一遍。二是更严重的"上下文坍缩":摘要时把"需经人类同意才能删邮件"这类关键指令弄丢了,Agent 就开始失控。课程里讲过一个真实事故,压缩导致 Agent 忘了"删邮件要先问",自主把用户邮件删了。所以最理想的策略是分阶段:前期先用便宜的遮蔽法缩短工具输出,等累积到一定程度再做一次整体摘要。

Claude Code 怎么落地这套策略,值得细看,因为它是上面原理最完整的工业实现。它的压缩按成本从低到高分三层:

  • 第一层 Microcompact(微压缩),最便宜,不调模型。把较旧的工具结果整体替换成一句占位符 [Old tool result content cleared],默认保留最近 5 个。这就是观察遮蔽的工程版。
  • 第二层 折叠,把更老的消息归档折叠。
  • 第三层 Full Auto-Compact(完整自动压缩),最贵,会调模型。当 Token 占用达到窗口的某个百分比阈值(大致 75% 到 85% 区间,且这个阈值一直在被官方往下调)时触发,用结构化总结把整段对话蒸馏成摘要,开新窗口续上,保留目标、决策、关键发现、未解决的 bug、架构决策,丢弃冗余的工具输出和探索过程的措辞。

它还有几个工程化护栏:连续压缩失败 3 次就熔断、停止自动压缩防止烧钱;压缩完成后会重新注入最近几个文件、激活的 skill、计划文件等关键上下文。这些机制在 2026 年也成了 Claude 开发者平台上人人可调的 API 原语。

卸载到环境:把细节存到硬盘,只留一个指针#

摘要是有损的,压坏了找不回来。有没有无损的省空间办法?有:别总结,把它搬到硬盘上。回到 P 和 N 的拆分——模型当下看得见的(P)才烧 Token,存在硬盘上的(N)不烧。于是把详细内容写到硬盘,上下文里只留一个指针(路径),需要时再用工具读回来。

举例:Agent 写了一个 500 行的文件,历史里不该存这 500 行全文,只存一句"内容已保存到 /src/main.py"。这种压缩是可逆的,与摘要那种有损不可逆完全不同。学术上 IBM 的"内存指针"论文(2511.22729内存指针)把这个思路推到极致:让模型操作"指向大数据的指针"而非数据本身,在一个常规工作流根本跑不动的真实材料科学应用上跑通了,还省了约 7 倍 Token。

子代理:用"隔离"代替"压缩"#

如果是一整段复杂的子任务(比如读 30 个文件做调研),它的整个过程都会污染主线。子代理(Subagent) 是这个问题的架构性解法,思路从事后压缩变成事前隔离:主代理把一个聚焦的子任务派给子代理,子代理在自己独立、干净的窗口里干脏活(可能烧掉几万 Token),干完只把一段 1 到 2K Token 的浓缩摘要交回。主代理的窗口因此始终很小,那段复杂的子对话从来没进过主线。

这条线上有两篇结果共同印证了一个规律:主动管理通常优于无脑摘要。Context-Folding2510.11967Context-Folding)让智能体用 branch 开分支、return 折叠中间步骤,用小 10 倍的活跃上下文就匹配甚至超过 ReAct 基线。AgentFold2510.24699AgentFold)的 30B 模型在 BrowseComp 上超过了体量大得多的 671B 模型,100 轮交互后上下文仅约 7K Token。

到这里处理的都是已经产生的历史。但有一类东西不是历史,而是"该怎么做某件事"的方法论,它既不该每次重写,也不该塞满窗口。这就引出了 Skills。

Skills:渐进式披露的"标准作业程序"#

先给一句最准的定位:工具(Tool)执行并返回结果,技能(Skill)则在教模型怎么把一类问题做好。Tool 提供"能做什么",Skill 提供"该怎么把这件事做漂亮"。Skill 约等于给 Agent 的一份标准作业程序(SOP),把"遇到这类任务该一步步怎么做"的程序性知识打包好,需要时才加载。它是一个自包含的文件夹,以 SKILL.md 为锚点,可选地附带脚本、参考文档、模板。

Skill 之所以能省 Token 又好用,靠的是上下文工程的灵魂机制——渐进式披露

Skill 的灵魂机制 · 渐进式披露

逐级点开,看上下文成本如何被「按需加载」压住。

  1. Level 1 · 元数据几十 Token

    会话一开始,只有每个 Skill 的 name 加一句话 description 被加载。其它一概不进窗口。

    name: log-analyzer
    description: 分析日志里的错误。当用户说「检查日志」时使用。
  2. Level 2 · 正文几百 Token
  3. Level 3 · 按需资源用到才计费

渐进式披露其实是"卸载到硬盘加指针"的思想用在了方法论上,而上一章的按需发现工具是同一思想用在了工具上。这是上下文工程反复出现的同一招:平时只放索引或描述,要用才加载全文。Skill 的 description 写得好不好,直接决定它能不能在对的时候被触发,这是写 Skill 最关键的一环(终章会用一套真实科研 Skill 把这件事讲透)。Skill 起源于 Claude Code,2026 年已演化成跨工具的开放标准。

记忆系统:从"两层加向量库"到"四层加做梦"#

很多人对 Agent 记忆的早期理解是两层:短期记忆是本轮对话维护的便签,长期记忆是存进向量库靠语义相似度检索。这套理解没被推翻,但被显著扩展了。今天主流把记忆拆成四层:

记忆类型存什么类比
工作记忆 Working当前任务里活跃的内容早期说的 Notepad
情景记忆 Episodic具体发生过的事件、轨迹"上次我们怎么解决的"
语义记忆 Semantic提炼出的事实、偏好"用户用 Docker、偏好中文"
程序记忆 Procedural怎么做某件事的流程正好和 Skill 重叠

两个大升级:一是检索从纯向量到混合检索(向量、图、关系型、关键词多路并取再融合),Mem0(2504.19413Mem0)在 LOCOMO 基准上相对 OpenAI 方案提升 26%、延迟降 91%;二是离线巩固(Dreaming,做梦)——记忆不再只在对话时实时写入,而是有了一个离线的、类似睡眠的后台阶段,Agent 在闲时回看过去的会话、抽取模式、把有用信息巩固进结构化记忆。还有一个早期没正视的新难题:记忆腐烂、陈旧,一条曾经正确的记忆在情况变化后会变成"自信地错"。

怎么找信息:Agentic Search 与 RAG#

要在几千个文件里找一个函数定义,有两条路线:RAG 事先把代码切块、算成向量、建索引,用时取最像的 top-k;Agentic Search 不建索引,让模型像程序员一样现场搜——先用 Grep、Glob 缩小到具体文件、具体行,再 Read 那一小段。

Claude Code 选了后者,而且是把早期的 RAG 砍掉之后选的。在代码场景,Agentic Search 在精度(标识符拼写精确,grep 直接命中)、简单(没有索引要维护)、新鲜度(永远读当前文件)、隐私(数据不出本机)四个维度全面更优,而且模型越强它自动越强。这不意味着 RAG 已死——成熟共识是分场景:代码检索用 Agentic Search,大型非结构化知识库(客服、法律、医疗文档)仍是 RAG 赢。

把上下文管理权也交给模型#

到这里,第二级的所有机制都还是人类工程师写死的固定逻辑。最前沿的一步是把管理权也交给模型自己。ACE2510.04618ACE)把上下文当成一本不断进化的 playbook,用"生成、反思、策展"做结构化增量更新,靠执行反馈自我改进。RLM 递归语言模型2512.24601RLM)把超长输入当成外部环境,让模型写代码去窥探、拆解、甚至递归调用自己,能处理超出窗口一个数量级以上的输入。