Agent gubi wątek w długim zadaniu

przez Łukasz | sie 24, 2026

Objawy

Pierwsze kroki idą wzorowo. Po kilkunastu agent zaczyna się rozjeżdżać.

Przestaje przestrzegać reguły z promptu systemowego, której trzymał się na początku. Zmienia format odpowiedzi w połowie zadania. Wraca do czegoś, co już ustalił, i ustala to inaczej. Odpowiada na pytanie sprzed kilku kroków zamiast na bieżące. Pomija ograniczenie, o którym wyraźnie mu powiedziano.

Odróżnienie od zapętlenia: tam agent powtarzał ten sam krok. Tutaj każdy krok jest inny, tylko całość przestaje się trzymać kupy.

Sygnał rozstrzygający: im dłuższy przebieg, tym gorzej. Jeśli jakość nie zależy od liczby kroków, to nie ten syndrom.

Mechanizm w trzech zdaniach

Mechanizm uwagi waży wszystkie pozycje w kontekście naraz — nie przegląda ich po kolei, nie premiuje instrukcji. Instrukcja umieszczona wśród kilkuset tokenów ma inną wagę niż ta sama instrukcja wśród kilkudziesięciu tysięcy.

Model o niej nie „zapomina” — jej wpływ się rozmywa. Mechanizm opisuje artykuł o attention, skutki dla planowania kontekstu — okno kontekstu i context rot.

Diagnostyka różnicowa

1. Rozmycie instrukcji przez narastanie kontekstu

Jak rozpoznać: degradacja stopniowa, wprost proporcjonalna do długości przebiegu. Najczęstsza przyczyna.

Test: powtórz krytyczną instrukcję jako ostatni element kontekstu przed wywołaniem i porównaj. Jeśli agent znów jej przestrzega, masz rozpoznanie.

2. Kluczowa informacja utonęła w środku

Jak rozpoznać: agent ignoruje konkretny fakt, który obiektywnie jest w kontekście — tyle że w połowie.

Dlaczego to boli: modele radzą sobie lepiej z początkiem i końcem sekwencji niż z jej środkiem.

Test: przesuń tę informację na koniec i powtórz. Ta sama treść, inne miejsce.

3. Kompaktowanie wycięło ustalenie

Jak rozpoznać: degradacja skokowa, nie stopniowa. Do kroku dwunastego wszystko dobrze, od trzynastego agent nie pamięta czegoś z kroku czwartego.

Test: sprawdź, w którym momencie zadziałał mechanizm skracania historii i czy usunięty fragment zawierał utracone ustalenie. To jedyna przyczyna z ostrą granicą czasową.

4. Sprzeczne instrukcje z różnych warstw

Jak rozpoznać: agent robi coś, co ktoś mu kazał — tylko nie ty.

Dlaczego to boli: prompt systemowy mówi jedno, wynik narzędzia sugeruje drugie, użytkownik w trzeciej wiadomości poprosił o trzecie. Model nie ma reguły pierwszeństwa i zwykle idzie za najświeższym.

Test: wypisz wszystkie instrukcje obecne w kontekście na moment błędu. Zaskakująco często okazuje się, że są sprzeczne, a nikt tego wcześniej nie zestawił.

5. Kontekst zaśmiecony wynikami narzędzi

Jak rozpoznać: policz, jaki procent kontekstu stanowią surowe wyniki narzędzi. Jeśli powyżej połowy — to jest to.

Dlaczego to boli: trzysta rekordów wklejonych w całości konkuruje o uwagę z twoimi instrukcjami. To ten sam problem, który w syndromie kosztowym objawiał się rachunkiem — tutaj objawia się jakością.

6. Przekroczenie użytecznego okna, nie nominalnego

Jak rozpoznać: kontekst mieści się w limicie, a mimo to model traci spójność.

Dlaczego to boli: okno nominalne i okno, w którym model faktycznie utrzymuje uwagę na wszystkim, to dwie różne wielkości. Deklarowane dwieście tysięcy tokenów nie znaczy, że przy stu pięćdziesięciu tysiącach wszystko działa równie dobrze.

7. Nieudane próby zostają w historii jako ustalenia

Jak rozpoznać: agent powtarza błąd, który już popełnił, albo buduje na wyniku, który wcześniej został odrzucony.

Dlaczego to boli: wywołanie zakończone błędem, argument odrzucony przez walidację, ścieżka porzucona w połowie — wszystko to zostaje w kontekście i wygląda jak część ustaleń.

Test: przejrzyj historię z perspektywy modelu i sprawdź, czy da się odróżnić kroki udane od nieudanych. Jeśli nie da się tego zrobić czytając, model też tego nie zrobi.

8. Format nie jest wymuszony, tylko poproszony

Jak rozpoznać: rozjeżdża się wyłącznie struktura odpowiedzi, treść pozostaje sensowna.

Dlaczego to boli: instrukcja „odpowiadaj w formacie JSON” przesuwa rozkład, a przy długim kontekście przesuwa go słabiej. Schemat wymuszony po stronie API nie podlega rozmyciu.

Postępowanie

Najpierw pomiar, nie poprawki. Zmierz zależność jakości od długości kontekstu — to rozstrzyga, czy problemem są przyczyny pierwsza, druga i szósta, czy któraś z pozostałych. Sposób w aneksie.

Powtórz krytyczne instrukcje na końcu. Najtańsza skuteczna interwencja. Trzy–pięć linii przypomnienia doklejane tuż przed wywołaniem, po całej historii. Kosztuje kilkadziesiąt tokenów i zwykle wystarcza przy przyczynie pierwszej.

Przycinaj wyniki narzędzi. Uchwyt zamiast pełnych danych — rozwiązuje przyczynę piątą i przy okazji rachunek.

Oznaczaj kroki nieudane wprost. „Ta próba została odrzucona, powód: …” zamiast zostawiania surowego błędu wśród udanych wyników. To naprawia przyczynę siódmą jednym zdaniem w formacie logu kroku.

Wymuś strukturę schematem zamiast prosić o nią w prompcie.

Trzymaj ustalenia poza kontekstem. Decyzje podjęte w trakcie zapisuj w stanie pętli i wstrzykuj jako zwięzłą listę, zamiast liczyć, że model odnajdzie je w historii. To odporne również na kompaktowanie.

Profilaktyka

Budżet kontekstu ustalony świadomie, niższy niż limit nominalny. Stała struktura: instrukcje na początku, przypomnienie na końcu, historia w środku i możliwie krótka.

Rozdzielenie tego, co model musi widzieć, od tego, co pętla ma pamiętać — czyli stan poza kontekstem.

Przy naprawdę długich zadaniach rozważ podział na etapy z jawnym przekazaniem ustaleń, zamiast jednego przebiegu na trzydzieści kroków.

Jak zdiagnozować u siebie

Test zależności jakości od długości kontekstu. Ta sama instrukcja, to samo pytanie, rosnąca ilość wypełniacza pomiędzy.

python
from openai import OpenAI

client = OpenAI()

INSTRUKCJA = ("Jesteś asystentem technicznym. ZASADA BEZWZGLĘDNA: każdą "
              "odpowiedź kończ linią 'ŹRÓDŁO: <nazwa systemu>'. "
              "Nigdy nie pomijaj tej linii.")

WYPELNIACZ = ("Wynik narzędzia: zamówienie {i}, status zrealizowane, "
              "kwota {k} PLN, kurier DPD, magazyn centralny. ")

def test(ile_wypelniacza, przypomnienie=False, n=3):
    historia = "".join(WYPELNIACZ.format(i=i, k=100+i)
                       for i in range(ile_wypelniacza))
    wiadomosci = [{"role": "system", "content": INSTRUKCJA},
                  {"role": "user", "content": historia +
                   "\n\nPytanie: jaki jest status zamówienia 5?"}]
    if przypomnienie:
        wiadomosci.append({"role": "user",
                           "content": "Pamiętaj o linii ŹRÓDŁO na końcu."})

    trafienia = 0
    for _ in range(n):
        r = client.chat.completions.create(
            model="gpt-4o-mini", messages=wiadomosci, max_tokens=120)
        tresc = r.choices[0].message.content
        trafienia += "ŹRÓDŁO:" in tresc
    tokeny = r.usage.prompt_tokens
    print(f"{tokeny:6} tokenów  przestrzega: {trafienia}/{n}"
          f"{'  (z przypomnieniem)' if przypomnienie else ''}")

for ile in (0, 50, 200, 600):
    test(ile)
print()
test(600, przypomnienie=True)

Pierwsze cztery uruchomienia pokazują krzywą: gdzieś przestaje działać reguła, która przy krótkim kontekście była przestrzegana bezwzględnie. Piąte pokazuje, ile z tego odzyskuje przypomnienie doklejone na końcu.

To jest cały test diagnostyczny w pięciu wierszach wyniku. Jeśli krzywa opada — masz przyczynę pierwszą i wiesz, że naprawa jest tania. Jeśli reguła łamie się od razu przy krótkim kontekście, problem leży gdzie indziej i wróć do listy przyczyn.

Ćwiczenie: podmień INSTRUKCJA na regułę ze swojego promptu systemowego, a wypełniacz na realne wyniki twoich narzędzi. Zmierz, przy ilu tokenach twoja reguła przestaje obowiązywać — i porównaj to z typową długością kontekstu na produkcji.

Powiązane

Jak działa uwaga i dlaczego kolejność w kontekście ma znaczenie: Anatomia LLM. Co trzymać poza kontekstem: Maszyneria agenta.

Następny syndrom: Agent zrobił to samo dwa razy.

Agent kończy, ale zadania nie wykonał

Agent kończy, ale zadania nie wykonał

Objawy Agent odpowiada: „Przygotowałem i wysłałem potwierdzenie do klienta." Potwierdzenie nie zostało wysłane. Albo: „Zaktualizowałem wszystkie rekordy" — zaktualizował trzy z dwunastu. Albo: „Nie znalazłem żadnych zamówień" — bo narzędzie zwróciło błąd, którego nikt...

Agent zrobił coś, o co nikt nie prosił

Agent zrobił coś, o co nikt nie prosił

Objawy Operacja, której nikt nie zlecił. Dane wysłane pod adres, którego nie ma w żadnej konfiguracji. Rekord zmieniony poza zakresem zadania. Odpowiedź, z której wynika, że agent dostał instrukcje od kogoś innego niż ty. Cecha wspólna: technicznie wszystko zadziałało...

Agent zrobił to samo dwa razy

Agent zrobił to samo dwa razy

Objawy Ten syndrom różni się od pozostałych jedną rzeczą: objaw widzi klient, nie ty. Trzy identyczne wiadomości w skrzynce. Dwa zamówienia zamiast jednego. Podwójne obciążenie. Duplikaty rekordów, które ktoś zauważa tydzień później. W twoim dzienniku wszystko wygląda...

Agent podaje dane, których nie ma

Agent podaje dane, których nie ma

Objawy Numer zamówienia w idealnym formacie, którego nie ma w bazie. Kwota, której w dokumencie nie ma. Nazwa pola API, które nigdy nie istniało. Cytat z regulaminu, brzmiący dokładnie jak reszta regulaminu i w nim nieobecny. Cecha wspólna wszystkich tych przypadków:...

Działał wczoraj, dziś nie działa

Działał wczoraj, dziś nie działa

Objawy Nic się nie wywala. Nie ma wyjątków, nie ma timeoutów, dziennik wygląda tak samo jak zawsze. Po prostu odpowiedzi są gorsze. Postacie, w jakich to się objawia: Jakość. Agent zaczyna pomijać kroki, które wcześniej wykonywał, albo odpowiada ogólniej. Format....

Agent wybiera złe narzędzie

Agent wybiera złe narzędzie

Objawy Agent odpowiada nie na to pytanie. Pobiera listę zamówień, gdy pytano o jedno konkretne. Odpowiada z pamięci, choć miał sprawdzić w bazie. Albo sięga po właściwe narzędzie i wpisuje w argumenty coś, czego nie da się użyć. Sygnał, który odróżnia ten syndrom od...

Agent kręci się w kółko

Agent kręci się w kółko

Objawy Agent wykonuje kolejne obroty pętli, nie zbliżając się do zakończenia zadania. W dzienniku widać jedną z trzech postaci. Powtórzenie. To samo narzędzie, te same argumenty, raz za razem — czasem dziesiątki razy pod rząd. Oscylacja. Agent wywołuje na przemian dwa...

Co logować w pętli agenta

Co logować w pętli agenta

W drugim artykule padło, że pętla powinna zwracać nie samą odpowiedź, lecz odpowiedź razem z powodem zakończenia, liczbą kroków i zużytym budżetem. To był zalążek. Tu jest pełna wersja. Typowy dziennik agenta zapisuje pytanie i odpowiedź. To akurat najmniej użyteczna...