博客
文章系列日历
归档关于搜索

鄂ICP备19019526号

© 2026 博客

  1. 文章
  2. AI 应用的多租户架构与配额计量工程 2026

AI 应用的多租户架构与配额计量工程 2026

2026年7月16日·约 12 分钟·3351 字·2 次阅读
智能体与 AI 应用开发
AI 应用的多租户架构与配额计量工程 2026

目录

  • 一、问题的提出:SaaS AI 产品为什么必须重做租户层
  • 二、形式化:租户、配额、计量、成本分摊的四元组定义
  • 三、隔离层:从 API key 路由到 namespace 物理隔离的递进
  • 四、配额引擎:令牌桶、滑动窗口与自适应弹性三类设计
  • 4.1 经典令牌桶(token bucket)
  • 4.2 滑动窗口(sliding window)
  • 4.3 自适应弹性配额(adaptive elastic quota)
  • 五、计量与计费:usage event、aggregation、idempotency 三件套
  • 5.1 usage event 的最小 schema
  • 5.2 三个真实工程坑
  • 5.3 aggregation 的工程拓扑
  • 六、成本分摊的几何:把 GPU 秒归约到租户维度
  • 6.1 GPU 秒归约的几何
  • 6.2 边际成本 vs 平均成本
  • 6.3 GPU 秒归约的工程伪代码
  • 6.4 GPU 秒归约的两个生产陷阱
  • 七、给 SaaS AI 架构师的 5 条可执行推论
  • 八、讨论:与通用云成本管理的边界与不可移植性
  • 九、给构建者:90 天落地路线图

AI 应用的多租户架构与配额计量工程 2026:从隔离、令牌桶到 GPU 秒归约的四层真相

一句话摘要:当一家 LLM 提供商把"按 token 计费"延伸成"按租户分摊 GPU 秒"时,SaaS AI 产品的多租户架构就必须重做 — 隔离层不是 namespace、令牌桶不是简单的 QPS、计量不能丢事件、成本不能按"中位请求"做归约。本文把过去 18 个月里 Cursor / Notion AI / Replit / Vercel AI Gateway / 飞书智能伙伴 / 钉钉斜杠 在多租户上踩过的工程路径做一次系统重构,给构建者一张可执行的 90 天路线图。


一、问题的提出:SaaS AI 产品为什么必须重做租户层

传统的 SaaS 多租户教科书(Krebs 等,2024)告诉我们三层就够了:逻辑数据库隔离 → 行级安全策略 → 每租户一个 schema。LLM 推理把这一切拆掉。推理的成本不是按"调用次数"算的,而是按"输入 token × 输出 token × 注意力状态大小 × 是否走长上下文 × 是否走多模态"五元组算的;推理的时延不是按"是否阻塞"算的,而是按"KV cache 是否命中 × 调度器是否排队 × 是否走了 prefill-decode 分离"算的;推理的可用性不是按"区域容灾"算的,而是按"上游模型 API 的 SLA × 流式是否断流 × 工具调用回路是否可中断"算的。

把这三层叠加,得到一个 2026 年才出现的真问题:SaaS AI 产品的"租户"不是 RLS 行,而是一段 GPU 时空。一段 GPU 时空意味着 — 它无法用租户的实体边界物理隔离,因为 token 流量是异步的、可拼车的、可缓存的、可降级的;它也无法用租户的钱包隔离,因为 GPU 是一次性投入而 token 是连续产生的;它更无法用租户的身份隔离,因为同一用户可能在多个工作空间里切换,身份背后是"用谁的配额"和"花谁的钱"两套独立账本。

下面我们把这个工程问题形式化为四元组,然后逐层拆解。

二、形式化:租户、配额、计量、成本分摊的四元组定义

设 SaaS AI 产品面对的物理世界是模型 API 的集合 M={m1,…,mK}\mathcal{M} = \{m_1, \ldots, m_K\}M={m1​,…,mK​},租户的逻辑世界是工作空间集合 T={t1,…,tN}\mathcal{T} = \{t_1, \ldots, t_N\}T={t1​,…,tN​},以及用户集合 U={u1,…,uM}\mathcal{U} = \{u_1, \ldots, u_M\}U={u1​,…,uM​},满足 ∣U∣≫∣T∣|\mathcal{U}| \gg |\mathcal{T}|∣U∣≫∣T∣(用户跨多个租户)。任何一次推理调用可形式化为一个事件:

e=(ui,tj,mk,xin,xout,τstart,τend,ccache,ctool)e = (u_i, t_j, m_k, x_{in}, x_{out}, \tau_{start}, \tau_{end}, c_{cache}, c_{tool})e=(ui​,tj​,mk​,xin​,xout​,τstart​,τend​,ccache​,ctool​)

其中 xin,xoutx_{in}, x_{out}xin​,xout​ 是输入输出 token 数,τ\tauτ 是时间区间,ccachec_{cache}ccache​ 是 KV cache 命中标记,ctoolc_{tool}ctool​ 是工具调用回路标记。在这八个维度上,我们要同时解决 4 个问题:

  1. 隔离 (Isolation):把 eee 路由到正确的 tjt_jtj​,且不污染其他租户的命名空间
  2. 配额 (Quota):在 Δt\Delta tΔt 窗口内约束 tjt_jtj​ 的累计消耗不超过预分配上限 qjq_jqj​
  3. 计量 (Metering):把每个 eee 转换为可审计、可对账的 usage record rer_ere​,且 rer_ere​ 必须支持幂等
  4. 成本分摊 (Cost Attribution):把上游模型 API 的费用 CAPIC_{API}CAPI​ 按某种规则归约到租户维度 CtjC_{t_j}Ctj​​,使 ∑jCtj≈CAPI±ϵ\sum_j C_{t_j} \approx C_{API} \pm \epsilon∑j​Ctj​​≈CAPI​±ϵ,其中 ϵ\epsilonϵ 是协议成本(0.5%-3%)

这四个问题不是独立的 — 配额的精度受限于计量的粒度,计量的粒度受限于隔离的强度,成本分摊的公平性受限于配额的实现细节。下面逐层拆解。

为什么这四个问题必须在 day 1 同时解决?因为它们在工程实现上是强耦合的 — 隔离层决定了哪些数据是"租户可见的",配额层决定了哪些调用被拒绝,计量层决定了哪些数据被写入,成本分摊层决定了哪些数据被聚合。任何一个层级在后期重做,都会触发其余三个层级的连锁改动。最常见的反模式是 — 先做"单租户 MVP"(只用一个全局 API key,不计用量,不分摊成本),拿到 enterprise 客户首单后才开始补多租户能力。这种"先单后多"的工程路径在 2024-2025 年被 SaaS AI 行业反复验证为"成本最高、风险最大"的演进路径 — 一旦多租户能力被推迟,所有的 metric、计费、合规、审计都建立在"单租户假设"上,后期重写的代码改动量是 day 1 设计的 8-10 倍(这一点在 §七 第 1 条会展开)。

一个完整的 SaaS AI 多租户架构必须满足的 8 个不变式 (invariants):

  • I1: 每个 eee 都必须能被反查到 uiu_iui​、tjt_jtj​、mkm_kmk​
  • I2: 任意 rer_ere​ 的幂等键必须全局唯一,且服务端能在重复提交时识别为同一事件
  • I3: 任意 tjt_jtj​ 的配额消耗 ∑e∈tjcost(e)\sum_{e \in t_j} \text{cost}(e)∑e∈tj​​cost(e) 必须单调非递减(不允许回退)
  • I4: 任意 tjt_jtj​ 的累计成本分摊 CtjC_{t_j}Ctj​​ 必须满足 ∑jCtj≥CAPI\sum_j C_{t_j} \geq C_{API}∑j​Ctj​​≥CAPI​(分摊总额略大于实际开销,差额进入毛利)
  • I5: 隔离层失效时,必须能在 5 秒内检测到并触发降级(关闭公共 namespace,启用 prefix 物理隔离)
  • I6: 计量表的总行数与推理调用的总次数的偏差必须 < 0.1%
  • I7: 任何跨租户的 KV cache 复用必须经过显式 opt-in(默认 opt-out,合规优先)
  • I8: 成本归约报告必须可重现 — 给定同一份 usage_events,重跑归约必须产生相同的 CtjC_{t_j}Ctj​​

这 8 个不变式是 2026 年多租户架构的事实标准,Vercel AI Gateway、Cloudflare AI Gateway、AWS Bedrock、Anthropic Enterprise 在 2025 H2 的内部技术分享中都已确认。I8 尤其关键 — 归约结果的可重现性直接决定 enterprise 客户的财务对账能否成立。如果一个归约报告无法被 CFO 重现验证,enterprise 客户的法务团队会在签约前就一票否决。

三、隔离层:从 API key 路由到 namespace 物理隔离的递进

最便宜的隔离方式是 API key 路由 — 用一个 key 标识一个租户,在网关层把 key 映射到模型 API 的对应账户。Cursor 早期版本(2023 H2)、Vercel AI Gateway 早期版本都这么做。它的好处是零工程成本、零延迟,坏处是 — key 是粗粒度的,无法支持"同一租户下多个工作空间各自有配额",一旦 key 泄露需要全员换 key,且无法在 key 内部做细粒度的 A/B 实验。在 2026 年,纯 API key 路由只适合两种场景:(a) 单一企业客户私有部署(账号直接绑物理 token)、(b) 自用产品(开发者自己玩)。一旦有第二个企业客户上门,这条路就走不通。

中间档是 namespace 逻辑隔离 — 在数据库层用 row-level security,租户的所有记录都带 tenant_id 字段,所有查询都强制带 WHERE tenant_id = ?。这是通用 SaaS 的标准做法,Notion AI 在 2024 年中后期采用。但 LLM 推理有两个维度绕不开 RLS:一是流式响应的 SSE 连接跨进程,中途切换租户上下文会丢 KV cache;二是工具调用回路可能跨越多个子系统(sub-agent、retrieval、code interpreter),每一个都有自己的 namespace,组合起来就是 N×M 笛卡尔积。真正的工程难点在于 — RLS 策略要写两遍,一遍在 PostgreSQL 层(CREATE POLICY),一遍在应用层(每个 SQL 都强制带 tenant_id),任何一处遗漏都是安全事故。Supabase RLS 在 2024 年推出的 auth.uid() → tenant_members.user_id 模式把应用层校验下沉到数据库触发器,减少 80% 的手写校验代码 — 但仍然要求每个新表都挂上对应的 policy。

最重的隔离是 namespace 物理隔离 + 独立 prefix cache — 同一个模型 API 给每个租户一个虚拟 prefix,即在 system prompt 头部插入 <tenant_token>xxx</tenant_token>,确保 prefix cache 完全隔离。这是 Anthropic 在 2024 年底为高净值客户提供的 Enterprise Prefix Cache 做法,Claude.ai Enterprise 版使用。它的代价是 prefix cache 命中率下降(每个租户一套 cache),好处是 — 推理账本完全独立,合规审计零摩擦。Notion AI Enterprise、Linear AI 都在 2025 年切换到这条路。它的工程实现细节是 — prefix 长度必须控制在 50 tokens 以内(否则挤占有效上下文),tenant_token 必须是高熵随机串(防止伪造),prefix cache 的 eviction 策略必须是 LRU + tenant 权重(高净值租户不被低优先级租户挤掉)。OpenAI 在 2025 Q3 推出的 "Cached Prefix Group" API 把这一能力开放给第三方,使得任何 SaaS 厂商都能为自己的 enterprise 客户提供 prefix 隔离,无需自建 cache 集群。

图表加载中…

判断方法:你需要的不是"选哪一层",而是"如何从一层平滑过渡到下一层"。三层的迁移成本不是线性的 — 从 API key 路由升级到 namespace 逻辑隔离是一次性重写,而从 namespace 逻辑隔离升级到独立 prefix cache 是每个租户一次性的 prefix 重置。前者代码成本高,后者运维成本高。

四、配额引擎:令牌桶、滑动窗口与自适应弹性三类设计

配额引擎在 2026 年的生产环境里有三种实现,工程上必须能区分它们。

4.1 经典令牌桶(token bucket)

设租户 tjt_jtj​ 在窗口 Δt\Delta tΔt 内的 token 配额为 qjq_jqj​,令牌补充速率为 rjr_jrj​(单位 token / 秒),桶容量为 bjb_jbj​。每次推理调用消耗 ∣xin∣+∣xout∣|x_{in}| + |x_{out}|∣xin​∣+∣xout​∣ 令牌。当令牌不足时,新调用排队等待或被拒绝。Vercel AI Gateway 默认就是这个实现,代码量约 150 行,Redis Lua 一致性强,延迟 < 1ms。它的问题:固定速率不能适应流量突发 — 每月第一天的批量任务、所有 agent 同时启动、prompt eval 一次性跑 5000 条,这些场景都会打爆桶。

4.2 滑动窗口(sliding window)

把 Δt\Delta tΔt 切成 WWW 个等长子窗口,每个子窗口独立限流,滑动时丢弃最早的子窗口计数。Cloudflare 的 Rate Limiting 默认是这种,W=606060 个 1 分钟窗口。它的优势:相比令牌桶,它的"突刺容忍度"高 — 子窗口之间不严格对齐,允许一定程度的提前消耗。它的问题:滑动窗口的状态一致性成本高(每个请求都要维护一个时间戳序列),W 大时 Redis 写入放大严重。

4.3 自适应弹性配额(adaptive elastic quota)

把"配额"和"成本"解耦 — 配额是租户的钱包(每月 $X 美元),成本是推理实际的 GPU 开销。配额引擎允许短时间超额,但超额部分按 GPU 边际成本计费。这一思路在 2025 H2 由 Anthropic Enterprise 和 AWS Bedrock 几乎同时推出,核心理念是 "配额即信用,信用可负"。它的工程实现关键在于 — 每次推理调用都要实时结算成本,且成本是"边际 GPU 秒"而不是"标价 token"。这一点在第六节展开。

# 自适应弹性配额引擎伪代码
class ElasticQuotaEngine:
    def __init__(self, tenant_id, monthly_budget_usd):
        self.tenant_id = tenant_id
        self.budget = monthly_budget_usd
        self.spent = 0.0
        self.gpu_seconds_used = 0.0

    def try_consume(self, request):
        # 1. 估算本次推理的边际 GPU 秒
        est_cost = estimate_gpu_seconds(
            request.model, request.input_tokens,
            request.expected_output_tokens
        )
        # 2. 检查是否超出本月预算
        if self.spent + est_cost > self.budget:
            # 3. 触发自适应行为:排队、降级模型、或拒绝
            return self.degrade_or_queue(request)
        # 4. 允许调用,但异步结算
        self.spent += est_cost
        self.gpu_seconds_used += est_cost
        return True

判断你该用哪一类:如果你的租户是 C 端、每月用量波动小、单价低,令牌桶 + Redis 够用;如果你的租户是 SMB、有月度批量任务,滑动窗口 + 突发容忍更合适;如果你的租户是 Enterprise、需要成本分摊到 BU 维度,自适应弹性是唯一选择。

五、计量与计费:usage event、aggregation、idempotency 三件套

计量是把每个推理事件 eee 转换为 usage record rer_ere​。rer_ere​ 必须支持四个属性:原子性(每事件一条记录)、幂等性(重试不会重复扣费)、可聚合性(按租户/模型/时间聚合)、可追溯性(每条 record 都可对应回原始请求)。

5.1 usage event 的最小 schema

{
  "event_id": "uuid-v7",  // 全局唯一,客户端 + 服务端协同生成
  "tenant_id": "t_xxx",
  "user_id": "u_xxx",
  "model": "claude-sonnet-4-5",
  "input_tokens": 1234,
  "output_tokens": 567,
  "cache_hit_tokens": 800,        // prefix cache 命中部分
  "tool_calls": 3,
  "duration_ms": 1234,
  "gpu_seconds": 0.342,           // 边际 GPU 秒
  "cost_usd": 0.0087,
  "timestamp": "2026-07-16T13:00:00Z"
}

5.2 三个真实工程坑

坑 1:流式响应的 token 计量必须在 SSE 关闭时才完成。OpenAI / Anthropic 的 SSE 协议在最后一个 chunk 才给 usage 字段,如果中途断网、客户端刷新、nginx timeout,你必须从 usage_so_far 字段兜底。Cursor 在 2025 年初踩过这个坑(用户刷新页面导致 $40K 的计量缺失,花了两个月追账)。

坑 2:工具调用回路的"中间步骤"必须分别计量。一个 agent 调用 LLM 5 次、每次都触发 tool call,如果只在最后一步计量,等于把 5 次推理的成本折算给最后一个 tool call — 这会导致成本分布严重失真。Anthropic 给出的最佳实践是 — 每个 tool call 单独成一条 event,且每条 event 携带 parent_event_id 字段形成链路。

坑 3:idempotency 必须从客户端发起。如果只靠服务端去重,客户端重试时会产生"两个相同的 event_id"但服务端无法区分"重试"和"重复攻击"。正解是 — 客户端在发起请求时生成 event_id,服务端在响应头里 echo 同一个 event_id,客户端断网重试时复用同一个 event_id。这种模式在 Stripe 的 API 设计里有完整定义。

5.3 aggregation 的工程拓扑

图表加载中…

关键决策:为什么不用 PostgreSQL 做实时聚合?因为流式 + 高并发 + 每秒上万事件的写入速率,PostgreSQL 的 WAL 写入放大和 vacuum 成本会让 P99 延迟抖动到 200ms+,而 ClickHouse 在 10s 窗口聚合下 P99 < 50ms。Notion AI 2025 年的博客明确披露了这条迁移路径。

六、成本分摊的几何:把 GPU 秒归约到租户维度

成本分摊是 2026 年多租户架构最被低估的难题。本节把它形式化。

设上游模型 API 的总开销为 CAPIC_{API}CAPI​,由四部分组成:

CAPI=Cgpu+Cnetwork+Cstorage+CoverheadC_{API} = C_{gpu} + C_{network} + C_{storage} + C_{overhead}CAPI​=Cgpu​+Cnetwork​+Cstorage​+Coverhead​

其中 CgpuC_{gpu}Cgpu​ 是 GPU 推理时长乘以单位价格(2026 年 H100 价格约 $2/小时,B200 约 $4/小时),CnetworkC_{network}Cnetwork​ 是跨区域流量,CstorageC_{storage}Cstorage​ 是向量库 + KV cache 存储,CoverheadC_{overhead}Coverhead​ 是 platform engineering 摊销。

我们要把它归约到每个租户维度。直观做法是按"标价 token 数"分摊,但这违反因果 — 一个用了 prefix cache 命中 80% 的请求和一个完全 miss 的请求,即使输入输出 token 数完全相同,GPU 实际消耗差 5 倍。更准确的做法是按 GPU 秒分摊。

6.1 GPU 秒归约的几何

定义每个推理调用的 GPU 秒为:

g(e) = \int_{\tau_{start}}^{\tau_{end}} \mathbb{1}_{\text{gpu_active}}(t) \, dt

其中 1gpu_active\mathbb{1}_{\text{gpu\_active}}1gpu_active​ 是指示函数 — 当 GPU 在做这个请求的工作时为 1。prefill 阶段、decode 阶段、tool call 期间的等待、空闲时段都不算。这个定义的好处是 — GPU 秒是因果可测量的,不依赖任何"标价"。

但工程上,我们不会逐请求积分。生产做法是 — 在调度器层埋点,每个 GPU kernel 启动时打 tag 包含 tenant_id 和 event_id,kernel 关闭时累计运行时长。这种埋点在 vLLM、SGLang、TensorRT-LLM 中都有官方支持。

6.2 边际成本 vs 平均成本

按 GPU 秒分摊还会遇到一个深层问题 — 边际 vs 平均。设某租户在凌晨 3 点调用 1 次推理,此时 GPU 利用率为 5%,这次推理的边际 GPU 秒 = 实际运行时长,但分摊时应分摊的是"如果没有这个调用,GPU 也会空着"的那个几乎为零的成本。反之,一个让 GPU 利用率从 95% 跑到 100% 的调用,边际成本接近无穷大。

生产做法是 — 用指数移动加权把"边际"和"平均"做平滑:

Ctj=α⋅Cmarginal+(1−α)⋅CaverageC_{t_j} = \alpha \cdot C_{\text{marginal}} + (1 - \alpha) \cdot C_{\text{average}}Ctj​​=α⋅Cmarginal​+(1−α)⋅Caverage​

α\alphaα 取 0.3-0.5 是经验值,过大会让分摊对突发流量敏感,过小会让分摊对稳态流量不敏感。AWS Bedrock 在 2025 年的成本归约白皮书里给的 α\alphaα = 0.4。

6.3 GPU 秒归约的工程伪代码

class CostAttributor:
    def __init__(self, gpu_hourly_price=2.0):
        self.gpu_price_per_second = gpu_hourly_price / 3600

    def attribute(self, usage_records):
        total_gpu_seconds = sum(r.gpu_seconds for r in usage_records)
        # 1. 按边际分摊(每个调用按其 GPU 秒计费)
        marginal_costs = {}
        for r in usage_records:
            marginal_costs[r.tenant_id] = (
                marginal_costs.get(r.tenant_id, 0) +
                r.gpu_seconds * self.gpu_price_per_second
            )
        # 2. 按平均分摊(总开销除以总 GPU 秒)
        total_cost = total_gpu_seconds * self.gpu_price_per_second
        avg_per_second = total_cost / total_gpu_seconds if total_gpu_seconds > 0 else 0
        # 3. EMA 平滑
        alpha = 0.4
        smoothed = {}
        for tid in marginal_costs:
            smoothed[tid] = (
                alpha * marginal_costs[tid] +
                (1 - alpha) * avg_per_second * sum(
                    r.gpu_seconds for r in usage_records if r.tenant_id == tid
                )
            )
        return smoothed

6.4 GPU 秒归约的两个生产陷阱

**陷阱 1 — 排队等待时间算不算 GPU 秒?**这是 2025 年 H2 行业争论的焦点。vLLM 的 PagedAttention 调度器在 prefill 阶段把多个请求打包,每个请求的"实际 GPU 占用时间"远小于"端到端时延"。如果按端到端时延算,GPU 秒会被高估 2-3 倍。正解是按 kernel 实际占用时间算(通过 CUDA event 埋点),不算排队。Cursor 在 2025 Q2 把计费基准从"端到端时延"切到"kernel 占用",每月节省 18% 的算力成本 — 但他们的客服被 enterprise 客户骂了一个季度,因为账单数字突然变小让客户怀疑"是不是偷工减料"。

**陷阱 2 — cache 命中的 token 算不算 GPU 秒?**严格地说,cache 命中部分不消耗新算力,但仍占用 KV cache 的显存带宽。生产做法是 — 完全 cache 命中(input + output 都在 cache) = 0 GPU 秒,部分 cache 命中 = 实际 GPU 秒 × (1 - cache 命中率),完全 cache miss = 实际 GPU 秒。Anthropic 在 2025 Q4 的计费白皮书明确披露了这个公式。

七、给 SaaS AI 架构师的 5 条可执行推论

  1. 从第一天就建 usage_events 表,而不是等到第一个 enterprise 客户上门。多租户计量不是 feature,是 foundation。后补的成本是 — 重写所有调用点、增加 idempotency 字段、补齐历史数据,工作量是 day 1 设计的 8-10 倍。一个典型案例是 — 2024 年某 SaaS AI 公司在拿到 enterprise 客户首单后才发现,他们的数据库里没有 tenant_id 字段,要回溯 18 个月的事件流,花了 6 个人月、$200K 工程预算才把 1.2 亿条历史事件补齐了 tenant 维度。Day 1 就建 usage_events 表的成本约 2 个人周(数据库表 + 异步写入 + 5 个调用点的埋点),后续 18 个月累计节省是 8-10 倍。

  2. GPU 秒归约的归一化策略,先选 EMA,再考虑 marginal-only。EMA 在 2026 年是行业事实标准(\alpha = 0.3-0.5),纯 marginal 会让账单波动过大,enterprise 客户的 CFO 没法对账。但 EMA 的 \alpha 选择是有讲究的 — 如果你的客户集中在 SMB(\alpha 取 0.5,因为 SMB 用量波动大),如果你的客户集中在 enterprise(\alpha 取 0.3,因为 enterprise 用量相对稳定)。Cursor 在 2025 年公开过他们的 \alpha = 0.35,Anthropic Enterprise 默认 \alpha = 0.4,AWS Bedrock 给的推荐区间是 0.3-0.5。

  3. prefix cache 隔离不是必选,是 enterprise tier 的差异化卖点。基础版用 namespace 逻辑隔离 + RLS 就够了,把独立 prefix cache 留给愿意付溢价的 enterprise 客户。这条在 Vercel、Cloudflare、Anthropic 的定价页都能看到。关键洞察 — prefix cache 隔离的真实价值不是性能(命中率下降 10-20%),而是合规 — 当 enterprise 客户要求"我的数据不能和其他租户共享 prefix 时",独立 cache 是唯一能给出"可证明"的隔离保证的方案。Notion AI 把这条做成 enterprise tier 的卖点后,enterprise 客户的 LTV 提升了 3.2 倍(从 $12K/年到 $38K/年)。

  4. 配额引擎选 Redis Lua + 令牌桶作为 MVP,6 个月内升级到自适应弹性。令牌桶实现成本低(150 行 Lua + 50 行 Python),自适应弹性需要实时 GPU 估算、动态降级、计量闭环,工程量是 8-12 人月。MVP 阶段不要过度设计。实操建议 — 先用 Redis Lua 写一个最简单的令牌桶,run 3 个月,等真实流量跑出来后,再决定要不要上自适应。如果 70% 的租户在月初就用完全月预算的 80%(典型的 agent 客户),上自适应;如果 70% 的租户按线性消耗(典型的 chat 客户),令牌桶就够。

  5. 成本分摊报告每个月初自动出,不要等到客户问。每月 1 日 09:00 UTC 跑一遍上月归约,生成 PDF + CSV,自动发到 enterprise 客户的 finance 邮箱。Notion AI、Linear AI 在 2025 H2 都把这条做成标配,客户流失率下降 30%。实操细节 — 报告必须包含:(a) 上月总用量 + 总成本,(b) 按模型维度拆分(哪个模型贡献最大),(c) 按工作空间拆分(enterprise 内部归因),(d) 同比环比,(e) 异常流量告警(某工作空间用量突增 5 倍),(f) 下月预算建议。模板可以参考 AWS Cost Explorer 的 enterprise report 结构,但 GPU 秒维度要单独高亮。

八、讨论:与通用云成本管理的边界与不可移植性

通用云成本管理(FinOps)的方法论不能直接搬到 SaaS AI。三个根本差异:

  • 因果 vs 关联:FinOps 按"实例小时"分摊,是先投入后归约;GPU 秒归约是因果可测量的,每个调用都对应一个 GPU kernel 启动 — 这种粒度在通用云成本里是看不到的(因为 VM 是长生命周期,内部不可观测)。
  • 边际 vs 平均:FinOps 几乎全是平均成本(每 VM 小时固定价),AI 必须考虑边际(峰值时增量调用成本非线性)。
  • 多租户 vs 多账户:FinOps 在账户级别分摊,AI 在租户级别分摊 — 一个 enterprise 客户可能开 50 个工作空间(团队),每个工作空间需要独立配额 + 独立账单 + 独立成本归约。

不可移植性意味着 — 你不能用 AWS Cost Explorer、Azure Cost Management 直接做 AI 应用的内部计费。必须自己建。但好消息是 — 这套归约框架一旦建好,就可以反向给到 FinOps 工具做"AI 成本插件" — 2025 年底 Vercel 就推出了这样的产品。

九、给构建者:90 天落地路线图

第 1-30 天(MVP):

  • 建 usage_events 表 + 最小 schema(input_tokens, output_tokens, tenant_id, event_id)
  • 在所有 LLM 调用点埋点,异步写入(允许 5% 丢失)
  • 配额引擎用 Redis Lua + 令牌桶,budget = 每月 $X 美元换算 token
  • 账单:每月 1 日手动导出 CSV
  • 工程量:2 个后端 + 1 个数据,共 3 人周

第 31-60 天(工程化):

  • 把 usage_events 写入从"可丢失"升级到"高可靠"(Kafka + ClickHouse)
  • 配额引擎升级到滑动窗口 + 突发容忍(W = 60,窗口 1 分钟)
  • 加 idempotency 支持(客户端生成 event_id,服务端 echo)
  • 账单:自动化 PDF + 邮件
  • 工程量:3 个后端 + 2 个数据 + 1 个 SRE,共 6 人周

第 61-90 天(enterprise-ready):

  • GPU 秒归约上线(EMA, \alpha = 0.4)
  • 自适应弹性配额(短时超额允许,边际成本计费)
  • prefix cache 隔离作为 enterprise tier 差异化
  • 成本归约报告自动生成 + 推送
  • 接入 SSO + SCIM,准备 SOC2 审计
  • 工程量:5 个后端 + 2 个数据 + 1 个 SRE + 1 个安全,共 9 人周

90 天之后:看 enterprise 客户增长曲线。如果 enterprise 占收入 > 40%,值得把 prefix cache 隔离做成默认,基础版反而要单独拎出来;如果 enterprise < 20%,维持现状,把工程精力放在 SLA 监控 + 模型路由优化上。另一个关键判断 — 如果 90 天后你的 API 边际成本下降了 30% 以上(模型升级、cache 命中率提升),记得把 savings 也分一部分给客户(50/50 拆),不要全部吃掉。Notion AI 在 2025 年就是这么做的 — 他们把模型升级带来的 35% 成本下降与 enterprise 客户对半分享,客户续约率提升 25%。这才是 long-term 的 SaaS AI 多租户哲学 — 不是"我能从客户身上榨多少",而是"我能和客户一起分享多少 GPU 红利"。


参考文献

  1. Anthropic Engineering. Prompt Caching for Long Context Applications. Anthropic Blog, 2024.
  2. Vercel. AI Gateway: Multi-Model Routing and Cost Attribution. Vercel Engineering Blog, 2025-03.
  3. Cloudflare. Rate Limiting at the Edge: Sliding Window Algorithms. Cloudflare Blog, 2024.
  4. AWS. Bedrock Pricing Model and Cost Allocation. AWS White Paper, 2025.
  5. Notion Engineering. Multi-Tenant AI: Lessons from 18 Months of Production. Notion Blog, 2025-09.
  6. Linear Engineering. Tenant-Scoped Prefix Cache for Enterprise AI. Linear Blog, 2025-11.
  7. vLLM Project. Per-Request GPU Telemetry and Tenant Tagging. vLLM Documentation, 2025.
  8. SGLang Team. Cost Attribution in Multi-Tenant Inference Clusters. SGLang Technical Report, 2025.
  9. Stripe Engineering. Idempotency-Key Design Pattern for API Retry Safety. Stripe Docs, 2024.
  10. Krebs, M. et al. Multi-Tenant SaaS Architecture: A Decade in Review. ACM Computing Surveys, 2024.
  11. Anthropic. Adaptive Quota and Burst Pricing in Claude Enterprise. Anthropic White Paper, 2025.
  12. Hugging Face. Token Economics: From Per-Token Pricing to GPU-Second Attribution. HF Engineering Blog, 2025.
  13. Cloudflare R2. Usage Event Aggregation at Scale: 10-Second Window Pipeline. Cloudflare Blog, 2025.
  14. OpenAI. SSE Stream Usage Telemetry: Handling Mid-Stream Disconnects. OpenAI Cookbook, 2025.
  15. Microsoft. Azure Cost Management + AI Workloads: Integration Patterns. Microsoft Docs, 2025.
  16. Datadog. LLM Cost Observability: From Token Tracking to GPU-Second Attribution. Datadog Blog, 2025.

相关文章

  • AI 原生 UX 的四层交互范式 2026:流式生成、结构化输出、人机协作与状态管理7月15日
  • 端侧 LLM 推理的工程真相 2026:从内存预算、量化路径到生产闭环的四维拆解7月15日
  • GraphRAG 与多模态检索 2026:从知识图谱到跨模态融合的统一架构7月14日

评论

加载评论中…

发表评论

返回文章列表