LLM-FinOps 本节摘要:传统 FinOps 在 LLM 花费上崩盘。成本是 token 交易,不是资源在线时长。标签映射不上——一次 API 调用是一笔交易,不是一个资产。工程决策(提示设计、上下文窗口、输出长度)就是财务决策。2026 的剧本有三个第一天就要埋点的归因维度:按用户( )用于席位定价与扩张、按任务( + )用于产品面成本与优先级、按租户( )用于单位经济与续约。四层 token——提示、工具、记忆、响应——全塞一个桶会掩盖花费。多租户产品的强制阶梯:按租户限流(预期峰值的 23 倍,清晰的 429 + retry-after);每日花费上限(合同上限的 1.53 倍,触发限流收紧 + 告警);花费 z 分数 >4 的杀开关(自动暂停 + 叫值班)。
本节摘要:传统 FinOps 在 LLM 花费上崩盘。成本是 token 交易,不是资源在线时长。标签映射不上——一次 API 调用是一笔交易,不是一个资产。工程决策(提示设计、上下文窗口、输出长度)就是财务决策。2026 的剧本有三个第一天就要埋点的归因维度:按用户(
user_id)用于席位定价与扩张、按任务(task_id+route)用于产品面成本与优先级、按租户(tenant_id)用于单位经济与续约。四层 token——提示、工具、记忆、响应——全塞一个桶会掩盖花费。多租户产品的强制阶梯:按租户限流(预期峰值的 23 倍,清晰的 429 + retry-after);每日花费上限(合同上限的 1.53 倍,触发限流收紧 + 告警);花费 z 分数 >4 的杀开关(自动暂停 + 叫值班)。归因模式:标签聚合、遥测连接器(trace-ID → 账单,精度最高)、采样外推、模型分配、事件溯源、实时流式。单位指标:每解决查询成本、每生成制品成本——不是每百万 token 多少美元。回溯打标总会漏;在请求创建时埋点。
对应原课程:Phase 17 · Lesson 27 ·
27-finops-llms(原英文phases/17-infrastructure-and-production/27-finops-llms/docs/en.md)。
阅读完本节,你应当能够:
你的账单写着 4 万美元。你不知道:
provider 侧的标签聚合对云资源(EC2、S3)有效,因为标签会传播到账单行。LLM API 调用不会自动打标——你得在调用点给 user/task/tenant 盖戳并贯穿。回溯归因总会漏边界情况。
按用户(user_id):谁花了多少。驱动席位定价、扩张对话、识别重度用户。
按任务(task_id + route):哪个产品面花了多少。驱动特性优先级、砍掉昂贵特性的决策。
按租户(tenant_id):哪个客户盈利。驱动单位经济、续约定价、分层阈值。
第一天就在调用点埋三个维度。回溯总是更糟。
| 层 | 示例 | 典型占比 |
|---|---|---|
| 提示 | 系统 + 用户输入 | 40~60% |
| 工具 | 喂回的工具调用结果 | 20~40%(智能体工作负载) |
| 记忆 | 先前对话 / 检索文档 | 10~30% |
| 响应 | 模型输出 | 10~30% |
全塞一桶让优化变瞎。在归因 schema 里把它们拆开。
限流 按租户。预期峰值的 2~3 倍。返回带 Retry-After 的 429。租户感受摩擦;无意外账单。
每日花费上限 按租户。合同上限的 1.5~3 倍。触发:收紧限流 + 告警客户成功。
杀开关 花费 z 分数相对租户基线 >4。自动暂停租户;叫值班;升级到运维 + CS。
每百万 token 多少美元是厂商话术。产品指标:
把成本绑到产品结果。否则优化无锚。
trace_id: abc123 user_id: u_42 tenant_id: t_7 task_id: task_classify_doc route: model_haiku layers: prompt_tokens: 1800 tool_tokens: 600 memory_tokens: 400 response_tokens: 150 cost_usd: 0.0135 cached_input: true batch: false
每次调用都发。存数据湖。按维度聚合。第 13 节的可观测栈就是它住的地方。
栈:缓存 + 批处理 + 路由 + 网关。四者齐全时:
最佳叠加:约为朴素基线的 510%。多数团队拉了 23 个杠杆;很少四个全叠。
原课程 code/main.py 模拟带三级强制阶梯的多租户 LLM 服务,注入一个滥用租户并演示杀开关触发。下面给最小可读的 z 分数杀开关骨架。
def spend_zscore(current_spend, baseline_mean, baseline_std): """花费 z 分数:相对租户历史基线的偏离程度。 current_spend: 当期租户花费 baseline_mean: 该租户历史花费均值 baseline_std: 该租户历史花费标准差 返回: z 分数 """ if baseline_std == 0: return 0.0 return (current_spend - baseline_mean) / baseline_std def kill_switch(z, threshold=4.0): """杀开关:z 分数超阈值即自动暂停租户并叫值班。""" if z > threshold: return {"pause_tenant": True, "page_oncall": True, "reason": f"花费 z={z:.2f} > {threshold},疑似滥用"} return {"pause_tenant": False} # 案例:租户 t_7 历史日均 50 美元(std=8),今日突发 95 美元 z = spend_zscore(95, baseline_mean=50, baseline_std=8) print(f"z={z:.2f}", kill_switch(z)) # z≈5.6 > 4 → 自动暂停 + 叫值班
💡 杀开关的阈值要设在「正常波动之上、演变成真损失之前」。z 分数 >4 是经验值——它意味着「比均值高 4 个标准差」,在正态假设下约万分之一概率是正常波动,几乎可断定是异常。
| 模式 | 精度 | 实时性 | 复杂度 | 适合 |
|---|---|---|---|---|
| 标签聚合 | 粗糙 | 事后 | 低 | 起步、粗略花费 |
| 遥测连接器 | 最高 | 近实时 | 中 | 成熟团队、trace-ID 已有 |
| 采样外推 | 中(漏尾部) | 近实时 | 中 | 大规模、可接受误差 |
| 模型分配 | 低(遗留) | 事后 | 中 | 无标签的遗留数据 |
| 事件溯源 | 高 | 实时 | 高 | 已有 Kafka/Kinesis |
| 实时流式 | 高 | 亚秒 | 高 | 需要仪表盘亚秒更新 |
心法:起步用标签聚合,成熟后升级到遥测连接器(精度最高)。事件溯源与实时流式是高投入高回报,适合规模化的多租户产品。采样外推适合「粗略够用」的场景,但尾部滥用会漏。
本节产出 outputs/skill-finops-plan.md(原课程目录)。给定产品与规模,它设计:
跑通模拟器:运行 code/main.py。杀开关在哪个 z 分数触发?阈值怎么选?
设计仪表盘:设计一个按租户、按任务的成本仪表盘。先建哪 5 个视图?
单位经济为负:你最大租户的单位经济为负。按客户影响排序提出三个干预。
每解决工单成本:为一个支持产品算每解决工单成本:每工单 3M token、每天约 800 工单、GPT-5 缓存费率。
回溯打标:论证回溯打标是否可能有效。何时可接受?
最后一节,我们做全章收尾——自托管服务选型,把前面所有引擎(vLLM、SGLang、llama.cpp、Ollama、TGI)按硬件、规模、工作负载串成一条决策路径,并封上整章「基础设施与生产化」。