前端 Token 控制与成本优化
很多团队第一次做 AI 产品,盯的是模型效果;做了两周之后,盯的就变成账单。
Token 成本真正难管的地方,不在单次调用,而在这三个连锁问题:
- 上下文越来越长,历史消息舍不得删。
- 小任务也用大模型,模型分层没建立。
- 没有预算口径,账单只能事后看。
如果不把这三件事一起治理,成本问题迟早会变成产品问题。
1. 先搞清钱花在哪,不然优化没有方向
一个 AI 请求的总成本,通常由四部分决定:
| 成本来源 | 典型表现 | 优化方向 |
|---|---|---|
| 输入 token 过长 | 把完整聊天历史全带上 | 摘要与裁剪 |
| 输出过长 | 要求“尽量详细”且没有长度约束 | 限制输出目标 |
| 模型选型过重 | 分类、改写也走大模型 | 分层用模 |
| 重试与重复请求 | 用户多次点击、前端自动重发 | 幂等与去抖 |
所以成本治理的第一步不是“换便宜模型”,而是建立这张账本。
2. 上下文压缩,要保留任务状态,不是保留所有原文
最常见的误区是:为了“保证模型懂上下文”,把所有历史消息原样带上。
更有效的方法是分层保留:
- 当前任务必须保留的信息。
- 对后续判断有影响的摘要。
- 可以随时回查、但不必每次都发给模型的原始全文。
一个前端应用最小可行的上下文策略可以这样分:
interface ContextLayer {
currentTask: string
stableFacts: string[]
rollingSummary: string
rawHistoryRefIds: string[]
}
也就是说,模型每次看到的应该是“任务状态”,不是“完整聊天录像”。
3. 模型分层决定了成本结构,不要把一个模型当万能入口
很多团队的隐性浪费来自一句话:先都用最强模型,后面再优化。
更稳的做法是按任务类型分层:
- 高复杂决策:规划、架构、风险分析。
- 中复杂生成:页面文案、摘要、方案比较。
- 低复杂处理:分类、提取、格式化、改写。
如果低复杂任务占总调用量 70%,那成本优化的主战场不在最复杂的 30%,而在高频任务的默认模型。
4. 前端最容易忽略的浪费,是“无意识重复请求”
这些情况很常见:
- 输入框每次改动都触发重新生成。
- 用户连续点两次“生成”。
- 页面切换回来再次自动请求。
- 同一任务在不同组件里各发一次。
推荐至少加三层防护:
const inflightRequests = new Map<string, Promise<unknown>>()
export async function runDedupedRequest(key: string, task: () => Promise<unknown>) {
if (inflightRequests.has(key)) return inflightRequests.get(key)
const promise = task().finally(() => inflightRequests.delete(key))
inflightRequests.set(key, promise)
return promise
}
这不是性能小技巧,而是直接的成本控制手段。
5. 一个失败案例:把聊天历史越堆越长,结果越聊越贵、越聊越慢
很多 AI 应用在早期都经历过这个阶段:
- 为了保持上下文,所有消息永久保留。
- 每次请求都把历史全部发给模型。
- 结果响应越来越慢,费用越来越高。
- 最后不得不靠“清空聊天”粗暴止损。
问题根因有两个:
- 没有把“长期记忆”和“当前会话”分开。
- 没有把“摘要信息”和“原始内容”分开。
修复方式通常是:
- 超过阈值后自动做阶段摘要。
- 原始内容只做检索引用,不再全量拼接。
- 对不同功能设置独立上下文窗口。
6. 成本治理要落到预算策略,而不是每月看账单
最小预算体系至少要有 3 层:
- 日预算:防止异常暴涨。
- 功能预算:识别哪个入口最费钱。
- 用户预算:防止个别用户无限消耗。
| 层级 | 例子 | 作用 |
|---|---|---|
| 全局预算 | 每日 300 元 | 防止账单失控 |
| 功能预算 | 页面生成每日 120 元 | 看功能 ROI |
| 用户预算 | 单用户每日 30 次 | 控制滥用 |
如果预算命中了,不一定要直接报错。更实用的策略是:
- 大模型降级到轻模型。
- 流式生成降级为非流式摘要。
- 免费用户进入排队或频率限制。
7. 上线前 Checklist
- 已统计输入 token、输出 token、模型名与功能名。
- 已建立上下文裁剪或摘要规则。
- 高频低复杂任务已从大模型拆出。
- 前端已做重复请求去重与取消。
- 已设置全局、功能、用户三级预算。
- 命中预算阈值时有降级策略,而不是直接崩溃。
- 已能区分“效果问题”和“成本问题”。
- 已监控取消率、重试率、平均 token 与单次请求成本。
FAQ
Token 控制是不是会损害效果?
会,但关键在于你裁掉什么。裁掉重复历史和低价值上下文,通常只会减少浪费;裁掉任务状态,才会真正影响质量。
前端怎么知道一次请求花了多少钱?
不要在浏览器硬算账单。更稳的是由服务端记录模型、token 与费用,再返回聚合后的统计结果给前端后台面板。
什么情况下要做摘要而不是截断?
只要历史内容里有“之后仍会影响判断的事实”,就优先做摘要,而不是简单截断。


