Claude Code的上下文管理机制
Claude Code的上下文管理机制
- 上下文与其管理方案
- Claude Code的上下文管理实践
最近,终于按下心来,打算记录一下大模型应用开发相关的知识了。那么,提到agent,必然绕不开Claude Code这样一个编程助手神作。
上下文与其管理方案
上下文是大模型一次推理可以见到的全部token空间,包括系统和用户提示词、工具调用信息等。
目前大模型窗口普遍达到1M,但是大量的工具调用结果比如文件读取、构建日志和堆栈报错体量较大,且轨迹累积,因此上下文容易撑爆,并且模型对于早期重要约束的注意力会下降、加上中间状态可能干扰判断,从而导致执行质量下降。
既然空间是有限的并且质量和成本及时间都随上下文增长而增长(token计算的时间复杂度是O(N2)),那么就需要管理空间内的信息以决定哪些信息值得留下来、哪些要丢弃。
常见方案有以下5种:
- 滑动窗口,满了丢弃最早的,简单但是容易丢弃最初目标、重要约束、关键决策等任务背景。
- 摘要压缩,将历史对话总结为短文本,压缩力度有了,但是粒度没了,很可能丢失细节,且不保留结构化的可供继续执行的任务状态。而agent需要的是任务状态快照。
- RAG检索,基于相关性算法检索知识片段并塞入prompt,适合补充相关知识但是不能稳定召回关键状态,比如任务目标、已修改文件状态等执行轨迹。
- 长期记忆,比如CLAUDE.md和memory,适合存放稳定的规则约束,比如编码规范、目录结构、项目技术栈,但是不适合放临时任务状态。
- subagent隔离,比如派出subagent去探索项目返回精简结果,它是上下文管理的一部分但是不能替代主agent的上下文管理,主agent依然要读取结果、决定下一步。
其实,也可以看出来,任何一个方案单独拿出来对于执行长线任务的agent都不够用,所以上下文管理要多维度控制。
Claude Code的上下文管理实践
- 精准定位上下文。Claude Code采用Glob找文件->Grep找关键词->Read读相关内容的三步走策略来只读取精准上下文。
- 裁剪工具结果。每次工具调用超过硬上限时会通过截断+预览的方式裁剪工具结果。
- subagent探索去隔离噪音。将大范围探索变为小体积结论。
- 稳定规则放CLAUDE.md和memory。这样,在Auto-Compact压缩之后会重新注入稳定规则,而不会丢失。
- Auto-Compact压缩。在留有摘要空间的时候,将执行轨迹压缩成Agent可以继续执行的结构化任务状态快照,从工具输出提炼关键状态结论,保留任务目标、任务进度、关键决策、已修改文件、未完成事项等,丢弃重复日志、无关搜索和已被结论覆盖的中间过程等。核心思想是,丢弃噪音,保留状态。
