如何解决 Claude Code 会话变慢及成本过高问题
Claude Code 会话因上下文重复发送导致变慢且成本增加。本文教你使用 /context 查看资源占用,通过 /clear 和 /compact 指令清理冗余,并识别 Prompt is too long 等错误代码,从而有效控制 Token 用量与开发成本。
如何避免长时间 Claude Code 会话变慢并增加成本
长时间运行的 Claude Code 会话会变慢并增加成本,因为每一轮都会重新发送完整上下文,而上下文只会不断增长。解决方法是按固定顺序进行维护。运行 /context,查看哪些内容占用了上下文窗口;删除每次请求都会产生费用的内容;然后在不相关的任务之间使用 /clear,在同一个长任务中使用 /compact 并附带说明。应连续完成一段工作,因为提示缓存失效后,原本成本较低的读取操作会变成对全部历史内容的完整重写。
代理会话背后的令牌计量器解释了为什么会产生这些用量。
在修改任何内容前读取 /context
不要猜测窗口的填充情况。Claude Code 会告诉您。
/context [all]以彩色网格显示当前上下文使用情况,并为上下文占用较高的工具和内存膨胀提供优化建议;all在全屏模式下展开各项明细。将结果分为以下 5 个部分。
- 系统提示。 Claude Code 自身的运行框架指令。在整个会话中固定不变。
- 工具定义。 Agent 可调用的每个工具的架构,包括所有已连接的 MCP(Model Context Protocol)服务器。
- 内存文件。
CLAUDE.md和自动内存,在会话开始时加载。 - 文件和工具结果。 读取的每个文件,以及命令输出的全部内容。
- 消息历史。 您发送的消息和 Claude Code 的回复。
前 3 项是固定开销,在会话期间的每个请求中都会产生。后 2 项会持续增长。在开始时一次性降低固定开销;持续管理不断增长的部分。
以下两个字符串表示窗口已满:
Context exceeds the 200k-token limit by 94k tokens — run /compact or /clear to continue.
Context is 94k tokens past the 200k-token compaction window — run /compact to reduce usage.第一个表示硬限制,超过后请求会被拒绝;对应的 API(application programming interface)错误为 Prompt is too long。第二个表示压缩窗口。在 1 million token 模型上,它可能低于模型实际的上下文窗口。超过该窗口后请求仍可成功,因此它表示警告,而不是拒绝。
在付费套餐中,/usage会增加另一部分信息:标记长上下文或缓存未命中等行为,并将近期使用量归因到具体技能、子 Agent 和 MCP 服务器。如果它提示配额已经用尽,您正在等待哪个限制窗口将决定现在缩减上下文是否有帮助,还是需要通过其他方式恢复工作。
CLAUDE.md 是一项永久成本,因此应保持精简
您的 CLAUDE.md 会在会话开始时加载,并一直保留在上下文中。如果其中包含详细的部署流程,那么即使您只是在测试文件中修正拼写错误,这些令牌也会一直存在。Anthropic 建议只保留必要内容,并将文件控制在 200 行以内。
将流程移到技能中。技能只有在调用时才会加载,因此每周运行两次的工作流在其他日期不会产生任何成本。压缩后,技能有独立的预算:每个技能最多重新注入 5,000 个令牌,总计最多 25,000 个令牌,按最早加载的顺序丢弃。截断会保留文件开头,因此应将最重要的指令放在 SKILL.md 的顶部附近。
压缩后仍能保留哪些内容,决定了指令应放在哪里。
- 系统提示和输出样式不会改变,因为它们不属于消息历史记录。
- 项目根目录中的
CLAUDE.md、未限定范围的规则和自动记忆会从磁盘重新注入。 - 带有
paths:frontmatter 的规则会丢失,直到再次读取匹配的文件。 - 子目录中的嵌套
CLAUDE.md会丢失,直到再次读取该子目录中的文件。 - Hook 会继续运行,因为 Hook 以代码形式执行;只有 Hook 之前添加到上下文中的内容会与其余对话一起被摘要。
因此,您依赖的规则应放在项目根目录的 CLAUDE.md 中:Claude Code 会先清除较早的工具输出,然后执行摘要,因此对话早期的指令可能会丢失。使用 /memory 编辑记忆。Claude Code 会保留会话开始时加载的副本,因此会话中途的精简会保留提示缓存,并且直到下一次 /clear、/compact 或重启后才会生效。上下文丢失只是规则停止遵循的一个原因,因此当规则显然仍在窗口中却仍被忽略时,请先排查其他原因,再重写规则。
/clear 用于不同任务之间,/compact 用于同一任务内部
这两个命令看起来可以互换,但成本差异很大。
/clear [name] 会在空白上下文中启动新会话。它不会发送请求,因此不产生费用。传入名称后,可在 /resume 选择器中标记上一段会话;/reset 和 /new 是别名。切换到无关任务时应立即使用它,否则旧任务会在新任务的每条消息中再次发送并再次计费。
/compact [instructions] 会在继续同一会话的同时释放上下文:它汇总当前历史记录并用摘要替换历史记录。适合用于较长的单一任务,因为此时仍需要保持上下文连续性。
始终为 /compact 提供指令。 不带参数的 /compact 会根据默认提示进行摘要,而默认提示不知道你还需要哪部分工作。提供指令后,它会保留以下内容:
/compact focus on the auth bug fix
/compact keep only the plan and the diff如果每次压缩的原因都相同,可在项目的 CLAUDE.md 中的 # Compact instructions 标题下设置固定指令。在新会话中,/compact 会输出 Not enough messages to compact.,这只表示当前还没有历史记录。
这里容易混淆两种成本。摘要请求会复用你的前缀,因此会读取现有缓存,而不是重新处理历史记录;其大部分耗时用于生成摘要。压缩大型上下文仍然是大型请求,因为被摘要的会话就是输入。压缩后的下一轮并不是耗时部分:它只需为更短的提示重新构建缓存。
还有两个成本更低的命令。/rewind 会将代码和会话回滚到检查点;如果要完全放弃某条路径,它比压缩更合适,因为它会截断回已经缓存的前缀。/recap 会将摘要作为命令输出追加,而不是替换历史记录,因此缓存的前缀保持不变。
自动压缩反复触发时,会输出以下内容:
Autocompact is thrashing: the context refilled to the limit...压缩已成功,但文件或工具输出连续多次重新填满了上下文窗口,因此 Claude Code 停止重试。可通过按行范围读取超大文件、运行带有可丢弃大型输出的焦点指令的 /compact、将相关工作交给子代理,或在不再需要早期会话时使用 /clear 来恢复。
MCP 服务器会产生固定开销
您连接的每个 MCP 服务器都会为整个会话的每个请求增加开销。无论您是否调用它,都需要承担这部分开销。
Claude Code 会缓解这一问题。默认情况下,MCP 工具定义采用延迟加载方式,因此在 Claude 使用某个具体工具之前,只有工具名称会进入上下文。运行 /context 可查看服务器实际产生的开销,运行 /mcp disable <name> 可移除今天不会使用的服务器。如果您在 VPS 上运行自己的 MCP 服务器,同样的计算方式也决定了单个服务器应暴露多少个工具。
请在会话开始时执行此操作。在工具定义保持延迟加载的情况下,连接或断开服务器只会向对话追加内容,缓存仍会保留。如果工具搜索已禁用、不可用,或低于其 auto 阈值,导致工具定义加载到前缀中,则同样的变更会使下一个请求重新读取全部内容。
在进入上下文前过滤详细的工具输出
工具结果属于输入内容,并会在后续每一轮中重新发送。一次测试运行如果输出 20,000 个 token,这并不是一次性成本:在它离开上下文窗口前,每一轮都会再次产生成本。
在源头进行过滤。通过 hook 在 Claude 看到测试结果前只保留失败项,可以将大量输出压缩为几百个 token;当前轮次和后续每次重新发送时都能节省上下文空间:
npm test 2>&1 | grep -E "FAIL|Error:" | head -40hook 本身不会进入上下文,因为它们以代码形式运行。对于输出超过一屏的任何工具,都应采用相同方法。3,000 行的文件也是如此:只请求所需的行范围,因为完整文件进入上下文后会一直占用窗口。
限定代理读取的范围,并委派高噪声任务
明确指定文件和症状的提示只会读取该文件。要求整理项目的开放式请求会读取代理认为相关的所有内容,而且每次读取都会保留在当前上下文中。
将高输出量的任务委派给子代理。测试运行和日志处理都会消耗实际上下文;子代理会在自己的上下文中保留这些输出,只返回摘要。代价是:子代理需要建立自己的缓存,首次调用不会命中缓存;即使使用订阅,也仍采用 5 分钟的缓存生命周期。委派任务可以稳定地保护主上下文,但不一定会减少总 token 数。
缓存时钟:分段连续工作
提示词缓存让重复发送变得经济。写入前缀的费用是基础输入费率的 1.25x;使用一小时有效期时为 2x。读取缓存的费用在 Haiku 5.5 上为 0.1x,在 Opus 5.5 和 Sonnet 5.5 上为 0.05x(每百万 token 收费 $0.20 和 $0.10),在 Fable 5.1 上为 0.025x(每百万 token 收费 $0.25)。每次使用都会免费刷新条目,因此计时从上次使用开始。这些倍率只能说明账单的计算方式,不能说明具体金额。请结合每百万 token 的实际费用,将完整上下文窗口换算成美元金额。
缓存有效期取决于身份验证方式。因此,笼统地说“缓存五分钟后过期”并不准确。
- 使用 Claude 订阅时,Claude Code 会自动请求一小时有效期。
- 超出套餐限额并开始使用用量额度后,这部分用量会单独计费,因此有效期会降回五分钟。
- 使用 API key 或云服务提供商时,有效期保持为五分钟。将
promptCacheTtl设置为1h或ENABLE_PROMPT_CACHING_1H=1可启用一小时有效期,FORCE_PROMPT_CACHING_5M=1则会强制将其恢复为五分钟。
无论使用哪种有效期,工作节奏都应保持连续。因为空闲时间超过有效期后,下一轮请求必须重新写入此前累积的整个前缀。在 tmux 中运行已分离的 Claude Code 会话在空闲时不会产生费用,但空闲期间会使预热缓存失效。
即使你仍在工作,某些操作也会丢弃缓存:切换模型、在旧版模型上更改 effort level、启用 fast mode、连接或断开 MCP server、工具定义预先加载时拒绝整个工具、启用或禁用会添加工具的 plugin、执行 compact、对话包含过多图像后删除旧图像,以及升级 Claude Code。在使用 API key 或订阅时,Opus 5.5、Sonnet 5.5、Haiku 5.5 和 Fable 5.1 现在会在更改 effort level 后保留缓存。/model通常最容易造成意外,因为每个模型都有独立缓存。因此,即使内容完全相同,下一次请求仍会读取完整历史记录,且不会命中缓存。这次重新读取会按目标模型的费率计费,并作为新的缓存写入处理。因此,在会话中途切换到 Fable 时,整个累积历史记录都会按Fable 公布的缓存写入费率计费:五分钟有效期下每百万 token 收费 $12.50,一小时有效期下收费 $20;Fable 5 和 Fable 5.1 的费率相同。
编辑文件、编辑 CLAUDE.md、调用 skills 和 commands、运行 /recap、回退以及启动 subagent 都会保留缓存。缓存作用域限定为一台机器上的一个目录,因此位于不同目录的两个会话无法命中彼此的缓存。该作用域跟随 CLI,而不是你的账户。因此,这些缓存不会延续到 Claude 桌面应用;在 Linux 上,桌面应用是与 CLI 并列安装的独立 beta 版本。
要确认缓存是否生效,请读取 current_usage。cache_creation_input_tokens按缓存写入费率计费;cache_read_input_tokens按模型的缓存读取费率提供服务,具体为标准输入费率的 2.5% 到 10%,取决于模型。读取次数与创建次数的比例较高,说明缓存运行正常。如果每一轮的创建量都很高,说明前缀中的某些内容持续发生变化。
更大的上下文窗口能解决这个问题吗?
部分可以。目前所有模型(Fable 5.1、Opus 5.5、Sonnet 5.5 和 Haiku 5.5)都使用 1 million token 的上下文窗口;达到更高上限后,压缩机制的工作方式也不变。成本不会因此改变,因为每轮仍会重新发送完整提示,并按每轮计费。更大的窗口决定您何时被迫采取措施;上下文管理决定成本。如果问题在于账单而不是上限,那么哪种 Claude 方案适合您的工作方式将决定您是支付美元,还是消耗方案额度。
API 中的上下文编辑和压缩是两种不同的功能
如果您在 通过 Messages API 构建自己的代理,则不存在斜杠命令,您需要自行实现这些功能。从一开始就为这项工作预留预算,因为 除了少量注册赠金外,API 没有免费层,而且每轮请求都会重新发送未经裁剪的历史记录,并为全部内容计费:前缀处于缓存状态时按缓存读取费率计费,否则按完整输入费率或缓存写入附加费计费。您所选择的基础提供商会在进行任何裁剪前决定这套成本计算方式。因此,如果尚未确定选择,应当 在两个 API 上分别计算相同工作负载的成本,而不是比较表面上的单 token 费率。服务端有两项功能可以完成这项工作,但它们并不是同一个功能。
上下文编辑会随着对话历史增长,有选择地清除其中的特定内容,并将每项被清除的结果替换为占位文本,让 Claude 知道有内容被移除。该功能处于 beta 阶段:发送 anthropic-beta: context-management-2025-06-27,并在 context_management.edits 下配置策略。clear_tool_uses_20250919 会清除工具结果,clear_thinking_20251015 管理思考块。其 trigger 默认值为 100,000 个输入 token,keep 默认为最近 3 次工具调用,clear_tool_inputs 默认为 false,因此输入内容会保留,只清除结果。
压缩会生成摘要,并用摘要替换完整的对话历史。该功能有两种 beta 形式。阈值压缩在普通请求内部运行:发送 anthropic-beta: compact-2026-01-12,并使用编辑类型 compact_20260112。触发阈值默认为 {"type": "input_tokens", "value": 150000},且该值必须至少为 50,000。按需压缩允许您的代码决定执行时机:发送带有顶层 "compaction": {"type": "summarize"} 的 anthropic-beta: compact-2026-09-04,响应中只包含摘要块。Anthropic 的压缩概览建议,只要支持按需压缩,就应使用该方式。
阈值压缩有一项容易被忽略、但会导致代理失效的交接规则。响应以包含摘要的 compaction 内容块开头,后面是普通文本块。后续请求必须传回该内容块,API 随后会丢弃它之前的所有内容块。实际操作中,应追加完整的 response.content,而不能只追加其中的文本。按需压缩的处理方式相反:您需要自行移除已摘要的消息,将返回的内容块放在 messages 的首位,并按原样传回,包括签名。
Anthropic 的文档将服务端压缩称为管理长期运行对话上下文的主要策略,将上下文编辑称为对清除内容进行更细粒度控制的选项。请先确认模型支持情况。目前所有模型都支持这两种压缩方式,包括 Haiku 5.5;较旧的 claude-haiku-4-5 不支持。每个压缩页面都会列出实时支持列表。这些 beta 功能都不会驱动 Claude Code 自身的 /compact。其文档将该功能描述为客户端使用您的历史记录发送的独立摘要请求。
FAQ
为什么 Claude Code 会话运行时间越长,速度越慢、费用越高?
因为每一轮都会再次发送完整对话,所以在一个已经运行一整天的会话中,即使只提出一个问题,也会携带当天的全部内容。提示缓存处于有效状态时,可以降低这部分成本:在 Haiku 5.5 上,读取费用为基础输入费率的 0.1x;在 Opus 5.5 和 Sonnet 5.5 上为 0.05x;在 Fable 5.1 上为 0.025x。某一轮未命中缓存后,相同前缀会按 1.25x 的费率重新写入;使用一小时生命周期时,费率为 2x。运行 /context 查看哪些内容占用了上下文窗口,并阅读Claude Code 会话的计费内容了解其工作机制。
Claude Code 中的 /clear 和 /compact 有什么区别?
/clear 会在空上下文中开始新会话。它不会发送请求,因此不产生费用;在不相关的任务之间切换时,应使用此命令。/compact 会保留当前会话,并将历史记录替换为摘要;在同一项长期任务中,应使用此命令。请像 /compact keep only the plan and the diff 一样指定重点,因为该指令决定哪些内容会保留。
如何查看哪些内容占用了 Claude Code 上下文窗口?
运行 /context;如需查看完整的逐项明细,则运行 /context all。它会以彩色网格显示系统提示、工具定义、MCP 服务器、内存文件和历史记录,并针对占用较多上下文的工具及过大的内存内容提供建议。在付费计划中,/usage 还会将近期用量归因到具体 skill、子代理和 MCP 服务器。
我应该使用 1 million token 上下文窗口,而不是进行压缩吗?
更大的窗口只能延后问题,不能解决问题。当前每个模型(Fable 5.1、Opus 5.5、Sonnet 5.5 和 Haiku 5.5)都支持 1 million token 上下文窗口,在该窗口中压缩的行为也相同。每一轮仍会重新发送完整提示,并继续按其计费,因此一段 400,000-token 的对话无论能否容纳,费用都很高。
Claude API 中的上下文编辑和压缩有什么区别?
上下文编辑会选择性清除旧内容,主要是工具结果,并在每个被清除内容的位置保留占位文本,以便 Claude 知道这些内容已被移除。压缩会生成摘要,并用摘要替换完整历史记录。Anthropic 的文档将压缩称为长期运行会话的主要策略,并将上下文编辑定位为更细粒度的选项。两者都处于 beta 阶段,各自使用独立的请求头,并且都不同于 Claude Code 的 /compact。