Одиннадцать способов прервать бесконечные циклы ИИ-агента
Обнаруживайте циклы застревания инструмента, добавляйте условия остановки и восстанавливайтесь с точками контроля вместо использования дополнительных токенов.
Источники: **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. Почему ИИ-агенты застревают в циклах?
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. Простой цикл агента
Необходимо внедрять проверку со стороны человека для операций, связанных с тратой денег или изменением производственных данных. Простая настройка во время компиляции не гарантирует полноты обработки бизнес-логики.
while (!done) {
const action = await model.decide(context);
const result = await executeTool(action);
context.push(result);
}
Model
↓
Tool
↓
Result
↓
Model
↓
Tool
↓
Result
↓
...
Пример из реальной жизни
В качестве примера из реальной практики необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Необходимо одновременно задокументировать успешный и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Внедрять утверждение человеком для операций, связанных с тратой денег или изменением производственных данных. Настройка на этапе компиляции не гарантирует полноты функционала продукта. В качестве примера из реальной практики необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия элементам, определите критерии успеха и не допускайте безответственного частичного завершения работы.
get_refund_status()
Refund pending
get_refund_status()
3. Установите бюджет для агента
При работе над пунктом 3. Установите бюджет для агента сначала запишите условия контракта: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает избегать ошибок при последующих изменениях кода. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Выполняйте проверку после дорогостоящих шагов. Система возобновления работы не должна снова взимать плату за один и тот же вызов LLM, если оператор пытается выполнить последующий этап.
const MAX_STEPS = 12;
const MAX_TOOL_CALLS = 20;
const MAX_RUNTIME_MS = 30_000;
Почему использовать несколько лимитов?
При работе над разделом «Зачем использовать несколько лимитов?» сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и что происходит при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Храните конфигурацию вне кода приложения. Файлы с настройками окружения, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Создавайте контрольные точки после дорогостоящих операций. Функция возобновления работы не должна снова взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий шаг.
Steps → reasoning budget
Tool calls → external API budget
Time → latency budget
Tokens → model cost
Примеры
При работе с примерами сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Документируйте как успешный, так и восстановительный пути выполнения. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Выполняйте контрольные точки после дорогостоящих операций. Механизм возобновления работы не должен повторно взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий этап. При работе с примерами сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Рассматривайте этот этап как договор между входными данными и проверенными выходными результатами. Дайте названия создаваемым элементам, определите критерии успеха и не допускайте безусловного частичного завершения работы.
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. Обнаружение повторяющихся действий
- Обнаружение повторяющихся действий работает наилучшим образом, когда рассматривается как измеримая характеристика. Сначала необходимо зафиксировать один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию, прежде чем расширять объем исследования. Рядом с функциональными результатами следует записывать временные показатели, а также стоимость токенов или запросов. Отображение затрат с самого начала помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам. Состояние графа следует сохранять простым и типизированным; вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и могут нарушить возобновление работы после прерываний.
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);
Но точное совпадение недостаточно
Но точное совпадение недостаточно — лучший результат достигается, когда это рассматривается как измеримая поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь граф. Сохраняйте состояние графа простым и типизированным. Вложенные структуры данных скрывают информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.
search("Node.js latency")
search("nodejs latency")
search("Node latency")
5. Обнаружение отсутствия прогресса
- Обнаружение отсутствия прогресса работает наилучшим образом, когда рассматривается как измеримая характеристика. Соберите один эталонный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Задокументируйте как успешный, так и восстановительный пути выполнения. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не этапом последующей доработки. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил какое поле, и мешают возобновлению работы после прерываний.
- Обнаружение отсутствия прогресса работает наилучшим образом, когда рассматривается как измеримая характеристика. Соберите один эталонный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия соответствующим элементам, определите критерии успеха и не допускайте молчаливого частичного завершения работы.
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
Полезная модель мышления
Чтобы иметь полезную модель мышления, определите входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. При следующем шаге, представляющем собой код или вызов инструмента, отдавайте предпочтение структурированным выводам с проверкой схемы перед произвольными текстовыми описаниями.
How many actions did the agent take?
What changed after each action?
6. Не пытайтесь повторить бездумно
Что касается пункта 6: не пытайтесь перепробовать решения слепо — определите входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Вводите человеческое утверждение для операций, связанных с тратой денег или изменением производственных данных. Подключение компонентов во время компиляции не гарантирует полноты бизнес-логики.
charge_card()
→ timeout
Тот же принцип применяется к агентам
Для агентов также действует тот же принцип: необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Необходимо одновременно задокументировать успешный и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Внедрять утверждение человеком для операций, связанных с тратой денег или изменением производственных данных. Настройка на этапе компиляции не гарантирует полноты функционала продукта. Для агентов также действует тот же принцип: необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия элементам, определите критерии успеха и не допускайте безответственного частичного завершения работы.
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. Укажите агенту стратегию восстановления
При работе над пунктом 7. Укажите агенту стратегию восстановления сначала запишите условия контракта: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе с демо-среды в общедоступные среды. Создавайте контрольные точки после дорогостоящих шагов. Функция возобновления не должна снова взимать плату за один и тот же вызов LLM, когда оператор пытается выполнить последующий узел.
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. Четко определите момент завершения
При работе над пунктом 8 необходимо четко указать, что сделано: сначала запишите условия работы — требуемые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы с настройками окружения, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Создавайте контрольные точки после дорогостоящих операций. Функция возобновления работы не должна повторно взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий шаг.
I found an order.
Done.
Task:
Find latest order
Done when:
- customer identified
- orders retrieved
- orders sorted by date
- latest order selected
- result returned
Аналогия из реальной жизни
При работе с аналогией реального мира сначала запишите условия работы: необходимые входные данные, сигнал о успехе и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Документируйте как успешный, так и восстановительный пути выполнения. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не последующими улучшениями. Выполняйте контрольные точки после дорогостоящих шагов. Система возобновления работы не должна снова взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить последующий этап. При работе с аналогией реального мира сначала запишите условия работы: необходимые входные данные, сигнал о успехе и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успеха и не допускайте безответственного частичного выполнения задач.
Destination reached
9. Добавьте возможности для наблюдения до того, как они понадобятся
- Лучший способ обеспечения возможности наблюдения — рассматривать её как измеримую характеристику до того, как она понадобится. Сначала соберите один эталонный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию, прежде чем расширять объём работы. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам. Сохраняйте структуру графа простой и типизированной; вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и могут нарушить возобновление работы после прерываний.
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. Более безопасный цикл агента
- Более надежный цикл агентов работает лучше всего, когда его рассматривают как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работы. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь граф. Сохраняйте состояние графа простым и типизированным. Вложенные структуры данных скрывают информацию о том, какой узел заполнил тот или иной поле, и приводят к нарушению продолжения работы после перерывов.
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. Модель принимает решение. Инструментарий его обеспечивает.
- Модель принимает решение. Инструментарий обеспечивает его выполнение. Система работает наилучшим образом, когда рассматривается как измеримая поверхность. Перед расширением объёма работы соберите один идеальный пример выполнения, один случай сбоя и запись о возврате к предыдущему состоянию. Документируйте как успешный, так и восстановительный пути работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не этапом последующей доработки. Установите лимиты на количество токенов за один ход и за сессию. Инструменты агентов активно расширяют контекст; жёсткие ограничения предотвращают появление неожиданных счетов.
- Модель принимает решение. Инструментарий обеспечивает его выполнение. Система работает наилучшим образом, когда рассматривается как измеримая поверхность. Перед расширением объёма работы соберите один идеальный пример выполнения, один случай сбоя и запись о возврате к предыдущему состоянию. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия соответствующим документам, определите критерии успеха и откажитесь от молчаливого частичного выполнения задач.
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
Цель не в устранении циклов
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?
Чек-лист для работы
☑ 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?
Заключительные мысли
Спасибо, что являетесь частью сообщества
Чек-лист операций
Маркер переписи 1 для 3372f6d9932d: перефразируйте соседние утверждения на языке операторов, сохраните полейа [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.
Маркер переписи 2 для 3372f6d9932d: перефразируйте соседние утверждения на языке операторов, сохраните полейа [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.
Маркер переписи 3 для 3372f6d9932d: перефразируйте соседние утверждения на языке операторов, сохраните полейа [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.
Перепишите маркер 4 для 3372f6d9932d: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.
Перепишите маркер 5 для 3372f6d9932d: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.
Перепишите маркер 6 для 3372f6d9932d: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.
Перепишите маркер 7 для 3372f6d9932d: перефразируйте сопутствующие утверждения на языке операторов, сохраните поле [[CODE_n]] без изменений и избегайте повторения предложений исходного текста.