R

A06 状态外化策略

创建 2026-06-07 更新 2026-06-11 1 条双链 上下文工程 专题 AI 整理

长任务为什么会”越跑越蠢、最后崩掉”?本节点要解决的问题是:当一个 Agent 需要执行几十上百步时,把全部状态(计划、进度、已学事实、工具历史)都压在 context window 里,几乎注定崩盘。本节用一个判断框架——状态外化(state externalization)——来回答:哪些状态必须留在 context 里、哪些必须主动倒出去、什么时候倒、倒到哪。判断主轴一句话:状态全压在 context 里 = 长任务必崩

§0 为什么是”状态外化”这个框架,而不是”加大窗口”

读者脑子里的默认框架往往是:任务崩是因为窗口不够大,等 1M、10M token 普及就解决了。这个框架是错的,而且错得很贵。

第一,窗口大小和有效利用是两回事。NoLiMa 基准(Adobe Research,ICML 2025)给出的数字很刺眼:Claude 3.5 Sonnet 在 1K token 时语义检索准确率 87.6%,到 64K 时跌到 29.8%(跌 57.8 个百分点);Gemini 1.5 Pro 从 92.6% 跌到 48.2%;GPT-4o 的”实际有效上下文”被估算为约 8K token,尽管它声称 128K(来源:GitHub adobe-research/NoLiMa;An et al. 2024,arXiv 2410.18745)。换句话说,窗口越大,你越容易产生”我都放进去了它应该看得到”的幻觉,而模型其实早就看不全了

第二,Chroma 2025 的系统测评(Kelly Hong、Anton Troynikov、Jeff Huber,2025-07-14)测了 18 个前沿模型(Claude Opus 4 / Sonnet 4 系列、GPT-4.1/4o、Gemini 2.5 Pro/Flash、Qwen3-235B 等),结论是:所有 18 个模型在所有输入长度增量上都出现性能下降,无一例外——这就是 Anthropic 命名的 context rot(上下文腐化)(来源:Chroma context rot 研究)。这是 Transformer 注意力架构的固有属性(RoPE 长距离衰减 + Softmax 归一化放大),不是”训练几个版本就能消除”的能力缺陷。

所以正确的框架不是”等更大的窗口”,而是把 context window 当成一个主动管理的、会腐化的稀缺资源——既然资源会腐化,就要把不需要每步都看的状态外化(写出去),只在 context 里保留”下一步真正需要的最小高信号集合”。这正是 LangChain 把 context engineering 类比为”操作系统管理 CPU 内存”的原因(来源:LangChain Blog,2025-07-02):RAM 有限且昂贵,操作系统靠分页和换出(swap)管理,Agent 靠状态外化管理。

§1 三种外化动作:Write before fill / Compaction / Sub-agent 消化回传

状态外化不是单一技巧,而是三个互补动作,对应任务的三个时刻。

动作时机做什么解决什么Anthropic 对应实现
Save plan before fill(填满前先存盘)任务开始 / 接近软阈值前把计划、关键决策写入外部文件(memory/TODO.md)防止”压缩一来,计划被摘掉”Memory Tool(memory_20250818)
Compaction(压缩)软阈值触发摘要历史或清除旧工具结果,腾出窗口防止硬撞窗口上限直接崩compact_20260112 / clear_tool_uses_20250919
Sub-agent 消化回传子任务可隔离时子 Agent 独立窗口探索,只回传压缩结论探索过程不污染主线程Claude Code 子 Agent 系统

这三者的共同逻辑是:让”过程”留在外面,只让”结论”进 context。下面逐一拆。

§2 Save plan to memory before context fills:把蓝图钉在窗口之外

最反直觉、也最常被忽视的一条:任何你压缩后还想要的东西,都不能假设它会被压缩保留

Anthropic 的工程实践明确这样说:必须放入持久记忆的内容(关键决策、当前计划、约束)应当写进外部文件(如 TODO.mdNOTES.md,或 Memory Tool 的 /memories 目录),假设它不会被压缩流程保留(来源:Anthropic Context Engineering Cookbook)。Memory Tool(memory_20250818,2025-08 公测)的系统 prompt 会自动注入一条指令:“在做任何事之前先查看 memory 目录”——这就是 save-before-fill 的机制化:计划落盘在前,执行时随时回读。

量化收益是实打实的:Anthropic 发布的数据显示,上下文编辑(Context Editing)+ 记忆工具组合让 Agent 搜索性能提升 39%(单独上下文编辑提升 29%)(来源:Anthropic Context Management 博客)。

[!note] 〔待核实〕“save plan to memory before context fills”作为一句 Anthropic 官方命名的指南,WebSearch 未找到确切短语。该理念分散在 Cookbook 与工程博客中,可能是社区对 Anthropic 实践的总结。本节按”据 Anthropic 实践推断”处理,不伪装成官方独立命名。

为什么 before fill 是关键时点?因为压缩是有损的,而且Anthropic 的 compaction 已知缺陷之一是:偶发模型在该写摘要时反而去调用了工具,导致摘要质量不可控(2026-06 状态,来源:Anthropic Compaction 文档)。把蓝图钉在窗口之外,等于给压缩上了保险:就算这一轮摘要把计划摘丢了,外部文件里还在。

§3 Compaction:摘要压缩 vs 观测遮蔽,一个被数据打脸的直觉

压缩有两条主流路线,直觉上”摘要更聪明”,但生产数据给了相反答案。

路线 A — LLM Summarization(摘要压缩): 用一次额外推理把历史对话压成摘要替换原文。Anthropic 的 compact_20260112(2026-01 beta)默认 150K token 触发,要求摘要保留”状态、下一步、已学到的内容”,在 100 轮网页搜索评估中 token 消耗减少 84%(来源:Anthropic Compaction 文档)。

路线 B — Observation Masking(观测遮蔽): 把旧的 tool_result 换成占位符,保留 tool_use 记录(模型知道自己调过)。无推理开销,但会让 prompt cache 前缀失效。

JetBrains Research(2025-12)在 SWE-bench 上的对比实验是这条线最硬的证据:Observation Masking 比 LLM Summarization 更便宜更可靠;Qwen3-Coder 480B 用 Masking 后解决率提升 2.6%、成本降低 52%;而 LLM Summarization 反而使 Agent 运行时间增加约 15%(摘要可能遮盖了”该停了”的停止信号)(来源:JetBrains Research Blog)。

这条数据的 PM 含义很尖锐:“更智能的压缩”未必更好,因为摘要本身会引入新的信息丢失和幻觉。一个更便宜、更笨但无损方向更可控的方案(遮蔽旧观测),在工程上常常赢。Anthropic 推荐的生产组合也是分层的:工具结果清除(clear_tool_uses_20250919,较早触发)→ 摘要压缩(较晚触发)→ 跨会话持久化记忆。

§4 Sub-agent 消化回传:隔离的红利与 Cognition 的反驳

第三种外化是空间上的:让子 Agent 在独立窗口里把脏活干完,主 Agent 只接收压缩后的结论。子 Agent 的全部探索历史(几十次试错、上百行工具输出)不进入主线程,从而延迟主窗口耗尽。Claude Code 的子 Agent 系统是典型实现:专用助手 + 独立隔离窗口 + 受限工具权限(来源:martinuke0 博客)。

但这里必须接入业界最有力的反方,而不是装作隔离没有代价。

[!warning] 对手框架回应:Cognition 的”Don’t Build Multi-Agents” Cognition(2025,Cognition Blog)明确反对盲目拆子 Agent,核心两条:(1) 上下文割裂——只收到”子任务描述”的子 Agent,因缺乏整体决策历史而误解任务,他们主张”Share full agent traces, not just individual messages”;(2) 隐式决策冲突——并行子 Agent 各自做出局部合理、组合起来却冲突的决策(经典例子:一个子 Agent 建 Super Mario 风格背景,另一个建视觉不兼容的角色)。

接受:Cognition 对的部分——在当前模型可靠性下,跨 Agent 通信确实有损,“全上下文单线程”在很多任务上优于草率的多 Agent 拆分。回传的是摘要,摘要就有信息损失,这是真代价。 边界:但本节坚持——当子任务真正可隔离(探索路径多、产物可压缩成结构化结论、不依赖主线程中途决策)时,隔离的红利(主窗口免于被探索垃圾淹没)大于回传损失。判据不是”要不要拆”,而是”这个子任务的探索过程是否需要被主 Agent 看到”。需要看到 → 别拆(Cognition 对);只需要结论 → 拆(隔离红利)。这是个可证伪的边界:如果回传摘要丢掉了主 Agent 后续需要的信息,就该收回隔离。

§5 判断主轴:状态全压在 context 里 = 长任务必崩

这是本节命门。90% 的人在长任务上栽跟头,栽在以下四个点。每点给”症状 → 为什么错 → 正确做法 → 真实反例”。

错位一:把 context 当持久存储用。

  • 症状:让 Agent”记住第 3 步定下的方案”,跑到第 40 步它忘了 / 改了。
  • 为什么错:context 是会腐化的工作内存,不是磁盘。NoLiMa 显示 64K 处语义召回可跌到 30% 量级,第 3 步的决策早被注意力稀释。
  • 正确做法:第 3 步当场把方案写入外部文件(§2),后续回读而非”指望它记得”。
  • 真实反例:Anthropic compaction 偶发”该写摘要时去调工具”,证明连官方压缩都不能保证状态被可靠保留——更别说裸跑。

错位二:等撞到窗口上限才想起压缩。

  • 症状:任务跑到 95% 窗口突然报错或胡言乱语。
  • 为什么错:context rot 在窗口远未填满时就开始了;Chroma 18 模型实验里,上下文 >50% 满时 U 形曲线就已变形为偏向近期 token(recency bias 增强)。等满了再压,中段信息早废了。
  • 正确做法:设软阈值前摄压缩(Claude Code 约 80% / ~160K token 触发),并分层(先清工具结果再摘要)。
  • 真实反例:JetBrains 数据——晚触发的 LLM 摘要反而 +15% runtime,因为它在错误时机遮盖了停止信号。

错位三:盲目上多 Agent 来”扩容上下文”。

  • 症状:把任务拆成 5 个并行子 Agent,结果产物互相打架,集成失败。
  • 为什么错:这是把”上下文管理问题”误当成”并行度问题”。隔离窗口不是免费的,回传有损,决策会冲突(Cognition 原则二)。
  • 正确做法:只隔离”探索过程不需要被主线程看到”的子任务;需要共享决策历史的,宁可单线程 + 压缩。
  • 真实反例:Cognition 的 Super Mario 背景 vs 不兼容角色——两个各自合理的决策组合崩盘。

错位四:以为”摘要压缩”是无损的智能折叠。

  • 症状:压缩后 Agent 丢了关键约束 / 漏了已排除的死路,重复踩坑。
  • 为什么错:摘要是一次有损的再生成,会丢字符级细节(对代码 Agent 尤其致命——语法有效性、调试所需的精确信息会被摘没)。
  • 正确做法:对代码/精确场景优先用观测遮蔽(无损方向)而非摘要;关键约束走外部文件而非指望摘要带上。
  • 真实反例:SWE-Pruner(arXiv 2601.16746)的出发点就是”语义压缩破坏语法有效性、摘要丢失调试字符级信息”——专门为代码场景做自适应剪枝而非摘要。

§6 产品 PM 视角补盲

跳出工程视角,三个容易看走眼的点。

用户心理模型:“我都告诉它了它怎么还忘”是头号差评来源。 用户把对话框等同于”它会一直记得”的心理账户。当长会话 Agent 在第 40 轮忘了第 3 轮的设定,用户感受到的不是”context rot”,而是”这 AI 不靠谱”。PM 的产品决策:要么显式做”记忆条/已记住”的 UI 反馈(把外化状态可视化,让用户看到它”存盘”了),要么主动告知”长对话我会做摘要,关键信息建议钉一下”。状态外化不只是后端优化,它需要前端的信任设计。

商业模式:外化是成本杠杆,不只是质量杠杆。 压缩省 84% token(Anthropic)、观测遮蔽降 52% 成本(JetBrains)——这些直接落到毛利。一个长任务 Agent 产品,不做状态外化,单位经济(unit economics)可能直接为负。PM 在定价和 SLA 时必须把”有效上下文 ≪ 标称窗口”算进去:你按 200K 窗口卖,但有效可能只有 30-60K,超出部分用户体验和你的成本都在恶化。

合规边界:外化记忆 = 一个新的数据留存面。 把计划、用户信息写进 /memories 持久文件,意味着这些数据跨会话存活——这触发 GDPR 的”被遗忘权”、数据最小化、留存期限等合规问题。Agent 记忆里存了什么、存多久、谁能读、如何删除,是 PM 必须和法务对齐的清单,而不是工程师顺手写个文件了事。

§7 跨域呼应:Polanyi 的”默会知识”与外化的限度

[!note] 跨域调度:Michael Polanyi —— “我们知道的比我们能说出来的多” Polanyi 的核心命题(The Tacit Dimension, 1966):“We know more than we can tell.” 大量知识是默会的(tacit),无法被完整地形式化、言说、外化。

这个框架直接改变本节的判断,而不是装饰。状态外化的隐含假设是:状态可以被完整地写出来——把计划、决策、已学事实倒进文件,回读时无损还原。但 Polanyi 提醒:Agent 在长任务中积累的有些”状态”是默会的——它对问题空间的整体直觉、对哪条路是死胡同的模糊判断、各约束之间的张力感——这些恰恰是最难被摘要捕获、也最容易在压缩中丢失的部分。

这解释了为什么 LLM 摘要会”丢了已排除的死路”(错位四):死路的”已排除感”是探索过程沉淀的默会判断,摘要把它显性化为几行字时,语境和确信度都被压扁了。也解释了 Cognition 为什么坚持”share full traces”:完整轨迹保留了默会的过程,而结论式回传只保留了可言说的部分。

对本节的修正:状态外化是必需的,但它有一条 Polanyi 边界——越是依赖默会判断的任务(创造性设计、复杂调试、需要”手感”的探索),外化的损失越大,越应该谨慎压缩、保留完整轨迹;越是可显式化的任务(信息检索、流程执行、事实积累),外化越安全。这给”什么时候压”提供了一个比 token 阈值更深的判据:不只看窗口满没满,还要看被压掉的状态有多默会

§8 PM 决策启示

  • 面试怎么用:被问”你的长任务 Agent 为什么不稳定”,不要答”窗口不够大”。答:“context 是会腐化的工作内存(NoLiMa:64K 处语义召回可跌到 30% 量级),我们靠三层外化——计划落盘、分层压缩、子 Agent 隔离——把有效上下文维持在高信号区。“一句话区分”听过 context engineering”和”做过”。
  • 选型怎么用:评估一个 Agent 框架/平台,直接问三件事:(1) 有没有持久 memory 层(还是全靠 context)?(2) 压缩是摘要还是观测遮蔽,触发阈值可配吗?(3) 子 Agent 隔离时回传的是 full trace 还是摘要,可选吗?三个都答不上来的,长任务别用。
  • 复现怎么用:Rick 自己用 Claude Code / CLAUDE.md 的一手体感——CLAUDE.md 本质就是”save plan/约束 before fill”的人肉版:把项目约束、命名规范、不可违反原则写进文件,每次会话开头自动读入,而不指望模型跨会话记得。本专题工厂本身(SHARED_CONTEXT.md + 草稿落盘 + final_path)就是状态外化的活体实践:把写作宪章外化为文件,让每个并行写作 Agent 在独立窗口里读同一份”外部记忆”,正是 §4 的 sub-agent 模式 + §2 的 save-before-fill 叠加。

§9 与已有节点的关系(升级对照,不复述)

  • 对照 m206 - Agent 产品化:记忆机制与技术进展:m206 讲”记忆机制有哪些”(短期四策略 / 长期三库 / 衰减冲突隐私四决策),本节做的是操作纠偏——不讲记忆架构本身,讲”什么时候、为什么必须把状态从 context 倒进记忆层”,并补上 m206 没有的 compaction 两路线数据对比(JetBrains)和 Cognition 反多 Agent 的边界。两者是”机制 vs 时机”的互补。
  • 对照 m209 - 推理成本控制手册:m209 从成本角度算账,本节补一个 m209 未展开的杠杆——状态外化是成本与质量的同源杠杆(压缩 84% token、遮蔽降 52% 成本同时不降质),把”省钱”和”防崩”统一到一个动作上。
  • 对照 m201 - Prompt Engineering 实战体系:m201 是单次指令的静态优化,本节是多步执行的动态状态管理——这正是 prompt engineering → context engineering 升格的具体落地处:m201 管”怎么写这一句”,本节管”几十步里哪些状态该留、该倒”。
  • 对照 c09 - RAG 架构m204 - RAG 生产环境:Chunking 与范式演进:RAG 是”信息四去向”里的”走 RAG”分支,本节的状态外化是”外化 memory”分支——两者都是”不把所有东西塞进 context”的策略,区别在 RAG 拉外部知识、外化倒内部状态。决策时是同一个判断框架的两个出口。
  • A07 Multi-Agent Teams(0411 专题,如确有内容相关)的关系:0411 讲多 Agent 怎么分工,本节从 context 管理角度补”分工的隐藏成本是上下文割裂”,与 Cognition 立场对齐。

§10 关联节点

核心(必读)

延伸(可选)

修订日志

  • 2026-06-07 R0:首稿。建立”状态全压在 context 里 = 长任务必崩”判断主轴;三动作框架(save-before-fill / compaction / sub-agent 回传);四错位判断主轴;接入 Cognition 反多 Agent 对手框架(接受+边界);Polanyi 默会知识跨域呼应(给出”被压掉的状态有多默会”这一深层压缩判据);与 m206/m209/m201/c09 显式升级对照。事实接地:NoLiMa、Chroma、JetBrains、Anthropic compaction/memory 数据均带来源;“save plan before fill 官方命名”标〔待核实〕。