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.

Model nie pamięta — pamięta produkt

Model nie pamięta — pamięta produkt

Model nie pamięta ani jednego słowa z waszej poprzedniej wymiany. Wagi są zamrożone, między turami nie zapisuje się nic, a wrażenie ciągłości powstaje przez mechanizm tak prosty, że po jego poznaniu przestaje dziwić połowa rzeczy z tej serii — łącznie z rachunkiem za...

Czego nie widzisz w oknie czatu

Czego nie widzisz w oknie czatu

Okno czatu wygląda jak najkrótsza możliwa droga do modelu, a jest najdłuższą. Między twoim zdaniem a wagami stoi więcej warstw niż w wywołaniu API — i żadnej z nich nie widzisz, nie ustawiasz i nie możesz wyłączyć. W poprzednim torze rozkładaliśmy to, co dzieje się na...