长 Agent 上下文爆窗怎么治:Claude 的 tool search、context editing、compaction 实战 长 Agent 上下文爆窗怎么治Claude 的 tool search、context editing、compaction 实战跑长链路 Agent 时一个绕不开的问题任务没做完上下文窗口先满了。这不是模型能力问题是工程问题——工具定义 一轮轮累积的tool_result把可用上下文一点点吃光。本文讲清三种上下文管理手段各管什么、怎么组合以及和 prompt caching 一起用时最容易踩的缓存失效坑。一、上下文是怎么被吃掉的两个来源上下文窗口 ├── 工具定义 ← 工具越多越长每次请求都带 └── 累积 tool_result ← 长循环产生几百个中间结果当时有用后来是死重四种手段在管线不同位置解决问题且可叠加手段解决什么触发阈值Tool search工具定义占用工具 ~20 个Context editing旧 tool_result 死重长循环大量中间结果Compaction窗口将满任务超单窗口Prompt caching复算成本不减 token工具集大但固定二、三件套各管什么Tool search按需加载工具工具集大到一定规模把全部定义塞进每个请求就是浪费。tool search 让模型按需检索工具。经验阈值超过约 20 个工具或基线上下文占用变明显时上。Context editing清失效的 tool_result第 3 步读的文件到第 50 步早已无关。context editing 把这些已完成使命的旧tool_result从历史移除不重启会话就腾出空间。Compaction摘要续接撞到窗口上限时总结会话、用摘要开新会话继续。它的实现细节直接关系到成本——见下一节。三、Compaction 与缓存命中最关键的一节做 compaction 时Claude API 复用与父会话完全相同的系统提示、用户上下文、系统上下文、工具定义父会话最后一次请求 [system][tools][msg 1..N] compaction 后 [system][tools][msg 1..N][compaction prompt] └────── 前缀逐字节一致 ──────┘ └─ 唯一新 token ─┘从 API 视角这个请求和父会话最后一次请求前缀几乎一样所以缓存前缀仍命中只有 compaction prompt 是新 token。这是长 Agent 降本的核心压缩上下文的同时不丢缓存。如果你自己实现摘要续接而不保持前缀一致每次 compaction 都会触发一次完整的缓存 miss 重新写入成本反而上去了。四、完整配置fromanthropicimportAnthropic clientAnthropic(api_keysk-...,base_urlhttps://gw.claudeapi.com)# 工具定义稳定 → 缓存复用前缀TOOLS[# ... 你的工具集 ...]TOOLS[-1][cache_control]{type:ephemeral}# 标在最后一个工具respclient.messages.create(modelclaude-sonnet-4-6,max_tokens2048,system[{type:text,text:稳定的系统指令 / 背景知识,cache_control:{type:ephemeral},}],toolsTOOLS,messagesconversation,)分工工具集大但固定→ prompt caching缓存一次复用后续复算成本降到 10%。工具集大且要精简上下文→ 叠 tool search。循环产生大量中间结果→ 叠 context editing。任务超单窗口→ compaction保持前缀一致。五、保持缓存命中的硬纪律缓存命中要求前缀逐字节一致。几条最容易翻车的纪律原因绝不中途增删工具工具定义在缓存层级最顶端一改后面全失效动态内容放 user message 不放 system系统提示写死日期 → 每天午夜缓存失效固定 JSON key 排序Go/Swift 序列化 key 随机 → 永不命中达 token 下限Sonnet 4.6 ≥4096/检查点不够会被静默跳过不报错验证是否真命中# 第一次写入assertresp1.usage.cache_creation_input_tokens0# 第二次相同前缀命中assertresp2.usage.cache_read_input_tokens0别假设缓存生效——很多时候因为没达 token 下限被静默跳过只有看 usage 字段才知道。六、小结三件套tool search按需加载 context editing清死重 compaction摘要续接可叠加。compaction 必须保持前缀一致才命中缓存否则反而更贵。全程铁律绝不中途改工具集动态内容进 user message验证 usage 字段确认缓存真命中。