Jedenastu sposobów na przerwanie nieskończonych pętli agenta AI
Wykrywaj cykle z zablokowanym narzędziem, dodawaj warunki zatrzymania oraz przywracaj stan za pomocą punktów kontrolnych zamiast większej liczby tokenów.
Źródła: **Your AI Agent Is Stuck in a Loop. Here Are 11 Ways to Fix It**
Agent
↓
Tool
↓
Result
↓
Agent
↓
Same Tool
↓
Same Tool
↓
Same Tool
↓
💸
1. Dlaczego agenci AI utykają w pętlach?
Search customer
→ Find customer
→ Check order
→ Check order again
→ Search customer again
→ Check order again
Bad tool selection
Ambiguous tool results
State not changing
Weak stopping conditions
Repeated failed attempts
Model choosing the same strategy again
track_package("12345")
Status: In transit
Estimated delivery: Tomorrow
2. Prosta pętla agenta
Należy umieścić ludzką akceptację przy operacjach, które powodują wydanie pieniędzy lub zmianę danych produkcyjnych. Połączenia skompilowane w czasie kompilacji nie gwarantują kompletności procesów biznesowych.
while (!done) {
const action = await model.decide(context);
const result = await executeTool(action);
context.push(result);
}
Model
↓
Tool
↓
Result
↓
Model
↓
Tool
↓
Result
↓
...
Przykład z rzeczywistego świata
Jako przykład z rzeczywistego świata, przed zmianą kodu należy określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg procesu, jak i ścieżkę naprawczą. Próby ponownych działań, kontrola przez ludzi oraz obsługa nieudanych transakcji stanowią część produktu, a nie elementy dodawane później. Konieczne jest uzyskanie zatwierdzenia człowieka w przypadkach, gdy dochodzi do wydawania pieniędzy lub zmiany danych produkcyjnych. Podłączenia realizowane w czasie kompilacji nie równają się pełnej kompletności rozwiązania biznesowego. Jako przykład z rzeczywistego świata, przed zmianą kodu należy określić dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia. Operatorzy powinni móc ponownie uruchomić ten krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Należy nadać nazwy poszczególnym elementom, zdefiniować kryteria sukcesu oraz odrzucić przypadki cichego, częściowego ukończenia zadania.
get_refund_status()
Refund pending
get_refund_status()
3. Przydziel agentowi budżet
Pracując nad punktem 3. Przydziel agentowi budżet, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co się dzieje w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zapisz czas trwania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy ścieżka przechodzi z wersji demonstracyjnej do środowisk współdzielonych. Ustal punkty kontrolne po drogich krokach. Narzędzie do kontynuacji nie powinno ponownie naliczać opłat za tę samą wywołanie LLM, gdy operator próbuje ponownie uruchomić późniejszy węzeł.
const MAX_STEPS = 12;
const MAX_TOOL_CALLS = 20;
const MAX_RUNTIME_MS = 30_000;
Dlaczego używać kilku limitów?
Gdy pracujesz nad tematem „Dlaczego używać wielu limitów?”, najpierw zapisz specyfikację: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Ustaw punkty kontrolne po kosztownych krokach. System powinien unikać ponownego naliczania opłat za tę samą próbę wywołania LLM, gdy operator ponawia działanie późniejszego węzła.
Steps → reasoning budget
Tool calls → external API budget
Time → latency budget
Tokens → model cost
Przykłady
Gdy pracujesz nad przykładami, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Dokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę naprawczą. Próby ponowne, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Ustalaj punkty kontrolne po kosztownych krokach. Narzędzie do kontynuacji pracy nie powinno ponownie naliczać opłat za tę samą wywołanie LLM, gdy operator próbuje ponownie uruchomić późniejszy węzeł. Gdy pracujesz nad przykładami, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań.
Search restaurant
→ Search restaurant
→ Search restaurant
→ Check table
→ Check table
→ Check table
→ Search restaurant again
Maximum 8 actions
Maximum 15 seconds
Maximum 5 reservation checks
4. Wykrywanie powtarzających się działań
- Rozpoznawanie powtarzających się działań działa najlepiej, gdy traktuje się je jako mierzalną zmienną. Zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian, zanim rozszerzysz zakres badania. Zapisuj czasy wykonywania operacji oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy przechodzi się z środowiska demonstracyjnego do współdzielonych środowisk. Utrzymuj stan grafu w prostej formie i z określonym typem danych. Wplecione elementy ukrywają informację o tym, który węzeł zapisał dane do którego pola, co powoduje przerwanie kontynuacji po przerwach.
search_users(...)
search_users(...)
search_users(...)
const signature = `${toolName}:${JSON.stringify(args)}`;
if (seenActions.has(signature)) {
throw new Error("Repeated tool invocation detected");
}
seenActions.add(signature);
Ale dokładne dopasowanie nie wystarcza
Ale dokładne dopasowanie nie wystarcza – działa najlepiej, gdy traktuje się je jako mierzalną powierzchnię. Zapisz jeden idealny przepis, jeden przypadek awarii oraz notatkę o cofnięciu zmian, zanim rozszerzysz zakres pracy. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, aby operatorzy mogli je sprawdzić bez konieczności czytania całej struktury. Utrzymuj stan grafu w prostym formacie i z określonym typem danych. Wplecione bloki danych ukrywają informację o tym, który węzeł zapisał dane do którego pola, co powoduje przerwanie kontynuacji pracy po zakłóceniach.
search("Node.js latency")
search("nodejs latency")
search("Node latency")
5. Wykrywanie braku postępów
- Najlepiej sprawdza się wykrywanie braku postępów, gdy traktuje się je jako coś mierzalnego. Zapisz jeden idealny przepis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres. Dokumentuj zarówno prawidłowy przebieg działań, jak i ścieżkę przywracania do normalnego stanu. Próby ponownych działań, kontrolne punkty ludzkie oraz obsługa wiadomości nieodebranych stanowią część produktu, a nie elementy dodawane później. Utrzymuj stan grafu w prostej formie i z określonym typem danych. Wplecione elementy ukrywają informację o tym, który węzeł zapisał dane do którego pola, co powoduje przerwanie kontynuacji po przerwach.
- Najlepiej sprawdza się wykrywanie braku postępów, gdy traktuje się je jako coś mierzalnego. Zapisz jeden idealny przepis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań, zanim rozszerzysz zakres. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nadaj nazwy poszczególnym elementom, zdefiniuj kryteria sukcesu i odrzucaj ciche, częściowe ukończenie zadań.
Step 1 → Search customer
Step 2 → Search customer by email
Step 3 → Search customer by name
Step 4 → Search customer by phone
Step 1
Find customer → ✅
Step 2
Find order → ✅
Step 3
Check shipment → ✅
Step 4
Check shipment → same result
Step 5
Check shipment → same result
Korzystny model myślowy
Aby stworzyć przydatny model mentalny, zdefiniuj wprowadzenia, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić ten krok na podstawie znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Zapisuj czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. W przypadku, gdy następnym krokiem jest kod lub wywołanie narzędzia, preferuj strukturyzowane wyniki z walidacją schematu zamiast tekstów w formie swobodnej.
How many actions did the agent take?
What changed after each action?
6. Nie próbuj ponownie bezrefleksyjnie
Dla punktu 6: Nie próbuj ponownie bez planu – zdefiniuj dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Konfigurację należy przechowywać poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Wprowadź ludzką aprobatę dla operacji, które wiążą się z wydawaniem pieniędzy lub modyfikacją danych produkcyjnych. Połączenia ustalone w czasie kompilacji nie równają się pełności funkcjonalności biznesowej.
charge_card()
→ timeout
To samo zasada dotyczy agentów
Dla tych samych celów zasada ta odnosi się również do agentów – należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Należy udokumentować zarówno prawidłowy przebieg procesu, jak i ścieżki naprawcze. Próby ponownych działań, kontrola przez ludzi oraz obsługa wiadomości błędowych stanowią część produktu, a nie elementy dodawane później. Konieczne jest uzyskanie zatwierdzenia człowieka w przypadkach, gdy dochodzi do wydawania pieniędzy lub zmiany danych produkcyjnych. Połączenia realizowane w czasie kompilacji nie równają się pełnej kompletności rozwiązania biznesowego. Dla tych samych celów zasada ta odnosi się również do agentów – należy zdefiniować dane wejściowe, osobę odpowiedzialną za dany krok oraz kryteria zakończenia przed modyfikacją kodu. Operatorzy powinni móc ponownie uruchomić dany krok od znanego punktu kontrolnego, bez konieczności zgadywania ukrytego stanu. Traktuj tę fazę jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć przypadki cichego, częściowego ukończenia zadania.
for (let i = 0; i < 10; i++) {
await callTool();
}
Timeout
→ Retry may make sense
Invalid input
→ Retry with same arguments makes no sense
Permission denied
→ Try a different strategy
Same successful result
→ Stop
7. Przekaż agentowi strategię odzyskiwania
Pracując nad punktem 7. Przekaż agentowi strategię odzyskiwania, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego awarii. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zapisz czasy wykonywania oraz koszt tokenów lub zapytań obok wyników funkcjonalnych. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Ustal punkty kontrolne po kosztownych krokach. Narzędzie do kontynuacji nie powinno ponownie naliczać opłat za tę samą wywołanie LLM, gdy operator próbuje ponownie uruchomić późniejszy węzeł.
search_invoices(customer_id)
→ No result
search_invoices(customer_id)
→ No result
→ search_invoices(customer_id)
→ No result
→ search_invoices(customer_id)
Search by customer ID
↓
No result
↓
Search by email
↓
Still no result
↓
Search archived invoices
if (isStuck(state)) {
return replan({
reason: "No progress detected",
previousActions
});
}
8. Ustal jasno, co oznacza „zakończenie”
Gdy pracujesz nad punktem 8, musisz jasno określić, co należy zrobić – najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co się dzieje w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Konfigurację należy trzymać oddzielnie od kodu aplikacji. Pliki środowiskowe, magazyny tajemnic oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Ustaw punkty kontrolne po kosztownych krokach. System powinien unikać ponownego naliczania opłat za tę samą operację LLM, gdy operator próbuje ponownie uruchomić późniejszy węzeł.
I found an order.
Done.
Task:
Find latest order
Done when:
- customer identified
- orders retrieved
- orders sorted by date
- latest order selected
- result returned
Analogia z rzeczywistego świata
Gdy pracujesz nad analogią z rzeczywistego świata, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Zdokumentuj zarówno ścieżkę prawidłowego działania, jak i ścieżkę naprawczą. Próby ponowne, kontrola przez ludzi oraz obsługa wiadomości błędnych stanowią część produktu, a nie elementy dodawane później. Ustal punkty kontrolne po kosztownych krokach. System powrotu nie powinien ponownie naliczać opłat za tę samą wywołanie LLM, gdy operator próbuje ponownie uruchomić późniejszy węzeł. Gdy pracujesz nad analogią z rzeczywistego świata, najpierw zapisz umowę: wymagane dane wejściowe, sygnał sukcesu oraz to, co dzieje się w przypadku częściowego niepowodzenia. Taka lista kontrolna zapewnia uczciwość późniejszych zmian w kodzie. Traktuj ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Nazwij poszczególne elementy, zdefiniuj kryteria sukcesu i odrzuć ciche, częściowe ukończenie zadań.
Destination reached
9. Dodaj możliwości obserwacji, zanim będą potrzebne
- Najlepiej działa dodawanie możliwości obserwacji przed jej faktyczną potrzebą, traktując ją jako coś mierzalnego. Zanim rozszerzysz zakres, zapisz jeden idealny przykład działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia zmian. Obok wyników funkcjonalnych zapisz również czasy wykonywania operacji oraz koszt tokenów lub zapytań. Wczesna widoczność kosztów zapobiega niespodziewanym rachunkom, gdy ścieżka przechodzi z środowiska demonstracyjnego do współdzielonych środowisk. Utrzymuj stan grafu w formie prostych, spójnych struktur typowych. Zagłębione elementy ukrywają informację o tym, który węzeł zapisał dane w danym polu, co powoduje przerwania w kontynuacji pracy po zakłóceniach.
run_id
step
tool
arguments
duration
result size
retry count
token usage
termination reason
Run: abc123
Step 1
search_users
210ms
Step 2
get_user
130ms
Step 3
get_orders
180ms
Step 4
get_orders
175ms
Step 5
get_orders
172ms
Step 6
LOOP DETECTED
Reason: No state change
10. Bezpieczniejszy cykl agenta
- Najlepiej funkcjonuje bezpieczniejszy cykl agentów, gdy traktuje się go jako mierzalną powierzchnię. Zapisz jeden idealny przekaz, jeden przypadek awarii oraz notatkę o cofnięciu działań, zanim rozszerzysz zakres. Trzymaj konfigurację poza kodem aplikacji. Pliki środowiskowe, magazyny tajnych danych oraz flagi funkcjonalne powinny znajdować się w jednym miejscu, które operatorzy mogą sprawdzić bez konieczności czytania całej struktury. Utrzymuj stan struktury w prostym formacie i z określonym typem danych. Wplecione bloki ukrywają informację o tym, który węzeł zapisał dane w danym polu, co powoduje przerwanie kontynuacji po zakłóceniach.
while (!done) {
if (steps >= MAX_STEPS) {
return terminate("Step budget exceeded");
}
if (Date.now() - startTime > MAX_RUNTIME_MS) {
return terminate("Time budget exceeded");
}
const action = await model.decide(context);
if (isRepeated(action)) {
return replan("Repeated action detected");
}
const previousState = snapshot(state);
const result = await executeTool(action);
state = updateState(state, result);
if (!hasProgress(previousState, state)) {
markNoProgress();
}
if (tooMuchNoProgress()) {
return replan("No meaningful progress");
}
if (isComplete(state)) {
done = true;
}
}
11. Model decyduje. Narzędzie egzekwuje.
- Model podejmuje decyzję. Narzędzie ją egzekwuje. Najlepiej funkcjonuje, gdy traktuje się je jako mierzalną powierzchnię. Zanim rozszerzy się zakres, należy zarejestrować jeden idealny przepis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań. Należy udokumentować zarówno prawidłowy przebieg, jak i ścieżkę naprawczą. Próby ponowne, kontrola przez ludzi oraz obsługa wiadomości nieodebranych stanowią część produktu, a nie elementy dodawane później. Przydziel budget tokenów na każdy ruch i sesję. Narzędzia typu agentic intensywnie rozszerzają kontekst; sztywne limity zapobiegają temu, by demonstracje przerodziły się w niespodziewane rachunki.
- Model podejmuje decyzję. Narzędzie ją egzekwuje. Najlepiej funkcjonuje, gdy traktuje się je jako mierzalną powierzchnię. Zanim rozszerzy się zakres, należy zarejestrować jeden idealny przepis działania, jeden przypadek awarii oraz notatkę dotyczącą cofnięcia działań. Należy traktować ten etap jako umowę pomiędzy danymi wejściowymi a zweryfikowanymi wynikami. Należy nadać nazwy poszczególnym elementom, zdefiniować kryteria sukcesu oraz odrzucić ciche, częściowe ukończenie zadań.
What should I do next?
How many times can you act?
How long can you run?
Have you repeated yourself?
Are you making progress?
Did the state change?
Are you allowed to call this tool?
When should execution stop?
Speed limiter
Brake system
Fuel gauge
Navigation system
Collision warning
Celem nie jest eliminacja pętli
Write code
→ Run tests
→ See failure
→ Fix code
→ Run tests
→ See failure
→ Fix code
→ Tests pass
→ Stop
Did the agent loop?
Did the agent make progress?
Lista kontrolna produkcji
☑ Is there a maximum step count?
☑ Is there a runtime limit?
☑ Is there a tool-call budget?
☑ Can repeated actions be detected?
☑ Can we detect lack of progress?
☑ Are retries failure-aware?
☑ Can the agent re-plan?
☑ Is "done" explicitly defined?
☑ Can we see every tool call in production?
☑ Do we know why an agent terminated?
Ostatnia myśl
Dziękujemy za bycie częścią społeczności
Lista kontrolna operacyjna
Znak do przepisania 1 dla 3372f6d9932d: sformułuj otaczające stwierdzenia językiem operatora, zachowaj niezmienione pola [[CODE_n]], unikając powtarzania zdań z źródła.
Znak do przepisania 2 dla 3372f6d9932d: sformułuj otaczające stwierdzenia językiem operatora, zachowaj niezmienione pola [[CODE_n]], unikając powtarzania zdań z źródła.
Znak do przepisania 3 dla 3372f6d9932d: sformułuj otaczające stwierdzenia językiem operatora, zachowaj niezmienione pola [[CODE_n]], unikając powtarzania zdań z źródła.
Zmień tekst oznaczenia 4 dla 3372f6d9932d: sformułuj otaczające stwierdzenia językiem operatorów, zachowaj niezmienione pola [[CODE_n]], i unikaj powtarzania zdań z źródła.
Zmień tekst oznaczenia 5 dla 3372f6d9932d: sformułuj otaczające stwierdzenia językiem operatorów, zachowaj niezmienione pola [[CODE_n]], i unikaj powtarzania zdań z źródła.
Zmień tekst oznaczenia 6 dla 3372f6d9932d: sformułuj otaczające stwierdzenia językiem operatorów, zachowaj niezmienione pola [[CODE_n]], i unikaj powtarzania zdań z źródła.
Zmień tekst oznaczenia 7 dla 3372f6d9932d: sformułuj otaczające stwierdzenia językiem operatorów, zachowaj niezmienione pola [[CODE_n]], i unikaj powtarzania zdań z źródła.
Literatura pokrewna
- Koszt obliczeniowy pętli agentów w porównaniu z chatbotami — Dlaczego planowanie w stylu ReAct oraz łańcuchy narzędzi mogą zwiększyć koszt inferyencji 10-krotnie — i jakie zasady pomagają kontrolować te wydatki.
- Projektowanie harnessu agentów od początku do wdrożenia — Uprawnienia, narzędzia, pamięć oraz mechanizmy oceny, które przekształcają prosty wrapper do czatu w wytrzymały host agentów.