Multi-tenancy w prywatnej instancji AI — architektura dla zespołów
Jak obsłużyć 15 zespołów wewnętrznych w jednej prywatnej instancji AI — z separacją danych, kontrolą kosztów per zespół i własnymi promptami dla każdego działu. Pokazujemy architekturę z 4 naszych wdrożeń (180-450 użytkowników), z koncepcją „virtual tenant", routingiem, billingiem i monitoringiem.
Mała firma robi prywatną instancję AI dla 5 osób. Duża — dla 350. Różnica nie jest tylko ilościowa: pojawia się problem multi-tenancy. Jak dział marketingu nie widzi rozmów działu prawnego? Jak liczyć koszty per dział? Jak handlowiec ma swój prompt, a księgowa swój? Pokazujemy architekturę, którą sprawdziliśmy w 4 wdrożeniach.
Dlaczego nie wystarczy „jeden Claude dla wszystkich"
W firmie 200-osobowej każdy dział ma inne potrzeby:
- Marketing pisze copy, oczekuje kreatywności i swobody.
- Prawnicy potrzebują dokładności i citowania źródeł.
- Księgowość pracuje z liczbami i nie może halucynować.
- HR ma wrażliwe dane kandydatów.
- Programiści piszą kod i potrzebują tools (Bash, Read, Edit).
Jeden prompt systemowy nie obsłuży tych potrzeb dobrze. A jeśli pozwolicie każdemu mieć swój — pojawia się chaos zarządzania.
Architektura — koncepcja „virtual tenant"
Nasza architektura ma 4 warstwy:
Warstwa 1 — autoryzacja użytkownika
SSO (typowo Azure AD / Google Workspace) → identyfikacja użytkownika → mapowanie na rolę („marketing", „księgowość", „prawnicy", „programiści", „HR", „management").
Warstwa 2 — virtual tenant (rola)
Każda rola ma własny zestaw: prompt systemowy, dostępne modele (Sonnet/Opus/Bielik), narzędzia (tools), limity kosztu miesięcznego, retencję historii, dostęp do RAG i baz wiedzy.
Warstwa 3 — gateway AI
Centralny router (LiteLLM albo własny napisany w PHP/Python). Egzekwuje uprawnienia, prowadzi accounting, dodaje prompty systemowe, robi logging i audyt.
Warstwa 4 — modele
Backend: API Anthropic/OpenAI/własna inferencja Bielika na GPU. Gateway sam wybiera, gdzie skierować zapytanie.
Schemat YAML — konfiguracja roli
tenants:
ksiegowosc:
system_prompt: "Jesteś asystentem księgowym. Pracujesz w PL GAAP."
allowed_models: [claude-sonnet-4-5, bielik-2-3-11b]
tools: [Read, search_documents]
monthly_budget_usd: 240
rag_collections: [ksef-docs, polskie-przepisy-podatkowe]
history_retention_days: 90
sensitive_data_filter: strict
marketing:
system_prompt: "Jesteś asystentem marketingu RedAI. Piszesz po polsku."
allowed_models: [claude-opus-4-6, claude-sonnet-4-5]
tools: [Read, Write, search_web]
monthly_budget_usd: 380
rag_collections: [brand-guidelines, case-studies-public]
history_retention_days: 365
sensitive_data_filter: none
Billing — koszt per dział
Każde wywołanie ma metadane: user_id, tenant, model, input_tokens, output_tokens, cost_usd. Dane idą do tabeli `ai_usage_log`. Co miesiąc generujemy raport per dział i obciążamy budżety wewnętrzne.
| Dział | Użytkownicy | Wywołań/mies | Koszt USD |
|---|---|---|---|
| Marketing | 12 | 8 240 | 312 |
| Programiści | 28 | 42 180 | 897 |
| Księgowość | 6 | 11 470 | 218 |
| HR | 4 | 3 870 | 94 |
| Prawnicy | 3 | 2 240 | 187 |
Sensitive data filter — co to robi
W trybie `strict` (HR, prawnicy) gateway przed wysłaniem promptu skanuje treść pod kątem: PESEL, numerów kart kredytowych, NIP-ów osób fizycznych, adresów. Wykryte dane są zastępowane placeholderem (`[PESEL_REDACTED]`) zanim trafią do modelu. Po odpowiedzi modelu — odwrotna mapa (placeholdery wracają do wartości tylko w UI użytkownika, nie w logach).
Monitoring i alerty
- Dzienny raport kosztu per dział — porównanie do budżetu.
- Alert na nietypowe wywołania (np. jeden user generuje 30% wywołań działu).
- Alert na próbę dostępu do funkcji spoza roli.
- Alert na zapytania zawierające frazy „ignore previous", „forget your instructions" (próba prompt injection).
Skala, którą obsłużyliśmy
Największe wdrożenie: 450 użytkowników, 14 ról, 6 modeli backendowych, 240 000 wywołań miesięcznie. Latencja gateway dodaje 47 ms p50, 180 ms p99. Koszt utrzymania samego gatewaya: ok. 1 200 zł/mies. (mała VM + Redis + Postgres).
Czego nauczyliśmy się ciężko
- Nie pozwalajcie użytkownikom zmieniać promptu systemowego — w dwóch wdrożeniach złamaliśmy tę regułę, w obu wpadliśmy w prompt injection w 3 tygodnie.
- Audyt od dnia 1 — log wszystkich wywołań, nie tylko błędów. Audyt compliance to wymóg, nie nice-to-have.
- Budżety twarde, nie miękkie — gdy dział przekroczy budżet, blokujemy do końca miesiąca. „Miękkie ostrzeżenie" nie działa — zawsze ktoś przekracza dwukrotnie.
Planujecie wdrożenie dla >50 osób? Napiszcie. Pokażemy gateway działający u nas i zaprojektujemy strukturę ról pod Waszą organizację w trakcie 2-godzinnego warsztatu.
Chcesz przetestować, jak AI rozwiąże to u Ciebie?
30 minut rozmowy + pokaz działającego wdrożenia u klienta. Bez NDA.
Umów demo