AI 产品怎么做成本控制:我的优化思路
How I optimize cost in AI products上一篇写到,我在测试一个 AI 产品时发现,一次完整使用流程可能花掉几美元。
真正开始优化以后,我发现,AI 成本控制并不只是缩短 Prompt、减少输出,或者换一个更便宜的模型。
我最后把它拆成了三个问题:
- 哪些钱根本不应该花;
- 必须花的钱,如何设定边界;
- 钱省下来以后,结果是否仍然值得使用。
第一步:先减少不应该发生的 AI 调用
成本优化最先要问的,不是“用哪个模型更便宜”,而是:
这一步真的需要 AI 吗?
很多工作并不需要模型。
例如:
- 去重可以用数据库和普通程序;
- 格式转换可以用 parser;
- 薪资、地点和硬条件比较可以用规则;
- 已知招聘网站可以直接通过 API 或固定页面结构获取;
- 简单排序可以先使用评分规则;
- 重复查询的公司和网页信息可以缓存;
- 固定格式的内容可以使用模板生成。
AI 更适合处理普通程序难以稳定完成的部分,例如:
- 判断一段经验与岗位要求是否真正相关;
- 综合多条证据形成结论;
- 处理模糊、冲突或缺失的信息;
- 根据具体上下文完成写作。
旧的思路可能是:
让 AI 搜索岗位、读取网页、去重、过滤、判断和排序。
新的顺序是:
普通程序先负责获取、解析、去重和硬条件筛选,只把剩下少量需要判断的内容交给 AI。
这不仅更便宜,也更稳定、更容易测试。
最便宜的调用,不是使用了更小的模型,而是这次调用根本没有必要发生。
第二步:减少每次调用读取的内容
调用次数减少以后,还要继续看每次调用到底读了什么。
我之前的一些流程会把完整的职位信息、用户职业经历、求职偏好和历史分析结果,重复发送给多个模型步骤。
但并不是每项任务都需要知道所有信息。
例如,一条 200 字符以内的 LinkedIn 消息,可能只需要:
- 岗位名称;
- 公司信息;
- 一两个最相关的经历;
- 希望建立联系的原因。
它不应该读取生成完整简历和岗位报告所需要的全部上下文。
后来我的处理方式是:
- 先整理一份可复用的证据包;
- 为每项任务选择真正需要的证据;
- 只发送相关片段,而不是完整历史;
- 对职位、公司和网页内容做缓存;
- 避免不同步骤重复搜索和重复读取相同信息。
这一步降低的不只是 Token,也减少了模型被无关信息干扰的可能。
第三步:为所有付费调用设置一个“收费站”
减少调用和输入以后,还需要一个统一的执行边界。
我把它理解成一个收费站。
以前,每个功能都可以直接调用模型:
岗位扫描走自己的调用,匹配分析走自己的调用,材料生成再走另一套调用。
这样的问题是:
- 每个功能可能使用不同的模型和参数;
- 有的地方可能忘记设置上限;
- SDK 可能在背后自动重试;
- 新增功能可能绕过原有的成本记录;
- 很难控制一个用户或整个产品的总开销。
后来,所有付费调用都必须先经过同一个入口。
收费站会在调用发生之前检查:
- 这是什么功能;
- 使用哪个模型;
- 最多允许多少输入和输出;
- 是否允许搜索;
- 最多允许搜索几次;
- 是否允许 retry 或 continuation;
- 这一次最坏可能花多少钱;
- 用户和系统是否还有预算。
不符合规则,就不允许调用。
这和月底看账单完全不同。
月底报表只能告诉我钱已经花掉了。收费站解决的是:
这笔钱现在能不能花?
第四步:调用前先预留预算,而不是花完以后报警
为了让收费站真正有效,我还引入了预算预留。
系统不会根据一个乐观估计说:
这次大概只花 0.05 美元,先运行再说。
它会按照预先设置的最大输入、输出、工具和重试次数,计算最坏情况下可能产生的费用,并先预留这笔预算。
调用结束以后,再根据实际使用结算,多余的部分释放。
这个设计有点像酒店押金。
为什么不能只记录实际费用?
因为多个请求可能同时发生。
假设账户里还剩 1 美元,同时来了三个“预计花费 0.4 美元”的请求。如果不提前预留,它们可能都会认为预算充足,最后一起超过上限。
预留也能避免 timeout 后立即重复调用。
请求超时不代表模型服务一定没有处理。如果系统立刻释放预算并重新执行,可能会为同一个任务付两次钱。
所以,在无法确认 provider 是否已经接受请求时,预留金额会暂时保留,直到能够完成核对。
第五步:为每项能力设置不同的价格
不同 AI 功能不应该共享一个模糊的预算。
一条简短消息、一封求职信、一份完整简历和一次公司研究,复杂度与用户价值完全不同。
在我的初始方案里,不同能力有不同的单次费用上限,例如:
- 简短 LinkedIn 消息:0.03 美元;
- 求职信:0.12 美元;
- 定制简历:0.25 美元;
- 完整岗位匹配分析:0.40 美元。
同时还有:
- 单个用户每日总预算;
- 自动后台任务的独立低额度;
- 产品整体的月度预算;
- 模型供应商账户的外层限制。
这些数字不是行业标准,只是当前产品在当前模型价格下的初始边界。
重要的不是数字本身,而是:
每项能力都应该有一张和其价值、复杂度相匹配的价格标签。
第六步:收费站之外,还要有一本完整的账
收费站负责决定钱能不能花,账本负责记录钱花去了哪里。
以前只有一次逻辑任务的总 Token,很难回答:
- 实际向模型发送了几次请求;
- 每次输入和输出分别是多少;
- 是否发生了 cache read 或 cache write;
- 使用了几次搜索;
- 第二次请求是 retry、continuation,还是用户重新点击;
- 失败之前是否已经产生费用;
- timeout 后的账单是否仍然不确定。
后来,每一次真实的 provider attempt 都单独记录。
即使最终没有生成产品结果,也要留下:
- 使用量;
- 工具调用;
- 失败阶段;
- 重试原因;
- 实际费用;
- 是否已经完成结算。
这让我第一次能够区分:
产品结果失败了,和付费调用没有发生,是两件完全不同的事。
收费站负责控制未来,账本负责解释过去。
缺少任何一个,成本管控都不完整。
第七步:成本下降以后,还要证明质量没有一起下降
最容易省钱的方法其实很多:
- 少给模型一些信息;
- 砍掉分析步骤;
- 缩短输出;
- 换更弱的模型;
- 不再搜索外部资料。
但如果结果因此变差,这并不算优化,只是把 API 成本转移成了产品质量损失。
所以,我还需要在固定样本上同时比较:
- 实际成本;
- 响应时间;
- 事实准确性;
- 内容完整度;
- 结论是否稳定;
- 用户是否仍然觉得有用;
- 最终需要人工修改多少。
这里必须区分三种状态:
- 已经测量:真实运行得到的成本、Token、延迟和失败记录;
- 工程预测:根据减少调用、缩小上下文和增加缓存推算的节省;
- 仍然未知:需要真实材料和付费测试才能确认的质量变化。
如果还没有完成对比测试,就不能把预计节省写成已经实现的结果。
最后
现在回头看,AI 成本控制可以浓缩成四句话:
能不用 AI 的地方,先不用 AI。必须调用时,只提供真正需要的内容。每笔付费都要先经过收费站,再进入账本。钱省下来以后,还要确认用户价值没有一起被省掉。
换一个便宜模型只是其中很小的一步。
真正的成本优化,是让每一次 AI 调用都有理由、有边界、有记录,也能够被评价。