AI技巧
学习中

1 / 1

课件阅读

降低 AI 编程成本:
6 个必须掌握的上下文管理技巧

同样一个任务,换一种问法、换一种会话习惯,烧掉的 token 可能差出好几倍。先从一道选择题开始,再跟着原文的思路一层层抽丝剥茧,把每个 token 都花在刀刃上。

📖 改编自 Anthropic 官方博客 🗓 原文发布:2026-08-14 🎯 适合:刚上手 Claude Code 的你

开篇一问:三种问法,哪种最烧 token?

任务是同一个 —— 修复 utils.test.ts 里失败的测试,交给 Claude Code 去做。下面三种问法,先别往下滑,凭直觉猜一猜:哪种花掉的 token 最多?想好了,就点卡片下方的按钮揭晓。

「测试挂了,帮我看看」
Claude 只能自己找:
  1. 🔍 grep(按关键词搜代码)找测试文件
  2. 📄 打开 a.test.ts —— 不是它
  3. 📄 打开 b.test.ts —— 也不是
  4. 📄 读取 utils.ts —— 找到了!
≈ 4 次探索全部留在上下文里,之后每一轮都要把它们重发一遍 —— 账单越滚越大
「请修复 utils.test.ts」
Claude 直奔目标:
  1. 📄 Read utils.test.ts
  2. 📄 顺带读被测文件 utils.ts
  3. 🛠️ 修复 + 跑测试
说清了文件名,1~2 次读取直达目标,探索的痕迹少了很多
「@utils.test.ts 修一下这个」
文件直接搭在你的消息上:
  1. 📎 首条消息已包含文件全文
  2. 🛠️ 直接修复 + 跑测试
  3. ✅ 完成,零探索
0 次额外读取 —— 文件内容在第一条请求里就到位了
💡只是换了个问法,成本就差出一截 —— 为什么?先看一次对话的成本怎么组成,再跟着原文逐个拆开:一个 token 的价格由什么决定(核心点 ①)→ 一个会话会发多少 token(核心点 ②)→ 感觉太贵先查哪里(核心点 ③)

先看全局:一次对话的成本由什么组成?

Claude Code 按 token(模型处理文本的计费单位,约等于大半个英文单词)计费。原文把「一次会话要花多少钱」拆成两个可以分别下手的量 —— 单价(每个 token 卖多少钱)和数量(一个会话一共发出多少 token)。想省钱,要么把单价打下来,要么把数量压下去,整篇文章的所有技巧都落在这两条线上:

🗺️ 一次会话的成本地图:单价 × 数量
单价:每个 token 多贵 数量:一共发了多少
一次会话的成本 = 单价 × 数量 单价:每个 token 多贵 核心点 ① 数量:一共发了多少 核心点 ② 🧠 用了哪个模型 大模型更贵 —— 所有成本都会被模型单价相乘。 难题用大模型,日常任务用小模型(/model ⌨️ 输出 ≈ 输入的 5 倍价格 思考(thinking)也算输出。用 /effort 控制思考量, 日常小改动几乎不需要「深思熟虑」。 ⚡ 是否命中 Prompt 缓存:命中 ×0.1,失效全价 📦 上下文里有什么 启动就带上:工具定义+系统提示+CLAUDE.md; 会话中累积:读过的文件、命令输出。 🔁 每轮重发 × 轮数 API 不记得上一轮 —— 每次请求都重发全部历史。 同样的三个任务,一个长会话=短会话的 1.9 倍 token。 🧩 同时跑几个上下文:子代理自带上下文,只带回答案
接下来就按这个框架,把左右两半逐个拆开讲。(图里先出现的术语:CLAUDE.md = 项目里每轮自动附给 Claude 的说明文件,详见核心点 ② 的背景二;Prompt 缓存详见 1.3;子代理详见 2.4)

核心点 ①:一个 token 的价格由什么决定?

三个因素决定单价 —— 模型、输入还是输出、有没有命中缓存。前两个好理解,第三个是大多数新手完全不知道的「隐藏开关」。

🧠1.1 模型:一切的「乘数」

同样的 token 数量,大模型的单价更高,所有成本都会乘上模型价格。所以第一问永远是:这个任务配得上大模型吗?

  • 值得上大模型:陌生代码库的排查、复杂的跨文件重构。
  • 小模型就够:格式调整、写简单测试、日常小修小补。
/model  # 随时切换模型

⌨️1.2 输入 vs 输出:输出贵得多

模型「读」你的上下文叫 prefill(输入),便宜;模型「写」答案叫 decode(输出)大约是输入的 5 倍价格。特别提醒:Claude 的「思考过程」(thinking tokens)也算输出 —— 思考得越久,花得越多。

  • Claude Code 提供 effort 档位:effort 越高,思考越多、越贵。
  • 日常小任务调低 effort:/effort
  • 想彻底关掉思考:MAX_THINKING_TOKENS=0(环境变量,写在 settings.json 的 env 里,或在 shell 中导出)
📌记住这个量级:输出 ≈ 5 × 输入。在 1.3 的「请求动画」里,红色专指「贵 5 倍的输出」;后面其他图中的红 / 橙 / 绿,统一表示「更贵 / 适中 / 更省」的相对档位。

1.3 Prompt 缓存:最容易被忽略的省钱开关

模型服务商会缓存你对话的「前缀」:如果新一轮请求的开头和上一轮一模一样,缓存命中的部分就按 0.1 倍计价(原价的十分之一);写一次缓存最多收 2 倍,但只付一次。这就是为什么长对话没有想象中那么贵 —— 历史部分都在打折。

🎬 动画:一句 prompt,五次请求 —— 看缓存如何一步步「长大」
缓存命中 ×0.1 新增输入 ×1 输出 ×5
📄 对话上下文(越攒越厚) 🧰 系统提示+工具定义+CLAUDE.md 💬 你的消息「修复 utils.test.ts」 📄 Read 调用+utils.test.ts 文件内容 📄 Read 调用+utils.ts 文件内容 🛠️ Edit 调用+修改 diff 🧪 npm test 测试输出 📝 一段简短总结(纯输出,未被重发) ↑ 每一次请求,这一整摞都会全部重发 📮 每一轮:发送了什么 ↔ 模型回应了什么 1 请求 1 · 全部全价 + 写一次缓存 📤 发送(输入)↓ 🤖 回应(输出)↓ 组装的上下文 ×1(写入缓存) ×5 🤖 想了一会儿 → Read:读取 utils.test.ts → 结果追加到左侧 2 请求 2 · 旧内容走缓存,只有新文件全价 缓存 0.1× ✓ 新文件 ×1 ×5 🤖 Read:读取被测文件 utils.ts → 结果追加到左侧 3 请求 3 · 前两轮走缓存,第二个文件全价 缓存 0.1× ✓(更长) 新文件×1 ×5 🤖 Edit:修改代码 → 结果追加到左侧 4 请求 4 · 之前的内容走缓存,Edit/diff 正价 缓存 0.1× ✓ diff ×1 ×5 🤖 工具调用:运行 npm test → 结果追加到左侧 5 请求 5 · 只有测试输出全价 缓存 0.1× ✓(越长越便宜) 测试×1 ×5 🤖 一段简短总结(没有工具调用) → 无新内容,结束 ⏹ 测试通过,模型输出一段简短总结 —— 没有新的工具调用、没有内容要追加,不会再产生第 6 次请求,任务到此结束 一句看起来很简单的 prompt,背后实际发出了 5 次模型请求;而且每一次请求,都会带上到当前为止的完整对话。 每一轮请求都极其不对称: 输入 · 可能有几万个 token 输出·几百个 输出虽小,单价却约是输入的 5 倍 —— 所以「过度思考」也在悄悄烧钱
左边是对话上下文的真实构成,右边是每一轮请求的缓存与计价情况。可以自动播放,也可以点数字逐轮讲解 —— 结尾揭示两件事:一句 prompt 背后是 5 次请求;每一轮「输入几万、输出几百」,极度不对称。

⚠️ 什么会「打断」缓存?

缓存按前缀匹配:一旦开头有任何变化,变化点之后的所有内容都要按全价重新处理一遍。看下图:

🧱 前缀断裂示意:断在哪里,哪里之后全价重算
✅ 理想:在结尾追加新消息 —— 前缀原样命中 系统提示 CLAUDE.md 对话轮 1×0.1 命中 对话轮 2×0.1 命中 对话轮 3×0.1 命中 新消息 唯一全价 只有末尾的橙色块按 ×1 计价,其余历史全部 ×0.1 —— 这就是缓存最喜欢的方式 ❌ 危险:改动了中间(如切换模型 / 调 effort)—— 前缀从此断裂 系统提示 CLAUDE.md ⚙️ 设置变了 断点! 对话轮 1 全价重算 ×1 对话轮 2 全价重算 ×1 对话轮 3 全价重算 ×1 断点之后的整段对话都要按全新价格重新 prefill —— 对话越长,这一下越贵
断点在哪里,哪里之后的内容就要全价重算 —— 而下面这 6 个操作,每一个都能制造这样的断点。

真正容易让缓存失效的,是下面这 6 个操作:

1/model中途换模型
每个模型都有它自己的缓存。在长对话中途换模型,下一轮可能需要按正常价格重新 prefill 整个会话
2/effort中途调 effort
effort level 也是缓存 key 的一部分。中途修改 effort,效果和切换模型类似
3⚡ 中途开启 Fast mode
是否开启 Fast mode(少思考的快速档位开关)同样属于缓存匹配条件。中途开启后旧缓存无法继续匹配,整个会话会按 Fast mode 的价格重新 prefill —— 要用就尽量从 Session 一开始用
4/compact压缩上下文
压缩后只有开头的 system prompt 能继续保留,其余上下文都被压缩。不过只要旧对话还在缓存里,压缩的开销并不大 —— 所以准备离开很久时,最好先 compact 再离开
5⏱ Time:缓存超时
每一轮都会重新计算缓存时间:订阅模式下通常 1 小时过期;API key 默认 5 分钟(设置 ENABLE_PROMPT_CACHING_1H=1 可延长到 1 小时)。超过这个时间,下一轮往往需要重新 prefill 整个对话。
6💾 恢复旧 Session
缓存大概率已经过期,而且 system prompt 在启动时也会被重新构建 —— 通常同样需要全价重新 prefill
便宜的时刻:会话刚开头、刚 /clear 之后 —— 反正没什么可失去,「切模型 / 调 effort」这些动作放在这里最划算。
⚠️贵的时刻:长对话进行到一半才去切模型。最近几轮走偏想回退?/rewind 回到走偏前的轮次 —— 只从尾部剪掉几轮,前面的缓存照常命中,比 /compact 便宜得多。

核心点 ②:一个会话会发出多少 token?

先记住这条铁律:任何东西一旦进入会话,之后每一轮都会重新发送一次。缓存让重发变便宜,但不是免费,而且它一直占着上下文的「座位」。这一部分分两块:先弄懂两个背景(每轮重发、上下文构成),再看四个典型问题与对应的优化技巧

🧠 背景 · 会话的 token 从哪来

🔁背景一:每一轮都在重发

API 是无状态的:模型不记得上一轮说过什么,所以每轮请求都要把完整历史再发一遍。下面这条传送带会一直向左滚动 —— 想象它就是你的上下文,每一轮都在循环:

⬆ 滚动方向=请求方向。想减少总量,就是下面四个技巧要做的事:提问更明确(2.1)、输出更安静(2.2)、会话更短(2.3)、脏活外移(2.4)

📦背景二:上下文里有什么

  • 还没说话就有的:工具定义(告诉 Claude 有哪些工具可用的清单)、系统提示(Claude 每次自带的行为说明)、CLAUDE.md(放在项目里、每轮自动附给 Claude 的说明文件)—— 这是「底座」,每轮都在。
  • 聊着聊着进来的:Claude 读过的每一个文件、每一条命令的输出。
🔎随手用 /context 看一眼当前上下文的构成 —— 这是发现「谁在偷吃 token」的第一步。
  • CLAUDE.md 要精简:不要塞满整个项目的说明,只留 Claude 干活真正需要的。
  • 定义清楚的工作流 → 用 Skills(放在 .claude/skills/ 的按需加载技能包):只在需要时才载入,比常驻 CLAUDE.md 划算得多。
  • MCP 服务器(给 Claude 外接工具的服务)自带工具定义:每个都会加进上下文,动辄 10k+ tokens。用 /mcp 查看各占了多少。
🛠️ 问题与技巧 · 四个典型场景

🎯技巧 2.1 提问指向明确:少走探索弯路

问题:「测试挂了,帮我看看」这类模糊提问会触发一长串搜索 —— Claude 要用 grep(按关键词搜代码)、逐个打开文件试错,整个探索过程留在上下文里,之后每轮重发。开篇那道选择题的答案,正是这个问题。
技巧:把目标说清楚,探索链立刻变短 —— 问法越具体,Claude 白跑的路越少:
  • 「测试挂了,帮我看看」→ Claude 只能自己 grep、逐个开文件试错,探索痕迹全程占着上下文;
  • 「请修复 utils.test.ts」→ 说清了文件名,读取测试文件和被测文件,一步到位;
  • 「@utils.test.ts 修一下这个」→ 最省:文件内容直接附在你的第一条消息里,Claude 零探索、直接开工。
📎小提示:同一个会话里 @ 引用一次就够,之后 Claude 记得住,不必每次都带。

🔕技巧 2.2 让命令输出安静下来

问题:命令的输出会整个进入上下文 —— 大目录里 grep 一次,可能就灌进几万 token 的结果。Claude Code 的保护机制(超过约 30,000 字符的输出写进文件、只给开头预览,BASH_MAX_OUTPUT_LENGTH 可调)也管不到真正的危险区:30k 以下,比如 400 行「测试全绿」—— 每一行都在稀释关键信息,还每轮重发。
技巧:让输出只留下有用的部分 ——
  • 用安静模式的 flags:npm run -s testgit log --oneline、pytest 的 -q、构建工具的 dot 进度。
  • 更省心的做法:把「带安静 flag 的完整命令」直接写进 CLAUDE.md —— 例如「跑单个测试文件用 npx vitest run <file> --reporter=dot」。Claude 不用再摸索命令,还能省下几百行输出(也可以用 hook 自动加安静参数)。
📏判断标准很简单:这条输出里,对任务有用的信息占比有多高?「全绿的 400 行」有用的只有最后一行。

✂️技巧 2.3 按主题拆会话,及时翻篇

问题:长会话上下文越攒越多,每一轮都在为所有历史买单。同样三个任务,「一口气做完」和「每个任务一个短会话」差多少?看官方给出的对比:
📊 同样的三个任务,两种做法的 token 总量
推荐:任务之间 /clear → 合计 1.0× 不推荐:一个长会话连做 → 合计 1.9×
✅ 三个短会话(任务之间 /clear) 任务 1 /clear清空 任务 2 /clear清空 任务 3 合计 1.0× 只重发自己 ❌ 一个长会话(连着做) 任务 1 任务 2 = 自己 + 重发任务 1 的历史(任务1 变成了甩不掉的行李) 任务 3 = 自己 + 重发 1+2 的全部历史上下文越滚越大 合计 1.9× 多付近一倍 长会话不是「错」—— 深入调试时值得。 但要清楚:它每一轮都在为更长的历史买单。 💡 结论:按「主题」开会话,做完一个就翻篇 —— 一个任务一个会话
重绘自原文对比图(柱宽为示意,非实测数据):同样的三个任务,一个长会话约消耗 1.9 倍 token。
技巧:按「主题」开会话,做完一个就翻篇 ——
  • /clear 清空重开 —— 最干脆的翻篇。小技巧:clear 前先 /rename 给会话起个名字,之后用 claude --resume 就能找回来。
  • 舍不得丢上下文?/compact 想保留的说明 —— 把历史压缩成摘要再继续。
  • 准备休息或切走?趁缓存还热先 /compact —— 订阅的缓存约 1 小时过期,趁它还在时做摘要,比过期后全价重来便宜得多。
  • 可以告诉它压缩时保留什么:在 CLAUDE.md / 设置里配置 Compact instructions
  • 用 1M 上下文模型的用户:/autocompact 200k(v2.1.221+)把自动压缩阈值调低,避免上下文涨满才压缩。
  • /loop 很贵:它会反复触发 Claude。运行它时,最好开一个全新的终端窗口

🧩技巧 2.4 把高输出的脏活外包给子代理

问题:日志分析、全量测试这类活「输出巨大、答案很小」,让主会话亲自干 —— 巨量中间过程会留在上下文里,之后每轮重发。
技巧:外包给子代理 —— 一个拥有独立上下文的 Claude 实例:有自己的系统提示、工具集和 CLAUDE.md,但看不到你的对话历史。它干完活,只有最终答案被带回主会话,其他一切直接丢弃。
🎪 子代理的上下文隔离:脏活不进你的会话
🏠 主会话(你的对话) 💬 你:「分析一下构建日志,为什么挂了」 🤖 Claude:我派一个子代理去处理 ✅ 主会话只收到:最终答案 上下文保持干净 —— 没有日志、没有中间过程 派出任务 只带回答案 🎁 🧩 子代理(独立上下文,与你隔离) 📜 自带:自己的系统提示 + 工具 + CLAUDE.md 🌀 干脏活:读完整日志 / 反复跑测试(输出量巨大) 🔍 中间过程:grep、翻文件、报错堆栈…… 🗑️ 任务结束:除答案外全部丢弃,不占主会话一个 token 划算场景:输出巨大、答案很小 的任务(日志分析、全量测试);小任务反而可能亏(子代理要重读文件、自己也要花轮次)
高输出、低保留的任务最适合外包。重复出现的脏活,用 /agents 定义一个专用子代理(模型可指定 haiku / sonnet 等便宜档)来干。

再放大视角看一张原文的图 —— 「一次对话,四个上下文」:你面对的主会话是 1 个上下文;它同时派出的 3 个子代理(翻构建日志、跑完整测试、搜 git 历史),又各自拥有 1 个独立上下文。注意三个细节:

  • 启动成本各自要付一份(紫色部分):每个子代理都要带上自己的系统提示+工具+CLAUDE.md,这是「同时跑几个上下文」的固定开销;
  • 中间过程全部留在子代理自己的上下文里(橙色「读了什么、跑了什么」):巨量输出不进主会话,任务完成即整体丢弃(discarded when done)
  • 只有绿色的一小段「答案」被带回主会话,追加到你的对话末尾,继续参与后面的轮次。
原文配图:一次对话四个上下文——主会话加三个并行子代理,各自有启动成本与中间过程,只有答案回到主会话
原文配图「One conversation, four contexts」(原文配色):紫色=启动内容(每个上下文各付一份);蓝色=你们的对话;橙色=子代理读了/跑了什么(用完即弃);绿色=最终带回主会话的答案。

核心点 ③:感觉太贵,先看哪里?

官方给出的「四件事」清单 —— 按花销从大到小排序。账单不对劲时,从 1 号开始查。

1 号大坑

长会话

每一轮都在重发之前的一切 —— 这是会话 token 的最大去处。

  • 一个任务一个会话,做完就 /clear(先 /rename 留档)
  • 舍不得丢就 /compact,并写好要保留什么
2 号大坑

📦上下文太杂

不需要的文件、吵闹的命令输出、上个任务的残留、没在用的 MCP 服务器 —— 全都每轮重发。

  • /context 检查构成;精简 CLAUDE.md;工作流用 Skills
  • /mcp 查 MCP 占用;命令加安静 flags
3 号大坑

🧠模型 / effort 高于任务需要

它乘在所有成本上,而且这个设置会跨会话保留 —— 上次调高的档位,这次可能还在。

  • 日常任务 /model 换小模型、/effort 调低
  • 彻底关思考:MAX_THINKING_TOKENS=0
4 号大坑

打断了 Prompt 缓存

中途换模型 / 调 effort / 切 fast mode、缓存过期后回来 —— 整段对话全价重算。

  • 昂贵的切换动作放在会话开头或 /clear 之后
  • 最近几轮走偏用 /rewind 回退:比 /compact 便宜,缓存仍命中

总结:常用的方法

原文结尾 TL;DR 给出的六条建议 —— 正好对应前面的核心点 ①②③,也是日常最常用的六个习惯。

🧠 选对模型难题用大模型,日常任务换小模型(/model)—— 模型价格会乘在所有成本上。
⌨️ 调低 effort输出 ≈ 输入 5 倍价,thinking 也算输出。日常任务用 /effort 调低,机械任务可 MAX_THINKING_TOKENS=0 彻底关掉思考。
⚡ 守住缓存昂贵动作(切模型 / 调 effort / fast mode)放在会话开头或 /clear 之后做;休息前趁缓存还热先 /compact
📦 上下文保持精简CLAUDE.md 只留必需的,工作流交给 Skills 按需加载;用 /context/mcp 定期检查谁在占上下文。
🎯 提问指向明确能 @ 文件就 @ 文件,让内容直接进第一条消息;常用命令写进 CLAUDE.md 并带上安静 flag(如 --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× 对比)均来自原文口径,实际价格以官方定价页为准。