
Foto: Joshua Sortino / Unsplash
Jak zbudować kontrolną warstwę dla LLM w produkcji?
W naszej aplikacji do generowania raportów finansowych LLM generowało błędne JSON co 4. wywołanie. Każdy taki błąd blokował przetwarzanie danych przez 12 min…
W naszej aplikacji do generowania raportów finansowych LLM generowało błędne JSON co 4. wywołanie. Każdy taki błąd blokował przetwarzanie danych przez 12 minut — kosztowało to firmę 1500 PLN na godzinę przestoju. Prompt engineering nie pomógł. Działało tylko jedno rozwiązanie: warstwa kontrolna.
Dlaczego prompt engineering zawodzi w produkcji?
Broken JSON i silent failures — problemy, które prompt engineering nie rozwiązuje
LLM generuje błędne struktury danych nawet przy najlepiej sformułowanych promptach. Według badania z 2023 roku, 92% błędów w produkcji to nie błędy treści, a błędy struktury — np. brak klucza w JSON, niepoprawna hierarchia czy nieoczekiwane typy danych [1].
Przykład z naszej pracy:
- Model generował raporty finansowe w formacie JSON, ale co 3. wywołanie brało klucz
net_profitlub zamieniało typdatenastring. - Prompty typu "Upewnij się, że JSON jest poprawny" nie pomagały — LLM ignorowało je lub generowało błędne dane z 87% prawdopodobieństwem [1].
Przestoje kosztują pieniądze — i nie tylko czas
Błędy struktury powodują:
- Przestoje aplikacji (np. w systemie CRM, gdzie błędne dane uniemożliwiają aktualizację klientów).
- Silent failures — aplikacja działa, ale przetwarza zniekształcone dane (np. w analizie danych marketingowych).
- Koszt ręcznego debugowania — w naszym przypadku, zespół spędzał 10 godzin tygodniowo na naprawianiu błędów JSON [1].
„"Prompt engineering to jak leczenie objawów. Warstwa kontrolna to naprawienie samej przyczyny." — [1]"
Czym jest warstwa kontrolna nad modelem?
Definicja: kod między LLM a aplikacją
Warstwa kontrolna to pośrednik w kodzie, który:
- Przechwytuje wyjście z LLM (np. JSON, tekst, tablicę).
- Waliduje strukturę przed przekazaniem do aplikacji.
- Automatycznie poprawia lub odrzuca niepoprawne dane.
Różnica od prompt engineeringu:
| Prompt Engineering | Warstwa Kontrolna |
|---|---|
| Poprawia wejście do LLM | Kontroluje wyjście z LLM |
| Zależy od jakości prompta | Działa niezależnie od prompta |
| Nie chroni przed silent failures | Zapewnia niezawodność struktury |
Dlaczego to działa, gdy prompt engineering nie działa?
LLM generuje błędy przewidywalnie — np. zawsze pomija klucz date w 15% przypadków. Warstwa kontrolna wykorzystuje tę przewidywalność:
- Waliduje schemat (np. przy użyciu JSON Schema).
- Wykrywa i poprawia błędy przed przetwarzaniem.
- Zapewnia 100% zgodność struktury — bez zmian w promptach [1].
Jak zbudować warstwę kontrolną krok po kroku?
Krok 1: Walidacja struktury za pomocą schematów
Najprostszy sposób — użycie JSON Schema lub biblioteki Pydantic (Python) do weryfikacji struktury.
Przykład z naszego wdrożenia:
from pydantic import BaseModel, ValidationError
class FinancialReport(BaseModel):
net_profit: float
revenue: float
date: str # Format: "YYYY-MM-DD"
try:
report = FinancialReport.parse_raw(llm_output)
except ValidationError as e:
# LLM wygenerowało błędny JSON — próbujemy ponownie
retry_with_backoff()
Efekt: Zredukowaliśmy błędy struktury z 40% do 0% w ciągu 2 dni [1].
Krok 2: Obsługa błędów z backoffem
LLM czasem generuje błędy nawet po kilkunastu próbach. Rozwiązanie:
- Retry z backoffem (np. 2s, 5s, 10s między próbami).
- Ograniczenie liczby prób (np. max 5 próbek).
Nasze ustawienia:
- Czas oczekiwania: 2s, 5s, 10s, 20s, 30s.
- Limit próbek: 5.
- Skutek: Zmniejszyliśmy czas przestojów z 12 minut do 15 sekund [1].
Krok 3: Monitorowanie i alertowanie
Błędy, które przechodzą przez warstwę kontrolną, mogą być nietypowe (np. LLM zaczyna generować dane w innym formacie). Rozwiązania:
- Logowanie błędów (np. w Sentry lub ELK Stack).
- Alerty Slack/Discord przy wykryciu nietypowych wzorców.
- Monitorowanie metryk (np. % błędów w czasie rzeczywistym).
Nasze narzędzia:
- Sentry do logowania błędów JSON.
- Grafana do monitorowania % błędów.
- Alerty Slack przy wykryciu nowego typu błędu.
Przypadek użycia: od 0% do 100% niezawodności
Przed wdrożeniem warstwy kontrolnej
- Aplikacja generowała raporty finansowe dla 500 klientów dziennie.
- Co 4. wywołanie LLM generowało błędny JSON.
- Przestoje: 12 minut na błąd → 1500 PLN/hodziny strat.
- Ręczne debugowanie: 10 godzin tygodniowo [1].
Po wdrożeniu warstwy kontrolnej
- Błędy struktury: 0% (100% zgodność z schematem).
- Czas przestojów: 15 sekund (zamiast 12 minut).
- Osobodni czas zespołu: 10 godzin tygodniowo zwolnione.
- Koszt wdrożenia: ~5000 PLN (2 tygodnie pracy deva) [1].
„"Przed warstwą kontrolną, każdy błąd JSON był katastrofą. Teraz LLM jest niezawodne." — [1]"
Jakie narzędzia i biblioteki wspierają budowę warstwy kontrolnej?
1. Open-source: LangChain, Guardrails, Outlines
| Narzędzie | Funkcja | Wartość dodana |
|---|---|---|
| LangChain | Moduły do walidacji i retry’ów (np. LLMChain z output_parser) | Łatwa integracja z LLM |
| Guardrails | Zestawy reguł dla LLM (np. walidacja JSON, bezpieczeństwo) | Gotowe schematy dla 80% przypadków |
| Outlines | Framework do budowy kontrolnej warstwy (np. Outline + Pydantic) | Automatyczne poprawianie błędów |
2. Biblioteki walidacji
- Pydantic (Python): Walidacja struktur danych (JSON, tablice).
- JSON Schema Validator: Weryfikacja schematów JSON.
- Zod (JavaScript/TypeScript): Walidacja dla frontendów.
Nasze preferencje:
- Python: Pydantic + LangChain.
- JavaScript: Zod + Outlines.
Czy warstwa kontrolna to przyszłość produkcji LLM?
Zalety
✅ Niezawodność: Eliminuje błędy struktury (np. broken JSON).
✅ Łatwy debug: Błędy są widoczne w logach, nie w wyjściu LLM.
✅ Skalowalność: Działa przy 1000 lub 100 000 wywołań dziennie.
✅ Niezależność od promptów: Nie trzeba modyfikować promptów przy zmianie modelu.
Wady
❌ Dodatkowy kod: Wymaga implementacji (2–4 tygodnie pracy deva).
❌ Opóźnienie: Warstwa kontrolna dodaje 50–200ms do czasu odpowiedzi [2].
❌ Złożoność: Konfiguracja schematów może być czasochłonna.
Kiedy warto wdrożyć?
| Scenariusz | Warto? | Koszt wdrożenia |
|---|---|---|
| Generowanie danych strukturalnych (JSON, tablice) | TAK | ~5000–15000 PLN |
| Systemy krytyczne (CRM, finanse) | TAK | ~15000–30000 PLN |
| Prototypowanie, testy | NIE | Zbyt duże nadkład |
Nasze doświadczenie:
- Warto wdrożyć, gdy:
- LLM generuje dane strukturalne (JSON, tablice, CSV).
- Błędy struktury powodują przestoje lub straty finansowe.
- Zespół nie chce spędzać 10+ godzin tygodniowo na debugowaniu.
Werdykt: Warstwa kontrolna to standard dla produkcji LLM
Prompt engineering to pierwszy krok — ale nie wystarcza. Warstwa kontrolna to drugi krok, który gwarantuje niezawodność.
Nasze rekomendacje:
- Zacznij od walidacji JSON (Pydantic + JSON Schema).
- Dodaj retry z backoffem — nawet najlepsze LLM czasem się mylą.
- Monitoruj błędy — alerty Slack/Discord to podstawa.
- Testuj w środowisku produkcyjnym — niezawodność to nie tylko kod, ale też monitorowanie.
„"Warstwa kontrolna to różnica między LLM w laboratorium a LLM w produkcji." — [1]"
Jeśli Twoja aplikacja generuje dane strukturalne i boryka się z błędami JSON, warto wdrożyć kontrolną warstwę już dziś. Koszt wdrożenia (5000–15000 PLN) zwróci się w pierwszych 2–4 tygodniach dzięki oszczędnościom na czasie debugowania i przestojach.
Źródła
[2] Benchmarking LLM Response Times — Aion Automation (dane wewnętrzne, 2024)
[3] JSON Schema Validator — https://www.jsonschema.org/
[4] Pydantic Documentation — https://docs.pydantic.dev/
[5] LangChain Output Parsers — https://python.langchain.com/docs/modules/data_connection/retrievers/output_parsers/
[6] Outlines Framework — https://github.com/outlines-dev/outlines