Мультитенантность в AI — это архитектурный подход, при котором одна AI-платформа обслуживает множество клиентов (тенантов), обеспечивая полную изоляцию их данных, конфигураций и лимитов. Если вы строите SaaS-продукт с AI-функциями или предоставляете AI API своим клиентам, мультитенантная архитектура — обязательное требование.
Изоляция данных между тенантами
Главное правило мультитенантности: данные одного клиента никогда не должны быть доступны другому. В AI-приложениях это касается:
- Промпты и ответы — история запросов каждого тенанта изолирована
- RAG-данные — векторная база знаний разделена по тенантам
- Конфигурации — системные промпты, выбранные модели, настройки
- Логи и аналитика — каждый тенант видит только свою статистику
Реализация изоляции на уровне базы данных:
-- Подход 1: tenant_id в каждой таблице (shared schema)
CREATE TABLE usage_log (
id BIGSERIAL PRIMARY KEY,
tenant_id UUID NOT NULL,
api_key_id BIGINT NOT NULL,
model VARCHAR(100) NOT NULL,
input_tokens INT NOT NULL,
output_tokens INT NOT NULL,
cost_usd DECIMAL(10, 6) NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
);
-- Row-Level Security (RLS) в PostgreSQL
ALTER TABLE usage_log ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation ON usage_log
USING (tenant_id = current_setting('app.current_tenant')::UUID);
-- Каждый запрос к БД устанавливает текущего тенанта
SET app.current_tenant = 'tenant-uuid-here';
Per-tenant лимиты и квоты
Каждому тенанту необходимо назначить индивидуальные лимиты, чтобы один клиент не мог исчерпать ресурсы всей платформы:
from dataclasses import dataclass
from enum import Enum
class TenantPlan(Enum):
FREE = "free"
STARTER = "starter"
BUSINESS = "business"
ENTERPRISE = "enterprise"
@dataclass
class TenantLimits:
rpm: int # Requests per minute
tpm: int # Tokens per minute
monthly_budget_usd: float
max_context_tokens: int
allowed_models: list[str]
max_api_keys: int
PLAN_LIMITS = {
TenantPlan.FREE: TenantLimits(
rpm=10, tpm=10_000, monthly_budget_usd=5,
max_context_tokens=4096, allowed_models=["gpt-4o-mini"],
max_api_keys=1,
),
TenantPlan.STARTER: TenantLimits(
rpm=60, tpm=100_000, monthly_budget_usd=100,
max_context_tokens=16384, allowed_models=["gpt-4o-mini", "gpt-4o"],
max_api_keys=5,
),
TenantPlan.BUSINESS: TenantLimits(
rpm=300, tpm=500_000, monthly_budget_usd=1000,
max_context_tokens=128000,
allowed_models=["gpt-4o", "claude-3.5-sonnet", "gemini-2.0-pro"],
max_api_keys=20,
),
TenantPlan.ENTERPRISE: TenantLimits(
rpm=1000, tpm=2_000_000, monthly_budget_usd=10000,
max_context_tokens=200000,
allowed_models=["*"], # Все модели
max_api_keys=100,
),
}
API-ключи и аутентификация
В мультитенантной системе API-ключи привязаны к тенанту и несут информацию о правах доступа:
interface TenantApiKey {
keyHash: string; // SHA-256 хэш ключа
tenantId: string; // UUID тенанта
name: string; // Человекочитаемое имя
permissions: string[]; // ["chat", "embeddings", "images"]
rateLimit: number; // RPM для этого конкретного ключа
monthlyBudget: number; // Бюджет в USD для этого ключа
allowedModels: string[]; // Разрешённые модели
expiresAt?: Date; // Опциональная дата истечения
createdAt: Date;
lastUsedAt?: Date;
}
// Middleware для извлечения тенанта из ключа
function authMiddleware(req: Request): TenantContext {
const apiKey = req.headers.get("Authorization")?.replace("Bearer ", "");
if (!apiKey) throw new UnauthorizedError("Missing API key");
const keyHash = sha256(apiKey);
const keyRecord = db.apiKeys.findByHash(keyHash);
if (!keyRecord) throw new UnauthorizedError("Invalid API key");
if (keyRecord.expiresAt && keyRecord.expiresAt < new Date()) {
throw new UnauthorizedError("API key expired");
}
return { tenantId: keyRecord.tenantId, limits: keyRecord };
}
Аудит и мониторинг
Для мультитенантной AI-платформы критически важен аудит:
- Кто — какой тенант и какой API-ключ сделал запрос
- Что — какая модель, сколько токенов, какой результат
- Когда — временная метка с точностью до миллисекунды
- Сколько — стоимость запроса, остаток бюджета
- Откуда — IP-адрес, User-Agent (для обнаружения утечек ключей)
ModelSwitch реализует мультитенантную модель из коробки: каждый пользователь — это отдельный тенант с собственными API-ключами (префикс ms-), балансом, лимитами и аналитикой. Security log фиксирует все действия с ключами, а usage log — каждый запрос к AI моделям.
Заключение
Мультитенантность — архитектурная основа любого AI SaaS. Обеспечьте изоляцию данных через RLS или schema separation, настройте per-tenant лимиты для защиты от noisy neighbor, привяжите API-ключи к тенантам и ведите детальный аудит. Если вы предоставляете AI-функции своим клиентам, ModelSwitch может выступить backend-провайдером с готовой мультитенантной инфраструктурой.