在大模型进入工程化阶段之后,一个现实问题逐渐浮出水面:模型本身的能力,已经不再是长任务稳定性的主要瓶颈。
不少开发者在使用 Claude Code、Codex 或其他 Agent 框架时,都会遇到类似体验:任务前半段执行流畅,但随着上下文增长,系统开始出现重复读取、状态遗忘,甚至“推翻自己”的行为。直觉上,这像是模型能力不足;但从近期对 Claude Code Runtime 的拆解来看,问题的本质更接近于——上下文与记忆的治理缺失。
与其说 Anthropic 在优化模型,不如说它在构建一套完整的 长任务运行时(Runtime)系统:把“该记什么、该忘什么、什么时候交接、如何续写”,从 Prompt 技巧上升为工程机制。
这套设计,正在重新定义 AI Coding Agent 的竞争维度。
在讨论长任务时,一个常见误区是把焦点放在 context window(比如 200k token)上。但窗口大小只解决“能装多少”,并不解决“装进去之后是否有序”。
Claude Code 的实现体现了一个关键转变:
长任务问题被拆成两条独立链路:
如果用工程视角看,它至少包含三类核心能力:
这三者分别对应不同失效模式:
- 上下文爆炸 → 信息噪音
- 任务中断 → 状态丢失
- 跨轮运行 → 经验遗忘
Claude Code 的关键在于:没有把这些问题交给模型“自己发挥”,而是拆成多个受控子系统。
在 query.ts 的执行链路中,可以看到一个典型的多阶段设计,而不是简单的“超长就 summarize”。
第一步不是压缩,而是剥离噪音源。
grep、cat、shell log)被写入 tool-results/这一步解决的不是“记忆”,而是避免上下文被工具输出吞噬。
在实际 Agent 运行中,这类数据往往占据 70% 以上 token。
与传统 summarize 不同,microcompact 并不生成摘要,而是选择性删除:
本质上是一次“垃圾回收(GC)”:
优先清掉体积大但信息密度低的内容。
只有在 microcompact 不够时,才触发真正的 compact:
这已经不是“模型自由总结”,而是一个带资源调度策略的系统决策。
当触发 prompt too long 时:
这是典型的 runtime fallback,而非 AI 行为。
在 compact prompt 中明确限制:
这意味着:
压缩被定义为一个“纯函数式操作”,而不是开放式推理过程。
这点非常关键——它避免了“越压缩越偏离”的系统性风险。
即使有完美摘要,长任务仍然会失败。原因在于:
任务丢失的往往不是历史,而是“当前进度”。
Claude Code 为此引入了独立系统:SessionMemory。
它不是总结,而是一份结构化运行状态:
| 能力 | 作用 |
|---|---|
| compact | 压缩历史 |
| SessionMemory | 维护当前状态 |
10k token 初始化
更重要的是:
它由后台子 agent 持续维护,而不是同步生成。
长任务常见失败路径:
SessionMemory 通过两个关键字段避免这些问题:
Current State:防止进度丢失 Errors & Corrections:避免重复踩坑 这本质上是把“隐性状态”结构化、持久化。
Claude Code 的长期记忆(memdir)设计非常克制:
MEMORY.md 只是索引(200 行 / 25KB 上限)换句话说:
长期记忆只存“无法从代码库重新推导的信息”。
流程如下:
这是一种“弱检索 + 强约束”的设计:
但这正是其设计目标:
限制 recall 预算,防止记忆污染上下文。
记忆提取由独立 agent 完成,且严格限制:
这解决的是一个更隐蔽的问题:
memory 腐化(重复、过时、矛盾)
后台任务,触发条件:
作用类似:
它不参与实时推理,但完善了整体记忆闭环。
把整个系统抽象一下,可以看到一个清晰的设计哲学:
Claude Code 的核心能力不在于“记住更多”,而在于:
用系统机制决定:什么该保留、什么该丢弃、什么该回灌。
如果你正在构建 AI Agent,这套设计可以直接转化为工程策略:
不要用一个 summary 解决两个问题。
禁止工具调用,确保稳定性。
至少包含:
只基于最近上下文,避免全局污染。
不要全量注入,只取相关子集。
没有上限的 memory,最终一定变成噪音源。
随着模型能力趋于同质化,差异正在转移:
Claude Code 提供的启示是:
长任务的稳定性,不应该依赖模型自觉,而应该依赖系统设计。
未来的 Agent 系统,本质上会越来越像操作系统:
而真正的竞争点,将不再是 token 数量,而是:
当这些能力被系统化之后,“不跑偏”才会成为默认行为,而不是运气。