Artykuł 9 z serii Anatomia Agenta AI ← Ile kosztuje agent w produkcji
Tradycyjny software jest deterministyczny. Wywołujesz funkcję z inputem X, dostajesz output Y. Zawsze. Test który przeszedł dziś przejdzie jutro jeśli kod się nie zmienił.
Agent AI nie jest deterministyczny. Ten sam input może dać inne odpowiedzi w różnych uruchomieniach. Model zaktualizowany przez providera zmienia zachowanie bez Twojej wiedzy. System prompt który działał doskonale z Claude Sonnet 4.5 może zachowywać się inaczej z Claude Sonnet 4.6.
Jak testujesz coś co jest z natury niedeterministyczne? Jak wiesz że zmiana system promptu poprawiła agenta zamiast go pogorszyć? Jak blokujesz deployment który obniżył jakość?
To jest problem ewaluacji agentów. I ma rozwiązania — tyle że inne niż klasyczne unit testy.
Dlaczego „działa” to za mało
Najczęstszy błąd przy budowaniu agentów: testowanie przez użytkowanie. Budujesz, rozmawiasz z agentem, widzisz że „działa”, wdrażasz.
Problem 1: testujesz happy path. Pytasz o rzeczy które wiesz że agent powinien obsłużyć. Użytkownicy produkcyjni zadają pytania których nie przewidziałeś.
Problem 2: „działa” jest binarne, jakość jest ciągła. Agent który „działa” ale daje odpowiedzi przeciętnej jakości, zbyt ostrożnie eskaluje lub regularnie popełnia subtelne błędy — to nie jest dobry agent.
Problem 3: zmiany regresują jakość. Zmieniasz system prompt żeby poprawić obsługę jednego scenariusza, niechcący pogarszasz inny. Bez ewaluacji nie wiesz o tym dopóki użytkownik nie zgłosi problemu.
Ewaluacja to systematyczne odpowiedź na pytanie: o ile dobrze agent robi swoje zadanie? Nie tak/nie — na ile.
Cztery metryki które mają znaczenie
1. Task completion rate
Czy agent ukończył zadanie które miał wykonać?
Proste do zdefiniowania, trudne do mierzenia precyzyjnie. „Ukończył” to często kwestia oceny — czy odpowiedź na pytanie o status zamówienia „ukończyła” zadanie jeśli podała status ale nie tracking number?
Definicja sukcesu musi być explicite w zestawie testowym: dla każdego testu definiujesz co oznacza „ukończone”.
2. Tool call accuracy
Czy agent wywołał właściwe narzędzia z właściwymi parametrami?
To jest ważniejsza metryka niż task completion dla agentów operacyjnych.
Przykład: agent ma sprawdzić status zamówienia #12345. Wywołuje get_order_status(order_id="12345") — dobrze. Wywołuje cancel_order(order_id="12345") — task completion może wyglądać jak sukces (zwrócił jakiś wynik) ale tool call accuracy = 0. Agent zrobił coś zupełnie innego niż powinien.
Mierzenie: w zestawie testowym zapisujesz jakie narzędzia agent powinien wywołać. Porównujesz z tym co faktycznie wywołał.
3. Response faithfulness
Czy odpowiedź agenta jest zgodna ze źródłami z których korzystał?
Agent RAG który twierdzi że „cena produktu X to 399 zł” gdy w bazie jest 499 zł — nie jest ani pomocny, ani nie można powiedzieć że działa jak założono. Agent który cytuje warunki gwarancji inaczej niż są w dokumencie, tak samo — nie jest „faithful”.
Faithfulness mierzy czy agent halucynuje fakty z kontekstu którego ma dostęp. Różni się od „agent mówi prawdę” — agent może mówić coś prawdziwego ale nieopartego na dostarczonych danych.
4. Conversation efficiency
Ile kroków, wywołań narzędzi i tokenów agent potrzebował?
Agent który rozwiązuje zadanie w 3 krokach jest lepszy niż ten który potrzebuje 9 — przy porównywalnej jakości. Efficiency jest proxy dla kosztów i dla jakości rozumowania. Agent który „krąży” w pętli zamiast zmierzać do celu ma niską efficiency i prawdopodobnie słabszy system prompt.
Budowanie zestawu testowego
Minimalny zestaw testowy dla agenta produkcyjnego: 20-30 przykładów pokrywających:
- 40%: typowe przypadki (to co użytkownicy pytają najczęściej)
- 30%: edge cases (pytania na granicy zakresu, niejednoznaczne, niekompletne)
- 20%: przypadki błędów (co agent robi gdy narzędzie zwraca błąd, gdy dane są niekompletne)
- 10%: adversarial (próby prompt injection, pytania poza zakresem, „zapomnij instrukcje”)
Format każdego testu:
{
"id": "test_001",
"input": "Gdzie jest moje zamówienie #45678?",
"expected_tools": ["get_order_status"],
"expected_tool_params": {"order_id": "45678"},
"success_criteria": "Odpowiedź zawiera status zamówienia i datę dostawy",
"should_not_contain": ["cancel_order", "delete", "refund"],
"category": "typical"
}
Kluczowe: zestaw testowy jest żywy — rośnie gdy odkrywasz nowe edge cases w produkcji. Każdy incydent to kandydat na nowy test.
LLM-as-judge — model ocenia model
Niektóre kryteria jakości są subiektywne: czy odpowiedź jest pomocna? Czy ton jest właściwy? Czy wyjaśnienie jest jasne?
Ręczna ocena wszystkich odpowiedzi nie skaluje się. Rozwiązanie: użyj drugiego modelu AI jako sędziego.
def llm_judge(question: str, answer: str, criteria: str) -> dict:
prompt = f"""
Oceń poniższą odpowiedź asystenta według kryterium: {criteria}
Pytanie użytkownika: {question}
Odpowiedź asystenta: {answer}
Oceń na skali 1-5 gdzie:
1 = Całkowicie nie spełnia kryterium
3 = Częściowo spełnia kryterium
5 = W pełni spełnia kryterium
Zwróć JSON: {{"score": X, "reasoning": "krótkie uzasadnienie"}}
Zwróć TYLKO JSON, bez dodatkowego tekstu.
"""
response = call_model(prompt) # tani model np. Haiku
return json.loads(response)
# Użycie
result = llm_judge(
question="Czy mogę zwrócić produkt?",
answer="Tak, mają Państwo 30 dni na zwrot...",
criteria="Odpowiedź jest zgodna z polityką firmy i kompletna"
)
# {"score": 4, "reasoning": "Odpowiedź poprawna, brakuje info o stanie produktu"}
Trzy pułapki LLM-as-judge:
Modele preferują swoje własne odpowiedzi. Jeśli judge to Claude i agenta to Claude — oceny mogą być zawyżone. Używaj innego modelu jako sędziego niż model agenta.
Długie odpowiedzi dostają wyższe oceny nawet gdy jakość jest gorsza. Sprawdź czy Twój judge nie premiuje gadatliwości — dodaj explicite „zwięzłość jest wartością” do prompt sędziego.
Judge nie zastępuje prawdy. LLM-as-judge to przybliżenie ludzkiej oceny, nie jej substytut. Dla krytycznych przypadków — ręczna review przez człowieka jest niezastąpiona.
Hallucination detection przed nieodwracalnymi akcjami
Hallucination detection ma największą wartość tam gdzie błąd jest kosztowny — przed akcjami których nie można cofnąć.
Agent który analizuje dane i na ich podstawie inicjuje przelew. Agent który tworzy dokument prawny na podstawie wymagań klienta. Agent który wysyła komunikat do wszystkich klientów.
Przed taką akcją warto sprawdzić: czy fakty w odpowiedzi agenta mają oparcie w danych które agent miał dostępne?
Prosty groundedness check:
def check_groundedness(agent_answer: str, source_documents: list[str]) -> dict:
sources_text = "\n---\n".join(source_documents)
prompt = f"""
Poniżej jest odpowiedź asystenta i dokumenty źródłowe.
Sprawdź czy każde twierdzenie w odpowiedzi ma oparcie w dokumentach.
ODPOWIEDŹ ASYSTENTA:
{agent_answer}
DOKUMENTY ŹRÓDŁOWE:
{sources_text}
Oceń groundedness (0.0-1.0) i wymień twierdzenia bez oparcia w źródłach.
Zwróć JSON: {{"score": 0.X, "unsupported_claims": ["..."]}}
"""
return json.loads(call_model(prompt))
# Użycie w pipeline agenta
result = check_groundedness(agent_answer, retrieved_docs)
if result["score"] < 0.8:
# Nie wykonuj akcji — human-in-the-loop
flag_for_review(agent_answer, result["unsupported_claims"])
else:
# Bezpiecznie wykonaj akcję
execute_action(agent_answer)
Wartość progu (0.8) zależy od kontekstu — dla transakcji finansowych wyższy, dla odpowiedzi informacyjnych niższy.
CI/CD dla agentów — automatyczne testy przed deploymentem
Każda zmiana agenta (nowy system prompt, zmiana modelu, nowe narzędzie) powinna przejść przez ewaluację zanim trafi do produkcji.
Prosty pipeline w GitHub Actions:
name: Agent Evaluation
on:
pull_request:
paths:
- 'agent/system_prompt.txt'
- 'agent/config.py'
- 'agent/tools/**'
jobs:
evaluate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run evaluation suite
run: python evaluate.py --test-set tests/agent_tests.json
- name: Check quality gates
run: |
python check_gates.py \
--task-completion 0.90 \
--tool-accuracy 0.95 \
--faithfulness 0.85
check_gates.py porównuje wyniki ewaluacji z progami i zwraca exit code 1 (blokuje merge) jeśli którykolwiek próg nie jest osiągnięty.
Trzy progi których warto pilnować:
- Task completion ≥ 90% — agent kończy zadania
- Tool call accuracy ≥ 95% — agent wywołuje właściwe narzędzia
- Faithfulness ≥ 85% — agent nie halucynuje z dostępnego kontekstu
Progi są parametrami — ustalasz je na podstawie baseline’u Twojego agenta, nie arbitralnie.
Pętla doskonalenia
Ewaluacja nie jest jednorazowa. Jest pętlą:
- Uruchom ewaluację na aktualnej wersji — masz baseline
- Zidentyfikuj najsłabsze kategorie — gdzie agent najczęściej zawodzi
- Zmień system prompt lub konfigurację pod kątem tych kategorii
- Uruchom ewaluację ponownie — czy poprawa nastąpiła bez regresji w innych kategoriach
- Wdróż jeśli wyniki lepsze — i zaktualizuj baseline
Ta pętla działa też w produkcji: logi konwersacji gdzie użytkownicy eskalowali lub wyrażali niezadowolenie są kandydatami do zestawu testowego. Każdy rzeczywisty incydent zasługuje na własny test który zapobiegnie jego powtórzeniu.
W ostatnim artykule serii: dziesięć artykułów, dziesięć warstw. Checklista agent-ready — co zrobić żeby Twoja strona i Twój agent były gotowe na to co nadchodzi.
Pojęcia ze słownika: Agent ewaluacja · Hallucination detection · Agent observability · Human-in-the-loop · Tool use · Chain-of-thought









![Artykuł 2 z serii "Agenci AI — od konceptu do produkcji" ← RAG, Agent AI, Agentic RAG — czym się różnią Poprzedni artykuł tej serii skończył się na rozróżnieniu: RAG odpowiada na pytanie, agent realizuje cel. Ale to rodzi pytanie które każdy kto buduje agenta zadaje sobie prędzej czy później: jak właściwie agent decyduje co zrobić dalej? Między "dostałem zadanie" a "zadanie wykonane" jest czarna skrzynka. Dla chatbota ta czarna skrzynka jest prosta — jeden prompt, jedna odpowiedź. Dla agenta to sekwencja decyzji, wywołań narzędzi i ocen wyniku która może trwać sekundy albo godziny. Żeby budować agentów świadomie — a nie przez próby i błędy — trzeba zrozumieć co jest w środku tej czarnej skrzynki. Pętla która napędza każdego agenta Zacznijmy od analogii. Wyobraź sobie że dostajesz zadanie: "Zarezerwuj mi hotel w Krakowie na weekend 14-15 czerwca, do 400 zł za noc, blisko centrum." Jak to robisz? Nie jednym ruchem. Najpierw szukasz opcji. Sprawdzasz ceny. Czytasz opinie. Może jedno miejsce ma dobry rating ale jest za drogie — odrzucasz. Drugie pasuje, ale patrzysz jeszcze na lokalizację. Potwierdzasz. Rezerwujesz. To jest pętla: obserwujesz → planujesz → działasz → oceniasz wynik → wracasz do początku. Agent AI działa identycznie. Każde wieloetapowe zadanie jest realizowane przez powtarzający się cykl czterech kroków — i ten cykl ma swoją nazwę: agent loop. Cztery kroki pętli Percepcja — agent patrzy na stan: co jest w oknie kontekstu, jakie były wyniki poprzednich akcji, co zwróciło ostatnie narzędzie, jaki jest cel. Planowanie — na podstawie tego co widzi, agent decyduje co zrobić dalej. To jest moment decyzji: czy cel jest osiągnięty? Jeśli nie — jaka akcja przybliży mnie do celu? Jakie narzędzie wywołać? Akcja — agent wykonuje to co zaplanował. Wywołuje narzędzie MCP, odpytuje bazę danych, robi request HTTP, pisze plik. Ocena — agent patrzy na wynik akcji. Czy to działało? Co teraz wiem więcej? Co jest następnym krokiem? Czy napotkałem błąd który wymaga innej strategii? I z powrotem do percepcji. Pętla kręci się dopóki agent nie osiągnie celu, nie napotka przeszkody której nie może pokonać, albo — i to jest ważne — nie przekroczy limitu iteracji. Limit iteracji jest krytyczny Agent bez limitu może kręcić się w pętli nieskończenie. Narzędzie zwraca błąd, agent próbuje jeszcze raz, i jeszcze raz, i jeszcze raz. Minuty zamieniają się w godziny. Tokeny i koszty rosną. Każdy agent produkcyjny musi mieć limit kroków po którym zatrzymuje się i raportuje do człowieka: "doszedłem do limitu X iteracji, oto co udało mi się ustalić, oto gdzie utknąłem." To jest pierwsza zasada którą ignoruje większość ludzi budujących swojego pierwszego agenta. ReAct — jak agent myśli zanim działa Teraz wiemy że agent kręci się w pętli. Ale co dokładnie dzieje się w kroku "planowanie"? Jak agent decyduje co zrobić? W 2022 roku badacze z Princeton i Google zaproponowali wzorzec który zmienił sposób budowania agentów: ReAct (Reasoning + Acting). Pomysł jest prosty do bólu: zanim agent wykona akcję, niech najpierw "powie na głos" co myśli. Generuje explicite reasoning — widoczny łańcuch myślenia — a potem na jego podstawie podejmuje decyzję o akcji. Wygląda to tak: Thought: Użytkownik chce hotelu w Krakowie na 14-15 czerwca do 400 zł. Powinienem najpierw sprawdzić dostępność. Action: search_hotels(city="Kraków", checkin="2026-06-14", checkout="2026-06-15", max_price=400) Observation: [3 wyniki: Hotel A — 380 zł, Hotel B — 350 zł, Hotel C — 420 zł] Thought: Hotel C jest za drogi. Hotel A i B mieszczą się w budżecie. Sprawdzam odległość od centrum. Action: get_location(hotel_id="hotel_A") Observation: 800m od Rynku Głównego Thought: 800m to blisko centrum. Hotel A kosztuje 380 zł i jest blisko. Rezerwuję. Action: book_hotel(hotel_id="hotel_A", dates=["2026-06-14"]) Trzy zalety ReAct które robią różnicę w praktyce: Debugging jest możliwy. Widzisz dokładnie skąd pochodzi każda decyzja agenta. Jeśli coś poszło nie tak — możesz śledzić rozumowanie krok po kroku i znaleźć moment gdzie agent zboczył z kursu. Narzędzia są wywoływane trafniej. Agent który "przemyśli" co wywołać zanim to zrobi, robi mniej błędnych wywołań niż agent który po prostu reaguje na ostatni wynik. Agent może się korygować. Reasoning jest widoczny — i agent może sam zauważyć że jego poprzedni krok był błędny, zanim podejmie kolejny. Chain-of-Thought — "myślmy krok po kroku" ReAct to wzorzec na poziomie architektury agenta. Chain-of-thought (CoT) to technika na poziomie promptowania modelu. Idea: zamiast prosić model o bezpośrednią odpowiedź, zachęć go żeby najpierw pokazał swoje obliczenia. Jak matematyk który nie podaje samego wyniku, ale zapisuje wszystkie kroki. Najprostszy możliwy CoT to dosłownie jedno zdanie dodane do promptu: "Myślmy krok po kroku." Brzmi banalnie. Ale działa — szczególnie przy zadaniach wieloetapowych, matematycznych i logicznych. Bardziej zaawansowany CoT to few-shot: dostarczasz modelowi przykłady pytanie + rozumowanie + odpowiedź, i model uczy się wzorca. Dla agentów operujących w specyficznej domenie — powiedzmy agent analizujący umowy prawne — few-shot CoT z przykładami z tej domeny jest jednym z najskuteczniejszych sposobów poprawy jakości. Extended thinking — CoT wbudowany w model Claude 3.7+ i kilka innych modeli poszło dalej: extended thinking jest wbudowane bezpośrednio w model, bez potrzeby specjalnego promptowania. Model generuje wewnętrzny długi łańcuch myślenia przed odpowiedzią — niewidoczny dla użytkownika (lub opcjonalnie widoczny). Efekt: znacząco lepsza jakość przy złożonych, wieloetapowych zadaniach — za cenę wyższej latencji i więcej tokenów. Dla agentów wykonujących skomplikowane analizy gdzie czas odpowiedzi jest mniej ważny niż poprawność — extended thinking jest naturalnym wyborem. Przykład który łączy wszystko: agent rezerwujący hotel Wróćmy do zadania: "Zarezerwuj hotel w Krakowie na 14-15 czerwca." Chatbot dostałby to pytanie i wygenerował listę hoteli z opisem. Odpowiedź tekstowa. Nic nie zarezerwował. Agent z agent loop, ReAct i dostępem do narzędzi wykonuje to zadanie od początku do końca: Iteracja 1: Percepcja → cel jasny, narzędzia dostępne. Planowanie → wywołaj search_hotels. Akcja → [wywołanie]. Ocena → 3 wyniki, Hotel C za drogi. Iteracja 2: Percepcja → mam 2 kandydatów. Planowanie → sprawdź lokalizację. Akcja → [wywołanie]. Ocena → Hotel A blisko centrum, Hotel B dalej. Iteracja 3: Percepcja → Hotel A: 380 zł, 800m od centrum. Spełnia wszystkie kryteria. Planowanie → rezerwuj. Akcja → [wywołanie book_hotel]. Ocena → rezerwacja potwierdzona, numer #KRK2026-0891. Wynik: "Zarezerwowałem Hotel A na 14-15 czerwca, 380 zł, 800m od Rynku Głównego. Numer rezerwacji: #KRK2026-0891." Trzy iteracje pętli. Trzy wywołania narzędzi. Jedno wykonane zadanie. Co to zmienia dla kogoś kto buduje agenta Zrozumienie agent loop, ReAct i CoT nie jest teorią akademicką — bezpośrednio wpływa na to jak projektujesz agenta. Agent loop mówi ci: musisz zdefiniować kryterium sukcesu (jak agent wie że skończył?), ustawić limit iteracji (co gdy agent utknął?), i zdecydować gdzie wstawić human-in-the-loop (które akcje wymagają potwierdzenia człowieka przed wykonaniem?). ReAct mówi ci: daj modelowi miejsce na reasoning zanim podejmie akcję. Nie optymalizuj prompta do minimum — reasoning kosztuje tokeny, ale zmniejsza błędy narzędziowe i ułatwia debugging gdy coś pójdzie nie tak. CoT mówi ci: przy złożonych zadaniach "myślmy krok po kroku" to nie magia — to zmiana trybu pracy modelu. Dla zadań domenowych few-shot CoT z przykładami z Twojej domeny jest wart inwestycji. W następnym artykule: agent myśli i działa — ale co pamięta? Jak działa pamięć agenta między krokami, między sesjami i między zadaniami — i dlaczego zły design pamięci jest jednym z najczęstszych błędów przy budowaniu agentów produkcyjnych. Pojęcia ze słownika: Agent loop · Chain-of-thought · Reasoning model · Tool use · Human-in-the-loop · Agent AI](https://webflux.pl/wp-content/uploads/2026/06/agent_mysli.webp)

