
多租户微调:为你的 SaaS 打造每客户 AI 模型
你的 SaaS 客户想要理解他们数据的 AI,而不是通用回复。以下是如何使用 LoRA 适配器架构每租户微调模型——包含真实的存储计算、成本分析和可扩展到数百租户的服务架构。
你的 SaaS 客户想要理解他们数据的 AI。不是你的训练数据。不是所有租户的某种混合平均值。他们的术语、他们的工作流、他们的边缘案例。
一个服务 80 家律所的法律科技平台有 80 种不同的词汇表。一个服务 50 个电商品牌的支持平台有 50 种不同的产品目录、语气指南和升级策略。一个服务 30 家诊所的医疗 SaaS 有 30 种不同的文档风格和专科缩写。
通用 AI 给出通用回答。而通用回答正是你的客户在每次反馈调查中不断要求"更好的 AI"的原因。
解决方案不是更好的提示词。而是每租户模型——它比你想象的更实用。
三种架构模式
向 SaaS 产品添加租户感知微调恰好有三种方式。每种在成本、隔离和质量之间做出不同权衡。
模式 1:共享微调
你将所有租户的训练数据合并为一个数据集并微调单个模型。每个租户命中相同的模型。
工作原理:
- 聚合所有租户的训练示例
- 在合并数据集上微调一个模型
- 所有 API 请求路由到相同的模型端点
优势: 简单。一个模型管理,一个部署监控,一次微调运行。存储成本最低——你只运行一个模型。
劣势: 模型学习所有租户的平均值。如果租户 A 使用"客户「而租户 B 使用」顾客"表示同一含义,模型学到的是模糊的中间值。更糟的是,租户 A 的数据影响租户 B 的回复。对于受监管行业,这是一个合规问题。
适用场景: 当你的租户是同质的——相同行业、类似数据、类似词汇。如果你正在为牙科诊所构建 SaaS,而它们都以类似方式记录手术,共享微调可能就够了。
模式 2:共享基础上的每租户 LoRA 适配器
你微调一次基础模型(或直接使用),然后为每个租户创建一个小型 LoRA 适配器。在推理时,加载基础模型加上租户的适配器。
工作原理:
- 部署一个基础模型(如 Llama 3.3 8B 或 Qwen 2.5 7B)
- 仅使用该租户的数据为每个租户微调 LoRA 适配器
- 请求时根据租户 ID 加载基础模型 + 正确的适配器
优势: 每个租户获得真正理解其数据的模型。存储很小——LoRA 适配器根据秩和目标模块为 50-200MB,相比完整模型的 4-14GB。训练快速且便宜。数据隔离是绝对的:租户 A 的数据永远不会接触租户 B 的适配器。
劣势: 你需要适配器热切换基础设施。切换适配器时有小的延迟成本(冷切换通常 50-200 毫秒)。
适用场景: 这是大多数 SaaS 产品的正确答案。这是我们为 90% 的多租户 AI 用例推荐的架构。
模式 3:每租户完整微调
你为每个租户微调一个完整模型。每个租户获得自己完全独立的模型。
工作原理:
- 为每个租户微调单独的模型
- 独立部署和服务每个模型
- 模型层租户之间没有共享基础设施
优势: 最大隔离。最大定制。每个模型可以是不同大小、不同基础、不同量化。你可以给企业租户 A 一个 70B 模型,给初创租户 B 一个 7B 模型。
劣势: 存储和计算成本随租户数量线性增长。管理 100 个独立模型部署是运维噩梦。每租户微调成本高 10-50 倍。
适用场景: 拥有大量数据集(100K+ 示例)、严格数据隔离要求和匹配预算的企业客户。想想银行、国防承包商、大型医院网络。
存储计算
这是决策通常不言自明的地方。以下是不同租户数量下每种模式的原始存储成本:
| 租户数 | 共享微调 | 每租户 LoRA | 每租户完整(7B Q4) | 每租户完整(13B Q5) |
|---|---|---|---|---|
| 1 | 4-5 GB | 4-5.2 GB | 4-5 GB | 9-10 GB |
| 10 | 4-5 GB | 4.5-7 GB | 40-50 GB | 90-100 GB |
| 50 | 4-5 GB | 6.5-15 GB | 200-250 GB | 450-500 GB |
| 100 | 4-5 GB | 9-25 GB | 400-500 GB | 900-1,000 GB |
| 500 | 4-5 GB | 29-105 GB | 2-2.5 TB | 4.5-5 TB |
计算方式:秩 64 目标注意力层的 LoRA 适配器为 50-200MB。Q4 量化的完整 7B 模型约 4-5GB。100 个租户时,每租户 LoRA 总共花费 5-20GB(一个基础模型加 100 个适配器)。每租户完整微调至少花费 400-500GB。
仅存储就有 20-50 倍的差异。而存储还是便宜的部分。
服务架构:适配器热切换如何工作
每租户 LoRA 模式只有在你能快速切换适配器时才有效。以下是架构。
请求流程
传入请求
→ 从认证令牌/请求头提取 tenant_id
→ 检查适配器缓存(内存 LRU)
→ 如果已缓存:路由到基础模型 + 缓存适配器
→ 如果未缓存:从磁盘/S3 加载适配器(50-200ms)
→ 运行推理
→ 返回响应
使用 Ollama 运行
Ollama 支持在基础模型之上加载 LoRA 适配器。设置方式:
-
一个基础模型在内存中。 加 载你的基础模型(如
llama3.3:8b-q5_K_M)一次。它保持驻留。这消耗约 6GB VRAM。 -
适配器文件在磁盘上。 将每个租户的
.gguf适配器文件存储在目录结构中:/models/adapters/{tenant_id}/adapter.gguf -
请求路由。 你的 API 网关提取
tenant_id,选择正确的适配器路径,并创建引用基础模型加适配器的 Modelfile。 -
适配器缓存。 将最近使用的适配器保存在 LRU 缓存中。对于大多数 SaaS 产品,80% 的流量来自 20% 的租户。保持 10-20 个适配器的缓存可以零切换延迟处理大部分请求。
延迟预算
| 操作 |
|---|