Как обслуживать N пользователей одним пулом GPU/моделей: лимиты, кэширование, изоляция тенантов.
Зачем: модель дорогая. Один пользователь (или бот) может сжечь бюджет и занять GPU-очередь. LLM04 из OWASP — Model DoS.[109]
Три уровня лимитов:
Механика: token bucket / fixed window в Redis. Ответ 429 + Retry-After. Клиент — ретрай с экспоненциальной задержкой (урок 0009).
Метрика: 429 rate, queue length, queue age (урок 0009).
Много запросов повторяются: «какая комиссия SPEI?» — 1000 раз в день. Генерировать каждый раз заново — тратить деньги и GPU.
| Тип кэша | Что кэширует | Риск |
|---|---|---|
| Exact cache | Точное совпадение (prompt, system, model) | Минимальный |
| Semantic cache | Похожие запросы (по эмбеддингам) | В банке опасен: «дней отпуска» ≈ «дней больничного» — разные ответы |
| Prefix/prompt cache | Общий префикс промпта (урок 0003) | Нет, это фича API |
Правило банка: exact cache — да, semantic cache — только если измерил false-hit rate. Инвалидация по версии документа: сменили тариф — старый ответ нельзя отдавать (урок 0002).
Проблема: B2B-банк может обслуживать несколько компаний-клиентов (тенантов). Ответы тенанта A не должны протекать в тенанта B.
Уровни изоляции:
Ошибка новичка: tenant_id только в промпте («ты работаешь для компании A») — это не изоляция, это подсказка. Изоляция — в ACL, кэше и логах.
Клиент → rate limiter (Redis token bucket, per user/tier)
↓
API-слой → tenant_id из заголовка, НЕ из тела
↓
Кэш (exact, ключ = tenant + prompt + model)
↓
Очередь → воркеры → LLM (vLLM c max-num-seqs)
↓
Лог: tenant_id, request_id, prompt_version, cost
Semantic cache в банке опасен, потому что?
Ключ кэша должен включать?
Тенантная изоляция — это?