Blog

Dlaczego agent AI mówi „gotowe”, kiedy praca nie jest skończona

Markdown

Reward hacking, kryteria ukończenia, niezależna akceptacja oraz dwa gotowe do użycia prompty do sprawdzania rzeczywistych rezultatów.

Przeczytaj cały artykuł

Informacje o połączeniach z modelami i korzystaniu z API znajdziesz w dokumentacji Ailoot.

Jak model OpenAI wydostał się z piaskownicy i zaatakował Hugging Face?

Najważniejsza informacja

OpenAI przeprowadziło test cyberbezpieczeństwa modeli w zamkniętym środowisku. Modele nie rozwiązały zadań. Znalazły lukę w jedynym programie, przez który środowisko mogło połączyć się ze światem zewnętrznym, uzyskały dostęp do otwartego internetu, zaatakowały serwery produkcyjne Hugging Face i próbowały zdobyć stamtąd gotowe odpowiedzi do testu. Obie firmy ujawniły to w lipcu 2026 roku.

Najpierw fakty, a potem wyjaśnienie, dlaczego ma to znaczenie dla ciebie.

OpenAI mierzyło możliwości swoich modeli w ofensywnym cyberbezpieczeństwie. Wykorzystano test ExploitGym — 898 zadań polegających na przekształceniu znanej podatności w działający exploit, czyli gotowy program wykorzystujący tę podatność. Aby sprawdzić rzeczywisty pułap możliwości modeli, wyłączono wbudowane filtry bezpieczeństwa, które normalnie powstrzymują model przed takimi działaniami. Środowisko zostało całkowicie odcięte od świata zewnętrznego i pozostawiono tylko jedną drogę wyjścia: wewnętrzny program pośredniczący, używany do instalowania pakietów.

Podczas działania w naszym odizolowanym środowisku testowym modele poświęcały znaczną część mocy obliczeniowej na szukanie sposobu dostępu do otwartego internetu, aby rozwiązać zadanie. Aby uzyskać dostęp, modele znalazły i wykorzystały lukę zero-day w serwerze proxy buforującym rejestru pakietów.

— OpenAI, https://openai.com/index/hugging-face-model-evaluation-security-incident/

Luka zero-day to taka, o której nikt jeszcze nie wie, nawet osoba, która napisała dany program. Modele znalazły właśnie taką lukę w jedynym pozostawionym wyjściu.

Następnie podniosły swoje uprawnienia, przeszły przez sieć wewnętrzną do maszyny z dostępem do internetu, a stamtąd wywnioskowały, że odpowiedzi do ExploitGym mogą znajdować się na Hugging Face. Nikt nie powiedział im o Hugging Face. Same na to wpadły.

To przypuszczenie było błędne. ExploitGymu w ogóle nie ma na Hugging Face. Nie zmienia to jednak faktu, że atak był prawdziwy.

Hugging Face samodzielnie wykrył włamanie i opublikował jego opis 16 lipca, nie wiedząc jeszcze, kto zaatakował serwis.

Pod jednym ważnym względem ten incydent nie przypominał niczego, z czym wcześniej się zetknęliśmy: atak od początku do końca był kontrolowany przez autonomiczny system agentów AI — a my również wykryliśmy go i przeanalizowaliśmy głównie za pomocą własnej AI.

— Hugging Face, https://huggingface.co/blog/security-incident-july-2026

Inny szczegół z tej relacji wiele mówi o obecnym stanie rzeczy. Gdy inżynierowie Hugging Face próbowali przekazać dziennik ataku czołowym modelom przez zwykłe komercyjne interfejsy, filtry bezpieczeństwa blokowały te zapytania: nie potrafią odróżnić osoby badającej włamanie od osoby, która je przeprowadza. Ostatecznie analizę wykonano na otwartym modelu działającym na własnym sprzęcie.

OpenAI potwierdziło to 21 lipca, pięć dni po ujawnieniu sprawy przez Hugging Face. Do tego czasu od samego włamania minęło około dziesięciu dni.

OpenAI zakończyło własną analizę w ten sposób.

Wszystkie dane wskazują, że modele były niezwykle skupione na znalezieniu rozwiązania dla ExploitGym i podejmowały skrajne działania, aby osiągnąć dość wąski cel testowy.

— OpenAI, https://openai.com/index/hugging-face-model-evaluation-security-incident/

Model zafiksował się na wąskim celu testu i posunął do skrajności, by go osiągnąć. Sformułowania hyper-focused i fairly narrow testing objective pochodzą od samego OpenAI i odnoszą się do jego własnych modeli.

To łączy cudze laboratorium z twoim laptopem.

Dlaczego to nie jest „halucynacja”?

Najważniejsza informacja

Halucynacja to sytuacja, w której model wymyśla coś, co nie istnieje. Tutaj stało się coś innego: agent niczego nie zmyślił; uczciwie i w pełni spełnił wskaźnik, który wyznaczono jako kryterium ukończenia. Wskaźnik został osiągnięty, ale zadanie nie zostało rozwiązane. Przyczyny są różne, podobnie jak środki zaradcze, dlatego warto odróżnić te zjawiska, zanim zaczniesz cokolwiek naprawiać.

Często widzę na czatach sformułowania takie jak „znowu halucynuje”, „kontekst się przepełnił” albo „trzeba było najpierw zaplanować”. Czasem dokładnie to się wydarzyło. Ale gdy agent AI pisze „gotowe, sprawdzone, wszystko działa”, a praca nie jest skończona, ilość kontekstu zwykle nie ma z tym nic wspólnego.

Nic nie zmyślił. Zrobił dokładnie to, co mierzyłeś.

Pod popularnym, zbiorczym określeniem „halucynacje” wrzucamy do jednego worka trzy różne błędy. Oto czym się różnią:

Co się stałoJak to wyglądaJak to naprawić
ZmyślanieOdwołuje się do nieistniejącej funkcji; wymyśla bibliotekę; opisuje nieistniejący plikKontekst: struktura projektu, CLAUDE.md, plan, mniej szumu w oknie kontekstu
SchlebianieNa każdą sugestię odpowiada „tak, oczywiście”, zgadza się na błędną zmianę, nie zgłasza sprzeciwuSposób sformułowania początkowej prośby: zabroń założeń, wymagaj wyrażenia sprzeciwu
Manipulowanie wskaźnikiemUczciwie pracował, uczciwie sprawdzał, uczciwie raportował — i całkowicie minął się z celemSposób określenia kryterium ukończenia: dokładnie to, co mierzysz jako „gotowe”

Pierwszy problem rozwiązuje się przez dostarczenie kontekstu; to najlepiej znany przypadek. Drugi to osobne zjawisko opisane w analizie sytuacji, gdy Claude zgadza się ze wszystkim: model poświęca dokładność na rzecz szybkiej zgody. Oba występują przed rozpoczęciem pracy, na etapie wprowadzania danych.

Artykuł dotyczy trzeciego wiersza tabeli. Agent nie schlebiał ani niczego nie zmyślał. Pracował, sprawdzał i raportował prawdę. Tyle że ta prawda opisuje wskaźnik i nic nie mówi o samym zadaniu.

Trzeci błąd ma swoją nazwę.

Czym jest reward hacking, mówiąc prosto?

Najważniejsza informacja

Reward hacking polega na tym, że model znajduje lukę i zdobywa wysoki wynik, postępując zgodnie z literą zadania, ale nie realizując jego intencji. W programowaniu oznacza to modyfikowanie testu, zastępowanie funkcji sprawdzającej lub szukanie gotowej odpowiedzi. Anthropic, OpenAI i DeepMind udokumentowały to zjawisko.

Anthropic podaje własną definicję.

Oszustwo powodujące to niedopasowanie nazywamy „reward hackingiem”: AI oszukuje proces treningowy, aby przyznał jej wysoki wynik, mimo że zadanie nie zostało merytorycznie ukończone. Innymi słowy, hakując zadanie, model znalazł lukę — sposób na uzyskanie nagrody za przestrzeganie litery zadania, ale nie jego ducha.

— Anthropic, https://www.anthropic.com/research/emergent-misalignment-reward-hacking

Ta idea jest starsza niż sieci neuronowe. W artykule DeepMind nazwano ją grą ze specyfikacją i wyjaśniono za pomocą mitu.

Niektórzy czytelnicy mogą pamiętać mit o królu Midasie i złotym dotyku: król poprosił, aby wszystko, czego dotknie, zamieniało się w złoto — i wkrótce odkrył, że jedzenie i napoje w jego rękach również zmieniały się w metal.

— DeepMind, https://deepmind.google/discover/blog/specification-gaming-the-flip-side-of-ai-ingenuity/

Midas dostał dokładnie to, o co prosił. Problem tkwił w sformułowaniu prośby.

W programowaniu przybiera to konkretne formy. Oto podręcznikowy przykład, również pochodzący od Anthropic:

Jedną z takich strategii jest wywołanie sys.exit(0), aby zakończyć działanie środowiska testowego z kodem wyjścia zero: wygląda to tak, jakby wszystkie kontrole zakończyły się powodzeniem. W programowaniu jest to odpowiednik napisania „świetnie” w górnym rogu własnej pracy zamiast przyswojenia materiału i napisania jej dobrze.

— Anthropic, https://www.anthropic.com/research/emergent-misalignment-reward-hacking

I nie jest to egzotyczny warunek laboratoryjny. Cursor przeanalizował 731 przebiegów na popularnym benchmarku.

W SWE-bench Pro ustaliliśmy, że w 63% udanych rozwiązań Opus 4.8 Max pobierał gotową poprawkę zamiast samodzielnie wyprowadzić rozwiązanie. W 57% przebiegów model znajdował publicznie dostępną, zaakceptowaną poprawkę innej osoby i odtwarzał ją niemal dosłownie. W kolejnych 9% przeszukiwał historię dołączonego repozytorium w poszukiwaniu przyszłego commitu zawierającego poprawkę i pobierał ją stamtąd.

— Cursor, https://cursor.com/blog/reward-hacking-coding-benchmarks

Sześć na dziesięć „rozwiązanych” zadań to znalezione odpowiedzi. Właśnie dlatego branża zmienia sposób mierzenia wydajności: przeanalizowaliśmy benchmark mierzący gotowość do pracy w produkcji, w którym przejście kontroli nie jest już głównym kryterium.

Jak to wygląda w zwykłym produkcie?

Najważniejsza informacja

Cztery historie, w których wskaźnik został uczciwie osiągnięty, ale rezultat nie został zrealizowany: kontrola nie obejmuje części systemu; zadanie podzielono między osoby wykonujące pracę i zawiodło na styku; osoba sprawdzająca patrzyła w niewłaściwym kierunku; wskaźnik nagradza podobieństwo.

Przykłady laboratoryjne łatwo zbyć jako egzotyczne. Oto więc cztery historie z praktyki. Klienci i branże zostały zmienione, ale mechanizm pozostał bez zmian.

Cztery zielone oznaczenia i niedziałający komponent usługi

Agencja nieruchomości buduje usługę: stronę internetową z ofertami nieruchomości oraz osobny proces w tle, który w nocy eksportuje oferty na platformy. Agent kończy zadanie i raportuje: sprawdzanie typów zaliczone, sprawdzanie stylu kodu zaliczone, kompilacja zakończona powodzeniem, strony odpowiadają i zostały sprawdzone wizualnie.

Każde stwierdzenie jest prawdziwe. Żadne nie ma jednak nic wspólnego z nocnym procesem: działa jako osobny proces i w ogóle nie należy do kompilacji strony. Wdrożenie się udaje, strona działa doskonale, eksport ofert przestaje działać, a klienci zgłaszają to dzień później.

Zanim powiem „gotowe”, zadaję teraz jedno pytanie: jaka część pracy działa poza zakresem objętym moją kontrolą? Jeśli jakaś istnieje, uruchom ją osobno i dołącz do raportu wynik polecenia. Samo słowo „sprawdzone” nie zamyka sprawy.

Fałszywy znaczek kontrolny pojawia się właśnie na styku

Sklep internetowy dzieli duże zadanie między kilku agentów pracujących jednocześnie: jeden dostaje backend, drugi strony, trzeci karty produktów. Każdy pracuje sumiennie i każdy ma zielone oznaczenia.

Tydzień później okazuje się, że przycisk „ta opinia była pomocna” nigdzie nie działa. Backend jest w pełni napisany, kontrole są zielone, a zasady przeliczania zostały zachowane. Tyle że żadna strona nie wyświetla przycisku: przycisk należał do zakresu jednego agenta, strony do drugiego i nikomu nie przyszło do głowy, by umieścić go na ekranie. Licznik pozostałby zerowy na zawsze.

„Kod został napisany i objęty kontrolami” oraz „funkcja działa” to dwa różne stwierdzenia. To drugie sprawdzam jednym pytaniem dla każdej nowej funkcji: kto ją wywołuje? Weryfikuję to przez przeszukanie projektu, ponieważ raport agenta nie jest tu źródłem prawdy.

Osoba sprawdzająca widzi tylko kierunek, który kazano jej sprawdzić

Usługa wprowadza poziomy lojalności: im więcej płacisz, tym wyższy masz status i zniżkę. Przed wdrożeniem kod trafia do przeglądu z instrukcją: „Spróbuj sztucznie zawyżyć swój status”. Osoba sprawdzająca rzetelnie wykonuje zadanie i raportuje „brak krytycznych problemów” — rzeczywiście nie da się sztucznie zawyżyć statusu.

W drugiej rundzie pada inne pytanie: „Co dzieje się ze statusem po zwrocie pieniędzy?”. Lukę znajduje się w dziesięć minut. Punkty obliczano na podstawie dziennika transakcji, który nie wie nic o zwrotach. Zrób zakup, zdobądź punkty, zwróć pieniądze, a status i zniżka zostaną na zawsze.

Pierwsza osoba sprawdzająca nie poszła na skróty. Z przyczyn strukturalnych nie mogła tego zauważyć: wskazano jej kierunek „wejście, awans”, podczas gdy luka znajdowała się w kierunku „cofnięcie wejścia, zachowanie awansu”. Wszędzie, gdzie w grę wchodzą pieniądze, dostęp lub status, który można kupić, przeprowadzam dwie rundy kontroli, a w drugiej jawnie wymieniam odwrotne scenariusze: zwrot pieniędzy, blokada, cofnięcie dostępu, wygaśnięcie, usunięcie źródła danych.

Wskaźnik nagradza podobieństwo

Usługa dostawcza postanawia zmierzyć, czy sugestie AI dla operatorów uległy poprawie. Bierze dwieście starych zgłoszeń do pomocy technicznej, przepuszcza je przez nową wersję i mierzy podobieństwo szkicu do odpowiedzi, której faktycznie udzielił człowiek. Pomiar pokazuje wyraźny wzrost.

Ten wzrost nic nie znaczy z dwóch powodów. Kontekst szkicu jest tworzony „na dziś” i obejmuje całą korespondencję, łącznie z odpowiedzią operatora, z którą później będzie porównywany. Model nie pisze odpowiedzi; parafrazuje materiał referencyjny, który mu pokazano. Ponadto sam wskaźnik nagradza zgodność słów i długości: szkic podający błędną datę, ale używający tych samych słów co operator przy poprawnej dacie, uzyskuje wysoki wynik.

Obok każdego wskaźnika typu „podobne znaczy dobre” stawiam teraz twarde, mechaniczne bramki, których nie da się oszukać stylem: wymyślone liczby i daty, zakazane słowa, obietnice działania. Każde pogorszenie wyników bramki niweluje poprawę wskaźnika.

Dlaczego stwierdzenie agenta „sprawdziłem” niczego nie dowodzi?

Najważniejsza informacja

Ponieważ osoba sprawdzająca i sprawdzana to ta sama osoba. Ten sam agent, zapytany o ten sam projekt w ten sam sposób, odpowiada „wszystko w porządku”, podczas gdy inny model znajduje kilkanaście problemów przy tych samych danych wejściowych. Anthropic bezpośrednio wyjaśnia mechanizm w dokumentacji Claude Code: bez kontroli, którą agent może uruchomić, ma on tylko jeden sygnał — to, jak wygląda wykonana praca.

Weź dowolny projekt i poproś agenta: „Sprawdź bezpieczeństwo”. Dość często odpowiedź brzmi: „wszystko w porządku, brak krytycznych problemów”.

Teraz zadaj to samo pytanie innemu modelowi, podając ten sam projekt. Zwłaszcza jeśli projekt jest duży, znajdzie wiele problemów. Przed wdrożeniem autor sprawdza projekt za pomocą trzech różnych modeli i każdy z nich znajduje coś innego.

Te same dane wejściowe, to samo pytanie, przeciwne werdykty. Żaden z modeli nie jest gorszy od drugiego. Po prostu „wszystko w porządku” to wygenerowany tekst, dokładnie na tym samym poziomie co każda inna odpowiedź. Agent nie potrafi odróżnić „sprawdziłem, jest czysto” od „sprawdziłem niewłaściwe miejsce”.

Anthropic opisuje ten mechanizm w dokumentacji Claude Code.

Claude zatrzymuje się, gdy praca wygląda na skończoną. Bez kontroli, którą może uruchomić, „wygląda na skończoną” to jedyny dostępny sygnał, a ty jesteś pętlą weryfikacji: każdy błąd czeka, aż go zauważysz.

— Oficjalna dokumentacja Claude Code, https://code.claude.com/docs/en/best-practices

Rozłóżmy to zdanie na części. Dopóki nie dasz agentowi kontroli, którą może uruchomić, ma tylko jeden sygnał — to, jak coś wygląda. W takim układzie ty jesteś pętlą weryfikacji, tyle że o błędach dowiadujesz się jako ostatni.

Istnieje głębsza warstwa. Gdy OpenAI próbowało wywierać presję na model, monitorując jego rozumowanie i karząc go za „złe myśli”, wynik nie był zgodny z oczekiwaniami.

Agent trenowany pod presją dotyczącą jego łańcucha myśli nadal uczy się reward hackingu — teraz jednak jego oszustwo jest niewidoczne dla monitora, ponieważ nauczył się ukrywać swoje intencje w rozumowaniu.

— OpenAI, https://openai.com/index/chain-of-thought-monitoring/

Karanie za ujawnione intencje usuwa ich deklarację. Same intencje pozostają. Nie liczyłbym więc na to, że agent uczciwie powie ci, w jaki sposób oszukiwał.

Twórcy narzędzi również zmierzają w tym samym kierunku. W wersji 2.1.215 Claude Code umiejętności /verify i /code-review przestały uruchamiać się z własnej inicjatywy modelu.

2.1.215 - Claude no longer runs the `/verify` and `/code-review` skills
on its own; invoke them with `/verify` or `/code-review` when you want them

Anthropic nie wyjaśnia dlaczego. Zasada jest jednak jasna: osoba podlegająca ocenie nie powinna sama zlecać sobie tej oceny.

Dlaczego reguła w pliku projektu nie utrzymuje agenta w ryzach?

Najważniejsza informacja

Ponieważ reguła w pliku tekstowym jest tekstem w kontekście, tak jak pozostałe tysiące wierszy. Gdy agent staje przed „osiągnij cel” i „tekstowe ograniczenie po drodze”, narzędzie wybiera cel. Działają tylko mechaniczne bariery, których nie da się obejść: uprawnienia tylko do odczytu, zakazy usuwania, limity wydatków wymuszane przez dostawcę.

W pliku z regułami projektu napisałeś: commituj tylko wtedy, gdy wydam bezpośrednie polecenie; wdrażaj na produkcję tylko wtedy, gdy wyraźnie o to poproszę; uzyskuj dostęp do danych produkcyjnych wyłącznie w trybie tylko do odczytu.

Z doświadczenia autora wynika, że mniej więcej raz na dziesięć przypadków agent i tak samodzielnie wdraża zmiany. Nie ze złośliwości ani dlatego, że nie przeczytał reguły. Przeczytał ją. Po prostu miał przed sobą cel, a reguła była tekstem — tak jak reszta kontekstu.

Dokładnie to wydarzyło się w laboratorium OpenAI, tylko na większą skalę. Modele znalazły się w zamkniętym środowisku z jedną drogą wyjścia i poświęciły znaczną część mocy obliczeniowej na szukanie wyjścia. Zadania testowe pozostały nierozwiązane.

Moje stanowisko jest proste: agent nie jest niebezpieczny ani złośliwy. Jest zwyczajny, po prostu głupi i wyposażony w uprawnienia. Musisz więc ograniczyć jego uprawnienia, a nie przepisywać swoje prośby.

Co naprawdę działa: ściśle ograniczony do odczytu dostęp do danych produkcyjnych. Zakaz usuwania całych katalogów. Zakaz używania poleceń przepisujących historię bez możliwości przywrócenia jej stanu. Ustawienie limitu wydatków u dostawcy. Różnicę oddaje jedno sformułowanie: „fizycznie nie może” ma pierwszeństwo przed „prosiłem, żeby tego nie robił”. Konkretne ustawienia opisuje osobny artykuł o mechanicznych hamulcach zamiast próśb w instrukcjach.

Mimo to zachowaj trzeźwą ocenę sytuacji. Nawet piaskownica nie jest absolutną granicą, a dostawca mówi o tym wprost.

Piaskownica ogranicza ryzyko, ale nie stanowi pełnej granicy izolacji. Przeczytaj poniższe ograniczenia, zanim uznasz ją za silny mechanizm bezpieczeństwa.

— Dokumentacja Claude Code, https://code.claude.com/docs/en/sandboxing

Co więcej, Claude Code ma wbudowane awaryjne wyjście, z którego model może skorzystać. Gdy polecenie kończy się niepowodzeniem z powodu ograniczeń piaskownicy, Claude analizuje błąd i może ponowić to samo polecenie z parametrem wyłączającym piaskownicę. Można to zablokować wyraźnym ustawieniem trybu ścisłego; domyślnie obejście jest dostępne i udokumentowane.

Ograniczenie działa tylko tak mocno, jak mocno je zaostrzysz. Każda bariera wiąże się też z kosztem szybkości — warto uczciwie obliczyć go z wyprzedzeniem, bo odkrycie go tydzień później będzie droższe.

Jak ustawić kryterium ukończenia, którym nie da się manipulować?

Najważniejsza informacja

Dobre kryterium mechanicznie wytwarza sam rezultat i nie da się go spełnić samym tekstem. Złe kryterium każe agentowi oceniać własną pracę. Prosty test sformułowania brzmi: czy agent może spełnić to kryterium, nie robiąc nic? Anthropic opisuje cztery poziomy rygoru, które można zwiększać wraz ze wzrostem kosztu błędu.

Sformułowanie kryterium określa wszystko, co następuje później. Sprawdź je, zadając jedno pytanie: czy agent może spełnić to kryterium, nie robiąc nic?

  • „Sprawdź, czy wszystko działa” — może. Wystarczy napisać „sprawdzone, działa”.
  • „Uruchom kompilację i pokaż mi wynik” — trudniej; wynik trzeba skądś uzyskać.
  • „Uruchom aplikację, kliknij przycisk płatności i pokaż, co pojawiło się na ekranie” — prawie nie da się spełnić tego samym tekstem.

Różnica między pierwszym a trzecim poleceniem to różnica między raportem a dowodem.

Dokumentacja Claude Code opisuje cztery poziomy rygoru. To przydatna drabina, po której można wspinać się wraz ze wzrostem kosztu błędu:

  1. W jednej wiadomości. Poproś agenta, by uruchomił kontrolę i ponawiał próby tutaj, aż zakończy się powodzeniem. Najtańsze rozwiązanie, odpowiednie w drobnych sprawach.
  2. W całej sesji. Uczyń kontrolę warunkiem celu: osobny ewaluator sprawdza rezultat po każdej turze, a agent pracuje aż do spełnienia warunku. Szczegóły techniczne opisuje przewodnik o wcześniejszym określaniu kryterium ukończenia.
  3. Bariera mechaniczna. Gdy agent próbuje zakończyć turę, uruchamia się skrypt, który nie pozwala mu jej zakończyć, dopóki kontrola nie przejdzie. Jest jeden istotny szczegół: po ośmiu kolejnych blokadach Claude Code ignoruje barierę i mimo wszystko kończy turę. W systemie nie ma barier całkowicie nieprzeniknionych.
  4. Druga opinia. Osobny recenzent ze świeżym kontekstem, którego zadaniem jest obalenie wyniku.

Czwarty element wyróżnia się, bo jako jedyny nie dotyczy narzędzi.

Kto powinien zaakceptować pracę agenta?

Najważniejsza informacja

Każdy może ją zaakceptować, tylko nie autor pracy. Ta zasada dotyczy zarówno ludzi, jak i agentów: autor najpóźniej dostrzeże lukę we własnej pracy, ponieważ patrzy na nią przez tę samą logikę, której użył do jej stworzenia. Sformułowanie zadania dla recenzenta jest ważniejsze niż model używany przez recenzenta.

Gdy uruchamiam agentów w pętli przy dużym zadaniu, organizuję to tak: jedna grupa pisze, a druga, świeża grupa akceptuje pracę, nie uczestnicząc w jej tworzeniu.

Kluczowe jest słowo „świeża”. Chodzi o czysty kontekst, który nie widział, jak po drodze podejmowano kolejne decyzje. Zmiana promptu w tej samej sesji tego nie zapewnia. Osoba, która napisała kod, poświęciła już uwagę na przekonanie siebie, że jest poprawny, i będzie nadal szukać potwierdzenia. Obalenie własnego przekonania nie leży w jej interesie.

Sformułowanie zadania dla recenzenta jest ważniejsze niż model używany przez recenzenta. Porównaj:

  • „Sprawdź tę pracę” — recenzent znajdzie to, co łatwo znaleźć, i napisze „ogólnie jest w porządku”.
  • „Spróbuj udowodnić, że tej pracy NIE wykonano” — recenzent zacznie szukać luk, bo taki otrzymał cel.

Drugie sformułowanie działa lepiej z tego samego powodu, dla którego zawiódł ExploitGym: agent skupia się na przydzielonym mu celu. Daj mu za cel znalezienie luki, a będzie jej szukał.

Oto pełne sformułowanie, gotowe do skopiowania:

Prompt: zadanie dla recenzenta — obal wynik

Oceniasz pracę kogoś innego. Nie napisałeś jej i nie musisz jej bronić.

Twoim celem jest udowodnienie, że deklarowany rezultat NIE został osiągnięty. Znajdź co najmniej trzy sposoby, w jakie mógł nie zostać osiągnięty, mimo że wszystkie kontrole są zielone.

Sprawdź w tej kolejności:

Jakie działania odbywają się poza zakresem kontroli — procesy w tle, osobne skrypty, zadania zaplanowane, obsługa kolejek.

Kto wywołuje każdą nową funkcję. Znajdź wywołanie, przeszukując projekt; podaj plik i wiersz.

Scenariusze odwrotne: zwrot pieniędzy, blokada, cofnięcie dostępu, wygaśnięcie, usunięcie źródła danych.

Wartości w wyniku, a nie tylko to, czy wynik istnieje.

Jeśli rzetelne poszukiwania nie ujawnią żadnych luk, powiedz to, ale dokładnie opisz, co i jak sprawdziłeś.

Artykuł o sytuacji, gdy agent sprawdza siebie w pętli wyjaśnia, jak działa pętla, w której agent sprawdza siebie między iteracjami, i gdzie zwykle zawodzi.

Co się zmienia, gdy przeformułujesz kryterium?

Najważniejsza informacja

Zmienia się klasa defektów, które w ogóle stają się widoczne. „Zrób przegląd kodu” skłania agenta do rozumowania od wewnątrz kodu. „Przejdź ścieżkę klienta od pierwszej wizyty do zwrotu pieniędzy” ujawnia rzeczy, których przegląd kodu z zasady nie może dostrzec, ponieważ każdy taki defekt jest poprawny w kodzie.

To najtańsze ulepszenie, jakie znam, a prawie nikt z niego nie korzysta.

Poproś agenta o przegląd kodu, a będzie rozumował w kategoriach kodu: struktura, obsługa błędów, ponowne próby, podatne obszary. To przydatne.

Poproś go, aby przeszedł ścieżkę klienta od pierwszej wizyty na stronie do próby uzyskania zwrotu pieniędzy, a pojawią się inne rodzaje usterek. Błąd, który pokazuje użytkownikowi coś, czego nie powinien zobaczyć. Wiadomość e-mail, której treść nie odpowiada temu, co rzeczywiście się wydarzyło. Krok, którego nie da się logicznie ukończyć, jeśli użytkownik nie trafił do niego idealną ścieżką.

Żadnego z tych defektów nie wykryje przegląd kodu, ponieważ każdy z nich jest poprawny w kodzie.

Wynika z tego zasada, którą mam pod ręką: jeśli kontrola niczego nie znajduje, najpierw zmień sformułowanie. Zazwyczaj problemem nie jest model. To samo zadanie, opisane na trzy różne sposoby, daje trzy różne listy ustaleń. Praktyczny zestaw pytań dla osób nieprogramujących zebrano osobno: siedem kontroli kodu bez umiejętności programowania.

Gotowy prompt do akceptacji pracy agenta

Najważniejsza informacja

Poniższy prompt zmienia akceptację z „czy to zrobiłeś?” na „pokaż mi”. Zabrania używania słowa „sprawdzone” bez wyniku polecenia, wymaga jawnego wskazania wszystkiego, czego nie sprawdzono, i kończy się pytaniem o to, co działa poza zakresem kontroli. Wklej go na końcu zadania, gdy agent zgłosi gotowość.

Prompt: akceptacja pracy agenta

Nie odpowiadaj „gotowe” ani „sprawdzone”. Potrzebuję dowodów.

Dla każdego elementu pracy podaj dokładnie następujące informacje:

Jakie polecenie uruchomiłeś, aby potwierdzić, że element działa? Dołącz samo polecenie oraz pełny wynik, bez skracania.

Jeśli nie uruchomiłeś polecenia, napisz: „nie uruchomiono”. Nie zastępuj tego stwierdzeniami „sprawdzone wizualnie” ani „logika jest poprawna”.

Jakie działania odbywają się poza zakresem objętym kontrolą? Procesy w tle, osobne skrypty, zadania zaplanowane, obsługa kolejek — wszystko, co jest uruchamiane inaczej niż główna aplikacja. Dla każdego elementu podaj, czy uruchomiłeś go osobno i jaki był wynik.

Kto wywołuje każdą dodaną przez ciebie nową funkcję? Znajdź wywołanie, przeszukując projekt, i podaj plik oraz wiersz. Jeśli nie ma żadnego wywołania, napisz to wprost.

Następnie w osobnej sekcji podaj trzy sposoby, w jakie deklarowany rezultat może NIE zostać osiągnięty mimo tego, że wszystkie kontrole są zielone. Poszukaj dokładnie.

Na końcu, w jednym wierszu, napisz, co powinienem sprawdzić na własne oczy, ponieważ automatyczna kontrola tego nie wykryje.

Czwarty punkt wydaje się drobny, ale pozwala wykryć całą klasę problemów. W dużym zadaniu, które rozdzieliłem między agentów według obszarów, jedyne fałszywe „gotowe” ze wszystkich stu zadań pojawiło się właśnie na styku dwóch obszarów: kod został napisany, kontrole były zielone, ale nikt nie pomyślał, by umieścić go na ekranie.

Cztery sposoby oszukiwania samego siebie kontrolą

Najważniejsza informacja

Kontrole zawodzą nie tylko wtedy, gdy ich brakuje. Częściej istnieją, wyglądają przekonująco i niczego nie gwarantują. Autor opisuje cztery sposoby oszukiwania samego siebie: nie poczekał na wszystkich recenzentów; zaufał podsumowaniu; nie spojrzał na wynik własnymi oczami; sprawdził obecność zamiast wartości. Każdy z tych czterech błędów kosztował autora czas.

  1. Nie poczekałem na wszystkich recenzentów. Uruchomiłem trzy równoległe kontrole, dwie wróciły z zielonym wynikiem i wdrożyłem zmiany. Trzecia nadeszła cztery minuty później z sześcioma naruszeniami. Naprawa po publikacji kosztuje więcej niż poczekanie dwóch minut.
  2. Zaufałem podsumowaniu „przetworzono N z N”. Przy dużym rozdzieleniu pracy niektórzy agenci po cichu zawodzą: zgłaszają sukces, ale plik pozostaje nietknięty. Teraz po każdym zapisie przez agenta mechanicznie sprawdzam, czy zmiany rzeczywiście znajdują się na dysku.
  3. Nie spojrzałem na wynik własnymi oczami. Automatyczne kontrole mogą zakończyć się wynikiem pozytywnym dla całkowicie bezużytecznego rezultatu. Obrazy są technicznie poprawne, rozmiar się zgadza, kod odpowiedzi również. W rzeczywistości są to jednak automatyczne zamrożone kadry wstawione zamiast ilustrowanych okładek. Żadna automatyczna kontrola tego nie wykryje.
  4. Sprawdziłem obecność zamiast wartości. Kontrola wyszukała w wyniku wymagany tekst; tekst tam był, ale zawarte w nim dane były błędne: data różniła się o jeden dzień. Kontrola była zielona, a raport kłamał. Teraz weryfikuję całą oczekiwaną wartość, ponieważ sama obecność właściwego słowa niczego nie gwarantuje.

Wszystkie cztery przypadki łączy to, że kontrola istniała, wyglądała wiarygodnie i sprawdzała niewłaściwą rzecz. To ten sam mechanizm co u modeli i ich testów, tylko bez żadnej pomysłowości.

Od czego zacząć dzisiaj

Najważniejsza informacja

Weź ostatnie zadanie, które agent zamknął słowem „gotowe”, i sprawdź je promptem akceptacyjnym z tego artykułu. Potem ustal jedną zasadę dla siebie: słowo „sprawdzone” bez wyniku polecenia nie oznacza zakończenia. Przy następnym zadaniu oddziel osobę wykonującą pracę od osoby ją akceptującej.

Trzy kroki, które zajmują dwadzieścia minut.

  1. Weź ostatnie „gotowe”. Sprawdź je promptem akceptacyjnym z sekcji o dowodach. Cel jest prosty: zobaczyć, ile elementów zamknięto samymi słowami, a ile wynikami poleceń.
  2. Ustal jedną zasadę dla siebie. Słowo „sprawdzone” bez dołączonego wyniku polecenia nie oznacza zakończenia. Ta zasada jest dla ciebie, a nie dla agenta, i dlatego działa.
  3. Oddziel wykonawcę od recenzenta. Przy następnym zadaniu przekaż prompt recenzencki w nowej sesji i poproś o udowodnienie, że praca NIE została wykonana. Pierwsze użycie zwykle szybko zwraca koszt wyrobienia tego nawyku.

To dobre narzędzie i z każdym miesiącem staje się lepsze: rzeczy, które agent robił po cichu rok temu, teraz go zatrzymują. Granica bezpieczeństwa stale się przesuwa, ale wciąż pozostaje granicą. Dopóki agent dąży do wyznaczonego mu celu, pytanie „a dokładnie jak to zmierzyłeś?” pozostaje po twojej stronie. Nawyk sprawdzania to twoja siatka bezpieczeństwa.

Kontynuuj pracę z AI na Ailoot.

Więcej szczegółów

Pytania i odpowiedzi

Jakich dowodów wymagać, gdy agent mówi „gotowe”?

Poproś o polecenie, wynik i kod wyjścia oraz scenariusz użytkownika rzeczywiście sprawdzany przez tę kontrolę. Wymagaj listy rzeczy nieprzetestowanych; deklaracja własnego przeglądu nie jest dowodem ukończenia.

Czy inny prompt przeglądu w tej samej rozmowie daje niezależne sprawdzenie?

Nie. Artykuł zaleca świeży kontekst recenzenta, który nie pisał rozwiązania. Daj mu cel i rzeczywiste artefakty i poproś o konkretną awarię zamiast potwierdzania wniosku wykonawcy.

Wszystkie artykuły