跳至内容
20/30第 20 章,共 30 章

Fine-Tune、检索还是 Prompt?决定因素是经济账

同一个支持问题用三种方式端到端计价:只有当被省掉的 prompt 超过 492 个 token 时,fine-tuning 才划算。

本页内容

这里有一个支持问题——这个项目要求的最低 Node 版本是多少?——基于同一份文档用四种方式回答,并端到端计价。

路线发送的 tokens单次回答成本
整份文档放进 prompt,无 cache43,311$0.066317
整份文档放进 prompt,已 cached43,311$0.007864
检索出的四段最佳摘录1,037$0.002906
fine-tuned model,完全不带文档28$0.002088

fine-tune 是最便宜的。对这个问题来说,它也是错误答案——而这两件事都可以用同一套算术说明,不需要靠观点。

表里的三个数字已经和你到处会读到的建议相矛盾。打开 cache 后,每个问题省了 88%,但在每月一百个问题时,同一路线会变得贵五倍。检索发送的 tokens 比 cached prompt 路线少四十二倍,成本却只低 2.7 倍。而 fine-tuned model 把 prompt 压到二十八个 token,相比检索只省 28%——因为它支付的 97% 都在答案上,训练不会缩短答案。

第 16 章构建了一个用来读账单的成本函数。这里,同一个函数用来决定架构。

查看详情

本章需要用到前面章节的内容。

  • **第 11 章**把 LoRA 和 QLoRA 当作技术来构建:低秩适配器是什么,为什么它训练的参数少几个数量级。本章不再解释,只给它计价。
  • 第 16 章构建了 computeCost、五个可计费桶,以及 prompt caching 的前缀规则。下面的成本表就是把三条路线代入那个函数。
  • **第 19 章**构建了检索器:带上下文标题的 chunking、混合搜索、四个摘录槽位、引用。本章复用它,并衡量运行它的成本,而不是解释它如何工作。

这里的一切都是 TypeScript,因为这只是费率、算术和会计,眼前没有 tensor——只有一个例外,会在发生处说明:为了弄清 fine-tuning 到底教会了什么,本章 fine-tune 了一个模型,而那部分是 Python。

“我们应该 fine-tune 吗?”这个问题常被当成模型问题来问。它其实是预算问题,而且形状没有任何 benchmark 能回答:哪些钱只付一次,哪些钱按问题付,世界一变哪些钱还要再付。

这三条路线也不是做同一件事的三种方式,供应商自己说得比多数博客更直白。OpenAI 自己关于监督式 fine-tuning 最适合什么的表列了四种用途:分类、细腻翻译、生成特定格式的内容,以及纠正 instruction-following 失败。1 其中没有一项是“教模型它不知道的东西”。它对收益的总结是:“你可以使用更短的 prompts,带更少的示例和 context 数据,从而在规模化时节省 token 成本,并可能降低 latency”——这是卖这个功能的公司给出的账单论证。

所以:

  • Fine-tuning 教的是形式和行为。 语气、格式、答案形状、你能示范但很难描述的边界。公开发表的最强版本是 LIMA 的表层对齐假说:知识来自 pretraining,对齐主要教模型该说哪一种格式子分布——这也是为什么那里一千个精选示例就够了。2
  • 检索提供会变化的事实。 三者中只有它能让你修改文档后,不碰模型也让答案更新。
  • Prompting 覆盖大多数真实场景,也是诚实的 baseline。自 Language Models are Few-Shot Learners 以来,in-context learning 就是默认做法:任务在 prompt 内被示范,不移动任何权重。3

两篇实测论文把中间那个错误彻底关上了门。Ovadia 及其同事比较了用无监督 fine-tuning 注入知识和用检索注入知识,结果检索稳定胜出,包括那些基础模型在 pretraining 中已经见过的事实。4 Gekhman 及其同事衡量了损害:引入新知识的示例拟合得很慢,而当模型终于拟合它们时,它在其他问题上的 hallucination 率会上升。5 用 fine-tuning 教事实不仅会失败;还会劣化你没有训练过的问题的答案。

这一半已经定了。经济账那一半还没有,后文就是它。

一个案例,跑三种方式:基于你自己的文档做技术支持,而这些文档每周都在变。

语料是真实的,就在这块磁盘上:一个真实在用的软件仓库存放的 23 份 Markdown 内部文档——构建指南、品牌规则、翻译 brief、十份服务手册、性能和安全说明。使用 o200k_base 测量,也就是第 7 章的 encoding:

the corpus, measuredTEXT
documents                              23
characters                        159,223
words                              22,194
tokens (o200k_base)                42,921
tokens with per-file headers       43,158

四万三千个 token 对这个决策来说很舒服:它能放进任何现代 context window,所以三条路线真的都可用。如果是千万级,决策已经替你做完了,那就是检索。

现在看“每周”这个词在做什么。文档流动通常只是被声称;这里直接从该仓库的版本历史中计数:

过去 26 周测得
触及这 23 份文档的 commits40
其中,对既有文档的编辑21
至少有一次变更的不同自然周11
触及产品面向用户文本目录、在其 8 周生命周期内的 commits157
这 8 周中发生过变化的自然周8

文档大约每隔一周就会动。用户可见字符串——这正是支持台实际会被问到的内容——自诞生以来每周都在动,大约每周二十个 commits。无论我们选择哪条路线,都必须能承受这种变化,而*“你训练所依赖的东西多久变一次?”*最后不是一个观点,而是你自己仓库里的一个数字。

针对这份语料写了二十个现实支持问题,每个主题一个,下面每个数字都基于这二十个问题计算。

最简单且可行的做法:把整个语料放进 system prompt,把问题放在末尾,然后让模型自己找。

one call, route oneTEXT
system instructions                       140 tokens
the 23 documents                       43,158 tokens
the question (median of 20 measured)       13 tokens
the answer (the one assumption)           150 tokens

那里每个数字都是数出来的,除了最后一个:150 个输出 token 是一个假设,选在第 16 章计费过的 assistant 回合范围内。它是这里唯一没有实际执行出来的数字,对三条路线完全相同地应用,而 break-even 小节会精确展示你改动它时结论会移动多少。

按 2026 年 9 月 7 日从供应商页面读到的费率——每百万输入 token $1.50,每百万输出 token $9.006——每个问题是 $0.066317。你在付费让模型重读四万三千个 token,只为回答十三个 token。

第 16 章的修复可以直接套用:语料稳定,且位于开头,所以是完美的 cache 前缀,读回来只需十分之一成本——每个问题 $0.007864,降幅 88%。第 16 章的警告也同样适用,而且以那章标出但没有计价的形式出现。这个供应商不收写入溢价;它收租金。显式 cache 每存储一个 token 每小时收费 $0.000001,6 所以让 43,298 个 token 保持温热的成本是

43,298×$0.000001=$0.043298 per hour43{,}298 \times \$0.000001 = \$0.043298 \ \text{per hour}

不管有没有人提问。也就是六个月 $189.78,为一个空房间付费。把租金除以每个问题节省的钱,条件一行就出来:cache 这份语料要在每小时 0.74 个问题以上才回本——把每周 cache 重建也算进去,就是每月 546 个。低于这个量,你开启的省钱功能反而在亏钱。

六个月,每月 100 个问题合计
全语料,无 cache$39.79
全语料,cached$196.18

同一路线,同一段代码,一个 flag,账单变五倍。第 16 章发现过一个由时间戳放错位置造成的版本;这里没有任何东西错,除了流量。Cache 是对流量的押注,而在这个供应商这里,你按小时下注。

第 19 章的检索器,不做修改:按章节边界切分并附加上下文标题,建索引,把四段最佳摘录放进 prompt。对二十个问题测得:

the retrieval route, measuredTEXT
chunks produced from the corpus              330
mean tokens of a chunk's own text          124.9
mean tokens of the four retrieved extracts   884
prompt per question (140 + 884 + 13)       1,037
one-off embedding of every chunk        46,823 tokens

prompt tokens 比路线一少四十二倍,每个问题 $0.002906。按每百万 embedding tokens $0.156,构建索引成本 $0.0070——还不到三个问题的成本——每次文档变化从头重建也同样是 $0.0070。六个月里每周重建整个索引,成本是十八美分

有一点值得停下来。检索会摧毁 prompt caching。 现在稳定前缀是 140-token 的 system instruction;从第 141 个 token 开始,每次调用的 prompt 都不同,因为摘录是按问题选择的。而 140 个 token 低于第 16 章引用过的所有 cache 最低门槛。所以路线二完全无法 cached,听起来很糟,其实不是:不 cache 1,037 个 token,比 cache 43,298 个便宜。

这是一个值得带走的通用规则:两个大型 token 节省技术不能作用在同一份内容上,胜出者是移除更多 token 的那个。检索移除了 97.6%。

用内部风格的两百个示例训练,然后提问时完全不附带文档。

the fine-tuned route, measuredTEXT
training examples                            200
training tokens                           24,389
epochs                                         3
prompt per question (15 + 13)                 28

训练成本是 24,389 × 3 × 每百万 $10.00 = $0.7317。这是全部构建成本,还不到一杯咖啡,也正因为如此,很多团队会在检查它是否有用之前就先付掉它。

现在是陷阱,也是本章存在的原因。fine-tuned model 的运行成本并不等于它的 base model。价格页用一句话说明:“从 Gemini 3 开始,tuned model endpoint prediction price 将是 base model 的 1.5 倍。”6 不是训练。是 inference,是模型存在期间每一个 token 的 inference。

所以把它写成公式。令 pip_ipop_o 为基础输入和输出价格,mm 为 tuned 乘数,LRL_R 为你要替换的路线的 prompt 长度,LFL_F 为 fine-tuning 后的 prompt 长度,OO 为答案长度。只有在以下条件成立时,fine-tuning 每个问题才更便宜:

LR  >  mLF  +  (m1)OpopiL_R \;>\; m\,L_F \;+\; \frac{(m-1)\,O\,p_o}{p_i}

第一项很明显:你的新短 prompt,被加价了。第二项不明显,而钱正是流向那里——答案上的附加费,它和你的 prompt 无关,训练也无法缩短它。用实测数字——m=1.5m = 1.5LF=28L_F = 28O=150O = 150po/pi=6p_o/p_i = 6——阈值是

the break-even prompt lengthTEXT
answer   50 tokens -> the prompt it replaces must exceed   192 tokens
answer  150 tokens -> the prompt it replaces must exceed   492 tokens
answer  400 tokens -> the prompt it replaces must exceed 1,242 tokens
answer 1000 tokens -> the prompt it replaces must exceed 3,042 tokens

在实测答案长度下,492 个 token——其中 450 个来自答案附加费,而不是 prompt。 如果替换的 prompt 比这更短,那么每个问题永远更贵,任何量级都一样;而这个阈值会随着 assistant 说的话变多而线性增长,所以一个写长答案的 assistant,无论删除多少 prompt,都不可能通过 fine-tune 变成更便宜的 token。

从另一个方向看,同一个事实可以记成一句话。在 fine-tuned 路线每个问题的 $0.002088 中,97.0% 是答案。Fine-tuning 优化的是剩下的 3%。

四个数字就能描述任意这些路线:一次性支付多少、文档变化时支付多少、不管有没有问题每小时支付多少,以及每个问题支付多少。这是在不修改第 16 章 computeCost 的前提下扩展它。

costsheet.tsTS
import { computeCost, type Pricing, type Usage } from "./cost";   // Chapter 16

export interface Route {
  name: string;
  setupUSD: number;            // paid once, before the first question
  perRefreshUSD: number;       // paid every time the documentation changes
  standingUSDPerHour: number;  // paid per hour whatever the traffic
  pricing: Pricing;
  usage: Usage;                // one question and its answer
}

export const perQueryUSD = (r: Route) => computeCost(r.pricing, r.usage);

const HOURS_PER_MONTH = (24 * 365.25) / 12;

export function totalUSD(
  r: Route, months: number, queriesPerMonth: number, refreshesPerMonth: number,
) {
  return r.setupUSD
       + months * refreshesPerMonth * r.perRefreshUSD
       + months * HOURS_PER_MONTH * r.standingUSDPerHour
       + months * queriesPerMonth * perQueryUSD(r);
}

/** Monthly volume at which `b` overtakes `a`. null = it never does. */
export function crossover(
  a: Route, b: Route, months: number, refreshesPerMonth: number,
): number | null {
  const fixed = (r: Route) =>
      r.setupUSD
    + months * refreshesPerMonth * r.perRefreshUSD
    + months * HOURS_PER_MONTH * r.standingUSDPerHour;
  const dFixed = fixed(b) - fixed(a);                     // b's extra fixed cost
  const dVar = perQueryUSD(a) - perQueryUSD(b);           // b's per-question saving
  if (dVar <= 0) return null;                             // b is never cheaper
  return Math.max(0, dFixed / dVar / months);
}

tuned model 不是另一张价格表,而是同一张价格表乘上一个系数:

the tuned endpoint is the base list times 1.5TS
const TUNED_MULTIPLIER = 1.5;   // read from the provider's pricing page, 2026-09-07

const scale = (p: Pricing, k: number): Pricing => ({
  input: p.input.map(t => ({ ...t, price: t.price * k })),
  cachedInput: p.cachedInput!.map(t => ({ ...t, price: t.price * k })),
  output: p.output.map(t => ({ ...t, price: t.price * k })),   
});

那一行高亮代码就是上一节的整个论点:乘数也落在 output 上。

六个月,文档每周刷新:

每月问题数prompt,cachedprompt,无 cache检索fine-tune
100$196.18$39.79$1.93$21.01
1,000$238.65$397.90$17.62$32.28
10,000$663.32$3,978.99$174.52$145.04
100,000$4,909.98$39,789.90$1,743.49$1,272.56

还有交叉点,也就是预算真正需要的四个数字:

crossovers, six monthsTEXT
retrieval -> fine-tune, documentation never changes:     148 questions / month
retrieval -> fine-tune, documentation refreshed weekly: 3,989 questions / month
prompt (no cache) -> retrieval:                            1 question / month
prompt (no cache) -> prompt (cached):                    546 questions / month

请把前两个一起读,因为它们就是本章的重点。静止语料让 fine-tuning 在一百五十个问题后回本;每周变化的语料会把同一个交叉点推远 27 倍,模型本身没有任何变化——只有你多久需要再次付费这一点变了。构建成本只是脚注;维护成本才是决策。

如果你现在得出结论:一个繁忙的支持台应该 fine-tune,那么算术同意你。它仍然是错的,下一节解释为什么。

成本表有一列算不出来,所以本节实际运行 fine-tune:本地,在一个小型开放模型上,用手写的适配器,而不是从库里拉一个。第 11 章构建了 LoRA;这里就是它,在 Qwen2.5-0.5B-Instruct 全部 24 层的 q_projv_proj 上,rank 8:

lora.py — the whole adapterPYTHON
class LoRALinear(nn.Module):
    def __init__(self, base: nn.Linear, r=8, alpha=16):
        super().__init__(); self.base = base
        for p in self.base.parameters():
            p.requires_grad = False              # the model is frozen  
        self.A = nn.Parameter(torch.zeros(r, base.in_features))
        nn.init.normal_(self.A, std=1 / r)
        self.B = nn.Parameter(torch.zeros(base.out_features, r))
        self.s = alpha / r
        self.on = True                           # so the same run can compare both

    def forward(self, x):
        y = self.base(x)
        return y + (x @ self.A.T @ self.B.T) * self.s if self.on else y

两百个训练示例从语料中机械生成,因此可复现:问题是把章节标题改写成问题,答案则是该章节自身文本,采用严格的内部风格——一行以 Short answer: 开头,一行以 Source: 开头并带文件路径。格式是被教的形式;路径是事实。 然后在二十个留出问题上看两个数字:答案是否符合内部风格,以及它是否说出了真正能回答问题的文件。

两个 baseline 让表格可读,而且两者都来自第 4 章的坚持,不是事后补充。二十个正确答案里有十个是同一个文件,所以一个忽略问题、永远回答 CLAUDE.md 的模型得分是 10/20。检索器也有自己的上限:在这二十个问题中,它的四段摘录有 14 次包含正确文件,7 次把它排第一,所以 14/20 是任何使用它的 reader 能达到的最高分。

measuredTEXT
LoRA modules 48   trainable parameters 540,672 (0.109 % of the model)
400 steps, 2 epochs, 0.76 s/step on 16 CPU threads, 304 s in total
mean loss over the first 50 steps 3.7363 -> over the last 50 steps 2.4197

                                        house style   correct source
always answer the most common file             --          10 / 20
the retriever's own ceiling                    --          14 / 20
base model, closed book                    0 / 20           0 / 20
fine-tuned, closed book                   19 / 20           8 / 20
base model, four retrieved extracts       13 / 20           2 / 20
fine-tuned, four retrieved extracts        1 / 20           1 / 20

形式被学会了,而且完全、快速。 从 0 到 19/20,只用了一个 540,672 参数的适配器——模型的 0.109%——在一台看不到显卡的处理器上训练五分钟。

事实没有被学会。 8/20 和完全忽略问题能得到的 10/20 没有可区分差异,第 4 章关于 20 个样本的区间已经把这点说得很清楚。那些文件路径在训练数据中出现了三轮;最后学出来的是以一个看起来合理的 Source: 行结尾的习惯。问它本章开头的问题时,fine-tuned model 回答 Short answer: 10.x . . .,并引用 CLAUDE.md。正确答案在 CLAUDE.md 中,是 18.17.0。

然后形式崩了,这一行正是实验的意义所在。 给 fine-tuned model 一千个 token 的检索摘录——一种它从没见过的 prompt 形状,因为每个训练 prompt 都是二十八个 token——内部风格从 19/20 崩到 1/20。在本章开头的问题上,它回答 18.17.0——正确,但完全没有它被训练出的格式。所以 fine-tuning 没有教会一种格式;它教会的是以训练集里的 prompts 为条件的格式,第一个看起来不同的 prompt 就把格式一起带走了。你用什么 fine-tune,什么就会成为模型唯一擅长的输入分布,而这件事没人会放进电子表格。

关于指标再补一条,直接指向第 29 章:“正确来源”把形式和事实一起打分,所以两个检索行看起来都很糟,尽管两个模型都答对了那个问题的事实。一个端到端数字掩盖了三件事——14/20 recall 的检索器、0.5B reader 和引用格式——而要选择修哪一个,就要在测量之前把它们拆开,不是在之后。

现在看供应商替你填好的那一列。fine-tuned model 不是你拥有的资产;它是租在别人 base model 上的东西,并且上面印着结束日期。2026 年 9 月 7 日,OpenAI 价格页的 fine-tuning 部分完整写着这条通知:

OpenAI 正在逐步关闭 fine-tuning 平台。该平台不再向新用户开放,但 fine-tuning 平台的现有用户在未来几个月仍可创建训练任务。所有 fine-tuned models 在其 base models 被弃用之前仍可用于 inference。7

时间线精确到日:2026 年 5 月 7 日,对从未 fine-tune 过的组织关闭;2026 年 7 月 2 日,对六十天内没有在 fine-tuned model 上运行 inference 的组织关闭;2027 年 1 月 6 日,不再允许任何新任务。8 同一页面安排了 fine-tuned models 本身的下线——ft-gpt-3.5-turboft-gpt-4ft-gpt-4.1-nanoft-babbage-002ft-davinci-002——日期为 2026 年 10 月 23 日,每个都带一个推荐替代 base model,这是一种礼貌说法:重新训练吧。

另一家 frontier 供应商从未把这份租约卖给你。Anthropic 的文档索引列出 699 页,没有一页关于 fine-tuning;Bedrock 价格页的模型定制部分覆盖 Amazon Nova、Amazon Titan、Cohere、Meta 和 OpenAI open-weight models,没有 Claude。910 如果你的架构依赖 fine-tune,三大 frontier 家族之一在任何预算下都不可用。

Self-hosting 把模型租约换成机器租约,而 AWS 在自己的页面上已经把这笔账算出来:一个 customised model 的 provisioned throughput,一个 model unit,一个月承诺,是“1 model unit × $21.18 × 24 hours × 31 days = $15,757.92”每月。10 直接租金属更便宜,但不是免费——H100 按需 $3.99/GPU-hour,preemptible $1.9911——一张必须始终在线的卡大约每月 $2,900,不管有没有人提问。每月一万个问题时,整条检索路线六个月是 $174.52。

这正是 LoRA 作为预算论证而不是技术论证发挥作用的地方。在同一个模型上测得,attention 和前馈层上的 rank-16 适配器是 8,798,208 个参数——模型的 1.781%,bfloat16 下 17.6 MB——相比 base weights 的 0.988 GB;它的 optimiser 和 gradient state 是 140.77 MB,而 full fine-tuning 需要 7.90 GB,相差 56 倍。结果不是训练更便宜,而是一个已加载的 base model 可以服务多个适配器,这是 GPU 固定成本唯一能被摊开的方式。托管训练也反映了这一点:16B 以下 low-rank 每百万 token $0.48,full $0.54,每个任务最低 $4.00。11 这个底价才是细节。对于 24,389 个 token、三轮 epoch,这份语料每次重新训练会按 $4.00 计费,而不是算出来的 $0.04——26 次每周运行的最低费用是 $104,而算术只有 91 美分。

隐私要花多少钱,以及为什么蒸馏不是第四个选项

链接到此部分:隐私要花多少钱,以及为什么蒸馏不是第四个选项

还有两列只会出现在账单上。

数据驻留大约多花 10%,两个供应商给出的数字一致。 OpenAI 对 2026 年 3 月 5 日或之后发布的模型的数据驻留端点收取“10% uplift”;7 Vertex 非全球端点价格是 $1.65,而不是 $1.50,也是同样的 10%。6 把它和 tuned endpoint 的 50% 加价相比,民间说法就反过来了:residency 很便宜,fine-tuning 不便宜——而且 fine-tuning 也不是更私有的选项,因为语料无论如何都会到供应商那里,只是从每次调用一次,变成训练时一次。

同一页面上有你数据最明确的标价:它把一个 fine-tuned model 列了两次;启用数据共享时,inference 价格正好减半——输入 $2.00 对 $4.00,输出 $8.00 对 $16.00。7 允许供应商保留你发送的内容值 50% 折扣,这说明它对他们有多值钱。

Distillation——用大模型的答案训练你自己的小模型——通常被当作二者的出路。计价后它并不是,因为 teacher 正是你试图替换的系统:通过向检索路线问两百个问题来生产两百个训练示例,成本是 200 × $0.002906 = $0.58,再加上训练它们的 $0.73。Distillation 是你在检索 pipeline 工作之后做的事,用来让它更便宜;它也继承检索器搞错的每个事实。

钱只是可见的一半。另一半以等待到来,原因和账单相同:模型必须先读完整个 prompt,才会说第一个字。第 13 章在你能摸到的模型上测过 prefill 对 decode;这里是同样的测量,一次运行、一台机器、对 prompt 长度:

prompt tokens首个 token 时间每 token
28312 ms11.14 ms
1,0374,971 ms4.79 ms
4,09622,272 ms5.44 ms
8,19249,443 ms6.04 ms

绝对数字属于一个跑在十六个 CPU 线程上的 0.5B 模型,不能说明托管 frontier model 的情况。形状完全可迁移:prefill 随 prompt 长度增长,而每 token 成本会随着第 9 章的二次项开始显现而爬升——一千个 token 时 4.79 ms,八千个 token 时 6.04 ms,仅仅因为更长就有 26% 的惩罚。

对三条路线的后果很直接。路线一每个问题 prefill 四万三千个 token,cache hit 让它变得可忍受——第 16 章解释了原因:cache read 替代 prefill 工作,所以它一次交易同时买到 latency 和金钱。路线二 prefill 一千个,并且先向索引多一次往返。路线三 prefill 二十八个,不添加任何东西,所以它在回答速度上可测地最快。它只是回答了错误的东西。

三个看起来像模型问题、其实不是的问题——这里花十分钟,之后省一个月:

检索无法检索没人写过的东西,而对它做 fine-tuning 只会教模型听起来很自信。如果你的头号支持问题在语料里没有答案,修复方式是技术写作。

“我的订单在哪?”是数据库查询,不是知识问题。那是 tool calling——第 18 章——训练和检索都不能替代它。

问题有歧义,而界面把它藏起来了

链接到此部分:问题有歧义,而界面把它藏起来了

当两个产品共享一个名字,最佳答案就是请求澄清。这是关于输入的产品决策,不是关于输出的建模决策。

凌驾于这一切之上的要求是:没有评估集,就无法做这个决策,而且销售 fine-tune 的供应商自己也这么说。 OpenAI 指南开篇写道:“只有在设置 evals 后才投入 fine-tuning。你需要一种可靠方式来判断你的 fine-tuned model 是否比 base model 表现更好”,并补充说,如果五十个好示例什么都没改变,问题在任务或 prompt,而不是数据量。1 二十个问题,也就是本章使用的规模,可以展示机制,但不能选择供应商——第 4 章衡量了原因;当你只有二十个案例时该怎么做——重复它们、配对它们,并测量运行之间的离散度——则是第 29 章。

四列,只有最后一列决定:

prompt检索fine-tune
它教什么任何你能写下来的东西会变化的事实形式和行为
构建成本$0.0070 加一个下午$0.7317 加一个 eval set
每个问题成本cached $0.0079,未 cached $0.0663$0.0029$0.0021,高于 492 个 prompt token 时
维护成本零,或每小时 $0.043 租金每次重建 $0.0070每次变化都要重新训练,再加上每个 base model retired 时一次

由此得出的规则很短,值得记住:从 prompt 开始;当事实会变时加检索;只有当你已经测量出仍然缺少的是形状而不是事实时,才 fine-tune——而且在做之前,要先给答案计价,不是给 prompt 计价。

给已经带着结论而来的人一个不舒服的版本:在本章测量的案例中,fine-tuning 在每月超过四千个问题后确实是最便宜路线;但在事实上,它仍然打不过对所有问题都回答 CLAUDE.md

这里的每个价格都是按 token,且每条路线都是安排 token 的不同方式。接下来这将不再成立。

第 21 章离开文本。进入模型的图像不是字符串,而是一格格 patch,带着你没有选择的 token 数;一分钟语音在一个供应商处按秒计费,在另一个供应商处按 audio token 计费;合成语音按字符出售,转录按分钟,原始计算按 GPU-second。本章用一个成本函数回答的问题——哪个更便宜?——在单位匹配之前甚至无法提出,而互联网上没有计算器会替你标准化它们。

那里也会再次出现训练:带 trigger word 的图像适配器,以及从样本克隆出的声音。这引出了下一章开头的问题,而且它不是反问:如果 fine-tuning 语言模型几乎总是错误购买,为什么 fine-tuning 图像模型几乎总是正确购买?


本章中的每个价格、阈值和乘数都来自供应商自己的页面,读取日期为 2026 年 9 月 7 日,并带上该日期引用,因为它们都会变。实测数字——token 计数、chunk 大小、检索大小、训练 loss、分数、latencies 和版本历史计数——都在同一天的一台机器上生成,并可从上述语料复现。

本地实验使用 Qwen/Qwen2.5-0.5B-Instruct 和 greedy decoding,因此可精确复现;适配器是上文打印出的十二行 class,在 q_projv_proj 上 rank 8。语料是一个真实在用的软件仓库中被跟踪的 Markdown 文档,不包括两个只追加日志,其变化率从该仓库的版本历史中统计。

  1. OpenAI, Supervised fine-tuning, developers.openai.com/api/docs/guides/supervised-fine-tuning, and Model optimization, .../guides/model-optimization, both accessed 2026-09-07。来源包括:监督式 fine-tuning 最适合什么的表(分类、细腻翻译、生成特定格式内容、纠正 instruction-following 失败);包括更短 prompts 和更低 latency 在内的四项声称收益;最少 10 个训练示例以及建议从 50 个开始;以及“Only invest in fine-tuning after setting up evals.” 2

  2. Zhou, C. et al. LIMA: Less Is More for Alignment. arXiv:2305.11206 (2023)。表层对齐假说——知识来自 pretraining,对齐教模型该说哪种格式——以及一千个精选示例就足够的原因。

  3. Brown, T. et al. Language Models are Few-Shot Learners. arXiv:2005.14165 (2020)。in-context learning 作为诚实 baseline 的来源:任务在 prompt 中被示范,没有权重被更新。

  4. Ovadia, O., Brief, M., Mishaeli, M. and Elisha, O. Fine-Tuning or Retrieval? Comparing Knowledge Injection in LLMs. arXiv:2312.05934 (2023)。在注入知识时,检索胜过无监督 fine-tuning,包括那些 pretraining 中已经见过的事实。

  5. Gekhman, Z. et al. Does Fine-Tuning LLMs on New Knowledge Encourage Hallucinations? arXiv:2405.05904 (2024)。引入新知识的示例拟合很慢,而拟合它们会提高无关问题上的 hallucination。

  6. Google, Vertex AI generative AI pricing, cloud.google.com/vertex-ai/generative-ai/pricing, accessed 2026-09-07。本章成本表中每个数字的来源:Gemini 3.5 Flash 在 global endpoint 上每百万 input tokens $1.50、cached input $0.15、text output $9.00,non-global endpoints 高 10%;同一模型的监督式 fine-tuning 为每 1,000 training tokens $0.01,其中“training tokens 按训练数据集中的总 token 数乘以 epochs 数计算”;显式 context cache storage 每 token 每小时 $0.000001;Gemini Embedding online input 每 1,000 tokens $0.00015;以及“for model inference starting from Gemini 3, tuned model endpoint prediction price will be 1.5 times of the base model.”这条说明。 2 3 4 5

  7. OpenAI, Pricing, developers.openai.com/api/docs/pricing, accessed 2026-09-07。完整引用的 wind-down 通知来源,以及用于交叉检查的当前文本费率来源:gpt-5.6-terra standard short context,每百万 tokens 输入 $2.00、cached input $0.20、cache write $2.50、输出 $12.00,batch tier 为各项一半。该页面有七个 base models 上的十行 fine-tuning,并且其中恰好只有一个按时间而不是 tokens 计费:o4-mini-2025-04-16 的 reinforcement fine-tuning,$100.00 每训练小时。同一页面说明,对 2026 年 3 月 5 日或之后发布的模型,data-residency endpoints 有 10% uplift。 2 3

  8. OpenAI, Deprecations, developers.openai.com/api/docs/deprecations, accessed 2026-09-07。self-serve fine-tuning 时间线(2026 年 5 月 7 日、2026 年 7 月 2 日、2027 年 1 月 6 日)的来源,以及 ft-gpt-3.5-turboft-gpt-4ft-gpt-4.1-nano-2025-04-14ft-babbage-002ft-davinci-002 于 2026 年 10 月 23 日下线的来源,每个都列有推荐替代 base model。

  9. Anthropic, developer documentation index, platform.claude.com/llms.txt, accessed 2026-09-07。列出 699 页,没有一页关于 fine-tuning;platform.claude.com/docs/en/build-with-claude/fine-tuning 返回 404。

  10. Amazon Web Services, Amazon Bedrock pricing, aws.amazon.com/bedrock/pricing/, accessed 2026-09-07。模型定制部分(Amazon Nova、Amazon Titan、Cohere、Meta、Qwen 和 OpenAI open-weight models——没有 Claude)、每个 custom model 每月 $1.95 存储费,以及所引用 worked example:“1 model unit × $21.18 × 24 hours × 31 days = $15,757.92”的来源。 2

  11. Together AI, Pricing, together.ai/pricing, accessed 2026-09-07。16B 以下模型的 fine-tuning 每百万 tokens 价格:监督式 fine-tuning low-rank $0.48、full $0.54,direct preference optimisation low-rank $1.20、full $1.35,价格按“training dataset size × number of epochs”加 evaluation tokens 计算,并且每个任务“minimum charge of $4.00”。GPU 容量:HGX H100 按需 $3.99/GPU-hour,preemptible $1.99,H200 $5.99。 2

准备好让 LIA 替你选模型了吗?

所有 AI 模型都在一处——今天就免费开始。