Галоўная / Артыкулы

Адзіннадцаць спосабоў перарваць бесканечныя цыклы AI-агента

Адказваць на сітуацыі, калі інструмент застрэліўся пад час работы, дадаць умовы зупнення і вярнуцца да паказчыковых точакоў замест адносна большай колькіць токенав.

Выдавец: REACTAPP.TOP11 хв чытання2555 слоў

Крыніцы: **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. Чаму агенты AI застрэліваюць у ціклах?

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

Прыклады

Калі працуеце з прыкладамі, спачатку запісайце умовы вярбунка: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс пераконтроўвае чыстасць пазнейшых змян у кодзе. Дакументавайце як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам. Зробіце пераконтроль пасля дорогіх крокаў. Сістэма вярнення не павінна знову ставіць плату за той самы вызов LLM, калі аператар перапрыбуе пазнейшы вузел. Калі працуеце з прыкладамі, спачатку запісайце умовы вярбунка: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс пераконтроўвае чыстасць пазнейшых змян у кодзе. Спрыймайце гэты этап як угоду між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць параметры пераконтроўвання успеху і адмовіцеся ад тыхнейкага частковага завершэння.

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. Адкліканне павтараючыхся дзеянняў

  1. Адэкватная дыягностыка павтараючыхся дзеянняў лепшая працуе, калі яе расследжваюць як мерыемую велічыну. Запісайце адны ідэальны прыклад работы, адну справу з бягам і прыметкі па вярнэнню да пачатковага стану прычым расшырэнню масштаба. Запісвайце часы выканання і вартасць токеноў або запытак праза функцыйнае рэзультат. Відразлівае паказанне вартасцей запобегае неспадзяваным рахункам, калі працэс пераходзіць з дэмавайнага рэжыма ў спяльныя асяроддзя. Храніце стан графа ў простам і тыпаваным фармаце. Вярнутыя структуры маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшваюць продажчыку працу пасля перарываў.
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. Адкліканне нестачы прагрэсу

  1. Адэкватная дыягностыка нехваткі прагрэсу лепшая, калі яе расследжваць як мерыемую велічыну. Зафіксавайце адны ідэальны прымер, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Дакументавайце як успішны, так і варыянт вярнэння да нормальнага стану. Перапрыбуткі, людзкія контраліны і обработка некорэктных паведамленняў ёсць часткай продукту, а не элементамі пазнейшай доработкі. Храніце стан графаў у простам і тыпаваным фармаце. Вярнутыя структуры дакументаў маскуюць інфармацыю пра тое, калькі вузел запісаў кожны поле, і спакойваюць працэс пасля перарываў.
  2. Адэкватная дыягностыка нехваткі прагрэсу лепшая, калі яе расследжваць як мерыемую велічыну. Зафіксавайце адны ідэальны прымер, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Расследжвайце гэты этап як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы всім элементам, задайце крытэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння задачы.
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, неабяжна чыста адзначэння статусу «завершана» работа: спачатку запісайце угоду — неабяжныы вхідныя даныя, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такій чэк-ліст дапамагае заставіць пазнейшыя змены коду быць чыстымі. Храніце настройкі парадульна коду прыемлена. Файлы сераўіснага сэрвісу, храненні секрэтных даных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аўдыт без неабяжнага чытання всіх элементаў. Стварайце контрольныя пункты пасля дорогіх крокаў. Сістэма вярнення работы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе працу да наступнага элемента.

I found an order.
Done.
Task:
Find latest order

Done when:
- customer identified
- orders retrieved
- orders sorted by date
- latest order selected
- result returned

Аналагія з рэальнага жыцця

Калі працуеце з аналагіямі з рэальнага свету, спачатку запісайце «кантракт»: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Документавайце як шлях успеху, так і шлях вярнення. Перапрыбуткі, людзкіе контрольныя пункты і обработка некорэктных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам. Стварайце контрольныя пункты пасля дорогіх крокаў. Сістэма вярнення не должна зноў выклікаць той самы вызов LLM, калі аператар перапрыбуе пазнейшы вузел. Калі працуеце з аналагіямі з рэальнага свету, спачатку запісайце «кантракт»: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрыятлівае ставленне да гэтага этапу як да кантракта межа данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задайце крытэрыяі успеху і адмовіцеся ад мовчанкавага частковага завершэння.

Destination reached

9. Дадзіце можласць абсервабельнасці раней, чым яе патрэбуеце

  1. Найкрашчы спосаб прыўнесення можлівасцяў абзору раней, чым яны патрэбны, — гэта калі іх расследжваць як вімерную характэрыстыку. Зберагачыце адна «золатая» транскрыпцію, адын прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць сферу дзеяння. Запісвайце часы выканання і вартасць токенаў аб запытоў па боку ад функцыйнальных рэзультатаў. Візуабілізацыя вартасцей з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя сераўы. Храніце стан графа ў простам і тыпаваным фармаце. Вярнутыя структуры даных маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшваюць продажчыку працу пасля перарываў.
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. Безпечнейшы цыкл агента

  1. Безпечнейшы цыкл агента працюе наякраўсі, калі яго спрыяваць як вімерную паверхню. Зафіксавайце адна ідэальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць сферу дзеяння. Зберагаюце настройкі пазыроўна ад коду прыемлівача. Файлы сераўнавальнага сераўса, хранілішчы секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабходнасці чытання всей структуры. Зберагаюце стан графа у простам і тыпаваным фармаце. Вярнутыя блокі маскуюць інфармацыю пра тое, які вузел запісаў якое поле, і спакоююць продаж чытання пасля перэрываў.
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. Мадэль прымячае рашэнне. Сістэма яго выканання.

  1. Мадэль прыме рашэнне. Канструкцыя яго выконвае. Сістэма працуе лепша, калі яе спрыяваць як меравальную паверхню. Перад расшырэнням масштаба зафіксавайце адны ідэальны прыклад работы, адну сітуацыю неудачы і прыметку па адвярнэнню. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія контрольны пункты і обработка некорэктных звесцей ёсць частынай продукту, а не пасляднім дапрацоўкам.
  2. Мадэль прыме рашэнне. Канструкцыя яго выконвае. Сістэма працуе лепша, калі яе спрыяваць як меравальную паверхню. Перад расшырэнням масштаба зафіксавайце адны ідэальны прыклад работы, адну сітуацыю неудачы і прыметку па адвярнэнню. Спрыяваць гэты этап як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы всім элементам, задайце крытэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння задачы.
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]] без змян і утрымвайцеся ад повторэння рэчэй з выкладку.