在 Claude Code 编程场景里,Token 成本从来不是“多问几句”这么简单。会话越长、工具调用越频繁、读取文件范围越大,消耗就会以肉眼可见的速度增长。很多开发者第一次看到账单时才发现,真正昂贵的不是 Prompt 本身,而是“让模型重新读取一遍代码、再为了一个改动作多次计划与验证”的整个过程。本文要做的就是把这些消耗点拆开,提供一套可落地的方法:从观测用量、控制上下文、拆分任务,到团队层面的成本治理。读完以后,你可以对自己的使用方式做一次审计,并建立一套长期有效的成本控制框架,而不是靠“少问问题”这种朴素经验来控制费用。
1. Claude Code 的 Token 消耗逻辑,先看清钱花在哪里
1.1 Claude Code 不是“一次问答一次计费”
使用 Claude Code 时,表面上你是在一个终端对话窗口里和模型交流,但底层并不是简单地“发送一次请求、收到一次回复”。一次看似简单的任务,比如“帮我查一下某个接口为什么报错”,实际可能包含多次模型调用:模型先判断需要读取哪个文件,读取文件内容作为工具结果返回,接着模型基于文件内容生成排查思路,再调用 grep 搜索相关代码,看到搜索结果后继续生成修改方案,最终写出改动内容。
这些环节中的每一步,都对应模型调用的输入 token 和输出 token。如果使用过程中打开了详细日志,可以看到每次工具调用后,工具返回的大段文件内容、目录列表、搜索片段都会进入下一次模型请求的输入上下文。也就是说,Claude Code 的消耗是“多轮交互累积”的,而不是按你输入的自然语言条数计算。
理解这一点很重要,因为它直接决定了成本优化的方向:不是减少提问次数,而是减少每一次模型调用时被迫携带的上下文体积。一个单轮 prompt 写得很长但信息密度低,和一个小而精确的 prompt 相比,两者的 token 消耗会差很多,前者的浪费往往被完全忽略。
1.2 哪些操作会悄悄扩大上下文
从实际观察来看,以下几个操作是 token 消耗的大头。把它们列出来,是因为大多数团队都没有意识到这些默认行为也在计费。
第一个是读取文件。Claude Code 读取文件时,通常会把整个文件内容放进上下文。一个几百行的文件被读取一次就可能是几千甚至上万 token,如果在一次会话里反复读取同一个文件、或者在多个会话里反复读取同一个大文件,成本会成倍增加。
第二个是搜索类工具。比如 grep、glob、ls 等操作,它们返回的是匹配到的代码片段或文件列表。看起来只是字符串,但如果搜索范围是整个项目,且匹配结果很多,工具返回内容可能轻松达到几千 token。尤其是对 node_modules、dist、target 这类目录不设防的搜索,非常容易产生大体积返回。
第三个是对话历史的持续累积。Claude Code 在同一会话中会把之前的用户消息、模型回复、工具调用结果都保留在上下文窗口里。会话进行到第 20 轮时,前 19 轮的所有内容都会跟着第 20 轮的请求一起发送。这就像每次开会都把之前所有会议记录重新念一遍,成本自然会持续上涨。
第四个是系统提示词和项目记忆文件,比如 CLAUDE.md、项目说明文件等。如果这些文件内容冗长、包含大量与当前任务无关的信息,它们就会像“背景噪音”一样在每一轮请求中占用上下文。
下面这张表总结了最容易造成浪费的操作,以及对应的优化思路:
| 消耗来源 | 典型表现 | 控制思路 |
|---|---|---|
| 大文件读取 | 每次读取整个文件进入上下文 | 手动指定行区段;拆分为小模块 |
| 全局搜索 | grep 搜索整个仓库,匹配结果多 | 限定目录、限定文件类型、使用精准关键词 |
| 历史会话累积 | 会话轮次多,旧内容反复携带 | 及时 compact;子任务开新会话 |
| 项目记忆文件冗长 | CLAUDE.md 写入大量低价值信息 | 只保留项目约定、命令、架构要点 |
| 工具返回过多 | 目录列表、搜索结果体积巨大 | 配置忽略目录;权限模式下限制目录访问 |
这些消耗点不是相互独立的,很多时候是叠加出现。一个 30 轮的长会话,中间读了 10 个大文件,又做了多次全仓搜索,到后面每一轮请求的上下文可能已经非常庞大。这也是为什么只看单条请求看不出问题,必须从整个会话的角度去看消耗。
1.3 输入、输出与缓存,三者的计价逻辑不同
从成本结构上,还需要区分输入 token、输出 token 和缓存 token。
输入 token 是模型每次请求接收到的内容,包括系统提示词、工具结果、历史消息和新写入的消息。输出 token 是模型生成的回复、代码片段和工具调用参数。两者的单价不同,而且实际账单中通常输出 token 更贵。如果模型在长会话里生成了大量计划性文字、重复解释代码,输出的浪费也会放大成本。
缓存 token 是相对容易忽略的部分。Claude Code 在连续请求中可能会复用一部分上下文缓存。缓存命中的部分,价格通常比普通输入低很多。这也解释了为什么“同一个会话连续处理”在成本上比“每次重新建立上下文”更划算,前提是不要让上下文膨胀到失去控制。优化的关键不是销毁一切会话,而是让会话长度保持在合理区间,让缓存能有效命中,同时防止历史消息累积导致每轮输入都变大。
所以,成本优化的本质是四个字:控制体积。不论是通过压缩历史、限制读取范围、拆分任务,还是精简项目记忆,最终目标都是让每一轮模型请求的输入保持精简,同时避免无意义的输出。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先给成本装上仪表盘,没有观测就没有优化
2.1 从会话内直接查看用量
在开始优化之前,第一步是知道自己现在消耗了多少。Claude Code 在交互界面中通常会显示当前对话的 token 使用情况,不同版本显示位置可能不同,可能在输入框附近、状态栏区域,或者在执行 /status 命令后展示。
如果找不到界面数据,建议打开详细日志模式。常见启动参数是 --verbose 或 -d,它会输出每一步的请求信息,包括输入 token、输出 token、工具调用名称、耗时等。虽然日志很啰嗦,但对于分析一次会话的消耗分布非常直接。
实际使用中会发现,一个会话里往往存在几个关键拐点:某一次文件读取后 token 数突然大幅上升,某一次搜索后返回大量结果导致上下文猛增。记录这些拐点,就能知道优化应该针对哪一类操作。
2.2 从本地日志做统计,知道钱到底花在哪里
如果只观察交互界面,很难发现多次会话之间的规律。Claude Code 通常会在本地目录,比如 ~/.claude/ 下保存会话记录和日志文件。日志会包含每次 API 请求的元信息,例如模型名称、input tokens、output tokens、cache creation、cache read 等字段。
下面是一个用于统计日志中 token 总量的小脚本思路,可以按项目目录或日期汇总结论:
bash复制# 以常见日志目录为例,实际路径需要按本机情况调整
LOG_DIR="$HOME/.claude/projects"
# 统计每个项目目录下的日志文件数量和 token 请求记录数
for dir in "$LOG_DIR"/*/; do
echo "== 项目: $(basename "$dir") =="
grep -h "input_tokens\|output_tokens" "$dir"/*.jsonl 2>/dev/null \
| wc -l
done
如果日志以 JSON 格式保存,可以写更细的解析脚本:
python复制import json
from pathlib import Path
log_dir = Path.home() / ".claude" / "projects"
total_input = 0
total_output = 0
total_cache_read = 0
for log_file in log_dir.rglob("*.jsonl"):
with log_file.open() as f:
for line in f:
try:
record = json.loads(line)
except json.JSONDecodeError:
continue
# 字段名以实际日志为准,这里展示统计思路
usage = record.get("message", {}).get("usage", {})
total_input += usage.get("input_tokens", 0)
total_output += usage.get("output_tokens", 0)
total_cache_read += usage.get("cache_read_input_tokens", 0)
print(f"输入 token: {total_input}")
print(f"输出 token: {total_output}")
print(f"缓存读取 token: {total_cache_read}")
需要注意的是,不同版本的字段名可能不同。实际落地前要先检查一个日志文件的结构,确认字段是否存在再全量统计。这里不是要做一个生产级统计系统,而是提供一个分析思路:把模糊的“感觉 token 消耗高”变成可量化的数据。
2.3 用固定任务建立成本基线
成本优化的效果需要有对比基准。建议在优化前后,用同一个代表任务做测试。比如:“给订单模块的查询接口增加分页逻辑,并补充单元测试”。这个任务最好具备以下特点:会读取文件、会修改代码、会运行测试、有一定的多轮交互。然后记录:
- 完成任务用了多少轮对话。
- 总输入 token、总输出 token。
- 读取了哪些文件、每个文件被读取了几次。
- 经过多少次 compact 或历史清理。
有了基线后,再尝试不同的优化手段,比如告诉模型“只读取 order_service.py,不要读取整个目录”,或者将任务拆成两个独立会话执行,再对比消耗差异。这种对比往往比嘴上说服团队更有力。优化不是玄学,是一次次测量后的取舍。
3. 控制进入上下文的内容,这比什么都重要
3.1 把“读取整个仓库”改成“读取指定路径”
很多用户习惯在 prompt 里写“帮我看看这个仓库哪里出了问题”,结果模型会自动读取多个文件、执行多次搜索,上下文迅速膨胀。更可控的做法是直接限定范围,例如:
text复制请只检查 src/services/order_service.py 文件中 createOrder 方法的分页逻辑,
不要读取其他文件。如果确实需要搜索,请在 src/main/java/com/example/service/ 目录下搜索。
这种写法相当于给模型画清楚边界。一方面避免它读取无关文件,另一方面也减少了工具调用次数。实际操作中,模型有时还是会因为“想确认某个函数的定义”而读取其他文件,这时候可以继续追加限制条件,比如:
text复制不要读取测试文件;不要读取配置文件;只读取仓库中与订单状态枚举相关的文件。
限制读取范围不是在限制模型能力,而是在减少它“用更多上下文换取安全感”的倾向。很多任务其实只需要两三个文件就能完成,根本不需要了解整个项目。
3.2 CLAUDE.md 是持久上下文,内容要精简、高频、可执行
Claude Code 允许通过 CLAUDE.md 这类记忆文件向模型提供项目级别的持久指令。它的价值在于后面每一个会话都会自动携带这些内容,因此它既高效又危险:写得越精简,每一轮请求的固定成本就越低;写得越啰嗦,每个会话的起步成本就越高。
一个合理的 CLAUDE.md 应该包含以下内容:
- 项目是做什么的。
- 常用构建命令、测试命令、启动命令。
- 代码风格约定,例如命名规范、目录结构。
- 与当前项目相关的、反复被问到的注意事项。
- 一些“禁止事项”,例如不要修改生成文件、不要动迁移脚本。
下面是一个精简示例:
markdown复制# 项目:订单服务
## 常用命令
- 构建:./mvnw clean package -DskipTests
- 测试:./mvnw test
- 启动:./mvnw spring-boot:run
## 目录约定
- controller 层只负责参数接收和响应包装。
- service 层写业务逻辑,禁止直接操作 HttpServletRequest。
## 需要注意
- 数据库迁移文件由专人维护,不要手动修改。
- 不要把新增配置写入 application.properties,应放到 application-prod.properties 并说明原因。
写这个文件的时候要问自己:这句话是不是每次开发都会用到?如果答案是否定的,就删掉。CLAUDE.md 不是项目文档合集,也不是 README 的复制品。它应该是一份“模型高频使用手册”。
3.3 用 .claudeignore 和权限模式限制模型视野
很多项目有大量与开发无关或体积巨大的文件,例如 node_modules、dist、target、build、*.lock 文件、日志输出目录。如果 Claude Code 在搜索时进入这些目录,不仅结果无用,token 消耗还会暴涨。
解决办法是维护忽略清单。Claude Code 通常支持通过 .claudeignore 文件配置忽略规则,作用和 .gitignore 类似:
gitignore复制# 忽略构建产物
node_modules/
dist/
build/
target/
out/
# 忽略日志
*.log
logs/
# 忽略大文件和锁文件
*.lock
package-lock.json
pnpm-lock.yaml
# 忽略本地环境文件
.env.local
配置忽略规则后,模型在搜索、读目录、自动探索时都不会进入这些路径,上下文质量会明显提升。需要特别说明的是,Claude Code 是否支持某个忽略文件、文件名是否必须叫 .claudeignore,要按当前版本的说明去确认。关键是思路:凡是模型不需要的文件,就不应该出现在它的搜索结果中。
同时,很多版本支持权限模式,常见有 plan、auto-accept、accept-edits、bypass-permissions 等。在默认或受限模式下,模型读取文件、写文件、执行命令都会先请求确认,这可以避免它一口气读取大量文件造成不可控消耗。代价是交互更繁琐,但对成本控制很有帮助。团队可以先从权限模式开始,比如只允许读取指定目录,禁止执行网络请求。
3.4 用 /compact 压缩历史,但别把它当成万能操作
当会话进行到一定程度,上下文已经塞满了历史内容时,继续提问会产生大量输入 token。Claude Code 提供压缩历史的功能,常见命令如 /compact,内置的行为是把当前对话总结成一份摘要,用摘要替换原始对话历史,从而降低后续请求的上下文体积。
/compact 在长会话中非常有用,但有代价:压缩会丢失细节。比如某一次错误日志里带着具体的报错行号,某一次文件读取里出现了某个关键变量的拼写,这些信息在压缩后可能变得模糊,模型为了确认内容,可能会重新读取文件或重新运行命令,反而多花一轮成本。
所以更合理的策略是:在会话进入“已经完成主要调研、开始写代码”的阶段时再 compact。在此之前,如果发现上下文已经很大,与其反复 compact,不如先想清楚:这个会话是不是已经太长?是否需要把剩余工作放到新会话里?
4. 把大任务拆成小任务,防止对话失控
4.1 单次会话只做一件事
最容易造成 token 浪费的场景,是一个会话里塞了多个任务目标。例如:
text复制先帮我看看登录接口的鉴权逻辑,然后把超时时间改一下,顺便把单元测试补上,最后检查一下有没有其他接口有类似问题。
这个 prompt 表面上是让模型做三件事,实际上会让模型反复读取文件、不断切换上下文、一轮轮确认需求。更麻烦的是,会话拖长后,模型可能忘记前面的结论,导致它重新读取文件来验证,成本进一步上升。
推荐做法是每个会话只承担一个明确任务。任务边界示例:
- 会话 A:定位登录接口鉴权逻辑,输出问题分析报告。
- 会话 B:根据分析报告修改超时时间并运行相关测试。
- 会话 C:检查其他接口是否存在同类问题,只做检查,不做修改。
拆分任务后,每个会话的上下文都可以保持精简,模型不需要在“旧任务结论”上反复加载。分析和修改解耦之后,即使某个环节失败,也可以单独重跑,不会污染整个会话。
4.2 用独立会话隔离不同模块的上下文
如果项目规模较大,一次改动牵涉多个模块,建议按模块拆分会话。比如要新增一个“批量导出订单”的功能,可能涉及前端接口、后端服务、异步任务三部分。正确的拆法是:
- 会话 A:设计批量导出接口的数据结构和返回格式,输出设计草稿。
- 会话 B:只实现后端批量导出服务,复用会话 A 的输出。
- 会话 C:只补充前端调用逻辑,并且把会话 B 的接口约定贴给模型。
当然,实际过程中不一定每次都能严格拆分,但原则是:不要让一个会话同时维护“订单模块的价格计算”“库存模块的扣减逻辑”“用户模块的鉴权规则”。这些模块之间没有强关联,把它们放在同一个上下文里,等于每隔几轮就要重新加载一遍互不相关的代码,浪费非常明显。
这一策略也可以结合 Claude Code 的子代理或任务委派机制使用。某些版本允许创建子任务或子代理处理独立目标,父会话只负责决策和汇总。这样可以把大范围探索交给独立上下文,避免主会话持续膨胀。
4.3 设置 max-turns 上限,暴露无效循环
Claude Code 在自动执行任务时,可能会进入“修改代码 -> 运行测试 -> 发现失败 -> 再修改”的循环。这个循环本身是正常的,但如果模型在每个循环里都读取一遍大型源文件、输出大段解释,消耗就会快速累积。
很多版本支持限制最大连续轮次或自动执行步数,常见参数如 --max-turns 或 -t。给自动执行任务设置一个上限,比如 10 或 20 轮,超过上限就停下来等待人工判断。这个限制的作用不是削减能力,而是防止模型在错误方向上反复尝试。
实际使用中可以看到这样的现象:模型在修改一处报错后,又发现关联的测试数据不对,于是回头改测试数据,接着又发现另一个测试用例受影响,于是继续修改,最后可能已经偏离原始任务很远。限制轮次后,它必须在指定步数内收敛,否则就停下来问你下一步怎么做。这种做法既控制成本,也减少失控风险。
bash复制# 示例:限制自动执行步数为 15 轮
claude --max-turns 15 "修复 auth 模块的登录超时问题,并运行相关测试"
4.4 非交互模式与脚本化,批量任务不走长对话
如果要做的事情比较机械,比如“批量给所有 controller 类加上统一日志注解”“把某个目录下所有接口的注释从中文改成英文”,这类任务适合用非交互模式一次执行,而不是开一个长会话逐条处理。
常见的示例是通过 -p 参数执行一次性 prompt:
bash复制claude -p "请给 src/main/java/com/example/controller 下所有 controller 类的 public 方法补充 @Log 注解,注解参数使用方法名,不要修改任何业务逻辑"
这种模式没有多轮对话的累积效应,模型执行完就结束,请求数量固定、上下文体积固定,成本更可控。但它的缺点是模型没有机会逐步验证,所以最适合范围清晰、风险低、可以脚本化验证的任务。执行前一定要把约束写清楚,并在执行后检查 diff:
bash复制git diff --stat
如果变化超过预期,可以直接 git checkout . 回滚,重新调整 Prompt 再执行。这样比在交互会话里“让模型解释自己为什么这么改”要省钱得多。
5. 常见 Token 浪费场景与排查路径
5.1 Compact 之后成本反而更高
现象:一个长会话已经很大,执行 /compact 后,模型反而开始重新读取文件、重新运行命令,接下来几轮的成本比压缩之前还高。
原因:压缩丢失了关键细节,模型为了确认这些细节,会主动读取相关文件或执行验证命令。尤其当之前的会话中有手写的补丁片段、特定报错信息时,压缩后的摘要往往不够精确。
排查方式:查看压缩前后的日志,观察接下来几轮是否有重新读取相同文件的记录,工具名称中出现 Read、Grep 的次数是否上升。
处理建议:在压缩前,先把关键事实写进当前对话。例如“错误信息第 12 行是 NullPointerException,修复方案已确认是加空值判断,不用重新排查”。这一句话可以帮助压缩后的模型避免重新探索。
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| compact 后重新读文件 | 摘要丢失关键细节 | 查看日志中工具调用次数 | 压缩前写入关键事实,或直接开新会话 |
| 修改一次文件反复读全文 | 模型每次编辑都要重新确认 | 检查 Read 调用次数 | 使用小文件、给出行号范围 |
| 同一会话处理多个目标 | 上下文不断叠加 | 查看会话轮次和 token 增长曲线 | 按任务拆分会话 |
5.2 修改大文件时反复读取整份文件
现象:模型在修改一个 1000 行的文件时,每轮都要调用 Read 读取整个文件,token 消耗快速上升。
原因:模型为了保证修改后不破坏其他逻辑,倾向于重新查看完整文件内容。这是“安全”和“成本”的权衡,但很多时候不需要每次都读全文。
排查方式:打开 verbose 日志,统计一个会话中某个文件被读取了多少次。如果超过 3 次,基本可以判定存在重复读取。
处理建议:先请模型输出修改方案,确认方案后再让它改动;或者把文件拆分为更小的模块,让每个会话只处理一个方法;也可以在 prompt 中直接提供需要关注的行号范围。例如:
text复制请只修改 order_service.py 中 120 到 160 行的 createOrder 方法,其他区域逻辑不要改动。
这样模型就不需要每次读取完整文件。
5.3 模型陷入“修改-验证-再修改”的无效循环
现象:一个简单任务,模型的自动执行轮次达到几十次,日志里大量出现 RunCommand、Read、Edit 交替调用,token 消耗很高,但最终改动却很小。
原因:模型在缺少确定性测试目标时,会反复尝试。比如测试环境不稳定、测试命令本身报错,或者模型不断“小步修改再运行”以确保不破坏任何内容。
排查方式:查看 --max-turns 前后行为,或观察日志中是否存在连续多次相同失败原因。如果模型连续三轮报同一个错误,说明它还没有找到根因,应该停止让模型继续尝试,转为人工分析。
处理建议:给模型明确的验证命令和验收标准,例如:
text复制完整执行命令:./mvnw test -Dtest=OrderServiceTest#testCreateOrder
如果测试失败,请直接输出失败日志,不要连续尝试超过 5 次。
通过限制尝试次数,逼着模型在第一次失败后及时向用户汇报,而不是无限循环。
5.4 同样的信息被重复粘贴进上下文
现象:用户在 prompt 里贴了大段错误日志,模型回复后又贴一次;或者在多轮对话中反复提供同一段代码,导致这些内容在历史中重复堆积。
原因:用户习惯把错误信息复制到对话框,模型分析后,用户没有总结结论就继续把新的错误日志贴进来。实际上前一轮的日志可能已经不再需要,但历史会一直携带。
排查方式:回看对话历史,数一下同一段错误日志或代码片段出现了几次。
处理建议:在开始新一轮提问时,先写结论摘要,再贴新信息。例如:
text复制根据上一轮分析,OrderService 里的空指针原因是 user 对象未判空,已经加了 if 判断。
现在新增一个错误:登录接口报 500,日志如下:...
这样模型既保留了有效结论,又不会被重复日志占据大量上下文。
5.5 搜索范围太宽导致工具返回结果过大
现象:使用 grep 搜索某个关键词时,模型没有限定目录,导致返回几百个匹配项。工具的返回结果被全部放入上下文。
原因:Claude Code 的搜索类工具默认范围可能是整个项目,也可能是因为 prompt 中没有指定目录。
排查方式:查看工具调用返回的字符数,或者在日志中看 Grep 之后上下文 token 是否有明显上升。
处理建议:在 prompt 中注明搜索范围:
text复制只在 src/services 目录下搜索 “createOrder”,不要搜索测试目录和构建目录。
同时维护 .claudeignore,让可能产生大返回的目录从一开始就不参与搜索。
5.6 完整的排查路径
遇到成本异常时,建议按以下顺序排查:
- 先看单次会话的 token 趋势,找到第一次大幅上升的节点。
- 对应节点前后操作是什么:读文件、搜索、还是大量输出。
- 统计同一个文件被读取的次数,同一个命令被执行的次数。
- 检查 prompt 是否存在大段重复内容。
- 检查 CLAUDE.md 或权限配置是否过于宽松。
- 检查日志中的缓存读取情况,确认是否频繁重建上下文导致缓存命中率低。
这一条链路基本能覆盖绝大多数 token 浪费问题。排查的关键不是“少用点模型”,而是让每一次模型调用都花在真正必要的信息上。
6. 团队级 Token 成本治理,把经验沉淀成规范
6.1 从个人习惯变成团队约定
个人发现的有效优化方法,如果只保存在自己脑子里,对团队没有意义。建议把以下内容沉淀成团队文档:
- 一个标准的任务描述模板:包含任务目标、允许读取的路径、禁止操作项、验收命令。
- 一个
CLAUDE.md的维护规范:什么内容可以进、什么内容不要进、多久评审一次。 - 一个
成本复盘检查表:每个迭代结束后,统计一次主要的 Claude Code 会话消耗,找出消耗最高的前 5 个会话,分析原因。
任务描述模板可以设计成下面这样:
text复制任务目标:(一句话描述要做什么)
模块范围:(允许读取的目录或文件列表)
禁止操作:(不要修改什么、不要读取什么)
验收方式:(运行哪条命令、期望什么结果)
使用模板的收益不是形式上的规范,而是它天然限制了模型的活动范围,减少了“隐身消耗”。模板本质上就是成本控制装置。
6.2 发布前检查清单
无论是个人使用还是团队使用,在消耗一次成本较高的会话之前,都可以先过一遍清单:
- [ ] 任务是否只有一个明确目标。
- [ ] 是否已限制读取的目录或文件。
-- [ ] 是否已经配置忽略规则,防止搜索进入构建目录。 - [ ] CLAUDE.md 是否包含本任务需要的关键信息。
- [ ] 是否知道本任务的验收命令。
- [ ] 是否决定使用交互式会话还是非交互式脚本。
- [ ] 是否为自动执行设置了 max-turns 上限。
- [ ] 如果任务过长,是否已经规划拆成多个独立会话。
这个清单不是限制效率,而是把每次调用都变成“有准备、有边界、可验证”的行为。
6.3 优化优先级速查表
当团队或个人的 Token 成本已经偏高,建议按下面的优先级处理,先做投入产出比最高的动作:
| 优先级 | 优化动作 | 预期效果 |
|---|---|---|
| 1 | 限定读取目录和文件 | 显著减少每轮上下文体积 |
| 2 | 拆分任务与会话 | 防止长期会话持续膨胀 |
| 3 | 精简 CLAUDE.md 内容 | 降低每个会话的基础成本 |
| 4 | 配置忽略规则和权限模式 | 减少大规模返回和无用读取 |
| 5 | 设置 max-turns 上限 | 避免无效循环和失控尝试 |
| 6 | 建立日志统计和成本基线 | 让后续优化有量化依据 |
| 7 | 对重复性任务使用非交互模式 | 用固定成本替代长对话成本 |
6.4 扩展方向:从省 Token 到更聪明的使用策略
成本优化的下一步,不只是“省 token”,而是更合理的资源分配。
一个方向是任务分级。简单机械任务、复杂设计任务、超大规模重构任务,应该采用不同的会话策略。简单任务可以用非交互模式批量处理,复杂设计需要保留足够的历史上下文,避免反复重述需求。这本质上是在“省钱”和“减少返工”之间做平衡,不能只看单次成本。
另一个方向是上下文缓存利用。连续会话、在同一项目中工作,更容易产生缓存命中。如果频繁清理会话、频繁换项目,缓存价值就会降低。合理做法是让相关任务放在同一项目、相近时间内连续完成,从而让缓存发挥更大作用。
还有一个方向是建立 token 消耗的持续观测。把日志统计接到监控面板或表格里,每次开会都看一眼趋势。没有数据支撑的优化建议在团队里很难推进,但一张“消耗排名前五的会话”截图就很有说服力。
Claude Code 这类工具的价值在于它能成为开发流程的一部分,但如果消耗失控,团队就会产生“用不起”的退缩感。与其因为账单减少使用频率,不如建立一套控制成本的使用方式。给每个任务设定边界,给每类任务选择合适的运行模式,把经验沉淀成模板和规范,持续观测和调整。这样,成本既不会成为开发的阻碍,模型的能力也仍然可以保持在收益大于支出的范围内。新手可以从一个最简单动作开始:下周每次交给 Claude Code 任务前,先在 prompt 里写清楚“只读取哪些文件、不要做什么、怎么验收”。这个动作坚持一周后,再对比之前的 token 用量,你会看到明显差异。
