首页 › cost-hacks › 输出贵五倍:三招砍掉没人盯的输出税

账单刺客藏在输出端:你以为省钱省对了地方,其实输错方向

如果让你猜一笔 AI 账单里最烧钱的部分,十个人有九个会盯着输入 token——于是全网都在教你做 prompt caching、压 prompt、换 tokenizer、批处理、上小模型路由。这些都是对的,但它们全都在砍入口。

问题在于:出口的价格是入口的 3 到 5 倍,而几乎没人优化它。

以 Anthropic 2026 年 7 月官方定价为例:Claude Opus 输入 $15 / 百万 token,输出 $75 / 百万 token——5 倍。GPT-4o 是 4 倍,Sonnet 是 5 倍,Haiku 是 5 倍。换句话说,模型每多吐一个字给你,烧掉的钱是它读一个字的四到五倍。可你打开任何一份"省钱清单",讲的全是怎么少喂它。

这就是本轮要拆的信息差:输出端有三笔隐形税——废话税、重试税、无缓存税——99% 的人一笔都没拦。下面把三笔税算给你看,再给三招直接砍掉。


一、先看清这场价格不对称:为什么优化方向错了

很多人有个错觉:既然 prompt caching 能把输入砍到 0.1 倍(Anthropic 缓存命中只收基准输入价的 10%),那我的账单不就下来了?

错。缓存只摊薄输入端,输出端是纯线性叠加的。

看这张图就懂了——左边输入端可以被缓存一层层摊平,右边输出端每一轮都是全新生成、全新计价,没有任何缓存能救你:

graph LR
    subgraph IN["输入端:有缓存可摊薄"]
        I1["第1轮输入<br/>全价 1x"] --> I2["第2轮重复输入<br/>缓存命中 0.1x"]
        I2 --> I3["第3轮重复输入<br/>缓存命中 0.1x"]
    end
    subgraph OUT["输出端:无缓存 纯线性叠加"]
        O1["第1轮输出<br/>全价 5x"] --> O2["第2轮新输出<br/>全价 5x"]
        O2 --> O3["第3轮新输出<br/>全价 5x"]
    end
    I3 -. 缓存帮不到输出 .-> O3
    style OUT fill:#fff0f0,stroke:#cc3333
    style IN fill:#f0fff0,stroke:#33aa33

真实场景里这有多贵?一个多轮 agent,假设每轮平均输出 800 token。在 Sonnet($15/M 输出)上跑 10 轮,光输出就是 10 × 800 × $15/1M = $0.12,看着不多——但放大到一天 100 万次调用,就是 $12 万/天的纯输出成本,而其中相当一部分是废话、重试、重复重述。这三笔钱,没有任何 caching 能帮你省。

下面三招,专门砍这三笔。


二、第一招:砍废话税——模型默认"啰嗦",是你没给它限高

现象

几乎所有大模型出厂都被微调成"礼貌、详尽、爱解释"。你问一个 Yes/No,它给你三段铺垫加一句总结。它每多写一个字,你按 5 倍价付费。

账怎么算

假设一个分类任务,理想输出是 {"label":"positive"}(约 6 token),但默认模型给你:

"根据您提供的文本内容,经过仔细分析情感倾向,可以判定该评论的整体情感为积极正面……" + JSON(约 150 token)。

25 倍的输出差距,按 5 倍单价算,等价于 125 倍的输入成本被白白烧掉。在 GPT-4o-mini 上这点钱不算什么,但同样逻辑搬到 GPT-4o / Sonnet / Opus 上,规模一上来就是真金白银。

操作步骤(立刻可做)

  1. 硬顶 max_tokens:每次调用都设。分类任务设 max_tokens=50,摘要设 300。这是物理上限,模型再啰嗦也烧不到上限之外。
  2. 系统提示里写死格式:"只输出 JSON,不要解释,不要前后缀,不要 markdown 代码块。"——这三个"不要"能直接砍掉 30–50% 的废话 token。
  3. 禁止寒暄词:"不要说'好的'、'当然'、'让我来'。" 这类开场白在中文任务里特别费钱,且经常是无效输出。
  4. 要数字不要叙述:"用逗号分隔,不要换行,不要标题。"

效果

笔者实测一个文档抽取 pipeline,仅靠"设 max_tokens + 禁寒暄 + 强制纯 JSON"三件套,输出 token 平均下降 40–55%。按输出占大头算,整张账单直接掉两成以上。


三、第二招:砍重试税——Structured Outputs 让你一次成功,告别"解析失败重来"

这一笔是最隐蔽、也最冤的输出税,因为它花的是"完全不该花"的钱。

现象

你让模型吐 JSON,然后代码里 json.loads()。结果模型偶尔漏个引号、多段 markdown、或者编了个字段名,解析抛异常,你怎么办?最常见的偷懒做法:catch 异常,把同一个 prompt 再发一遍,最多重试 3 次。

每一次重试,你都在为一次完整输入 + 一次完整输出二次买单。而输出是 5 倍价。

重试链路有多贵,看这张图

flowchart TD
    R0["请求"] --> R1{"json.loads<br/>校验"}
    R1 -->|解析失败| R2["重试 第2次<br/>付费:输入+输出"]
    R2 --> R3{"校验"}
    R3 -->|又失败| R4["重试 第3次<br/>再付:输入+输出"]
    R4 --> R5["成功"]
    R5 --> R6["实际付费 = 3×输入 + 3×输出<br/>输出按 5x 计费是大头"]
    R1 -->|原生 Structured Outputs| R7["强制贴合 JSON Schema<br/>一次成功"]
    R7 --> R8["付费 = 1×输入 + 1×输出<br/>零重试"]
    style R6 fill:#ffd0d0,stroke:#cc3333
    style R8 fill:#d0ffd0,stroke:#33aa33

算笔账:假设某接口 5% 的请求会格式失败、平均重试到第 2.5 次才成功。这意味着那 5% 的流量实际消耗了 12.5% 的输出 token。如果你的接口里有 10% 是 JSON 任务,整体输出账单里有 1.25% 是纯重试税——更恶心的是,它带来的是零业务价值,纯粹在为模型的格式不稳定买单。

操作步骤:用原生 Structured Outputs 根除它

  1. OpenAI:用 response_format + json_schema(Structured Outputs 模式,非旧的 json_object)。它在解码层强制输出贴合 schema,理论上不会格式失败。文档:platform.openai.com/docs/guides/structured-outputs。
  2. Anthropic:Claude 原生不强制 JSON,但社区标准做法是 Tool Use(function calling)当结构化出口——让模型把结构化数据填进 tool 的入参里,参数有 schema 校验,失败率远低于裸 JSON。文档:docs.anthropic.com/en/docs/build-with-claude/tool-use。
  3. 校验失败别整体重试:如果还用裸 JSON,至少做到局部修复——把上一次的错误信息塞回去做 repair,而不是把整段 prompt 原样重发。
  4. 用小模型做格式守门员:大模型出原始结果,扔给 gpt-4o-mini / Haiku 做格式化和校验。格式化是简单活,用 5 倍价的 Opus 做就是浪费。

效果

切到原生 Structured Outputs 后,JSON 任务的重试率从 5–15% 降到接近 0。对于结构化抽取为主的产品,这是直接砍掉一整块输出税,且顺带提升了稳定性——这是个少见的"省钱的同时还变好用"的操作。


四、第三招:砍无缓存税——把输出当结果缓存起来,别让模型重复劳动

这是三招里最反直觉的一笔。

现象

prompt caching 厉害吧?可它只缓存输入。模型生成的每一次输出,都是全新算的、全新计费的,输出端没有任何官方缓存机制。

于是有个反常识的结论:你做的"多轮重述"——让模型每一轮把前面的结论复述一遍——是在用 5 倍价的输出 token,去重复生产你已经有的内容。 这在 agent 链路里极其常见:A agent 产出的结论,B agent 又"总结"一遍,C agent 再"确认"一遍,每一遍都是新输出、新计费。

操作步骤

  1. 结果缓存(exact + 语义):对确定性查询(如"提取这份合同的第3条"),把 (输入hash → 结构化结果) 存进 Redis。命中即返回,零模型调用。对相近查询,上语义缓存(把 query 向量化,相似度 >0.95 直接复用上次输出)。
  2. 别让 agent 重述,让它引用:把上一步的结构化结果直接作为下一轮的输入(走输入端、走缓存、走 0.1 倍价),而不是让下一个模型"基于上文重新组织一遍"(走输出端、走 5 倍价)。把信息流动从"输出→输出"改成"输出→输入",这是省钱的物理本质。
  3. 多轮对话里别全量重写历史:很多框架默认每轮把整段历史塞进 prompt 让模型"回顾"——这部分历史复述属于输出端浪费。改成摘要 + 引用 ID 的结构,让模型只产增量。

一个反直觉的对比

做法 信息流 走的计价端 相对成本
Agent B 复述 Agent A 结论 输出→输出 全部走输出 5x 1.0
把 A 结论拼进 B 的 prompt 输出→输入 A 走输出,B 端命中缓存 0.1x ~0.3

同样一条信息,换一个流向,成本差 3 倍以上。


五、把三笔税摆在一起:信息差对照表

维度 大多数人在做的(被收割) 没人在做的(信息差)
优化重点 死磕输入:caching、tokenizer、批处理 同等重视输出端(贵 3–5 倍)
默认输出 接受模型啰嗦,让它自由发挥 max_tokens 硬顶 + 禁寒暄 + 强制纯格式
JSON 任务 正则解析、失败重试 N 次 原生 Structured Outputs / Tool Use,零重试
agent 链路 每个节点重新"总结"上文 结论走输入端引用,复用缓存 0.1x
多轮历史 全量塞回让模型"回顾" 摘要 + ID 引用,只产增量
缓存认知 以为 caching 能省一切 知道缓存只摊输入,输出靠结果缓存

六、行动指南:今天就做的五件事

  1. 跑一次 token 归因:拉最近 7 天的账单,把"输入 vs 输出"金额拆开看。如果输出占比超过 60%(多轮/agent 产品通常会),恭喜你找到了最大油矿。
  2. 给所有调用加 max_tokens:全仓库 grep 一次 API 调用,没设上限的全部补上,按任务类型给合理值。
  3. JSON 任务全切 Structured Outputs:OpenAI 上 json_schema 模式,Claude 上 Tool Use。先在一个高频接口上跑 A/B,看重试率变化。
  4. 审计 agent 链路的"重述"环节:找出哪些节点在重复生产已有信息,改成结论走输入引用。
  5. 给高频确定性查询上结果缓存:从 exact hash 开始,简单有效,再视情况上语义缓存。

一个经验阈值:纯聊天/创意类产品,输出税占比约 40–50%;结构化抽取、agent 自动化、文档处理类产品,输出税能占到 70% 以上——这类产品的成本优化战场,根本不在输入端。


参考来源


本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护。 聚焦5G/6G核心网、3GPP标准、AI工具实战。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入