跳至内容
AI Coding Token 与成本分析

AI Coding Token 与成本分析:一次任务到底消耗了什么

先看一个很普通的任务

你对 Agent 说:

GET /reports/:id 偶尔返回 500。请找到原因,修好它,补一个回归测试。

最后可能只改了两三个文件。可是在改文件之前,Agent 也许已经做了这些事:

  • 读了项目里的 AGENTS.md 和测试命令;
  • 搜索路由、数据库调用和重试逻辑;
  • 打开了几份相关代码和一段错误日志;
  • 跑了一次测试,发现自己的 Fixture 写错了;
  • 改完后再跑一遍测试,并写出修改说明。

所以,任务的花费和 diff 大小没有直接关系。真正消耗资源的,往往是“为了找到答案,Agent 来回看了多少东西、试了多少次”。

这篇文章就围绕这个排错任务展开。我们先弄清 Agent 每一轮在做什么,再把 Token、缓存、工具调用、重试和人工审查拆开,最后给出一份团队可以真正落地的记录清单。

一、Agent 不是只补全代码,它会反复做四件事

现在主流的 AI Coding Agent——例如 Codex、Claude Code、GitHub Copilot coding agent——虽然产品形态不同,但工作方式很像:它们会读取上下文,决定下一步动作,调用工具,然后根据结果继续判断。官方文档可以参考 Claude Code、GitHub Copilot Agent 和 Codex。

AI Coding Agent 的观察—规划—行动—验证回路

把它说得直白一点,就是四步循环:

  1. 先看:读需求、规则、代码片段和上一步工具输出;
  2. 想下一步:决定继续搜索、打开文件、修改代码,还是先跑测试;
  3. 动手:调用 Shell、搜索、浏览器或其他工具;
  4. 检查:看命令结果、看 diff、跑测试,决定是否继续。

每循环一次,都可能多出一笔输入、多一段输出,或者一次工具运行。最后用户看到的“已完成”,只是这一串循环的最后一句话。

同一个产品名,不代表同一种账单

有的 Agent 是 API 按量计费,有的是订阅里包含额度,有的还会额外计算云端容器、浏览器或搜索服务。比较成本时,别只问“这个模型一百万 Token 多少钱”,还要问:

  • 一次任务实际调用了几次模型?
  • 工具是在本地跑,还是在云端跑?
  • 失败后会不会自动重试?
  • 最后花了多少人工时间审查?

只看月度席位或消息数量,很难回答“修好一个 Bug 到底花了多少钱”。

二、Token 到底是什么钱

可以把一次模型调用想象成把一叠材料交给模型:

  • 输入 Token:你交给它的材料,包括 Prompt、项目规则、代码、历史对话和工具结果;
  • 输出 Token:模型生成的计划、解释、代码修改建议和最终回复;
  • 缓存输入:前面已经交过、这次可以复用的一部分材料;
  • 工具结果:Shell、搜索、浏览器等工具返回的新材料。

OpenAI 和 Anthropic 都把输入、输出以及缓存相关用量作为独立计费维度,具体字段和价格会随产品变化。实际账单应以供应商当前的 OpenAI 定价、OpenAI Prompt Caching、Anthropic 定价 和 Anthropic Prompt Caching 为准。

先记住一个简单版本:

任务成本 ≈ 输入成本 + 输出成本 + 工具/运行时成本 + 人工审查成本

为什么输入经常比你想象的多

你只输入了一句话,不代表模型只看了一句话。它可能还收到:

  • 系统指令和项目规则;
  • 当前对话历史;
  • Agent 刚刚搜索出来的文件片段;
  • 测试命令的输出;
  • 你上一轮补充的限制条件。

如果 Agent 连续跑四五轮,后面的请求往往会带着前面的历史一起走。于是,一次“再搜索一下”,可能不只增加一次搜索结果,还会让后续每轮的输入都变长。

缓存不是免费,也不是魔法

如果一段稳定的规则和工具定义被反复使用,供应商可能把它放进 Prompt Cache。缓存命中通常比普通输入便宜,但创建缓存、缓存失效和缓存没被再次使用,都可能产生代价。

因此不要为了“命中缓存”把整个仓库永久塞进固定前缀。更实用的做法是:把稳定的规则放前面,把易变化的日志和临时内容放后面;然后看真实命中率,而不是凭感觉加缓存。

三、把一次排错任务摊开看

下面的数字是演示用的假设值,不是任何供应商的报价。

轮次Agent 做了什么这轮新增了什么假设用量
1读规则、路由和测试任务上下文6,000 输入;1,200 输出
2搜索重试逻辑搜索结果3,500 输入;700 输出
3查看数据库适配器代码片段和日志8,000 输入;900 输出
4修改代码和测试补丁上下文2,000 输入;1,100 输出
5第一次跑测试失败错误输出4,000 输入;600 输出
6修正 Fixture,再跑一次修正后的上下文2,000 输入;500 输出
7汇报结果最终摘要1,000 输入;700 输出

表面上看,这是一个“小改动”。但它已经包含了 7 轮模型判断、多个工具调用和一次失败重试。

如果其中 18,000 个 Token 来自重复上下文,并且命中了缓存,台账至少要记成这样:

{
  "task_id": "BUG-1842",
  "input_tokens": 26500,
  "cached_input_tokens": 18000,
  "output_tokens": 5700,
  "tool_calls": 9,
  "retries": 1,
  "human_review_minutes": 14,
  "outcome": "merged"
}

假设未缓存输入 $2 / 1M、缓存输入 $0.20 / 1M、输出 $8 / 1M,模型部分大约是:

(26,500 - 18,000) × $2 / 1M
+ 18,000 × $0.20 / 1M
+ 5,700 × $8 / 1M
= $0.0986

这几分钱不是重点。重点是:输出 Token 虽然少,却可能更贵;缓存能降低重复上下文的价格;一次失败测试会同时增加模型调用和人的审查时间。

一次任务的上下文如何转化为加权成本

四、最容易浪费钱的地方,通常不是“写代码”

1. 读了太多无关代码

改一个服务,却让 Agent 先读完整个 Monorepo。它可能因此更“有背景”,但也更容易把真正的问题淹没。

2. 工具输出太吵

完整构建日志、依赖树、生成文件列表都塞进上下文,既贵又不容易读。让工具只返回失败附近的几十行,通常更好。

3. 需求在中途不断变化

如果已经改了一半,才补充“权限也要处理”“接口不能改名”,Agent 往往需要重新检查前面的决定。不是它故意绕路,而是任务边界变了。

4. 没有先写清楚验收条件

“修好它”很容易变成多轮猜测。更好的说法是:“修复 500,增加一个能复现旧问题的测试,运行命令 X,最后汇报通过的测试。”

一个实用的判断方法

每次复盘只问三个问题:

  1. 这一轮新读的内容,真的改变了下一步吗?
  2. 失败是因为模型能力不够,还是因为输入不清楚?
  3. 如果重来一次,最先删掉哪一段上下文或哪一次工具调用?

这样比盯着“平均每人用了多少 Token”更容易找到改进点。

五、别把“会话成本”当成“任务成本”

会话只是聊天窗口。一个窗口里可能混着三个问题;一个 Bug 却可能跨过本地 Agent、云端 Agent、CI 和人工 Review。

所以最好给每个任务一个稳定的编号,例如 BUG-1842,然后把下面这些东西都挂到它下面:

  • 模型调用;
  • 工具调用和运行时间;
  • 测试结果;
  • PR 或提交;
  • 审查时间;
  • 最终结果:合并、回滚、放弃或阻塞。

任务成本台账如何把模型调用连接到结果和团队决策

最小可用的调用记录可以很简单:

task_id
repository
model
input_tokens
cached_input_tokens
output_tokens
tool_calls
retries
runtime_seconds
review_minutes
outcome
evidence_uri

注意:这里不是让团队给每个人打分。记录这些字段的目的,是找出“为什么这类任务总要重试”“哪个工具输出特别吵”“哪个模型路线合并率更高”。

六、便宜的模型,不一定带来便宜的结果

选择模型时,不要只看每百万 Token 的价格。真正应该比较的是:

  • 第一次修改就通过审查的比例;
  • 需要重试几次;
  • 测试和回滚情况;
  • 人工需要看多久;
  • 从开始到合并用了多久。

一个常见而稳妥的分工是:

阶段可以先尝试的模型什么时候升级
找文件、做摘要小模型找不到关键路径或摘要不可靠
设计修改方案中等或强模型跨权限、数据或并发边界
改代码能稳定通过项目测试的模型出现反复返工
独立审查与编码不同的模型或人工任务风险较高

这是一个起点,不是规则。要用自己团队的任务记录验证,而不是照搬公开 Benchmark。

七、成本优化不能靠跳过验证

下面几种“省钱”方式,通常会把成本转移到更贵的地方:

  • 不跑测试,省下几轮调用,却把问题留给线上;
  • 关掉权限确认,让 Agent 更快执行危险命令;
  • 把密钥和生产日志完整放进上下文,减少几次搜索;
  • 只统计模型 Token,不统计云容器和人工审查。

尤其要注意缓存数据和日志。缓存并不意味着可以把秘密长期放进 Prompt;日志也不应该因为“模型能读”就不做脱敏。

真正可取的优化通常是:缩小无关上下文、减少工具噪声、让验收条件更早明确、把简单步骤交给便宜模型,同时保留测试和权限边界。

八、团队看板先记录事实,再谈优化

第一版看板不需要几十个图表。能回答下面这些问题就够了:

  1. 这个任务用了哪几个模型、工具和运行环境?
  2. 输入、缓存输入和输出分别是多少?
  3. 重试了几次,测试通过了吗?
  4. 最后合并了吗,还是回滚了?
  5. 人工审查花了多久?

可以先按四个视角看数据:

  • 按任务结果:合并、回滚、放弃、阻塞;
  • 按阶段:探索、实现、验证;
  • 按模型路线:价格旁边同时看通过率和审查时间;
  • 按浪费来源:过大上下文、重复工具调用、失败重试、空转运行时。

平均值不够。最好同时看中位数和 P90,因为少数复杂任务往往消耗大部分预算。

验收清单:你真的看懂一次任务的成本了吗?

拿一条真实任务记录,尝试回答:

  • 哪些模型调用属于这项任务?
  • Agent 读了哪些上下文,哪部分命中了缓存?
  • 调用了哪些工具,重试了几次?
  • 测试和人工审查给出了什么证据?
  • 任务最终是合并、回滚、放弃还是阻塞?
  • 下一步准备优化哪一处?用什么质量指标防止优化过头?

如果只能回答“这个月订阅花了多少钱”,你看到的是预算,不是任务成本。

结语:别只数 Token,要看它完成了什么

一次 AI Coding 任务的成本,不只是模型吐出了多少字。它还包括模型为了找到答案读了多少上下文、调用了多少工具、失败后重试了几次,以及最后有没有人花时间确认结果。

把这些信息挂到同一个任务编号下,成本才会从一个模糊的月度数字,变成可以解释、可以比较、也可以改进的工程记录。

下一篇文章再继续讨论:有了这些记录之后,怎样通过 AI Gateway 控制模型路由、权限和配额。

权威资料

最后更新于