Przejdź do głównej zawartości

Generative AI Design Patterns (Lakshmanan, Hapke): recenzja i mapa 32 wzorców

· 9 min aby przeczytać
Przemysław Majdak
Full-Stack Developer, Automation Engineer & Web Security Specialist

„Generative AI Design Patterns" Valliappy Lakshmanana i Hannesa Hapkego (O'Reilly) katalogizuje 32 wzorce projektowania aplikacji na modelach generatywnych: od maskowania logitów, przez RAG i agentów, po guardrails. Przeczytałem całość z jednym pytaniem przy każdym wzorcu: czy odpowiada na trwałą własność modeli, czy obchodzi brak funkcji w API z 2025 roku. Mój werdykt: część katalogu się zestarzeje, ale kryteria wyboru zostaną, bo autorzy przy większości wzorców piszą, kiedy go nie stosować, a przy kilku podpierają to liczbami. Ten wpis to recenzja i mapa serii — w dziesięciu kolejnych rozbieram wzorce grupami.

O książce​

Autorzy to Valliappa Lakshmanan i Hannes Hapke; wydawca O'Reilly, pierwsze wydanie 2025-10-03, na stronie redakcyjnej ©2026. Czytałem wersję PDF, która jest przeformatowanym EPUB-em i nie ma numerów stron druku, dlatego w całej serii cytuję po rozdziale i numerze wzorca — np. (rozdz. 5, Pattern 13) — a nie po stronie. Wydawca robi zresztą to samo: indeks książki wskazuje sekcje, nie strony.

Układ jest prosty. Rozdział 1 buduje model pojęciowy (logity, sampling, in-context learning, rodzaje post-treningu). Rozdziały 2–9 to 32 wzorce w stałym schemacie: problem, rozwiązanie, przykład, rozważania (Considerations, często z alternatywami) i literatura. Rozdział 10 składa kilka wzorców w jedną aplikację agentową.

Rozdz.TematWzorce
2Kontrola stylu i formatuP1 Logits Masking, P2 Grammar, P3 Style Transfer, P4 Reverse Neutralization, P5 Content Optimization
3Dodawanie wiedzy: podstawyP6 Basic RAG, P7 Semantic Indexing, P8 Indexing at Scale
4Dodawanie wiedzy: wyszukiwanieP9 Index-Aware Retrieval, P10 Node Postprocessing, P11 Trustworthy Generation, P12 Deep Search
5Rozszerzanie zdolności modeluP13 Chain of Thought, P14 Tree of Thoughts, P15 Adapter Tuning, P16 Evol-Instruct
6NiezawodnośćP17 LLM-as-Judge, P18 Reflection, P19 Dependency Injection, P20 Prompt Optimization
7Agenci i działanieP21 Tool Calling, P22 Code Execution, P23 Multiagent Collaboration
8Ograniczenia: koszt i latencjaP24 Small Language Model, P25 Prompt Caching, P26 Inference Optimization, P27 Degradation Testing, P28 Long-Term Memory
9ZabezpieczeniaP29 Template Generation, P30 Assembled Reformat, P31 Self-Check, P32 Guardrails

Moja teza, z której wynika reszta​

Klasyczne wzorce projektowe (GoF) porządkują kod, który sam napisałem. Wzorce z tej książki robią coś innego: obudowują komponent, którego nie napisałem i którego zachowania nie kontroluję. Model jest niedeterministyczny, bezstanowy, zmienia się z każdą wersją i nie wie, czego nie wie. Każdy z 32 wzorców da się więc czytać jako odpowiedź na konkretny tryb zawodności modelu.

To daje proste kryterium oceny. Jeśli wzorzec odpowiada na własność modelu (halucynuje, nie trzyma formatu, nie ma pamięci), to przeżyje zmianę dostawcy. Jeśli odpowiada na brak funkcji w API z 2025 roku, ma datę ważności — i w serii będę to przy każdym wzorcu zaznaczał jako moją ocenę trwałości, oddzieloną od tego, co piszą autorzy.

Kolejność sięgania po narzędzia​

Rozdział 1 i rozdział 5 razem dają coś, co nazywam drabiną kosztu. Skala czasu to moja heurystyka, nie liczby z książki — autorzy dla samego treningu podają czasy od minut do godzin (np. w rozdz. 1 dla fine-tuningu przez API), a ja doliczam przygotowanie danych, ewaluację i utrzymanie:

  1. Parametry generowania — temperatura, top-p, kary. Zmiana w minutę.
  2. Prompt i few-shot — godziny.
  3. RAG — dni: indeks, chunkowanie, ewaluacja wyszukiwania.
  4. Post-training — tygodnie, a potem utrzymanie na zawsze, bo każda nowa wersja modelu bazowego wymaga powtórki.

Schodzić w dół możliwie późno. Jedna obserwacja z rozdziału 2 zmieniła mi odruch: prośba w prompcie („zwróć JSON") nie jest tanim szczeblem tej drabiny, tylko jego brakiem. Autorzy nazywają poleganie na posłuszeństwie modelu antywzorcem, bo koszt przenosi się na każdego konsumenta wywołania, który musi się zabezpieczać osobno.

Rodzaj braku wyznacza narzędzie​

Najużyteczniejsza tabela, jaką z tej książki wyniosłem, nie jest w niej wydrukowana — składa się z fragmentów rozdziałów 1, 3 i 5:

Czego modelowi brakujeNarzędzieDlaczego
formy, stylu, formatufew-shot, Style Transfer (P3)zmiana przykładów działa natychmiast
logiki, proceduryChain of Thought (P13)„RAG gives the model a (few) fish, while Few-shot CoT shows the model how to fish" (rozdz. 5, Pattern 13)
faktuRAG (P6–P12)„You need that specific data point, and the only time you know it is during inference" (rozdz. 3, Pattern 6)
umiejętności bliskiej temu, co model już umieAdapter Tuning (P15)typowo kilkaset do kilku tysięcy przykładów, czasem wystarczy ok. 100 (rozdz. 5, Pattern 15)
żargonu, nowego językacontinued pretrainingadapter zmienia model za mało
całkiem nowego, złożonego zadaniainstruction tuning, Evol-Instruct (P16)tysiące przykładów i świadoma utrata części zdolności ogólnych

Argument, dlaczego dostrajanie nie jest sposobem na dodanie faktu, jest intuicyjny: kilkaset przykładów z nazwiskiem nowego premiera nie przeważy tysięcy artykułów o poprzedniku, które model widział w pretreningu.

Co jest mocne​

Kryteria „kiedy nie używać". To jest główna wartość książki. Przy Tree of Thoughts autorzy podają, że w ich przykładzie (optymalizacja łańcucha dostaw) jedna odpowiedź wymagała 41 wywołań API i trwała 93 sekundy (rozdz. 5, Pattern 14). Przy Evol-Instruct liczą, że każdy wygenerowany przykład to co najmniej trzy wywołania modelu, więc zbiór 10 tysięcy przykładów to ponad 30 tysięcy wywołań (rozdz. 5, Pattern 16) — to ich szacunek, nie pomiar, ale wystarczy do decyzji. Przy systemach wieloagentowych przytaczają analizę z 2025 roku, według której 40–80% zadań w takich systemach kończy się porażką, i sami rekomendują zrobienie wszystkiego, żeby wystarczył jeden agent (rozdz. 7, Pattern 23). Zastrzeżenie: w przypisie autorzy zaznaczają, że badacze opublikowali zaktualizowaną wersję pracy, gdy książka była w druku — do tej liczby wrócę przy wpisie o agentach.

Datowanie własnych tez. Autorzy wiedzą, że piszą o ruchomym celu. O Chain of Thought: „If you do use CoT, put a reminder on your calendar to check back every six months to see if CoT is still required" (rozdz. 5, Pattern 13). Uważam, że ta rada powinna być domyślnym odruchem wobec każdego wzorca z tej książki, nie tylko wobec CoT.

Uczciwość wobec własnego kodu. W rozdziale 10 autorzy ustawiają w przykładowej aplikacji ponowienie wywołania i sami nazywają to antywzorcem „try-and-try-again" z rozdziału 2, z rachunkiem, dlaczego w tym miejscu jest dopuszczalne. Książka, która przyznaje się do antywzorca we własnym przykładzie, zasługuje na zaufanie w pozostałych ocenach.

Stare wzorce w nowym kostiumie. Najbardziej wiarygodne okazały się te wzorce, które nie są nowe: Dependency Injection (P19) do testowania łańcuchów wywołań, Prompt Optimization (P20) jako kompilacja promptu z przykładów i ewaluatora, Template Generation (P29), czyli mail merge z lat 80. z modelem w trybie offline.

Słabe punkty​

Część katalogu ma datę ważności. Według mojej oceny 8 z 32 wzorców jest datowanych albo trwałych tylko częściowo (m.in. Chain of Thought, Tree of Thoughts, Small Language Model, Inference Optimization), a przy kolejnych datowane są szczegóły — progi, frameworki, limity. Kto wystawia logity, czy Zero-shot CoT jest jeszcze potrzebny, Tree of Thoughts wobec modeli rozumujących, progi cache'owania promptów, limity okien kontekstu — to wszystko jest stan z połowy 2025 roku. Rozdział 8 (małe modele, cache, optymalizacja inferencji) zestarzeje się najszybciej.

Liczby bez źródła. Część liczb to szacunki autorów podane bez przypisu: że limit to według nich 3–10 narzędzi, zależnie od modelu (stan na czerwiec 2025, rozdz. 7, Pattern 21), że 3–10% wartości wyciąganych z obrazów to halucynacje (rozdz. 9, Pattern 31), statystyki call center uzasadniające cache'owanie (rozdz. 8, Pattern 25). W serii oznaczam je jako szacunki autorów, a deklaracje dostawców (np. procent redukcji kosztu przy cache'owaniu) — jako deklaracje.

Rozdział 10 to przewodnik po repozytorium, a nie rozdział koncepcyjny. Przykłady kodu są w repozytorium GitHub autorów i warto je przejrzeć, ale do czytania ten rozdział wnosi najmniej.

Luka, którą dzieli cała dziedzina. Przeszedłem książkę z pytaniem, czy ktoś zapyta o uprawnienia pytającego: czy użytkownik ma prawo zobaczyć to, co system RAG dla niego pobierze. Metadane autoryzacyjne przy chunkach pojawiają się w jednym wyliczeniu w rozdziale 3 i nie wracają; w rozdziale 10 pada jeszcze ogólne zalecenie kontroli dostępu, logowania audytowego i punktów akceptacji przez człowieka dla użytkowników i agentów — bez przełożenia na retrieval. „Trustworthy Generation" dotyczy wiarygodności treści, prywatność w rozdziale 9 to nieujawnianie danych osobowych, a zaufanie w rozdziale 7 to uprawnienia agenta, nie użytkownika. To raczej opis stanu dziedziny w 2025 roku niż wada tej konkretnej książki — ale jeśli budujesz RAG na dokumentach z różnymi poziomami dostępu, konkretnego rozwiązania tu nie znajdziesz.

Motyw, którego autorzy nie nazwali​

Czytając rozdziały 2, 7 i 9 obok siebie, zauważyłem, że najskuteczniejsze wzorce obniżania ryzyka robią ten sam ruch: przesuwają niedeterminizm poza moment, w którym błąd kosztuje.

  • Grammar (P2) nie dopuszcza błędnego tokenu, zamiast go potem wycinać.
  • Template Generation (P29) generuje szablony offline, gdzie da się je przejrzeć, a w czasie działania zostaje deterministyczne podstawienie tekstu.
  • Assembled Reformat (P30) zostawia modelowi tylko przeformułowanie faktów zebranych innymi metodami.
  • Obrony przed prompt injection z rozdziału 7 dają uprawnienia do działania temu komponentowi, który nie czyta niezaufanych danych.

Model zostaje w systemie, ale nie w chwili, w której decyduje się szkoda. To jest, moim zdaniem, najogólniejsza lekcja tej książki i mocniejsza niż którykolwiek z 32 wzorców osobno.

Ocena​

4/5. Nie za katalog, tylko za kryteria wyboru i uczciwość wobec własnych ograniczeń. Do rozdziałów 1, 5, 6 i 7 będę wracał; rozdziałów 8 i 10 drugi raz nie otworzę. Dla kogo: dla kogoś, kto ma już za sobą pierwszy prototyp na LLM i zderzył się z tym, że działa w demo, a nie działa w produkcji. Na pierwszą styczność z LLM-ami to za dużo naraz.

Mapa serii​

Kolejne wpisy rozbierają wzorce grupami, w stałym schemacie: problem, rozwiązanie, kiedy nie używać, moja ocena trwałości i — jeśli istnieje — starszy krewny wzorca spoza świata AI.

#WpisWzorce
0Recenzja i mapa serii (ten wpis)—
1aTwarde ograniczanie wyjścia modeluP1–P2
1bStyl i optymalizacja treściP3–P5
2RAG: fundamentyP6–P8
3RAG: wyszukiwanie i zaufanieP9–P12
4Rozszerzanie zdolności modeluP13–P16
5NiezawodnośćP17–P20
6Agenci i narzędziaP21–P23
7Koszt, latencja, pamięćP24–P28
8ZabezpieczeniaP29–P32
9Kompozycja wzorców i podsumowanierozdz. 10

Linki pojawią się tu w miarę publikacji. Na tym blogu są już wpisy blisko związane z częścią tych wzorców: o chunkowaniu strukturalnym w RAG, o OWASP Top 10 dla MCP i o rozdzieleniu pętli agenta od wykonania narzędzi w Managed Agents.