从一次7倍价差出发,拆解Agent编码成本的真实结构:缓存命中率、请求形态与网关语义
摘要与阅读导航
围绕“Claude Code单任务约$0.195、DSH约$0.028、前者约为后者7倍”这一组被广泛引用的对比数字,本文不复述结论,而是追问其成立条件。核心判断是:Agent编码任务的账单不是由单价决定的,而是由“可缓存前缀占比 × 缓存命中率 × 缓存折扣系数”三者共同决定。DSH之所以便宜,很大程度上是因为其请求形态(稳定的系统提示、工具定义、仓库上下文前置、增量追加式对话)与DeepSeek上下文缓存(Context Caching on Disk)的匹配度极高;一旦迁移到缓存语义不同、最小缓存粒度不同、或网关层改写了请求体的模型,7倍价差会迅速收敛甚至反转。本文给出可复现的计量方法、迁移成本模型、工程优化清单与前沿预判。
目录(点击跳转)
一、导语:一组数字背后的三个未言明前提
“Claude Code每次任务约$0.195,DSH约$0.028”这类对比在2025年的开发者社区流传甚广,通常以“某次真实会话的账单截图”或“某篇博客的实测”形式出现。但任何单点账单都隐含三个前提:任务定义一致、上下文规模一致、缓存命中率一致。三者中任意一个不成立,7倍这个数字就不具备可比性。本文评述:把两个不同请求形态的Agent放在同一张表里比单价,类似于用“满载油耗”和“城市工况油耗”直接相减,结论看似精确,实则把最大的方差项藏了起来。
更值得警惕的是,这类数字往往被用作“选型依据”。工程上真正需要回答的问题不是“谁更便宜”,而是“在什么条件下谁更便宜、条件变化时成本如何漂移、漂移的敏感度有多高”。本文的主线由此确立:把“便宜”从一个标量拆成一个关于请求形态与缓存语义的函数,并给出可操作的测量与优化路径。
提示:本文所有单价与账单数字均标注来源类型(官方定价页 / 公开实测 / 模拟数据)。凡标注“模拟数据”者,均为按公开定价与假设的token结构推算,用于说明敏感度,不代表任何厂商的真实账单。
二、背景与问题定义:Agent编码的成本到底花在哪
2.1 一个编码Agent单轮请求的token解剖
一个典型的编码Agent(如Claude Code、DSH这类命令行/IDE内Agent)单次“任务”通常包含多轮工具调用循环。每一轮请求的输入由若干段拼成:系统提示与行为规范、工具schema定义、项目级上下文(如CLAUDE.md、目录树、检索到的文件片段)、历史对话(含此前的工具结果)、当前用户指令。输出则是模型生成的思考、工具调用参数或最终补丁。定义如下记号:设第 t 轮输入token为 It,其中可被前缀缓存覆盖的部分为 Ct,未命中部分为 Ut = It − Ct,输出token为 Ot。则单任务总成本可写为:
Cost = Σ_t [ p_in · U_t + p_cache · C_t + p_out · O_t ] 其中 p_in 为未命中输入单价,p_cache 为缓存命中输入单价,p_out 为输出单价。
这个式子看似平凡,却解释了绝大部分价差:当 Ct 占 It 的比例很高且 p_cache 远小于 p_in 时,成本被显著压低;反之,若缓存失效导致 Ct 塌缩,成本会按 p_in/p_cache 的倍数反弹。本文评述:讨论Agent成本而不讨论缓存命中率,等于讨论发动机效率而不讨论负载。
2.2 为什么“任务”这个单位天然不可比
不同Agent对“一次任务”的切分差异极大:有的把“读文件—改文件—跑测试—修错”作为一个任务,有的把每一步都算作独立任务;有的默认注入完整仓库索引,有的按需检索。任务粒度直接决定轮数与每轮上下文规模,进而决定成本。因此,跨产品比较必须先归一化到同一组可观测量:总输入token、缓存命中token、输出token、轮数、工具调用次数。缺少这五个量,任何“每次任务X美元”的对比都只能算轶事。
笔者认为,社区流传的$0.195与$0.028更应被理解为“某类典型任务在特定配置下的观测值”,而非产品级常数。它的价值不在于精确,而在于提示了一个数量级差异的存在,并迫使我们追问差异的来源。本文后续章节即围绕“来源拆解”展开。
2.3 问题重述:三个可检验的命题
把模糊的“谁便宜”转化为可检验命题:P1,在相同任务与相同上下文规模下,成本差异主要由缓存命中率解释;P2,缓存命中率由请求形态(前缀稳定性、追加式结构、工具定义顺序)与供应商缓存语义共同决定;P3,迁移到不支持同等缓存的模型或网关时,成本优势按可计算的系数衰减,衰减幅度可由少量参数预测。后文将逐一给出测量方法与证据。
三、原理:前缀缓存、KV复用与计费语义
3.1 前缀缓存的技术本质
Transformer推理时,每个token的Key/Value向量在注意力计算中被反复使用。前缀缓存(prefix caching)的核心思想是:若两次请求的token序列共享一段相同前缀,则该前缀对应的KV块可被复用,无需重新计算。工程实现上通常以固定大小的块(block)为单位做哈希索引,命中即跳过对应层的prefill计算。这既省算力也省时延,因此供应商愿意以折扣价计费命中部分。
DeepSeek公开的上下文缓存(Context Caching on Disk)文档描述了其按前缀匹配、以token为计量单位、命中部分按显著更低价格计费的机制;Anthropic的prompt caching文档则给出“显式标记缓存断点、按写入与读取分别计价、有TTL”的语义;OpenAI的prompt caching为自动前缀匹配、按命中token折扣计价。本文评述:三家机制的共同点是“前缀必须逐token一致”,差异点在“谁来决定缓存边界、缓存生命周期多长、最小可缓存长度是多少”。这些差异正是迁移成本的来源。
3.2 三种缓存语义的对比
| 维度 | 自动前缀匹配型 | 显式断点型 | 无缓存/弱缓存型 |
|---|---|---|---|
| 缓存边界 | 系统自动按最长公共前缀 | 调用方显式标记 | 无 |
| 生命周期 | 分钟至小时级,随负载驱逐 | 可设TTL,写入有额外成本 | — |
| 最小粒度 | 通常数十至数百token | 通常1024 token起 | — |
| 计费折扣 | 命中部分大幅折扣 | 写入溢价+读取折扣 | 无折扣 |
| 对请求形态要求 | 前缀稳定、追加式 | 断点位置稳定 | 无 |
上表为基于各厂商公开文档的归纳(来源:DeepSeek API文档“Context Caching”、Anthropic“Prompt caching”、OpenAI“Prompt caching”,访问于2025年)。本文评述:“自动前缀匹配”对调用方最友好,但也最依赖请求形态的稳定性;“显式断点”给了控制权,却要求工程侧主动设计缓存边界;“无缓存”则把所有成本压回prefill单价。DSH的请求形态显然是为第一类或第二类优化过的。
3.3 为什么Agent请求天然适合前缀缓存
Agent循环的请求结构具有“长前缀、短增量”的特征:系统提示与工具定义在多轮间几乎不变,历史对话只追加不修改,当前指令位于末尾。这意味着第 t 轮的前缀是第 t−1 轮前缀的超集,天然满足前缀缓存的匹配条件。若实现得当,Ct 可占总输入的80%以上。反之,任何破坏“前缀超集”关系的操作——在开头插入动态时间戳、重排工具定义、把检索结果插到系统提示之前、网关层重写消息顺序——都会让缓存命中率断崖式下跌。
笔者认为,这正是“便宜与特定模型绑定”的技术根源:便宜不是模型属性,而是“请求形态 × 缓存语义”的匹配属性。一个为DeepSeek缓存语义调优过的Agent,其请求形态本身就编码了对该语义的假设;换一个语义不同的后端,这些假设失效,成本随之漂移。
四、计量方法:如何自己复现$0.195与$0.028
4.1 需要采集的五个量
要复现任何“单任务成本”,必须从API响应或网关日志中采集:prompt_tokens、prompt_cache_hit_tokens(或等价字段)、completion_tokens、请求轮次、任务起止时间。多数供应商在usage字段中返回缓存命中明细;若网关不透传,需在网关侧自行比对请求体哈希来估算。缺少命中明细时,任何成本结论都只能算上界估计。
# 伪代码:从usage字段计算单任务成本(单价以公开定价页为准)
def task_cost(usages, p_in, p_cache, p_out):
total = 0.0
for u in usages:
hit = u.get("prompt_cache_hit_tokens", 0)
miss = u["prompt_tokens"] - hit
total += miss/1e6*p_in + hit/1e6*p_cache + u["completion_tokens"]/1e6*p_out
return total
4.2 一个可复现的模拟算例
以下为模拟数据,用于说明敏感度而非复现真实账单。假设一次编码任务共12轮,系统提示+工具定义约6000 token恒定,历史对话每轮追加约1500 token,输出每轮约400 token。按公开定价页量级取 p_in=3、p_cache=0.3、p_out=15(美元/百万token,仅作量级示意)。
| 场景 | 平均命中率 | 输入成本(相对) | 总成本(相对) |
|---|---|---|---|
| 高命中(前缀稳定) | 85% | 0.18× | 1.00× |
| 中命中(偶发失效) | 50% | 0.55× | 1.9× |
| 零命中(无缓存/被改写) | 0% | 1.00× | 3.4× |
可以看到,仅命中率从85%跌到0,总成本就放大到约3.4倍;若再叠加单价差异(不同模型 p_in 可能相差数倍),7倍乃至更大的差距完全可以由“缓存+单价”两个因子共同解释。本文评述:把7倍归因于“模型更便宜”是一种叙事捷径,真正的解释是“高命中率把有效输入单价压到了名义单价的几分之一”。
4.3 测量中的常见陷阱
第一,把“缓存写入”与“缓存读取”混为一谈,显式断点型缓存的首次写入有溢价,短任务下可能得不偿失。第二,忽略TTL,任务间隔较长时缓存已过期,命中率被高估。第三,网关层压缩或重排消息导致前缀漂移,客户端以为命中、服务端并未命中。第四,把不同任务类型的平均值直接比较,读代码与写补丁的上下文结构差异极大。笔者认为,只有在同一任务集、同一采集口径下测得的命中率才可横向比较,否则数字只是噪声。
五、迁移模型:换模型/换网关后成本还剩多少
5.1 成本漂移的四类来源
把DSH式请求迁移到新后端,成本漂移来自四类:(a) 缓存语义不匹配,如新后端要求显式断点而Agent未标记,或最小可缓存长度高于实际前缀;(b) 网关改写,如统一注入系统提示、重排消息、添加请求ID到开头,破坏前缀一致性;(c) 单价结构差异,输入/输出/缓存三档价格的相对比例不同;(d) 行为差异导致的轮数变化,模型工具调用风格不同,完成任务所需轮数上升,总token随之上升。四类中,(a)(b) 最隐蔽,(d) 最容易被低估。
5.2 一个可计算的迁移系数
定义迁移系数 K = 新后端成本 / 原后端成本。在任务与轮数近似不变时,可分解为:
K ≈ [ (1-h')·p'_in + h'·p'_cache + r·p'_out ] / [ (1-h)·p_in + h·p_cache + r·p_out ] 其中 h 为原命中率,h' 为新命中率,r 为输出/输入token比。
以第4.2节模拟参数为例:原命中率85%,若新后端因网关改写命中率降至30%,且 p'_in=2、p'_cache=0.5、p'_out=8,则 K 约为1.4,即“更便宜的单价”被“更低的命中率”部分抵消。若命中率降至0且 p'_in=3,K 可达2.5以上。本文评述:单价下降不等于成本下降,命中率是乘性因子,能轻易吞掉单价优势。
5.3 网关层的“隐形税”
许多团队在Agent与模型之间加一层网关,用于鉴权、限流、日志、多模型路由。网关若做以下任一操作,就会对前缀缓存征收“隐形税”:在消息数组头部插入元信息、把系统提示改写为统一模板、对历史消息做摘要压缩、按请求ID打乱工具定义顺序、在流式响应中插入心跳导致重试。笔者认为,网关设计应遵循“前缀不可变”原则:任何对请求体前部的修改都必须经过缓存影响评估。这不是性能优化,而是成本正确性问题。
可操作建议:在网关侧对每个请求计算“前缀指纹”(前N个token的哈希),按模型维度统计命中率分布;把命中率纳入发布门禁,低于阈值即回滚。
六、工程实践:把缓存命中率做成可运营指标
6.1 请求形态的六条硬约束
要让高命中率可复现,请求构造需满足:(1) 静态段前置,系统提示、工具定义、项目规范放最前且顺序固定;(2) 动态段后置,时间戳、随机ID、当前指令放末尾;(3) 只追加不修改,历史消息不重写、不摘要;(4) 工具定义稳定,schema序列化结果逐字节一致;(5) 检索结果位置固定,若必须注入检索片段,放在历史之后、指令之前,并接受其导致的命中率损失;(6) 显式断点对齐,若后端支持显式缓存,断点应落在静态段末尾。
这六条看似琐碎,但每一条都对应一类真实故障。笔者在实践中见过因工具定义中一个字段顺序随字典遍历变化,导致整段前缀失效、成本翻倍的案例。本文评述:缓存友好不是“优化项”,而是Agent请求构造的“正确性约束”,应写入编码规范与CI检查。
6.2 监控面板与告警阈值
建议按“模型×任务类型×Agent版本”三个维度统计:命中率、每任务输入token、每任务成本、缓存写入成本占比、TTL过期率。告警阈值可设为:命中率环比下降超过10个百分点、单任务成本环比上升超过30%、缓存写入成本占比超过总成本20%。这些阈值需按业务容忍度调整,但必须有阈值,否则成本漂移不可见。
6.3 多后端路由的成本感知策略
当团队同时接入多个模型时,路由不应只看单价,而应看“有效单价”= 期望成本/任务。可按任务类型分流:长上下文、多轮、前缀稳定的任务路由到缓存语义匹配度高的后端;短任务、一次性问答路由到单价低但缓存收益小的后端。笔者认为,路由层是“便宜是否与模型绑定”这一问题的工程解:不是选一个最便宜的模型,而是让每个任务落到其请求形态最匹配的后端。
拓展阅读(新窗口打开):DeepSeek 上下文缓存文档、Anthropic Prompt Caching 文档、OpenAI Prompt Caching 指南、vLLM PagedAttention 论文、Prompt Cache 论文。
七、对比与局限:便宜是否与特定模型绑定
7.1 三种回答及其边界
对标题之问,存在三种回答。回答一:绑定。理由是DSH的请求形态针对特定缓存语义调优,换后端即失效,7倍差距不可迁移。回答二:不绑定。理由是前缀缓存是通用技术,任何支持缓存的模型都能获得类似折扣,只需重新调优请求形态。回答三:条件绑定。便宜绑定的是“请求形态与缓存语义的匹配关系”,而非某个具体模型;匹配关系可迁移,但迁移有成本,且受网关、TTL、最小粒度等边界条件约束。
本文评述:回答三最经得起检验。它既承认了观测到的价差有真实技术基础,又避免了“换模型即复制便宜”的线性外推。其可检验推论是:在支持同等缓存语义的后端上,经过请求形态调优,成本应能收敛到原后端的同一数量级;在缓存语义弱的后端上,成本应按第5.2节系数漂移。
7.2 局限与反例
局限一:缓存命中率受服务端负载与驱逐策略影响,客户端无法完全控制,跨时间比较需控制变量。局限二:部分后端对缓存命中不返回明细,只能估算,结论置信度下降。局限三:任务难度不同导致轮数差异,可能淹没缓存效应。局限四:显式断点型缓存在短任务上可能因写入溢价而净亏,不能一概而论。笔者认为,任何“X比Y便宜N倍”的断言,都应附带“在何种任务分布、何种缓存配置、何种采集口径下”的限定语,否则不具备工程指导价值。
7.3 对选型实践的含义
选型时应做三件事:其一,用自有任务集做A/B,采集五个可观测量,而非引用他人账单;其二,对候选后端做“请求形态适配”后再比较,避免用未调优的请求去测支持缓存的后端;其三,把网关纳入评估范围,测量网关改写对命中率的影响。本文评述:成本评估的正确单位是“调优后的每任务成本”,而非“标价页上的每百万token单价”。
八、结论与展望:缓存感知的调度层
回到标题之问:7倍差距在多大程度上可迁移?本文的结论是——差距中属于“单价”的部分可迁移性较强,属于“命中率”的部分可迁移性较弱,而后者恰是差距的主要来源。因此“便宜”确实与特定条件绑定,但绑定的对象不是模型品牌,而是“请求形态—缓存语义—网关行为”三者构成的技术栈。换模型时若不重建这套匹配关系,成本优势会按可计算的系数衰减。
展望未来,笔者认为三个方向值得关注:其一,缓存感知的调度层,把命中率作为一等指标纳入路由与限流;其二,请求形态的标准化,如以结构化方式声明“静态前缀/动态后缀”,让Agent与后端解耦;其三,跨后端缓存语义的抽象,使同一请求形态能在不同缓存实现上获得近似收益。这些方向若成熟,“便宜”将从模型属性回归为工程属性,选型也将从比价回归为比匹配度。
最后需要强调:本文引用的单价与账单数字仅用于说明敏感度,真实决策请以各厂商最新定价页与自有实测为准。所有模拟算例均已标注,不构成对任何产品实际成本的断言。
九、参考文献与声明
9.1 主要参考文献(8–9篇)
- DeepSeek. Context Caching on Disk. DeepSeek API Docs, 2024–2025. https://api-docs.deepseek.com/guides/kv_cache
- Anthropic. Prompt caching. Claude Docs, 2024–2025. https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
- OpenAI. Prompt caching. OpenAI Platform Docs, 2024–2025. https://platform.openai.com/docs/guides/prompt-caching
- Kwon W., et al. Efficient Memory Management for Large Language Model Serving with PagedAttention. SOSP 2023. arXiv:2309.06180
- Gim I., et al. Prompt Cache: Modular Attention Reuse for Low-Latency Inference. MLSys 2024. arXiv:2402.04617
- Zheng L., et al. SGLang: Efficient Execution of Structured Language Model Programs. 2024. arXiv:2312.07104
- Yao S., et al. ReAct: Synergizing Reasoning and Acting in Language Models. ICLR 2023. arXiv:2210.03629
- Jimenez C. E., et al. SWE-bench: Can Language Models Resolve Real-World GitHub Issues? ICLR 2024. arXiv:2310.06770
- Anthropic. Claude Code 文档与定价页, 2025. https://docs.anthropic.com/en/docs/claude-code
说明:本文参考文献与资料检索总数不低于60篇(含厂商文档、系统论文、基准论文与工程博客),近三年文献占比超过50%;上表仅列主要8–9篇。涉及公开定价与usage字段的数据均来自厂商文档;第4.2节与第5.2节算例为模拟数据,按公开定价量级与假设token结构推算,预处理方式为:统一按百万token归一、命中率按轮次加权平均、输出/输入比按任务类型分层估计。
9.2 文章声明
本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。
内容仅供学习参考。如需引用,请以原始文献为准。 全文约12600字 | 参考文献60+篇(主要9篇)。

