AI API 输出 token 是大头 那篇讲了一个被忽视的事实——输出 token 单价是输入的 3-5 倍,结果是大多数 prompt 在生产环境的真实成本里,输出占比常常 60% 以上。
这篇是上一篇的执行篇:输出已经被识别为大头,具体怎么压。我把日常用过有真实效果的方法整理成 8 个,按”修改成本”从低到高排:
| 编号 | 方法 | 修改成本 | 实测降幅 |
|---|---|---|---|
| 1 | 格式输出强制结构化 | 极低 | 20-40% |
| 2 | system prompt 加输出长度上限 | 极低 | 10-25% |
| 3 | 删去解释性前后缀 | 低 | 10-20% |
| 4 | 用 enum/code 代替自然语言标签 | 低 | 15-30% |
| 5 | 切流式 + 提前终止 | 中 | 5-30% |
| 6 | schema 嵌套扁平化 | 中 | 15-25% |
| 7 | 后处理截断 + 重要部分前置 | 中 | 10-20% |
| 8 | 输入端给”格式范例” | 中 | 20-40% |
下面一个一个说。
方法 1:格式输出强制结构化
做什么:把”用一段话回答”改成”用 JSON / YAML / 表格回答”。
为什么有效:自然语言里有大量”过渡词、客气话、解释性铺垫”——Sure, I can help with that. Here's the breakdown of... 这种 30 token 在 JSON 输出里基本消失。模型看到 schema 会自动跳过 fluff。
示例:
❌ 自然语言:
Based on the description, this ticket appears to be a billing issue.
The user is asking about why they were charged twice. The priority
is high because billing problems affect customer trust. I would
suggest assigning this to the billing team for review.
✅ JSON:
{
"category": "billing",
"priority": "high",
"assignee": "billing",
"reason": "duplicate charge"
}
输出 token 从 ~70 降到 ~25,降幅 64%。
注意:JSON schema 的 token 在系统提示侧(cache 友好),输出端只用 schema 实体,输入成本几乎不变。
方法 2:system prompt 加输出长度上限
做什么:在 system prompt 里明确告诉模型输出长度上限。
为什么有效:模型对”具体数字”比”抽象指令”敏感。Be concise 几乎不起作用,Output 50 words or less 会真的压。
有效写法对比:
❌ “Be concise” / “Don’t be verbose”
❌ “Keep it short”
✅ “Output ≤ 50 words”
✅ “Limit response to 3 sentences max”
✅ “Output exactly 1 paragraph, no more than 80 tokens”
更进一步可以按场景加分支:
Output rules:
- For simple questions: 1-2 sentences
- For lists: max 5 items
- For code: only the requested function, no surrounding text
- Never explain your reasoning unless explicitly asked
实测一个客服场景这一段单独加进去,平均输出 token 从 180 降到 110。
方法 3:删去解释性前后缀
做什么:明确禁止 Sure, here's... / I hope this helps! / Let me know if... 这种废话。
为什么有效:这些句子在每次输出都出现,按 token 算每次浪费 15-30 个。一天 10 万次调用就是 150-300 万浪费 token。
system prompt 加这段:
- Do not start responses with "Sure", "Of course", "I'd be happy to", "Here's", "Based on"
- Do not end with "I hope this helps", "Let me know if you need more", "Feel free to ask"
- Start with the actual answer
- End when the answer ends
模型会真的照做。
方法 4:用 enum / code 代替自然语言标签
做什么:把状态、分类、级别等枚举值用短代码代替整词。
为什么有效:"priority": "high" 是 1-2 token,"priority": "very high importance" 是 4-5 token。批量分类场景这一项放大效果惊人。
示例:
❌ 啰嗦:
{
"status": "successfully completed",
"severity": "moderate to high impact",
"next_action": "human review required"
}
✅ 紧凑:
{
"status": "ok",
"severity": "M",
"next": "review"
}
代价:你的解析层得知道这些缩写——但这只是一次写代码的成本,输出端 token 节省是持续的。
方法 5:切流式 + 提前终止
做什么:用流式响应(SSE),客户端检测到”答案够了”就主动断开连接。
为什么有效:很多场景模型继续输出的内容已经价值边际递减——但 API 会按完整生成计费。提前终止能掐掉那部分。
典型应用:
- 摘要任务:用户读到第 100 字就够了,但模型还想写 500 字
- 列表生成:用户只需要前 3 个,但模型默认生成 10 个
- 代码生成:模型函数主体写完后还想”在解释一下”
代码示例(伪代码):
async for chunk in stream_response(prompt):
yield chunk
if condition_met(accumulated_output):
await close_stream() # 主动断开
break
注意:不是所有 provider 都对”客户端主动断”完全免计费——有的 API 仍按已生成 token 计费。看具体 provider 文档。
方法 6:schema 嵌套扁平化
做什么:把深层嵌套的 JSON 改成扁平结构。
为什么有效:嵌套 JSON 的 { "user": { "profile": { "name": ... 每一层都要 token 表示括号、逗号、缩进。同样信息扁平化能节省 30%+ 结构 token。
示例:
❌ 深层嵌套(45 token):
{
"user": {
"profile": {
"name": "Alice",
"tier": "pro"
},
"stats": {
"calls_today": 42,
"tokens_today": 8400
}
}
}
✅ 扁平(28 token):
{
"user_name": "Alice",
"user_tier": "pro",
"calls_today": 42,
"tokens_today": 8400
}
代价:扁平结构在数据语义上不如嵌套清晰,但输出场景下你的接收端通常会立刻把它解析成对象——展平不影响下游消费。
方法 7:后处理截断 + 重要部分前置
做什么:让模型把最重要的内容写在前面,后面再做截断。
为什么有效:模型有时候输出很长是合理的,但你只需要前 80%。如果重要内容在前面,截断后影响小。
system prompt 模式:
Output structure:
1. Direct answer (1-2 sentences) — REQUIRED
2. Key reasoning (2-3 bullets) — OPTIONAL
3. Detailed explanation — OMIT unless asked
4. Examples — OMIT unless asked
Order matters: write 1, then 2 only if helpful, then 3, then 4.
后处理上你可以截断到第 1 段或第 2 段,看场景。本质是把”详细程度”做成可裁剪的。
方法 8:输入端给”格式范例”
做什么:在 prompt 里直接给一两个理想输出例子。
为什么有效:模型对 example-based instruction 服从度比 rule-based 高。给一个 80 token 的范例,模型会按 80 token 复刻;给规则 “be concise” 模型会自由发挥。
适用场景:
- 输出长度需要稳定的场景(评论生成、tag 提取、摘要)
- 格式有固定模板的场景
缓存友好:例子放在 system prompt 里 → 享受 prompt caching → 不增加 input 成本
落地优先级
如果你只能选 3 个先做,按 ROI 顺序:
- 方法 1(结构化输出) —— 一次配置,永久生效,对几乎所有场景都有效
- 方法 3(删废话前后缀) —— 加 5 行 system prompt,立刻 10-20% 降幅
- 方法 2(明确长度上限) —— 在 1 之后强化效果,避免长输出失控
做完这 3 个、跑一周看实测降幅,再决定是不是值得做 4-8。
不要做的”伪压缩”
最后列几个看着像压缩、实际上没用甚至更贵的做法:
❌ 要求模型自己再总结一次自己的输出 —— 多一次调用,多一次成本,质量未必更好
❌ 强制输出长度太短 —— 短到模型答不全,用户不满意要重问,总成本反而上升
❌ 删除所有解释、只要结论 —— 在需要可解释性的场景(医疗、金融、法律)会出可信度问题
❌ 用模糊语言”你看着办” —— 模型会发挥,输出方差变大,长尾输出更长
输出压缩的目标是保住信息密度,砍掉冗余形式——不是越短越好。
延伸阅读:
- 先理解为什么压输出值得做:AI API 输出 token 是大头
- 配合输入端优化:Prompt 缓存预算清单 让 input 也省钱
- 全面降本动作:7 种立刻可执行的 AI API 降本动作
- 不知道现在花在哪:先用 AI 成本失控的 7 个信号 摸清楚结构