降低 AI 编程成本:
6 个必须掌握的上下文管理技巧
同样一个任务,换一种问法、换一种会话习惯,烧掉的 token 可能差出好几倍。先从一道选择题开始,再跟着原文的思路一层层抽丝剥茧,把每个 token 都花在刀刃上。
开篇一问:三种问法,哪种最烧 token?
任务是同一个 —— 修复 utils.test.ts 里失败的测试,交给 Claude Code 去做。下面三种问法,先别往下滑,凭直觉猜一猜:哪种花掉的 token 最多?想好了,就点卡片下方的按钮揭晓。
- 🔍 grep(按关键词搜代码)找测试文件
- 📄 打开 a.test.ts —— 不是它
- 📄 打开 b.test.ts —— 也不是
- 📄 读取 utils.ts —— 找到了!
- 📄 Read utils.test.ts
- 📄 顺带读被测文件 utils.ts
- 🛠️ 修复 + 跑测试
- 📎 首条消息已包含文件全文
- 🛠️ 直接修复 + 跑测试
- ✅ 完成,零探索
先看全局:一次对话的成本由什么组成?
Claude Code 按 token(模型处理文本的计费单位,约等于大半个英文单词)计费。原文把「一次会话要花多少钱」拆成两个可以分别下手的量 —— 单价(每个 token 卖多少钱)和数量(一个会话一共发出多少 token)。想省钱,要么把单价打下来,要么把数量压下去,整篇文章的所有技巧都落在这两条线上:
核心点 ①:一个 token 的价格由什么决定?
三个因素决定单价 —— 模型、输入还是输出、有没有命中缓存。前两个好理解,第三个是大多数新手完全不知道的「隐藏开关」。
🧠1.1 模型:一切的「乘数」
同样的 token 数量,大模型的单价更高,所有成本都会乘上模型价格。所以第一问永远是:这个任务配得上大模型吗?
- 值得上大模型:陌生代码库的排查、复杂的跨文件重构。
- 小模型就够:格式调整、写简单测试、日常小修小补。
⌨️1.2 输入 vs 输出:输出贵得多
模型「读」你的上下文叫 prefill(输入),便宜;模型「写」答案叫 decode(输出),大约是输入的 5 倍价格。特别提醒:Claude 的「思考过程」(thinking tokens)也算输出 —— 思考得越久,花得越多。
- Claude Code 提供 effort 档位:effort 越高,思考越多、越贵。
- 日常小任务调低 effort:/effort
- 想彻底关掉思考:MAX_THINKING_TOKENS=0(环境变量,写在 settings.json 的 env 里,或在 shell 中导出)
⚡1.3 Prompt 缓存:最容易被忽略的省钱开关
模型服务商会缓存你对话的「前缀」:如果新一轮请求的开头和上一轮一模一样,缓存命中的部分就按 0.1 倍计价(原价的十分之一);写一次缓存最多收 2 倍,但只付一次。这就是为什么长对话没有想象中那么贵 —— 历史部分都在打折。
⚠️ 什么会「打断」缓存?
缓存按前缀匹配:一旦开头有任何变化,变化点之后的所有内容都要按全价重新处理一遍。看下图:
真正容易让缓存失效的,是下面这 6 个操作:
核心点 ②:一个会话会发出多少 token?
先记住这条铁律:任何东西一旦进入会话,之后每一轮都会重新发送一次。缓存让重发变便宜,但不是免费,而且它一直占着上下文的「座位」。这一部分分两块:先弄懂两个背景(每轮重发、上下文构成),再看四个典型问题与对应的优化技巧。
🔁背景一:每一轮都在重发
API 是无状态的:模型不记得上一轮说过什么,所以每轮请求都要把完整历史再发一遍。下面这条传送带会一直向左滚动 —— 想象它就是你的上下文,每一轮都在循环:
⬆ 滚动方向=请求方向。想减少总量,就是下面四个技巧要做的事:提问更明确(2.1)、输出更安静(2.2)、会话更短(2.3)、脏活外移(2.4)。
📦背景二:上下文里有什么
- 还没说话就有的:工具定义(告诉 Claude 有哪些工具可用的清单)、系统提示(Claude 每次自带的行为说明)、CLAUDE.md(放在项目里、每轮自动附给 Claude 的说明文件)—— 这是「底座」,每轮都在。
- 聊着聊着进来的:Claude 读过的每一个文件、每一条命令的输出。
- CLAUDE.md 要精简:不要塞满整个项目的说明,只留 Claude 干活真正需要的。
- 定义清楚的工作流 → 用 Skills(放在 .claude/skills/ 的按需加载技能包):只在需要时才载入,比常驻 CLAUDE.md 划算得多。
- MCP 服务器(给 Claude 外接工具的服务)自带工具定义:每个都会加进上下文,动辄 10k+ tokens。用 /mcp 查看各占了多少。
🎯技巧 2.1 提问指向明确:少走探索弯路
- 「测试挂了,帮我看看」→ Claude 只能自己 grep、逐个开文件试错,探索痕迹全程占着上下文;
- 「请修复 utils.test.ts」→ 说清了文件名,读取测试文件和被测文件,一步到位;
- 「@utils.test.ts 修一下这个」→ 最省:文件内容直接附在你的第一条消息里,Claude 零探索、直接开工。
🔕技巧 2.2 让命令输出安静下来
- 用安静模式的 flags:npm run -s test、git log --oneline、pytest 的 -q、构建工具的 dot 进度。
- 更省心的做法:把「带安静 flag 的完整命令」直接写进 CLAUDE.md —— 例如「跑单个测试文件用 npx vitest run <file> --reporter=dot」。Claude 不用再摸索命令,还能省下几百行输出(也可以用 hook 自动加安静参数)。
✂️技巧 2.3 按主题拆会话,及时翻篇
- /clear 清空重开 —— 最干脆的翻篇。小技巧:clear 前先 /rename 给会话起个名字,之后用 claude --resume 就能找回来。
- 舍不得丢上下文?/compact 想保留的说明 —— 把历史压缩成摘要再继续。
- 准备休息或切走?趁缓存还热先 /compact —— 订阅的缓存约 1 小时过期,趁它还在时做摘要,比过期后全价重来便宜得多。
- 可以告诉它压缩时保留什么:在 CLAUDE.md / 设置里配置 Compact instructions。
- 用 1M 上下文模型的用户:/autocompact 200k(v2.1.221+)把自动压缩阈值调低,避免上下文涨满才压缩。
- /loop 很贵:它会反复触发 Claude。运行它时,最好开一个全新的终端窗口。
🧩技巧 2.4 把高输出的脏活外包给子代理
再放大视角看一张原文的图 —— 「一次对话,四个上下文」:你面对的主会话是 1 个上下文;它同时派出的 3 个子代理(翻构建日志、跑完整测试、搜 git 历史),又各自拥有 1 个独立上下文。注意三个细节:
- 启动成本各自要付一份(紫色部分):每个子代理都要带上自己的系统提示+工具+CLAUDE.md,这是「同时跑几个上下文」的固定开销;
- 中间过程全部留在子代理自己的上下文里(橙色「读了什么、跑了什么」):巨量输出不进主会话,任务完成即整体丢弃(discarded when done);
- 只有绿色的一小段「答案」被带回主会话,追加到你的对话末尾,继续参与后面的轮次。
核心点 ③:感觉太贵,先看哪里?
官方给出的「四件事」清单 —— 按花销从大到小排序。账单不对劲时,从 1 号开始查。
⏳长会话
每一轮都在重发之前的一切 —— 这是会话 token 的最大去处。
- 一个任务一个会话,做完就 /clear(先 /rename 留档)
- 舍不得丢就 /compact,并写好要保留什么
📦上下文太杂
不需要的文件、吵闹的命令输出、上个任务的残留、没在用的 MCP 服务器 —— 全都每轮重发。
- /context 检查构成;精简 CLAUDE.md;工作流用 Skills
- /mcp 查 MCP 占用;命令加安静 flags
🧠模型 / effort 高于任务需要
它乘在所有成本上,而且这个设置会跨会话保留 —— 上次调高的档位,这次可能还在。
- 日常任务 /model 换小模型、/effort 调低
- 彻底关思考:MAX_THINKING_TOKENS=0
⚡打断了 Prompt 缓存
中途换模型 / 调 effort / 切 fast mode、缓存过期后回来 —— 整段对话全价重算。
- 昂贵的切换动作放在会话开头或 /clear 之后
- 最近几轮走偏用 /rewind 回退:比 /compact 便宜,缓存仍命中
总结:常用的方法
原文结尾 TL;DR 给出的六条建议 —— 正好对应前面的核心点 ①②③,也是日常最常用的六个习惯。
/model)—— 模型价格会乘在所有成本上。/effort 调低,机械任务可 MAX_THINKING_TOKENS=0 彻底关掉思考。/clear 之后做;休息前趁缓存还热先 /compact。/context 和 /mcp 定期检查谁在占上下文。--reporter=dot)。/clear 前先 /rename);要保留就 /compact;高输出、低保留的活交给子代理。📖 本页内容改编自 Anthropic 官方博客 《Maximizing the value of your Claude Code sessions》(2026-08-14),按原文顺序逐点图解
⚠️ 文中倍率(输出≈5×、缓存读 0.1×、写≤2×、缓存时效 1h/5min、1.9× 对比)均来自原文口径,实际价格以官方定价页为准。
AI技巧