代码语言
选择后全站课程跟随

上下文工程

4,748 字 · 预计阅读 14 分钟

前情提要

  • 上下文工程有四种手段:写(重要的东西落到文件里)、选(只把这一步要用的拿进来)、压(把历史缩成摘要)、隔(换一张干净的台面,交给子代理)
  • 「目标漂移」:转了二十轮之后,最初的目标被大量工具输出冲淡,Agent 开始跑偏
  • 模型对上下文末尾的内容记得最牢
  • /compact 可以手动压缩,后面还能跟要求,比如 /compact 保留改过的文件和没做完的事
  • 第5节:缓存决定了上下文怎么排,会话中的变化只往末尾追加

第5节讲了上下文怎么「排」,这一节讲上下文怎么「管」:会话一长,工具输出越堆越多,Claude Code 怎么防止它跑偏、塞满、超限。

这是 Claude Code 最见功力的部分。你会看到很多常量,比如 167K、5 万字符、10 轮、3 次,它们背后都有线上数据。


一、四种手段,一张地图

上下文工程通过写、选、压分配有限空间

先把四种手段在 Claude Code 里的位置对一下:

手段 意思 Claude Code 里的实现 在哪讲
写 重要的东西落到纸上 待办清单和提醒;让模型自己记笔记;计划文件;MEMORY.md 本节
选 只放这一步要用的 Skill 目录 1% 预算;MCP 工具搜索;子目录规则按需加载;大结果落盘 第7、8、6节,本节
压 把历史缩成摘要 四道工序,从轻到重 本节
隔 换一张干净的台面 子代理新开一份消息列表 第12节

再加一条贯穿所有手段的:缓存(第5节)。决定上下文怎么管的,除了「模型需要什么」,还有「怎么做最省钱」。


二、写:待办清单和每 10 轮的提醒

模型有一个 TodoWrite 工具,用来维护待办清单。如果连续 10 轮都没更新它,系统就会追加一条提醒,把当前的清单重新贴出来:

TodoWrite 工具最近没用了。如果你在做的任务适合跟踪进度,考虑用它……这只是一个温和的提醒,不适用就忽略。绝对不要向用户提起这条提醒。

(后面附上当前的待办清单)

这条提醒对付的就是「目标漂移」。转了二十轮之后,最初的目标埋在一大堆工具输出前面,离模型越来越远。提醒做的事情,是把目标重新放到离模型最近的地方:模型对上下文末尾的内容记得最牢,提醒就追加在末尾。

注意它的写法:

  • 「不适用就忽略」:给模型留了判断的余地,不是命令
  • 「绝对不要向用户提起」:这是写给模型的私下提醒,用户不需要看到

把目标定期贴回末尾,对抗目标漂移。


三、写:让模型自己记笔记

系统提示词的动态区里有这样一句:

处理工具结果时,把之后可能用到的重要信息写进你的回复里,因为工具结果的原文之后可能会被清掉。

为什么?因为工具结果会被清掉(下面「压」的部分会看到),模型自己写的回复不会。所以重要的信息,要从工具结果里「抄」到自己的回复里。

连模型都被要求先落盘。

除此之外还有两种「写」:

  • 计划文件:计划模式产出的计划写在一个文件里,压缩之后会重新注入
  • 自动记忆:MEMORY.md 是自动记忆的索引,每次会话开始都会加载(第6节)

工具结果会被清掉,自己写下来的才留得住。


四、选:大结果落盘

完整工具结果落盘,只将预览送进上下文

前几节已经看到了大部分「选」:Skill 目录只占 1%(第7节)、MCP 工具用时再搜(第8节)、子目录规则碰到才加载(第6节)、Explore 子代理不带 CLAUDE.md(第6节)。

再补一个:大结果落盘。

src/constants/toolLimits.ts 规定了两条线:

限制 数值 超了怎么办
单个工具结果 50,000 字符 完整内容存到磁盘,模型只拿到前 2KB 预览和文件路径
一条消息里所有并行工具结果加起来 200,000 字符 把其中最大的几个存到磁盘,直到总量降下来

第二条的注释说得很直白:防止 10 个并行工具每个都差一点到上限,加起来一轮就塞进 40 万字符。

模型收到的大概是这样:

<persisted-output>
Output too large (30.5KB). Full output saved to: /Users/you/.claude/projects/.../tool-results/xxx.txt

Preview (first 2KB):
(前 2KB 的内容)
...
</persisted-output>

如果你让 Agent 一口气 cat 好几个大文件,大概率见过这个。完整内容没有丢,模型需要的时候可以再用 Read 去读那个文件的某一段。

这是七道关里的第 ⑦ 关(第3节):在工具结果进入历史之前就处理好。这一点很重要,下面会再提到。

不是不给,而是先给预览,要了再给。


五、压:四道工序,从轻到重

上下文压缩逐级减少历史负担

第2节的循环里,每次调模型之前都要过一遍「减肥」。按代价从小到大排:

本文是会员内容

全文 4,748 字,已试读约 28%。 开通专业版可阅读全文,并解锁全部课程与后续更新。

开通专业版

支持 7 天无理由退款 · 早鸟期前 500 名自动升级永久卡