AI 编程工具用起来爽,但账单跑起来也真让人肉疼。我身边不少朋友刚上手 Codex 和 Claude 的时候,都是抱着"先充上再说"的心态,结果一个月下来发现额度像开了闸的水龙头,尤其是把这两个工具嵌进日常开发流之后,token 消耗速度远超预期。这篇笔记就聊聊我这一段时间在 Codex 和 Claude 上踩过的坑、试过的省法,以及怎么在"用得爽"和"花得少"之间找到那个平衡点。不管你是刚装好 Codex CLI 准备跑第一个任务,还是已经把 Claude Code 接进 VS Code 天天用,这里面的思路应该都能帮你把成本压下来一截。
1. 先搞清楚钱到底花在哪了
很多人一上来就想着"怎么省",但其实第一步应该是"怎么看清"。你连消耗结构都不清楚,省的方向大概率是错的。
1.1 Token 消耗的三个大头
AI 编程工具的计费逻辑,本质上就是输入 token 加输出 token。但实际用起来,消耗结构比这个复杂得多。我观察下来,钱主要花在三个地方:
第一块是上下文携带量。这是最容易被忽视的。你每发一次请求,工具会把当前对话历史、打开的文件内容、项目结构信息等一起打包发给模型。对话轮次越多,这个包越大。我做过一个粗略测试:同一个项目里,第一轮对话可能只发 2000 token,到第十轮的时候,光历史上下文就能膨胀到 15000 token 以上。也就是说,你后面每一句话都在为前面的对话"交税"。
第二块是文件读取范围。Claude Code 和 Codex 都有自动读取相关文件的能力。这个能力很好用,但也很"费"。如果你让它改一个函数,它可能把整个文件甚至关联的几个文件都读一遍。一个 800 行的文件,读一次就是好几千 token。如果它反复读同一个文件,那就是反复烧钱。
第三块才是真正的输出。模型生成代码、解释、建议所消耗的 token。这块反而是相对可控的,因为输出量通常不会太夸张。真正的大头往往在前两块。
提示:如果你用的是按 token 计费的 API 模式,建议先去后台看一眼最近几天的消耗曲线。很多人看到曲线之后才发现,自己以为的"写代码花得多",其实是"读文件花得多"。
1.2 不同使用模式的成本差异
Codex 和 Claude 目前主要有几种使用形态,成本结构差别很大:
| 使用形态 | 计费方式 | 适合场景 | 成本特点 |
|---|---|---|---|
| CLI 交互模式 | 按 token | 日常开发、快速问答 | 上下文累积快,长会话成本高 |
| IDE 插件模式 | 按 token 或订阅 | 边写边改 | 文件读取频繁,但单次请求小 |
| 订阅制 | 固定月费 | 高频使用者 | 有额度上限,超了会限速 |
| API 直调 | 按 token | 自动化流程 | 完全可控,但需要自己管上下文 |
我自己的做法是:高频交互用订阅制兜底,自动化批处理用 API 按量付费。这样既不会因为订阅额度用完被卡住,也不会在低频场景下白交月费。
1.3 一个真实的消耗对比
举个具体例子。我有个项目,需要给一个 Flask 后端加一套用户权限校验。同样的任务,我用两种方式各做了一遍:
方式 A:开一个长会话,从"帮我看看这个项目结构"开始,一路聊到"帮我把权限模块加上",中间穿插了七八轮讨论和修改。整个过程消耗了大约 45000 token。
方式 B:先自己理清楚需求,直接开一个新会话,把需要改的文件路径和具体要求一次性说清楚,让模型直接输出代码。整个过程消耗了大约 12000 token。
任务完成度差不多,但成本差了将近四倍。差距就来自上下文携带量和文件读取范围。
2. 上下文管理:省钱的第一个开关
上下文是最大的成本变量,也是最容易优化的地方。核心原则就一句话:让模型只看到它需要看到的东西。
2.1 会话该断就断,别舍不得
很多人有一个习惯:一个会话从早用到晚,中间什么任务都往里塞。这个习惯在聊天场景下没问题,但在 AI 编程场景下就是烧钱。
我的做法是:一个任务一个会话。具体来说:
- 改 bug 开一个会话,改完就关
- 写新功能开一个会话,写完就关
- 问概念性问题开一个会话,问完就关
这样做的好处是,每次会话的上下文都是干净的,不会带着之前无关的对话历史。代价是你需要重新描述一下背景,但这个描述成本远低于携带一堆无关历史的成本。
注意:有些工具支持"清空上下文但保留会话"的功能。如果你只是想重置上下文,用这个功能比关掉重开更方便。但要注意,有些工具的清空只是隐藏了历史,实际请求时还是会带上,这个需要自己确认。
2.2 文件引用要精准,别让它自己猜
Claude Code 和 Codex 都有"自动找相关文件"的能力。这个能力在探索阶段很好用,但在执行阶段就是浪费。
我的经验是:探索阶段让它自己找,执行阶段手动指定。
比如你要改一个函数,不要只说"帮我改一下 validateUser 这个函数",而是说"帮我改一下src/utils/validate.js里的 validateUser 函数"。这样它就不需要去搜索整个项目来找这个函数在哪。
如果工具支持@文件路径这种引用语法,那就更好了。直接把文件路径喂给它,省掉它自己搜索的过程。搜索过程本身也是要消耗 token 的。
2.3 长文件要截取,别整篇喂
一个 1000 行的文件,你只需要改其中 50 行,但整篇喂进去就是 1000 行的 token 成本。这时候应该做的是:只把需要改的那一段贴给它。
具体操作上,你可以:
- 先自己定位到需要改的函数或代码块
- 把这一段单独复制出来
- 在对话里说明"这是文件 X 中的一段代码,上下文是 Y,帮我改成 Z"
- 拿到结果后自己贴回文件
这样做虽然多了一步手动操作,但 token 消耗可能只有整篇喂进去的十分之一。
2.4 对话历史要主动清理
有些工具允许你删除对话中的某几条消息。如果你发现前面有几轮对话已经没用了(比如走了一些弯路),可以主动删掉。这样后续请求就不会再携带这些无用历史。
不过这个操作比较繁琐,我一般只在长会话中才会做。日常短会话直接关掉重开更省事。
3. 提示词写法直接决定输出成本
提示词写得好不好,不仅影响输出质量,还直接影响 token 消耗。一个模糊的提示词会让模型反复确认、反复尝试,每一次往返都是钱。
3.1 一次说清楚,别挤牙膏
最费钱的提示词写法就是挤牙膏式:
你:帮我改一下这个函数 模型:请问你想怎么改? 你:让它支持异步 模型:好的,请问用 async/await 还是 Promise? 你:async/await 模型:好的,这是改好的代码...
这一来一回,每一轮都在携带完整上下文,成本翻了好几倍。
正确的做法是一次性把需求说清楚:
你:帮我改一下
src/utils/fetchData.js里的 fetchData 函数,改成 async/await 写法,保持原有的错误处理逻辑不变,返回值结构也不变。
这样一轮就能拿到结果,上下文只携带一次。
3.2 给例子比给描述更省
如果你想要一个特定格式的输出,给一个例子比写一段描述更省 token,效果也更好。
比如你要让模型生成一个特定格式的配置文件,与其写"请生成一个包含 name、version、dependencies 字段的 JSON 配置,dependencies 里每个依赖要有版本号...",不如直接给一个例子:
{ "name": "my-project", "version": "1.0.0", "dependencies": { "express": "^4.18.0" } }然后说"按这个格式,帮我生成一个包含 axios 和 lodash 的配置"。这样模型不需要猜测你的格式偏好,一次就能输出正确结果。
3.3 限制输出范围
如果你只需要代码,就明确说"只输出代码,不要解释"。如果你只需要解释,就说"只解释思路,不要写代码"。这样避免模型输出一堆你不需要的内容,既省输出 token,也省你阅读的时间。
我常用的几个限定语:
- "只输出修改后的代码,不要解释"
- "用一句话说明思路即可"
- "不需要完整代码,只给出需要修改的行"
- "不要重复我贴给你的代码"
3.4 系统提示词要精简
如果你用的是 API 模式,系统提示词(system prompt)是每次请求都会携带的。如果你写了一个很长的系统提示词,那每次请求都在为它付费。
我的建议是:系统提示词只放最核心的角色设定和输出格式要求,具体的任务描述放在用户消息里。这样系统提示词可以保持精简,而任务描述只在需要的时候才携带。
4. 工具配置里的隐藏省钱项
除了使用习惯,工具本身的配置也有很多可以优化的地方。这些配置往往藏在文档的角落里,但对成本的影响不小。
4.1 模型选择:不是所有任务都需要最强模型
Codex 和 Claude 都提供不同档位的模型。强模型贵,弱模型便宜。很多人图省事,所有任务都用最强模型,这其实很浪费。
我的分配策略是:
| 任务类型 | 推荐模型档位 | 理由 |
|---|---|---|
| 复杂架构设计 | 最强模型 | 需要深度推理 |
| 日常代码修改 | 中等模型 | 任务明确,不需要太强推理 |
| 格式转换、重命名 | 最弱模型 | 机械性任务 |
| 代码解释 | 中等模型 | 理解为主,不需要生成 |
| 疑难 bug 排查 | 最强模型 | 需要多步推理 |
这样搭配下来,整体成本能降不少,而效果几乎不受影响。
4.2 关闭不必要的自动功能
很多工具默认开启了一些"智能"功能,比如自动读取相关文件、自动补全上下文、自动生成摘要等。这些功能在提升体验的同时也在消耗 token。
我建议逐个检查这些功能,只保留真正需要的。比如:
- 自动读取相关文件:探索阶段开,执行阶段关
- 自动生成对话摘要:如果会话不长,可以关掉
- 自动补全:如果影响不大,可以关掉
4.3 缓存机制的利用
部分工具支持 prompt caching(提示词缓存)。简单说就是,如果一段内容在多次请求中重复出现,缓存机制可以让它只计费一次。
利用这个机制的方法是:把不变的内容放在前面,变化的内容放在后面。比如系统提示词、项目背景介绍这些不变的内容放前面,具体的任务描述放后面。这样缓存命中率高,成本就低。
提示:不同工具的缓存机制不一样,有的自动生效,有的需要手动标记。建议查一下你所用工具的具体文档。
4.4 批量任务合并处理
如果你有一批类似的任务,比如给十个文件都加上相同的注释头,不要一个一个问。把十个文件的内容一起贴进去,让它一次性输出十个结果。
这样做的好处是,系统提示词和任务描述只需要携带一次,而不是十次。虽然单次请求的 token 量大了,但总消耗反而更低。
5. 那些我踩过的坑
说了这么多省钱的思路,也聊聊我实际踩过的坑。有些坑是工具本身的限制,有些是我自己的使用习惯问题。
5.1 长会话的"温水煮青蛙"
最开始用 Claude Code 的时候,我习惯开一个会话一直用。前几轮感觉很流畅,到后面越来越慢,我还以为是网络问题。后来看消耗记录才发现,会话到后面每一轮的 token 量都是前面的好几倍。
这个坑的隐蔽性在于,它不是突然发生的,而是随着对话轮次增加慢慢累积的。你感觉不到痛,但账单会告诉你。
现在的做法是:会话超过十轮就考虑重开。如果任务确实需要长对话,那就定期清理无用历史。
5.2 文件读取的"雪球效应"
有一次我让 Codex 帮我重构一个模块。它很"聪明"地读取了所有相关文件,包括一些测试文件和配置文件。结果一次请求就消耗了大量 token,而其中很多文件的内容根本没用到。
后来我学乖了:重构任务先自己理清依赖关系,只把真正需要改的文件喂给它。如果它需要看其他文件,它会问,到时候再给也不迟。
5.3 提示词里的"隐形浪费"
我以前写提示词喜欢加很多礼貌用语和背景铺垫,比如"你好,我有一个项目,这个项目是这样的...,现在我想请你帮我..."。这些内容看起来不多,但每次请求都携带,累积起来也不少。
现在我的提示词风格是:直接说事,不铺垫。比如"改src/app.js第 45 行的 handleClick 函数,改成防抖处理"。简洁明了,模型也能理解。
5.4 模型选择的"惯性"
有一段时间我所有任务都用最强模型,因为"感觉更靠谱"。后来试着把一些简单任务换成中等模型,发现效果几乎没差别,但成本降了一半。
这个坑的本质是"懒"——懒得去判断任务难度,懒得去切换模型。但只要你愿意多花几秒钟判断一下,省下来的钱是实打实的。
5.5 订阅额度的"月底恐慌"
如果你用的是订阅制,额度是按周期重置的。我遇到过好几次月初大手大脚,月底额度不够用的情况。后来我养成了习惯:每周看一眼额度消耗进度,如果发现消耗过快,就及时调整使用策略。
6. 一套可复用的省钱工作流
把上面这些思路串起来,形成一套我日常在用的工作流。你可以根据自己的情况调整。
6.1 任务开始前的三问
每次打开 AI 编程工具之前,先问自己三个问题:
- 这个任务真的需要 AI 吗?有些任务自己写更快,比如改个变量名、调个格式。这种就别麻烦 AI 了。
- 这个任务需要多强的模型?根据任务难度选择模型档位,别一律用最强的。
- 我需要提供哪些信息?提前想清楚需要贴哪些文件、哪些代码段,一次性准备好。
这三个问题花不了半分钟,但能帮你省下不少不必要的消耗。
6.2 会话中的三个习惯
- 精准引用:用文件路径和行号定位,别让模型自己找
- 一次说清:需求、约束、期望格式一次性说完
- 及时断舍:任务完成就关会话,别留着"以后可能还用"
6.3 会话后的两个动作
- 检查消耗:看一眼这次会话花了多少,心里有个数
- 记录经验:如果发现某个写法特别费钱,记下来,下次避免
6.4 一个具体的操作示例
假设我要给一个 React 组件加一个 loading 状态。我的操作流程是:
- 先自己打开组件文件,找到需要改的地方,确认行号
- 打开一个新的 Claude Code 会话
- 输入:"改
src/components/UserList.jsx,在 useState 旁边加一个 loading state,在 fetch 数据前后设置 loading 的 true/false,在 JSX 里根据 loading 显示一个 spinner。只输出修改后的相关代码段。" - 拿到结果,自己贴回文件
- 关闭会话
整个过程可能只消耗几百 token,而如果开一个长会话慢慢聊,可能要几千 token。
7. 关于"开源节流"的一点个人体会
用了这段时间的 Codex 和 Claude,我最大的感受是:AI 编程工具的成本,很大程度上取决于使用者的习惯,而不是工具本身。同样的工具,不同的人用,成本可能差好几倍。
"开源"和"节流"其实是两个方向。开源是指把 AI 用在真正能提升效率的地方,让它帮你做那些你自己做很费时间的事。节流是指避免把 AI 用在那些它不擅长或者你自己做更快的地方。
我见过一些人,为了"用上 AI"而用 AI,明明自己写两行代码就搞定的事,非要问一遍模型。这种用法,再便宜的工具也是浪费。
也见过一些人,把 AI 当成万能钥匙,什么任务都往上扔,结果消耗巨大但产出有限。
真正划算的用法是:把 AI 用在那些它确实比你快、比你好的任务上,同时用合理的配置和习惯把成本压下来。这样才是真正的"开源节流"。
最后分享一个我最近在用的技巧:如果你发现某个任务反复需要 AI 帮忙,比如每周都要生成类似的报表代码,那就把提示词模板化。把常用的提示词存成一个片段,下次直接调用,既省时间又省 token。这个习惯坚持下来,效果比想象中明显。