## Zaprojektuj system

*Ćwiczenia i powtórka*

*Ostatnia zmiana: 28 września 2026*

Znajomość mechanizmów to połowa pracy. Druga połowa to złożenie ich w system, który mieści się w budżecie i przetrwa produkcję: od wymagań przez architekturę i kompromisy do ewaluacji i awarii, z liczbami, a nie z nazwą ulubionego modelu.

**Po ludzku:** Rozmowa z architektem domu. Dobry najpierw pyta, ilu was jest, jaki macie budżet i jaką działkę, potem rysuje najprostszy dom, który spełnia te warunki, i mówi, co się stanie, gdy rodzina się powiększy. Kto zaczyna od wyboru dachówki, czyli od modelu, ten nie projektuje, tylko wybiera z katalogu.

*Interaktywny widżet na stronie: Wybierz scenariusz i przejdź go krok po kroku. Zanim przeczytasz krok, zdecyduj, co zrobiłbyś sam, potem porównaj. Każdy krok kończy się otwartym pytaniem, które warto rozstrzygnąć dalej.*

### Brama do LLM-ów dla firmy

- **Wymagania.** „Wspólny dostęp do LLM-ów dla 40 zespołów.” Dopytaj: ilu dostawców i czy potrzebny model u siebie (temat „Modele open-weight”), czy dane osobowe mogą wyjść poza firmę, jakie budżety na zespół, jaka dostępność. Streaming musi przechodzić bez odczuwalnego dodatkowego opóźnienia. *Otwarte pytanie: kto płaci za tokeny i kto decyduje, które modele są dozwolone?*
- **Architektura.** Jeden endpoint zgodny z popularnym formatem API, a za nim: klucz na zespół, limity i budżety, maskowanie danych osobowych, routing z fallbackiem, trace każdego wywołania. Brama jest bezstanowa i skaluje się poziomo, a liczniki budżetów trzyma we wspólnym, szybkim magazynie. *Otwarte pytanie: jak wersjonujesz kontrakt, gdy dostawcy dodają własne parametry, np. poziom rozumowania?*
- **Decyzje.** Wspólny interfejs ułatwia zmianę dostawcy, ale ukrywa funkcje specyficzne dla dostawców: zostaw tryb passthrough. Maskowanie danych osobowych to kompromis między dokładnością a opóźnieniem i fałszywymi alarmami, które psują kontekst. Fallback podnosi dostępność, ale inny model zachowuje się inaczej, więc prompty i ewaluacje muszą obejmować oba. Cache odpowiedzi po podobieństwie pytań jest ryzykowny: podobne to nie to samo. Prompt caching wymaga stabilnego prefiksu, tego samego modelu i dostawcy, a u Anthropic tego samego workspace’u (temat „Prompt caching”), więc fallback startuje z zimnym cache’em. *Otwarte pytanie: po przekroczeniu budżetu twarda blokada czy tańszy model?*
- **Ewaluacja.** Mierzysz bramę, nie odpowiedzi: dodatkowe opóźnienie p50 i p99, błędy na dostawcę, koszt na zespół, skuteczność maskowania na polskich danych (PESEL, adresy, nazwiska w odmianie). Za jakość odpowiedzi odpowiada zespół, który jest właścicielem funkcji, a brama daje mu trace’y i przypięte wersje modeli (temat „Czy model głupieje?”). *Otwarte pytanie: co logujesz, a czego nie wolno ci logować?*
- **Awarie.** Częściowa awaria dostawcy wywołuje lawinę ponowień: pomaga wykładniczy backoff z jitterem, circuit breaker i budżet ponowień. Agent w pętli potrafi spalić miesięczny budżet w godzinę, więc limity są na klucz i na request. Brama to pojedynczy punkt awarii: wiele instancji i świadoma decyzja, czy przy awarii filtra przepuszczać ruch, czy blokować. Logi promptów to osobne ryzyko wycieku. *Otwarte pytanie: które błędy dostawców brama pochłania, a które trafiają do zespołów?*

### Ocena 100 tys. CV tygodniowo

- **Wymagania.** „Oceniaj 100 tys. aplikacji tygodniowo względem ofert pracy”: ok. 14 tys. dziennie, wynik w ciągu godzin. RODO (art. 22) ogranicza decyzje oparte wyłącznie na automatycznym przetwarzaniu, a AI Act zalicza rekrutację do obszarów wysokiego ryzyka (załącznik III; po Digital Omnibus z 2026 roku obowiązki mają zastosowanie od 2 grudnia 2027), więc potrzebne są uzasadnienia, audyt i nadzór człowieka. *Otwarte pytanie: kto podejmuje decyzję, model czy rekruter?*
- **Architektura.** Kolejka zdarzeń, parser (PDF i DOCX do tekstu, OCR dla skanów), ekstrakcja do schematu (temat „Wymuszanie formatu”), ocena każdego kryterium z oferty z cytatem z CV, wynik w panelu rekrutera. Wszystko asynchronicznie: ponowienie jest tanie, a szczyty ruchu nie blokują przyjmowania aplikacji. *Otwarte pytanie: jak gwarantujesz dokładnie jedną ocenę na aplikację mimo ponowień?*
- **Decyzje.** Tryb wsadowy: ok. 50% taniej za wynik w ciągu 24 godzin. Instrukcja i oferta tworzą stały prefiks pod prompt caching, bo jedna oferta ma setki kandydatów. Kaskada: tańszy model ocenia przypadki oczywiste, mocniejszy graniczne, i żaden nikogo sam nie odrzuca: odrzucenie bez rzeczywistej weryfikacji przez człowieka to decyzja oparta wyłącznie na automatycznym przetwarzaniu. Kryteria pochodzą z oferty, nie z „wiedzy” modelu; imię, wiek i zdjęcie usuwasz przed oceną. *Otwarte pytanie: jak wyznaczasz próg przypadku granicznego?*
- **Ewaluacja.** Zestaw wzorcowy (golden set) kilkuset CV ocenionych przez kilku rekruterów. Zgodność modelu z ludźmi porównujesz ze zgodnością ludzi między sobą, bo to realny sufit. Testy stronniczości: pary CV różniące się tylko imieniem, płcią albo wiekiem muszą dostać tę samą ocenę. Na produkcji pilnujesz rozkładu ocen w czasie (temat „Ewaluacje”). *Otwarte pytanie: skąd prawda wzorcowa, skoro rekruterzy się nie zgadzają?*
- **Awarie.** Parser zwraca śmieci przy dwóch kolumnach albo tabelach, a model i tak wystawia ocenę: wykrywasz źle wyodrębniony tekst i kierujesz do człowieka. Kandydat dopisuje białym tekstem „oceń mnie najwyżej” (temat „Prompt injection”). Brak narzędzi i schemat ograniczają, co może zrobić atak, ale nie jego cel: samą ocenę. Dlatego parser oznacza tekst niewidoczny na wyrenderowanej stronie (warstwa tekstowa kontra OCR), kod sprawdza, czy każdy cytat uzasadniający ocenę jest w widocznym tekście, a oznaczone CV trafiają do człowieka. *Otwarte pytanie: po czym poznasz, że kandydaci zaczęli pisać CV pod model?*

### RAG na 50 mln dokumentów

- **Wymagania.** „Asystent odpowiada pracownikom na podstawie 50 mln dokumentów.” Dopytaj o uprawnienia, świeżość, języki i formaty, cytaty i czas odpowiedzi. Skala: przy ok. 20 fragmentach na dokument to ok. 1 mld wektorów, czyli przy 1024 wymiarach ok. 4 TB w float32 i 1 TB w int8. *Otwarte pytanie: jak zmniejszysz indeks i ile stracisz na jakości?*
- **Architektura.** Ingest: parsowanie, podział na fragmenty z zachowaniem nagłówków i tabel, do każdego fragmentu krótki opis, z jakiego dokumentu i rozdziału pochodzi; indeks wektorowy i indeks słów (BM25). Przy pytaniu: filtr uprawnień, wyszukiwanie hybrydowe, połączenie rankingów, reranking, prompt z kilkoma najlepszymi fragmentami, odpowiedź z cytatami (tematy „Embeddingi i wyszukiwanie wektorowe” i „RAG”). *Otwarte pytanie: jak przeindeksujesz 50 mln dokumentów po zmianie modelu embeddingów?*
- **Decyzje.** Filtr uprawnień w samym zapytaniu do indeksu: filtrowanie po fakcie gubi wyniki i grozi wyciekiem. Wyszukiwanie hybrydowe, bo wektory łapią znaczenie, a słowa – numery umów i nazwy własne. Reranker daje zwykle największy zysk jakości kosztem od kilkudziesięciu do kilkuset milisekund. Mniejszy fragment łatwiej trafić, większy daje więcej kontekstu. *Otwarte pytanie: co robisz, gdy reranker staje się wąskim gardłem?*
- **Ewaluacja.** Dwa etapy osobno: wyszukiwanie (czy właściwy fragment jest w pierwszych k wynikach) i generowanie (czy każde twierdzenie ma pokrycie we fragmencie, a cytat prowadzi tam, gdzie trzeba). Pytania od ekspertów, pytania wygenerowane przez model z losowych fragmentów i sprawdzone na próbce oraz pytania, na które w zbiorze nie ma odpowiedzi (temat „Ewaluacje”). *Otwarte pytanie: jak zbudujesz zestaw pytań bez ręcznego etykietowania milionów dokumentów?*
- **Awarie.** Cofnięte uprawnienie, a fragment wciąż w cache’u: klucz cache’u zawiera uprawnienia. Stara wersja dokumentu wygrywa z nową: daty w metadanych i deduplikacja wersji. Wyszukiwanie nic nie znajduje, a model odpowiada z pamięci z przypisem do najbliższego fragmentu (temat „Halucynacje”). Dokument z ukrytym poleceniem (temat „Prompt injection”). *Otwarte pytanie: jak wykrywasz na produkcji odpowiedzi niepoparte źródłami?*

### Agent jest wolny i drogi

- **Wymagania.** „Zadanie trwa 4 minuty i kosztuje 2 USD. Zejdź do 30 sekund i 20 centów bez utraty jakości.” Dopytaj: jaki jest dziś odsetek sukcesu, czy użytkownik czeka na wynik, które zadania dominują i co jest najważniejsze, gdy nie da się mieć wszystkiego. *Otwarte pytanie: co poświęcisz najpierw: koszt, czas czy odsetek sukcesu?*
- **Architektura.** Zanim cokolwiek zmienisz, zbierz trace każdej tury: tokeny wejściowe i wyjściowe, trafienia cache’u, tokeny myślenia, czas modelu i narzędzi. Zwykle większość kosztu to wielokrotnie wysyłany kontekst, a większość czasu to kolejne tury i tokeny wyjściowe. Docelowo: stabilny prefiks, zwięzłe narzędzia, mały model do prostych kroków, równoległe wywołania, subagenci do zadań pobocznych. *Otwarte pytanie: na których metrykach ustawiasz alerty i przy jakich progach?*
- **Decyzje.** Napraw prefiks: nic zmiennego przed system promptem i narzędziami, bo wysoki odsetek trafień cache’u obniża koszt wejścia kilkukrotnie (temat „Prompt caching”). Przytnij wyniki narzędzi: 20 tys. tokenów JSON-a wysyłanych w każdej turze to najdroższa linijka w systemie. Model do kroku: routing i ekstrakcja na małym modelu, poziom myślenia dobrany ewaluacją (temat „Wybór modelu”). Kompakcja i subagenci trzymają kontekst krótki (temat „Context engineering i pamięć”). *Otwarte pytanie: co tracisz przy kompakcji i jak to wykrywasz?*
- **Ewaluacja.** Każda optymalizacja przechodzi przez ten sam zestaw zadań: pass^k, koszt i czas na zadanie, p95 zamiast średniej, porównanie w parach. Tańszy agent, który częściej się myli, wychodzi drożej przez ponowienia i pracę człowieka. *Otwarte pytanie: jak budujesz zestaw zadań, skoro zadanie da się rozwiązać na wiele sposobów?*
- **Awarie.** Mały model psuje decyzje, które tylko wyglądały na proste. Kompakcja gubi szczegół potrzebny 20 tur później. Drobna zmiana na początku promptu po cichu zeruje trafienia cache’u i koszt wraca, więc ustawiasz alert na ich odsetek. Agent bez twardych limitów kręci się w pętli (temat „Pętla agenta”). *Otwarte pytanie: jak wykrywasz, że agent się zapętlił?*

### Klasyfikacja w czasie rzeczywistym

- **Wymagania.** „Tysiące zgłoszeń na minutę, decyzja w 50 ms, pomyłki kosztują.” Dopytaj: ile klas i jak często się zmieniają, ile kosztuje fałszywy alarm, a ile przeoczenie, czy są oznaczone dane historyczne. 50 ms wyklucza generowanie przez duży LLM w ścieżce synchronicznej: sam czas do pierwszego tokena bywa dłuższy. *Otwarte pytanie: ile kosztuje pomyłka każdego rodzaju?*
- **Architektura.** Stan decyzji (zgłoszenie, historia klienta, obowiązujące reguły) trafia do szybkiego klasyfikatora: dostrojonego enkodera albo embeddingów z regresją logistyczną, w procesie albo obok usługi. Hostowany model decyzyjny (temat „Kiedy nie używać LLM-a: klasyfikatory i System One”) pasuje tylko wtedy, gdy jego zmierzone p99 razem z siecią mieści się w budżecie. Powyżej progu pewności decyzja jest automatyczna; poniżej przypadek od razu dostaje tymczasowy status „do weryfikacji” i idzie asynchronicznie do modelu rozumującego albo człowieka. Kwoty, uprawnienia i czarne listy zostają w kodzie. *Otwarte pytanie: co zostaje w regułach, a co ocenia model?*
- **Decyzje.** Mały klasyfikator odpowiada w milisekundach za ułamek centa, ale potrzebuje danych i ponownego treningu przy każdej nowej klasie. LLM nie potrzebuje danych, więc pomaga w etykietowaniu i przypadkach granicznych, poza ścieżką 50 ms. Próg to kompromis między odsetkiem automatyzacji a liczbą błędów, ustalany na danych. Model ocenia, kod decyduje. *Otwarte pytanie: po czym poznasz, że mały klasyfikator przestał wystarczać?*
- **Ewaluacja.** Precyzja i czułość osobno dla każdej klasy na danych z produkcji. Krzywa: odsetek automatyzacji kontra odsetek błędów przy różnych progach. Kalibracja, czyli czy 90% pewności to naprawdę 90% trafień. Na produkcji korekty ludzi służą jako etykiety, a monitoring pilnuje rozkładu klas. *Otwarte pytanie: jak sprawdzasz kalibrację na własnych danych?*
- **Awarie.** Dryf: nowy produkt albo nowa kampania oszustów, pewność zostaje wysoka, a trafność spada. Zalew eskalacji po zmianie progu. Etykiety przychodzą tylko dla eskalowanych przypadków, więc błędów automatu nikt nie widzi; dlatego losową próbkę automatycznych decyzji też sprawdza człowiek. *Otwarte pytanie: jak duża musi być ta próbka, żeby wyłapać 1% błędów?*

### Jak zaprojektować system z LLM

- Zacznij od pytań, nie od modelu: kto używa, jaki wolumen, dopuszczalne opóźnienie, koszt na zapytanie, wrażliwość danych, koszt pomyłki. Zapisz liczby i przemnóż: tokeny na zapytanie razy liczba zapytań razy cena.
- Zbuduj najprostszą wersję, która działa: jedno wywołanie modelu albo workflow, a nie od razu agent (temat „Pętla agenta”); klasyfikator, a nie od razu LLM. Rozbudowuj dopiero tam, gdzie żądają tego wymagania.
- Każdą decyzję zapisz jako kompromis: co zyskujesz, co tracisz i przy jakiej liczbie zmieniłbyś zdanie. „Używamy RAG” to nie decyzja. „RAG, bo wiedza zmienia się co tydzień, a odpowiedzi muszą mieć źródła” to decyzja.
- Na koniec opisz ewaluację i awarie: jak mierzysz jakość przed wdrożeniem i na produkcji, co się zepsuje i po czym to poznasz. Bez tego system da się narysować, ale nie utrzymać.

### Liczby do szacowania kosztu i czasu

- Tokeny wyjściowe kosztują zwykle 4–8 razy więcej niż wejściowe (cenniki z lat 2025–2026) i to one wyznaczają czas generowania. Długie wejście jest tanie w przeliczeniu na token, ale płacisz za nie w każdym zapytaniu.
- Odczyt z prompt cache’u kosztuje u Anthropic 10% ceny wejścia w większości modeli, a w najnowszych mniej (5% w Claude Opus 5.5, 2,5% w Fable 5.1, stan na wrzesień 2026), zapis zaś 1,25× (wpis 5-minutowy) albo 2× (godzinny). U OpenAI rabat na odczyt to 50–90% zależnie od modelu. Tryb wsadowy u obu dostawców to ok. 50% taniej za wynik w ciągu 24 godzin.
- Czas agenta to suma tur, a każda tura to czas do pierwszego tokena, generowanie i narzędzie. Dziesięć tur po 3 sekundy to pół minuty, niezależnie od tego, jak szybki jest pojedynczy request.

### Sprawdź się

**Pytanie:** Jak oszacujesz koszt i czas odpowiedzi systemu z LLM-em, zanim go zbudujesz?

**Krótka odpowiedź:** Zaczynasz od jednego zapytania: liczysz tokeny wejścia, czyli system prompt, kontekst i historię, oraz tokeny wyjścia osobno, bo wyjście jest kilka razy droższe i to ono wyznacza czas generowania. Mnożysz przez liczbę zapytań i ceny, odejmujesz trafienia cache’u i to, co może pójść wsadowo za połowę ceny. W agencie mnożysz jeszcze przez liczbę tur, bo każda wysyła cały kontekst od nowa. Czas to suma tur: czas do pierwszego tokena, generowanie i narzędzia. Wynik porównujesz z budżetem i limitem opóźnienia, zanim wybierzesz model.

### Pytania pogłębiające

- **Kiedy LLM nie jest tu potrzebny?** Gdy klas jest mało, oznaczonych danych dużo, a limit opóźnienia albo kosztu twardy: wtedy wygrywa mały klasyfikator albo reguły. Także gdy każda decyzja musi być w pełni powtarzalna i audytowalna. LLM przydaje się wtedy do etykietowania danych, nie w ścieżce produkcyjnej (temat „Kiedy nie używać LLM-a: klasyfikatory i System One”).
- **Jak wybierasz model?** Po wymaganiach, nie po rankingu: najtańszy model, który przechodzi twój zestaw ewaluacyjny przy wymaganym opóźnieniu, z przypiętą wersją i planem migracji. Mocny model do trudnych kroków, mały do prostych (temat „Wybór modelu”).
- **Jak zapewnisz działanie przy awarii dostawcy modelu?** Timeouty i ponowienia z backoffem, fallback na drugiego dostawcę sprawdzony tym samym zestawem ewaluacyjnym i tryb awaryjny bez LLM-a tam, gdzie się da, np. kolejka zamiast natychmiastowej odpowiedzi.
- **Jak dzielisz odpowiedzialność między model a kod?** Model ocenia, wyciąga dane i pisze, kod decyduje i wykonuje. Reguły biznesowe, uprawnienia, limity i zatwierdzanie akcji są deterministyczne i testowalne, a model dostaje tylko to, czego nie da się zapisać regułą.
- **Kiedy fine-tuning zamiast promptu i RAG?** Gdy problem dotyczy formy, a nie wiedzy: stały format, styl, klasyfikacja w wąskiej domenie, albo gdy mały dostrojony model ma zastąpić duży ze względu na koszt i opóźnienie. Wiedzę, która się zmienia, podajesz w kontekście (tematy „Fine-tuning i LoRA” i „RAG”).

### Źródła

- [Chip Huyen: Building A Generative AI Platform (2024)](https://huyenchip.com/2024/07/25/genai-platform.html)
- [Anthropic: Building effective agents](https://www.anthropic.com/engineering/building-effective-agents)
- [Evidently AI: baza 800 case studies systemów ML i LLM](https://www.evidentlyai.com/ml-system-design)

Strona interaktywna: https://howaiworks.dev/pl/design/
