速成课 · No. 31

每次调用模型都要花钱花时间,按 token 计费——而账单的大小取决于你发送多少内容、以及用的模型有多聪明。把成本和速度当作设计约束、而不是事后才想的事,正是「跑通一次的演示」和「能在规模下经济运转的产品」之间的分水岭。学会这些词和这些杠杆,「把它做得更便宜」就会变成例行操作,而不是一场危机。

只讲精髓 · 每个想法一个画面 · 成本是设计约束

§ 01

要控制一个 AI 功能的成本,你首先得看懂那块计价表。模型按 token 计费,几乎每一个经济决策都源自这意味着什么。

token 是成本的单位

一辆按里程计价的出租车——这趟车的价格不是统一定价,而是行驶的距离,一路都在跳表。

一个 token 是一小段文本——大约是一个词,或一个词的一部分——它就是你被计费的单位。每次调用模型,费用都基于涉及的 token 数量,就像出租车按距离收费一样。这是 AI 经济学的根本事实:你不是按请求以统一价格付费,而是为模型读取和写出的文本量付费。一旦你把 token 看作那块计价表,一切的成本就都变得清晰可读了。

进去的和出来的,你都要付费

一通电话,你说的和你听到的都要收费——整段对话都算,不只是你那一半。

你要为 input token(你发送的一切——prompt、上下文、历史记录)以及 output token(模型生成的一切)付费。两半都算,而你每次调用都发送的长上下文,每次都要付费,哪怕答案很短。这就是为什么一个把巨量上下文塞进每个请求的功能,不管 output 多大都很贵——你为整段对话付费,双向都算,每一次调用都算。

成本随上下文和调用次数放大

一家按件、按里程双重计费的快递服务——你的总价就是跑了多少趟乘以每趟跑多远。砍掉任何一个,账单都会下降。

你的总成本有两个乘数:每次调用多少 token(主要取决于你发送多少上下文)和你做多少次调用(取决于你的设计有多「话痨」——单次调用、固定链路,还是一个循环很多次的 agent)。长上下文乘以大量调用,就是 AI 账单爆炸的方式。这两个杠杆都在你的掌控之中,本课中几乎每一项省钱技巧,本质上都是在拉动其中之一:每次调用发送更少,或者做更少的调用。

模型按 token 计费,input 和 output 都算。你的成本是每次调用的 token 数乘以调用次数——所以每一项节省都归结为:发送更少,或者调用更少。

§ 02

本能反应是凡事都用最聪明的模型。这种本能很烧钱,因为模型之间的价格差距巨大,而大多数任务根本不需要顶配。

模型在价格和能力上差异巨大

一支从自行车到货运卡车的车队——每趟的成本天差地别,而用卡车去送一封信,为这点活儿花了大把钱。

模型有一个很宽的谱系,从小而便宜到大而昂贵,顶端和底端之间的价格差往往巨大——每 token 差好几倍甚至几十倍。最大、最聪明的 frontier 模型比小模型贵得离谱。所以模型的选择是你做出的最大成本决策之一,凡事都默认用最强的那个,就是默认用最贵的那个。

大多数任务不需要最聪明的模型

你不会请顶级外科医生来贴个创可贴——这种日常任务由远没那么贵的人来做一样好,让专家来做就是浪费。

frontier 模型在困难、开放式的推理上确实更强——但真实产品做的大多数事并不是这类。给消息分类、抽取一个字段、把一段话做摘要、给请求做路由:一个小而便宜的模型处理这些,质量好到你无法和那个巨无霸区分开。为日常工作付 frontier 的价钱,是 AI 产品里最常见的浪费。最聪明的模型是你在例外情况下才去取用的,而不是你一上来就用的默认值。

让模型匹配任务的难度

一个好的经理把难题交给专家、把日常活儿交给新人——让才能匹配任务,而不是反过来。

原则是让模型贴合任务实际的需求。困难、新颖、多步的推理配得上一个强大的模型;简单、范围明确、重复的工作交给小模型。这不是在质量上妥协——而是让能力匹配需求,这样你既不再为日常工作多付钱,又能在真正需要时把重型模型请来。逐个任务把这个匹配做对,是 AI 产品账单上最大的单一杠杆。

模型价格差异巨大,而大多数任务不需要 frontier。让模型匹配任务的难度——日常用小的,真正困难才用强的——别再为那一大堆简单任务多付钱。

§ 03

如果大多数活儿简单、有些活儿困难,你不会用一个模型应付所有——你会把每个请求送给对的那个。这种动态的选择就是 routing,它是杠杆率最高的模式之一。

默认用小模型,需要时再升级

一个客服台,一线人员处理大多数问题,只把真正棘手的那些转给专家——多数问题根本不需要升级。

核心模式是按难度做 routing:默认把每个请求送给一个小而便宜的模型,只在任务确实需要时,才升级到一个更大、更贵的。由于简单的情况占多数,大多数请求都被便宜地处理掉,你只为那少数配得上的请求付溢价。这把默认从「用最好的模型,之后再省」翻转成了「用能过线的最便宜的模型,过不了线再升级」。

router 决定每个请求归哪个模型

一位分诊护士,快速评估每位病人,把他们送往对应的护理级别——一个又快又便宜的判断,把昂贵的资源引向真正需要的地方。

要分流,就得有个东西来判断每个请求的难度——一个 router。它可以是简单规则(短的、结构化的任务走小模型;长的、开放式的走大模型),可以是一个便宜的分类器,甚至可以是一个小模型来判断难度。router 本身必须便宜又快,因为它对所有请求都要跑一遍。一个好的 router 悄悄地把大部分流量送给便宜模型,把 frontier 留给真正困难的那一小撮——把模型之间的价差变成节省。

让强模型规划,便宜模型执行

建筑师设计大楼,但施工队干了大部分体力活——你为思考付钱给昂贵的专家,为干活付钱给更便宜的人手。

routing 的一个强力变体是 plan-and-execute:用一次对强模型的调用,把一个困难任务拆成具体步骤,然后用一个更便宜、更小的模型去跑这些步骤。昂贵的推理只发生一次;大部分工作以便宜的方式运行。这在最要紧的地方抓住了 frontier 模型的规划能力,同时把每一步的成本压低——一种异构设计,相比把一切都跑在大模型上,能大幅削减账单。

按难度分流:默认用小模型,只在任务配得上时才升级到大的。一个便宜的 router,加上「规划用强、执行用廉」的拆分,把模型之间的价差变成节省。

§ 04

最便宜的一次模型调用,是你根本不去做的那次。当相同或相似的工作反复出现时,记住答案而不是重新算一遍,是能拿到的最大节省之一。

同一个答案别付两次钱

一位职员把最常被问到的答案记在桌上的卡片上,而不是每次有人问都从头查一遍。

如果你的应用反复产出相同的模型 output——相同的问题、同一份文档的摘要、相同的查询——你就是在为完全一样的工作一次又一次付费。caching 在第一次把结果存下来,之后重复时即时、免费地把它端出来(caching 那门课讲了其中的机制)。昂贵的调用只发生一次;便宜的读取发生很多次。凡是相同的 input 反复出现的地方,缓存都能把重复的成本变成一次性的。

prompt caching 复用不变的那部分

一封格式信,长长的标准开头是预先印好的,你只填那几行会变的——你不会每次都把整封重写一遍。

往往你上下文中很大一块每次调用都一样——一段长长的 system prompt、固定的指令、一份共享文档。prompt caching 让模型复用那段不变的前缀,而不是每次都重新处理它,对重复的部分收费低得多。由于那段固定上下文常常是你 input token 的大头,把它缓存起来,能在高调用量的功能上大幅削减 input 成本。这是一项近乎免费的节省,你只需把 prompt 中稳定的部分组织好,让它能被缓存。

semantic caching 抓住近似重复

一个帮助台,能认出「我怎么重置密码」和「我忘记密码了」是同一个问题——并给两者同一个准备好的答案。

除了精确匹配,semantic caching 用含义(通过 embeddings)来识别一个新请求是否和之前的足够接近、可以复用答案——「你们的退款政策是什么」和「退货怎么操作」不必分开重新计算。这抓住了用户用不同措辞问同一件事这一常见情况,把缓存的覆盖范围远远扩展到了完全相同的 input 之外。用得谨慎,它能把那一长串「措辞不同但等价」的问题变成便宜的缓存命中。

最便宜的调用是你跳过的那次。缓存重复的答案、复用不变的 prompt 前缀、用语义抓住换了措辞的重复——重复的劳动就是你本不必付的重复成本。

§ 05

当你确实要调用时,你通过控制发送多少来控制它花多少钱。发送更少、把工作打包,是把每次调用的成本压下去的日常杠杆。

发送更少的上下文

这趟旅行只带你真正会用到的,而不是整个衣柜——每多一件都要付出携带的代价,而其中大部分你压根不会碰。

由于你按 input token 付费,最直接的节省就是发送更少的上下文。精简对话历史,把旧的轮次做摘要而不是逐字带着,只检索那几块最相关的内容而不是全部。这正是上下文工程这门功夫双倍回报的地方:更紧凑的上下文不只对质量更好,每次调用也更便宜。大多数臃肿的 AI 账单底下都压着臃肿的 prompt——剪掉那些填充,成本也随之下降。

要更少的、结构化的 output

问一个想要「是或否」的问题,得到一个简短的答案;问一个邀请长篇大论的问题,得到一篇你既要付费、又要再去精简的文章。

你也为 output token 付费,所以别让模型生成超出你所需的内容。要简洁、结构化的 output——具体的那几个字段、一个简短的答案、不要啰嗦的开场白——而不是一篇你只会从中解析出一个数字的长文。结构化 output(structured-output 那门课)在这里一举两得:它更可靠 而且 更便宜,因为一个紧凑的 schema 产出的 token 比自由散文少。约束返回的内容,你就约束了账单里 output 的那一半。

能批处理就批处理

攒一整桶衣服一起洗,而不是一次洗一件衬衫——把工作打包,分摊了固定开销,每一轮也办成更多事。

当你有很多相似的请求、它们各自并不需要即时答案时,把它们 batching(许多个一起处理)往往比一个一个发更便宜,而且对于可以择时运行的批处理任务,供应商常常给折扣。这是用延迟(每一项都要等这一批)换更低的成本,对后台或批量工作来说正是划算的交易——处理积压、给数据集做富化——这些场景下每一项的速度并不要紧。在你不急着要的地方,批处理让它更便宜。

通过发送更少来控制每次调用的成本:精简上下文、要简洁的结构化 output、把不紧急的工作批处理。更紧凑的 prompt 既更便宜也更好。

§ 06

成本从不单独存在——它和速度、质量相互权衡。把这三者看作一个你按用例去平衡的三角,能让你不至于把一个优化到极致,反倒毁了另一个。

这三者互相拉扯

那块老车间的牌子——「快、省、好:挑两个」——因为在一个上猛使劲,通常要拿另一个来抵。

成本、latency(速度)和质量构成一个三角,它们相互权衡。最大、最聪明的模型给出最好的质量,但成本最高,往往也最慢;小模型便宜又快,但在困难任务上更弱;厚重的上下文提升质量,却同时抬高成本和延迟。你很少能三个同时拉满。所以你不会孤立地优化成本——你会为每个用例决定哪个角最要紧、以及你愿意拿什么去换它。

按用例挑那个平衡点

比赛你选跑车,搬家你选货车——同一个问题,相反的答案,因为活儿决定了什么要紧。

正确的平衡点完全取决于功能。一个面向用户的聊天,生死系于 latency,需要一个又快又强的模型。一个夜间批处理任务只在乎成本,可以用最便宜、最慢的选项。一个高风险的法律或医疗答案,把质量置于两者之上。三角上没有唯一正确的点——点明这个特定功能必须赢下哪个角、又能牺牲哪个角,正是那个驱动它周围每一个模型和设计选择的决策。

streaming 廉价地买来「感觉上的快」

一个厨房,每道菜做好了就端上来,而不是让你等整桌齐了再上——总时间一样,但等待感觉短得多。

有一招绕开了这个三角:把模型的 output 一边生成一边逐 token streaming 给用户,于是用户立刻看到文字在出现,而不是盯着空白屏幕直到整个答案完成。总时间没变,但 感觉上的 延迟急剧下降,因为有东西马上就在发生。这是一种廉价的办法,不靠更快的模型就让功能感觉很快——管理的是延迟的体验,而不是延迟本身。

成本、latency 和质量相互权衡——你很少能三个拉满。挑出每个功能必须赢下的那个角,牺牲掉对的另一个,并用 streaming 免费买来「感觉上的快」。

§ 07

AI 经济学归结为一种简单的姿态:知道东西值多少钱,然后刻意只花能办成事的最少的那一点。杠杆就那么几个,而大部分节省都来自拒绝默认地多付钱。

按任务计量成本,而不只是看总账单

一张逐项列出的账单,显示每道菜各花了多少,而不是一个大数字——只有这份明细能告诉你该从哪里砍。

你无法控制一个你不去计量的成本。追踪每个功能、每种调用类型、每个任务实际花了多少 token,而不只是那笔笼统的月度账单,这样你才能看清钱花到了哪里、该优化哪一部分。成本是你要去埋点和盯着看的东西,就像性能一样——大多数昂贵的 AI 功能都有一两个成本热点,一份明细能立刻把它揭出来,而一个总数则把它彻底藏住。按任务计量,该省的地方自己就会冒出来。

用能过线的最便宜的东西

你买那件够用的工具,而不是货架上最贵的那件——超出你所需的能力,只是花掉的钱。

支配性的原则是:用仍能达到你质量底线的最便宜的模型、最小的上下文、最少的调用——不多一分。这不是为省而省;而是拒绝为任务用不上的能力付钱。用 evals 定下质量底线,然后找出能过线的最轻的配置。大多数省钱并不是什么巧妙的把戏——只是在一个更精简的选项能过线时,拒绝默认去用那个最强、最堆上下文、最话痨的选项。

在你把一个 AI 功能规模化上线之前
  • 你知道每个任务的成本吗——以 token 计量,而不只是总账单? - 模型匹配难度了吗 ——日常用小的,只在需要的地方用 frontier? - 你在分流吗——简单的大多数给便宜模型, 把困难的情况升级? - 你在缓存吗——重复的答案、固定的 prompt 前缀、近似重复? - 你发送的是最少量吗 ——精简的上下文、简洁的结构化 output、不紧急的就批处理? - 三角的哪个角胜出 ——成本、latency 还是质量——设计为它调好了吗?
你现在掌握的词
  • token / input / output——计费的单位,按你发送的和返回的来收费。 - frontier model——最大、最聪明、也最贵的选项。 - routing / router—— 按难度把每个请求送给对的模型。 - plan-and-execute——强模型做规划,便宜模型干大头。 - caching / prompt caching / semantic caching——复用答案、固定前缀、近似重复。 - batching——把不紧急的工作打包以降低成本,用延迟来换。 - latency / cost / quality——你按用例 平衡的三角;用 streaming 换「感觉上的快」。
你成本管理得好的迹象
  • 按任务计量成本,知道自己的热点,而不只是月度总数。 - 你让模型 匹配难度分流,而不是凡事都用 frontier。 - 你 缓存重复的工作和固定的 prompt 前缀。 - 你发送最少量的上下文,并要 简洁的 output。 - 你按功能平衡这个三角,并用 streaming 让 东西感觉很快。

AI 经济学是一种刻意的节俭:按 token 计费、让模型匹配难度、分流、缓存、发送最少量,并在成本与延迟和质量之间做平衡——能过线的最便宜的东西就赢了。

速成课完 · 7 章 · 成本是设计约束

接下来是练习:拿一个 AI 功能,计量一个任务实际花掉多少 token——然后试试那些显而易见的动作。把它降到一个更小的模型,用 evals 检查质量是否守得住;精简上下文;缓存重复的部分。你通常会发现账单大幅下降而没有真正的损失,因为你只是出于习惯默认用了最贵的选项。当一个更便宜的配置过了线、你意识到 frontier 模型从来都不是必需的,这门功夫就豁然开朗了。但有一个想法要凌驾于其余之上:你按 token 为智能付费,所以只花能办成事的最少的那一点——让模型匹配任务、发送更少、复用你能复用的。