AI Tools
技巧11 分钟2026年4月20日作者:AIGCDev

如何减少 Claude Code 和 Codex 长会话中的 token 浪费

结论先说

如果你的 Claude CodeCodex 会话越聊越慢、越难驾驭,或者在 API 计费场景里越跑越贵,问题通常不在于“提示词还不够好”,而在于工作流形状本身。

2026-04-17,NVIDIA 的 Dynamo 团队发布了一篇关于 agentic inference 的详细文章,里面直接用了 Claude Code 和 Codex 风格的会话作为例子。它的核心观点很实用:长编码会话本质上更像 write-once, read-many 系统。真正昂贵的是那段稳定前缀:system instructions、tool definitions、repo rules,以及任务里跨多轮都不变的部分。你越频繁改写这段前缀,就越会触发额外重算;你越能保持它稳定,系统就越有机会复用它。

如果你走的是支持 prompt caching 的 API,这种复用还可能直接降低重复输入成本。但“措辞差不多稳定”还不够。Anthropic 的 prompt-caching 文档写得很清楚:你需要可缓存的内容块和明确的 cache breakpoint,而且 cache point 必须放在后续请求里会保持完全一致的内容之后。OpenAI 的 prompt-caching 指南也说明,复用依赖精确的前缀匹配,而且只有当 prompt 至少达到 1,024 tokens 后才开始生效。如果你用的是 Claude Code 或 Codex desktop 这类捆绑产品,更稳妥的理解方式仍然应该是:把它当成 latency 和 context hygiene 优化,而不是已经被官方证明的终端计费节省。

最稳妥的默认做法其实很简单:

  • 一个会话只做一个目标,
  • 把稳定指令收进一个小而可复用的前缀,
  • 只有分支真正独立时才拆并行,
  • 在线程变成一整段聊天流水账之前,把阶段性结论沉淀到文件里,
  • 不要把当前轮次不需要的工具或文件继续挂在上下文里。

长会话会把问题放大

这个话题之所以值得现在讲,不是因为“agents 最近很火”,而是因为 2026-04-17 确实出现了新的明确信号。

NVIDIA 的官方文章指出,编码 agent 会话可能在携带一大段共享前缀的前提下连续发出数百次 API 调用。在他们公开的例子里,Claude Code 风格会话在首次写入缓存之后,后续轮次的 cache reuse 达到了 85%97%;而四 agent 团队的 aggregate cache hit rate 达到了 97.2%,read-to-write ratio 为 11.7x。这些是基础设施层面的数字,不是对每个托管产品的体验承诺。但它足够说明一个模式:长会话的成本结构,往往被“反复复用同一段上下文”主导。

如果你走的是 API 计费工作流,价格层面也会放大这个差异。

截至 2026-04-20,Anthropic 的 prompt-caching 文档写明默认缓存生命周期是 5 minutes,Anthropic 的 pricing page列出的 Sonnet 4.6 价格是输入 $3 / MTok、5 分钟 cache write $3.75 / MTok、cache read $0.30 / MTok。OpenAI 的 API pricing page 列出的 GPT-5.4 价格是输入 $2.50 / 1M、cached input $0.25 / 1MGPT-5.4 mini 则是输入 $0.75 / 1M、cached input $0.075 / 1M。如果你用的是产品捆绑套餐而不是原始 API 计费,更适合把这些数字理解为“复用经济性”和“延迟行为”的证据,而不是直接等同于产品侧账单会下降。

编码 agent 里的 token 浪费到底从哪来

大多数 token 浪费,并不是来自某一次回答答错了,而是来自你反复让模型重读太多易变上下文。

常见原因:

模式 会发生什么 更好的做法
一个聊天线程装很多无关任务 前缀越来越长,但和当前轮次真正相关的部分越来越少 目标一变就开新会话
每轮都重新解释 repo 规则 稳定指令在每轮里被重复改写、重复转述 把 repo 规则放进一个小文件,再让 agent 去读它
为了松散相关的工作乱开 subagent 每个分支都要冷启动,还可能重复携带 setup 上下文 只有输出可以独立审阅时才拆分
把整段文件和日志直接倒进聊天 线程会一直背着那些已经没用了的旧细节 把结果沉淀成 note、diff 或 issue comment
长时间保持很多工具都在作用域里 tool schema 和权限边界都会增加上下文长度和复杂度 只保留当前任务必需的工具

Tip 1:把稳定指令当成前缀,而不是聊天噪音

如果一条规则会在大多数轮次里长期成立,它就不该反复出现在来回对话里。

Anthropic 的 prompt-caching 文档在这里很有参考价值,因为它把缓存结构理解为“后续对话之前的一段稳定前缀”。Anthropic 的 Claude Code memory 文档则把同样的逻辑搬到了工作流层面:把持久的项目规则放进 CLAUDE.md,而不是每轮都重新说一遍。

如果你直接走 API,把这条原则再具体一点。Anthropic 文档里,cache hit 取决于你把 breakpoint 放在哪里,以及可复用前缀是否足够长,达到模型要求的最小可缓存长度。OpenAI 文档里,可复用部分必须从 prompt 开头开始精确匹配,不是“意思差不多”就行。“大体相同”和“真正可缓存”不是一回事。

如果你就在这些产品里工作,还应该直接用它们原生的会话控制手段。截至 2026-04-20,Anthropic 的 Claude Code commands 文档列出了 /compact,用于压缩当前对话;也列出了 /clear,用于清空历史后重新开始。OpenAI 的 Introducing the Codex app 则说明,Codex agents 运行在按 project 组织的独立 threads 里,而且 app 内置了 worktrees。落到实操上,意思就是:

  • 在 Claude Code 里,如果目标没有变,但 transcript 已经膨胀到很难带着继续走,就用 /compact;如果旧历史已经变成死上下文,就用 /clear
  • 在 Codex 里,更应该优先开一个新 thread;如果代码路径也已经分叉,再配一个新的 worktree,而不是强行把无关工作塞进同一个长会话里。

适合收进稳定前缀的内容包括:

  • repo conventions
  • coding style rules
  • test commands
  • review checklist
  • approval boundaries
  • 整个任务期内都有效的产品文档或 API 文档链接

对 Claude Code 来说,这通常意味着一个足够紧凑的项目说明文件,例如 CLAUDE.md,或者其他 repo 文档。对 Codex 来说,这意味着一个尽量短、尽量稳定的 task brief,再加上放在文件里的项目说明,而不是每条消息都把相同约束再粘贴一遍。

反例:

Use TypeScript. Also keep accessibility in mind. Also do not change analytics. Also prefer server components. Also keep changes small. Also run the same test command as before.

更好的写法:

Use the repo rules in AGENTS.md.
Task: fix the mobile checkout validation error without changing analytics or auth flows.
Stop after code changes plus the exact verification commands.

这个变化看起来很小,其实不是。它把稳定指令从一堆越积越多的转述,变成了可复用前缀的一部分。

Tip 2:一个会话只做一个目标

一个编码线程应该只有一条明确的终点线。

好的会话边界:

  • 一个 bug
  • 同一子系统内的一次重构
  • 一轮 PR review
  • 一次 setup 或 migration 任务
  • 一篇有明确验证路径的文档改动

不好的会话边界:

  • “顺手把 repo 也清理一下”
  • “顺便把文档更新、CI 修了、价格对比也查了、这个 PR 也看了”
  • “把这条聊天当成我整周的通用编码工作区”

一个很好用的重置判断规则是:

  • 如果 acceptance test 变了,开新会话;
  • 如果主工作目录变了,大概率也该开新会话;
  • 如果你在问新任务之前,不得不先花一段话解释旧上下文,那就一定该开新会话。

这也是 worktree 真正有用的地方。新的 worktree 会给你新的分支、更小的 diff,以及一个天然适合开启新 agent 会话的环境。

git worktree add ../repo-fix-checkout -b fix-checkout-validation
cd ../repo-fix-checkout

Tip 3:并行 agent 只用在真正独立的分支上

NVIDIA 的2026-04-17 文章有个很重要的价值:它把 lead agent 和 subagents 区分开了,而不是假装所有并行都没有成本。

当每个分支都能回答一个很窄的问题时,并行是有帮助的,比如:

  • trace 一个 failing test,
  • inspect 一次 dependency upgrade,
  • review 一个文件夹里的 dead code,
  • compare 两种 implementation option。

当每个分支都需要整套 repo 背景和完整聊天历史时,并行就会开始伤害效率。

对 API 用户来说,这里还有一个 cache timing caveat。Anthropic 的 prompt-caching 文档说明,cache entry 要等到第一个响应开始之后才会对其他请求可用。OpenAI 的 prompt-caching 指南则说明,当很多请求同时带着相同前缀到达时,cache routing 可能会降低实际效果。所以,如果你想让共享前缀真的产生帮助,更稳妥的做法是:先让一个 lead request 把前缀“热起来”,再向外拆分成更窄的分支。

在你决定要不要再开一个 agent 之前,可以先用这个判断:

  • If the subtask can end with a small memo, diff, or yes/no recommendation, spawn it.
  • If the subtask needs the full evolving plan, keep it in the main thread.

一个紧凑的 delegation prompt,通常比把整个聊天历史都转发过去更有效:

Check only `src/payments/` for why the checkout form sends duplicate validation events.
Do not edit files.
Return:
1. likely root cause,
2. exact files involved,
3. whether the fix is low, medium, or high risk.

这样做既保留了独立性,也限制了每个分支必须携带的上下文长度。

Tip 4:在线程变成日志档案之前先做里程碑摘要

长编码聊天会变差,往往不是因为旧探索错了,而是因为旧探索一直留在活跃上下文里。

更好的模式是:在关键里程碑,把临时推理转成可持久引用的简短记录,例如:

  • repo exploration 之后,
  • root cause 找到之后,
  • fix path 选定之后,
  • verification 完成之后,
  • 交接给其他 agent 或其他人之前。

这个摘要应该短,而且最好有文件承载。

里程碑 note 示例:

## Checkout validation checkpoint
- Root cause: `useCheckoutValidation` fires both on blur and on submit for the same empty state.
- Files: `src/features/checkout/useCheckoutValidation.ts`, `src/features/checkout/CheckoutForm.tsx`
- Safe fix path: dedupe submit-time emission when blur already marked the same field invalid.
- Verify with: `bun test src/features/checkout` and manual mobile checkout flow.

它能给下一轮一个干净锚点,比拖着 60 轮探索历史继续前进要好得多。

Tip 5:长会话里把工具作用域收紧

每多一个工具、连接器或权限面,都会带来更多无关上下文、更长的 tool definitions,以及暂停后更慢的恢复成本。

截至 2026-04-16,OpenAI 的 Codex update post 已经把产品面扩展得很大:browser actions、plugins、memory、multiple terminals、review-comment handling、automations 都在里面。这当然有用,但它也更容易让你把一个会话做成“活跃表面太多”的状态。

最安全也最有效的默认做法其实很朴素:

  • 只启用当前任务需要的工具,
  • 只有真的必须时才打开 browser 或 desktop control,
  • 不要因为“以防万一”就把额外 docs、logs、screenshots 一起挂进去,
  • 把长期 memory 留给稳定偏好,而不是临时项目状态。

对 Claude 一侧的工作流也是一样。缓存那些会长期稳定的部分,不要让 live thread 一直堆满临时碎片。

一个通常能减少浪费的会话模板

启动一个非 trivial 编码任务时,可以先用这个模板:

You are helping with one bounded coding task.
Goal: fix [specific problem].
Scope: only [files, folders, or subsystem].
Constraints: follow repo rules in [file]; do not change [out-of-scope areas].
Tools: use only what is needed for this task.
Process:
1. inspect,
2. propose the smallest fix,
3. apply it,
4. run the exact verification commands,
5. stop.
Return a short checkpoint summary before any optional follow-up work.

它之所以有效,是因为它把前缀稳定下来,也给了会话一条明确的停线。

什么时候别再优化这条线程,而是直接重开

遇到下面这些情况时,直接重开一个新会话,通常比继续挽救旧线程更划算:

  • agent 已经在错误理解上跑了很多轮,
  • 你接受的计划已经变了,
  • 真正相关的 repo 区域已经完全换了,
  • 线程里已经堆满了大量死上下文,
  • 你现在需要的是一条比现有线程更干净的 review 记录。

很多时候,重开一条干净会话,比硬救一条臃肿线程更省事。

常见问题

只有按 token 计费时,这些建议才有意义吗?

不是。账单信号在 API 定价里最清楚,但同样的复用逻辑,在捆绑产品里也可能表现为更好的延迟和会话质量。

有了 prompt caching,是不是就能无限拉长同一个大线程?

不能。Anthropic 的文档把 prompt caching 定义为前缀复用,不是给你一张“无论上下文多乱都能继续加”的许可证。相关性仍然重要。

我是不是应该总是用 subagents 来提速?

不是。只有当分支能保持很窄,而且能返回一个边界清楚的结果时,subagents 才真的值。否则你只是制造了多个冷启动,再加上一轮新的 review 成本。

summary file 真的比聊天历史更好吗?

通常是。一个有文件承载的短摘要,会把下一轮重新锚定在你仍然关心的事实之上;而完整聊天记录会继续把所有东西都背在上下文里。

核验说明

核验时间:2026-04-20

核验官方来源:

claude-codecodexai-codingtoken-costprompt-cachingagent-workflowdeveloper-tools