Selliste agentide projekteerimine, mis ei jää lõputult tsüklisse
Levinuim produktsiooniagentide tõrge on lõputud või pseudolõputud tsüklid — agendid, mis proovivad uuesti, hargnevad ja põletavad tokeneid edasi liikumata. Arhitektuurilised mustrid, mis seda väldivad, ja toodavad agente, mis lõpetavad ka raskete ülesannete puhul.
Levinud kallis produktsiooni-AI tõrge: on teisipäeval kell 3 öösel ja klienditoe agent läheb lõputusse tsüklisse. Ta kutsub sama tööriista, saab sama vea, proovib uuesti veidi muudetud parameetriga, saab sama vea, kordab. Sadu kordi minutis. Hommikuks on meeskonnal nelja- või viiekohaline üllatusarve — sõltuvalt mudelist ja kutsete sagedusest.
See pole haruldane. Tsüklisse jäävad agendid on üks levinumaid — ja kaalukamaid — produktsioonitõrkeid. Need on kavalad, sest sageli "näivad töötavat" — agent võtab tegevusi ette, kutsed õnnestuvad (või kukuvad läbi etteennustatavalt). Alles kui logi vaatad, näed sama mustrit korduvalt.
Selliste agentide ehitamine, mis ei jää lõputult tsüklisse, nõuab teadlikke arhitektuurivalikuid. Enamik agendi-tõrkeid on etteennustatavad; nende vältimise mustrid on hästi teada. Meeskonnad, kes saadavad välja usaldusväärseid agente, on need, kes neid mustreid distsiplineeritult rakendavad.
See artikkel käsitleb, mis agente tsüklisse paneb, arhitektuurilisi mustreid, mis seda väldivad, ning operatsioonilisi piirdeid, mis tabavad tsükleid, kui need läbi libisevad.
Miks agendid tsüklisse jäävad
Mõned mehhanismid agendi-tsüklite taga:
1. Segadus edasimineku osas
Agendil pole selget tunnet "kas olen edasi liikunud?". Ta proovib midagi, vaatab tulemust, otsustab midagi muud proovida. Ilma selge edasimineku jälgimiseta võib "proovi midagi muud" tähendada "sama asja, veidi teisiti".
2. Lõpetamiskriteeriumide puudumine
Agendi promptis on kirjas "aita kasutajat", aga mitte "lõpeta, kui X on tõsi". Ilma selge lõpetamiseta jätkab agent "abistamist" — otsib veel ühte infot, proovib veel ühte tööriista, viimistleb edasi.
3. Uuestiproovimise patoloogia
Kui miski ebaõnnestub, proovivad agendid loomulikult uuesti. Ilma uuestiproovimise eelarvedeta saab sama tõrget määramatult uuesti proovida. Agent tajub "ma pole veel õnnestunud", mitte "olen seda juba 10 korda proovinud".
4. Oleku amneesia
Agendi töömälu sisaldab ainult viimaseid pööramisi. Kui tsükkel on läbinud 20 katset, näeb agent kontekstis võib-olla ainult viimast 5 — kaotades mustri, mis on välistele vaatlejatele juba ilmne.
5. Tööriista ebajärjepidevus
Tööriist tagastab segaseid või vastuolulisi tulemusi. Agent proovib uuesti. Tööriist tagastab endiselt segaseid tulemusi. Agent järeldab "võib-olla mu eelmine tõlgendus oli vale" ja proovib teisiti. Tööriist tagastab endiselt segaseid tulemusi. Tsükkel.
6. Ülemäärane optimism
Agendi treening teeb ta järjekindlaks — ta proovib edasi, kui parem strateegia oleks peatuda ja abi küsida. Eriti halb pikkade ajahorisontidega ülesannete puhul, kus väikesed segadused kuhjuvad.
7. Eesmärgi triiv
Agent kaotab tasapisi silmist, mida ta üritas saavutada. Ta hargneb alamülesanneteks, siis alam-alamülesanneteks, uurib tangentsiaalselt seotud alasid, ilma et naaseks põhieesmärgi juurde.
Erinevad agendid kukuvad läbi erinevatel viisidel. Kaitsemehhanismid kattuvad.
Muster 1: Karmid sammu-eelarved
Lihtsaim ja olulisim kaitse: maksimaalne sammude arv. Agendil on, ütleme, 20 tööriistakutset saadaval. Pärast 20-t peab ta tootma lõpliku vastuse (või eskaleerima).
Implementatsioon:
def agent_loop(query, max_steps=20):
messages = [{"role": "user", "content": query}]
for step in range(max_steps):
response = call_llm(messages, tools=available_tools)
if response.is_final_answer:
return response.content
result = execute_tool(response.tool_call)
messages.append(response)
messages.append({"role": "tool", "content": result})
# Eelarve täis — sunni lõplik vastus
return force_final_answer(messages)Eelarve peab olema kalibreeritud ülesandega. Lihtsad ülesanded: 5–10 sammu. Keerulised mitme allikaga ülesanded: 20–30. Avatud-otsaga uurimine: 50+. Aga alati piiratud.
Kui eelarve täitub, toodab agent oma parima vastuse selle põhjal, mida ta teab. Või eskaleerib inimese poole.
See üksik muster väldib enamuse katastroofilistest tsüklitest. Implementeeri see alati.
Variandid
Tokeni-eelarve. Sammu arvu asemel (või lisaks) piira tokenite koguarvu. Väldib agente, mis võtavad vähem samme, kuid iga samm on 50K-tokenine arutluskäik.
Kulu eelarve. Tõlgib sammu/tokeni eelarved eurodesse. Väldib eelarve ületusi abstraktseks jäämast.
Ajaeelarve. Reaalajaline piirang. Kasulik kasutajaliideste vooge jaoks ("vasta 30 sekundi jooksul").
Enamikul produktsiooniagentidest on kõik neli eelarvet mingis vormis. Ükskõik millise tabamine lõpetab jooksu.
Muster 2: Edasimineku jälgimine
Eelarve üksi ei ütle agendile, et ta on kinni jäänud — see lihtsalt peatab ta lõpuks. Edasimineku jälgimine aitab agendil tsüklit ära tunda ja sellest välja murda.
Lihtne implementatsioon: agent peab selget "edasimineku" logi. Igal sammul ütleb ta välja, mis uut infot ta sai või mis muutus.
Samm 1: Otsisin klienti "Smith". Leidsin 12 vastet.
Samm 2: Filtreerisin aktiivsete kontode peale. Jäi 4.
Samm 3: Kontrollisin hiljutist aktiivsust. Klient 234-l oli hiljutine tikett hinnastamise kohta.
Samm 4: Tõmbasin tiketi detailid. Kaebus oli hiljutise hinnamuudatuse kohta.
Samm 5: Koostasin vastuse mustandi. Saatmiseks valmis.Iga samm lisab uut infot. Kui agent teeb 6. sammu ja edasimineku logisse ei tule midagi juurde — sama otsing, samad tulemused, sama järeldus — siis ta käib tühikäigul.
Prompt võib sisaldada:
Enne järgmise tegevuse otsustamist tee kokkuvõte sellest, mida sa viimaste sammude jooksul õppisid. Kui pole viimase 3 sammu jooksul uut infot saanud, peatu ja kas:
- Tooda oma parim vastus praeguse infoga.
- Eskaleeri probleem: selgita, mida proovisid ja mida puudu on.See teeb "edasimineku puudumise" agendile nähtavaks, et ta saaks reageerida.
Muster 3: Korduste tuvastamine
Mõnikord kordavad agendid täpselt sama tööriistakutset. Seda on lihtne programmiliselt tuvastada.
def detect_repeat(history):
recent_calls = [c for c in history[-5:] if c.is_tool_call]
if len(recent_calls) < 3:
return False
call_signatures = [(c.tool, json.dumps(c.args, sort_keys=True)) for c in recent_calls]
return len(set(call_signatures)) < len(call_signatures) / 2Kui kordus tuvastatakse, sekku:
- Süsti sõnum: "Oled hiljuti seda tööriista nende parameetritega kutsunud. Tulemused pole muutunud. Proovi teist lähenemist või lõpeta."
- Või sunni lõpetamist.
See püüab automaatselt kõige ilmsemad tsüklid.
Muster 4: Kinnijäänud-oleku tuvastamine
Lisaks täpsetele kordustele saab tuvastada peenemaid kinnijäänud olekuid:
Mustri tuvastamine. Kasuta eraldi LLM-i kutset hindamiseks: "Vaadates viimaseid 5 sammu, kas see agent teeb edasiminekut?" Kui ei, siis murra välja.
def is_stuck(history):
recent = format_history(history[-5:])
response = call_llm(
system="Sa hindad, kas agent teeb edasiminekut.",
user=f"Hiljutised agendi sammud:\n{recent}\n\nKas agent teeb tähendusrikast edasiminekut või on kinni tsüklis? Vasta: progressing | stuck."
)
return response.content.strip() == "stuck"Jooksuta seda kontrolli iga paari sammu järel. Kui tagastab "stuck", sekku.
Tööriistade mitmekesisus. Kui agent on 5+ sammu kutsunud ainult 1 tööriista, on see kahtlane. Sunni teda midagi muud proovima või peatuma.
Veamustrid. Kui sama tööriist on tagastanud sama vea 3+ korda, lõpeta selle kasutamine. Agent ei tuleta rohkemate uuestiproovimistega puuduva sisendi peale.
Muster 5: Mõtisklemise punktid
Agendi jooksu kindlatel punktidel sunni selget mõtisklust.
Iga 5 sammu järel peab agent tootma mõtisklust:
1. Mis oli mu algne eesmärk?
2. Mida olen seni õppinud?
3. Mida pean veel teadma?
4. Kas teen edasiminekut või kordan?
5. Kas peaksin jätkama või lõpetama?Mõtisklus sunnib agenti astuma kõrvale vahetust järgmise-tegevuse mõtlemisest ja hindama suuremat pilti.
See on eriti efektiivne pikkade ajahorisontidega ülesannete puhul. Ilma sunnitud mõtisklemiseta agendid triivivad; sellega saavad nad oma triivi ise kätte.
Muster 6: Eesmärgi ankurdamine
Pikkade agendijooksude puhul kaob algne eesmärk silmist. Agendi kontekstiaken täitub vahepealsete sammudega; algne küsimus muutub suure konteksti väikeseks osaks.
Tasakaalusta seda eesmärki korduvalt ankurdades:
- Lisa algne eesmärk iga süsteemisõnumi etteotsa.
- Lase agendil eesmärk iga N sammu järel ümber sõnastada.
- Kasuta eraldi "eesmärgi-jälgijat", mis kinnitab, et iga samm on eesmärgiga kooskõlas.
Näide prompti lisandist:
Algne eesmärk: [kasutaja taotlus sõna-sõnalt]
Enne iga tegevust kinnita:
- Kas see tegevus aitab mind algse eesmärgi suunas?
- Kui jah, jätka.
- Kui ei, naase otse eesmärgi juurde.Muster 7: Alamülesannete piiritlemine
Pikad agendid jaotuvad loomulikult alamülesanneteks. Ilma struktuurita võivad alamülesanded rekursiivselt alam-alamülesandeid sünnitada, kuni agent on eksinud.
Anna struktuur:
- Agent identifitseerib alamülesanded selgesõnaliselt.
- Igal alamülesandel on oma eelarve.
- Pärast alamülesande lõpetamist (või ebaõnnestumist) naaseb agent põhiülesande juurde.
- Alamülesanded ei tohi piiramatult alam-alamülesandeid sünnitada.
Seda püüavad raamistikud nagu LangGraph formaalsustada — olekumasin, kus iga sõlm on selge samm, selgete üleminekutega.
Keerukate agentide puhul on see struktuur hädavajalik. Lihtsate jaoks on see ülearune.
Muster 8: Väljapääsud
Kui agent kinni jääb, vajab ta selgeid viise lõpetada:
Eskaleeri. "Ma ei suuda seda ülesannet lõpule viia. Siin on, mida proovisin ja mis puudu on." Agent peatub ja toob probleemi pinnale.
Osaline täitmine. "Olen lõpetanud osad A ja B. C on blokeeritud X-i tõttu." Agent ei pea täielikult õnnestuma; ta võib toota kasulikku osalist väljundit.
Selgitus. "Vajan kasutajalt rohkem infot: ..." Agent peatub ja küsib.
Need peaksid olema agendi jaoks esmaklassilised valikud, mitte viimased abinõud. Agendi prompt peaks neid mainima ja julgustama nende kasutamist, kui kinni jääb.
Kasulik prompti lisand:
Kui satud mõnda neist olukordadest, lõpeta proovimine ja vasta kohaselt:
- Tööriist tagastab järjepidevalt sama vea.
- Oled proovinud 3 erinevat lähenemist ilma edasiminekuta.
- Vajad infot, mida saab anda ainult kasutaja.
- Ülesanne on keerulisem, kui sinu tööriistad toetavad.
Nendel juhtudel:
- Tööriista vigade puhul: selgita probleemi, soovita kasutajal pöörduda toe poole.
- Edasimineku puudumise puhul: anna teada, mida proovisid, ja küsi juhiseid.
- Puuduva info puhul: küsi kasutajalt konkreetne küsimus.
- Keerukuse puhul: eskaleeri inimabi poole koos kokkuvõttega.Muster 9: Kindlust-arvestavad tegevused
Agent peab teadma, millal ta on kindel ja millal mitte. Madalal kindlusel tegutsemine on see, kuidas tsüklid algavad.
Muster: iga kaalukas tegevus nõuab selget kindlust.
Enne delete_record kutsumist väljenda oma kindlust 1–5 skaalal, et see on õige tegevus. Kui <4, ära kutsu. Selle asemel küsi inimese kinnitust.See töötab eriti hästi destruktiivsete või kallite tegevuste puhul. Agent peab pühenduma kõrgele kindlusele enne, kui nad ette võtab.
Kombineeritud mõtisklemisega, püüab see olukordi, kus agent "proovib asju", selle asemel et "plaani teostada".
Muster 10: Tööriista-tasandi piirded
Lisaks agendi-tasandi mustritele võivad tööriistadel endil olla piirded:
Sessiooni-põhine kõnesagedus. Tööriista saab sessioonis kutsuda ainult N korda. Pärast N-i tagastab "rate limit". Sunnib agenti midagi muud tegema.
Idempotentsus. Korduvad identsed kutsed tagastavad puhverdatud tulemuse ilma uuesti käivitamata. Väldib tsükleid, mis tööriista pommitavad.
Kulukatted. Kallitel tööriistadel (rasked DB-päringud, kasutuskuludega kolmandate osapoolte API-d) on sessiooni-põhised piirangud.
Tõrke-kaitselülitid. Tööriist, mis on selles sessioonis 3 korda läbi kukkunud, lülitatakse välja. Agent ei saa seda enam kutsuda.
Need täiendavad agendi-tasandi mustreid. Agent võib proovida tsüklisse minna, kuid tööriist takistab seda.
Muster 11: Väline monitooring
Kõikidele in-agent mustritele on lisaks väline monitor, mis tabab seda, mis läbi libiseb.
Monitoorimisprotsess jälgib kõiki jooksvaid agente. Ta kontrollib:
- Sammude arvu agendi kohta.
- Tokenikasutust agendi kohta.
- Kulu agendi kohta.
- Aega agendi kohta.
- Tööriistakutsete mustreid.
Kui mingi agent ületab künniseid, tapa see. Saada hoiatus.
See on viimane kaitseliin. Isegi kui agent ise on katki, püüab monitor selle enne, kui ta rahakotti kahjustab.
Implementatsioonis:
- Aegridade andmebaas jälgib agendi mõõdikuid.
- Reeglid käivitavad tapmiskorraldusi ("kui agent on jooksnud > 5 minutit, tapa").
- Väike teenus jälgib ja jõustab.
Süsteemides, mis jooksutavad korraga palju agente, on see hädavajalik.
Muster 12: Inimene-tsüklis kontrollpunktid
Kõrge panusega agentide puhul ehita sisse inimkontrollpunktid. Agent jookseb kontrollpunktini, siis ootab inimese kinnitust.
Tüüpilised kontrollpunktid:
- Enne destruktiivseid tegevusi.
- Pärast otsust, mida agent ei saa tagasi pöörata.
- Pika ülesande peamiste verstapostide juures.
- Kui kindlus langeb.
See pole umbusalduse väljendus — see on vigade püüdmine ajal, kui neid on odav parandada.
Praktiline töövoog: agent teeb ettevalmistustöö autonoomselt, toob esile kokkuvõtte ja pakutavad tegevused, inimene kinnitab, agent teostab. Inimene on tsüklis otsuste, mitte iga sammu jaoks.
Läbi tehtud näide: pikalt jooksev uurimisagent
Illustreerimiseks, mustrid rakendatud päris agendi peale:
Ülesanne: Uuri konkurenti ja koosta briif.
Hinnanguline töö: 10–30 veebiotsingut, 20–50 lehe lugemist, süntees 1000-sõnaliseks briifiks.
Rakendatud mustrid:
- Sammu-eelarve: kokku 60 sammu.
- Tokeni-eelarve: 300K tokenit (kontekst + tegevused). Kui ületatud, võta praegused leiud kokku ja jätka.
- Kulu eelarve: 2 € jooksu kohta. Kui ületatud, peatu ja tagasta osaline briif.
- Ajaeelarve: 5 minutit reaalaega.
- Edasimineku jälgimine: Igal sammul värskendab agent "leidude logi" uue infoga. Kui möödub 3 sammu uute leidudeta, põgene.
- Korduste tuvastamine: Kui sama otsingupäring tehakse kaks korda sarnaste tulemustega, sunni teistsugust lähenemist.
- Mõtisklemise punktid: Iga 10 sammu järel mõtiskleb agent edasimineku ja allesjäänud töö üle.
- Eesmärgi ankurdamine: Algse briifi siht iga süsteemisõnumi etteotsas.
- Väljapääsud: "Mul on piisavalt infot" või "Ma ei leia piisavalt infot" lõpetavad mõlemad agendi graatsiliselt.
- Väline monitor: Sõltumatu jälgija tapab agendid, mis eelarveid ületavad.
Tulemus: Mediaan jooksuaeg 3 minutit. Mediaan kulu 0,40 €. Tõrkemäär (tsüklid või time-out'id) < 1%. Toodetud briifid on 700–1200 sõna, faktiliselt põhjendatud, kasulikud lähtepunktid.
Ilma nende mustriteta: aeg-ajalt 30-minutilised jooksud, aeg-ajalt 20 €+ kulu, aeg-ajalt kinni jäänud sessioonid. Mustrid vähendavad saba dramaatiliselt.
Tuvastamine produktsioonis
Isegi mustritega libisevad aeg-ajalt probleemid läbi. Tuvasta need:
Hoiatused pikalt jooksvate agentide kohta. Iga agent, mille kestus on > 2x mediaan, käivitab hoiatuse.
Hoiatused kulu hüpete kohta. Agendi-põhine või kogukulu üle künnise.
Hoiatused korduvate mustrite kohta. Tööriistakutsete mustrid, mis viitavad tsüklitele.
Päevane pikalt jooksvate logide ülevaade. Inimene heidab pilgu päevas pikimatele 10 logile. Püüab probleeme, mida eval'id ei taba.
Agregeeritud mõõdikud: tsükli sagedus ajas. Püüab, kui miski muutub (mudeli uuendus, prompti muutus), mis tsüklisageduse tõstab.
Kasulik töölaud: agendi jooksupikkuste jaotus. Saba räägib sulle tsüklite esinemissagedusest.
Levinud vead
Mõned mustrid, mida näeme korduvalt:
Viga 1: Pole sammu-eelarvet. "Lisame siis, kui vaja." Siis läheb agent kell 3 öösel tsüklisse ja sa soovid, et oleksid selle lisanud. Lisa see alati esimesest päevast peale.
Viga 2: Liiga kõrged eelarved. "100 sammu peaks rikkalikult olema" — aga tsükkel täidab selle ära. Sea eelarved mediaani + 2–3x peale, mitte halvima juhtumi peale.
Viga 3: Pole välist monitori. Usaldad agendile, et ta ennast peatab. Mõnikord ta seda ei tee. Väline monitor on produktsioonis hädavajalik.
Viga 4: Püüa tsüklid kinni, aga analüüsi pole. Tsükkel juhtub, monitor tapab selle, meeskond liigub edasi. Sama tsükkel juhtub järgmisel nädalal. Tee püütud tsüklite kohta alati järelanalüüs — mis selle käivitas, mis muutus, kas saame seda tüüpi tõrget vältida?
Viga 5: Agressiivne mõtisklus lihtsate ülesannete puhul. Mõtisklemise sundimine iga 5 sammu järel 5-sammulise ülesande puhul on tühi kulu. Kalibreeri ülesande keerukusega.
Viga 6: Eesmärgid kaovad pikkades kontekstides. Eesmärk, mida mainiti üks kord 1. sammus, ei ela 50. sammuni. Ankurda regulaarselt uuesti.
Viga 7: Agendi enesetunnistuste usaldamine edasimineku kohta. Agendid ütlevad, et nad teevad edasiminekut, kui nad seda ei tee. Verifitseeri väliselt, kus võimalik.
Viga 8: Lased agentidel ennast rekursiivselt kutsuda. "Lammuta see ülesanne alam-agentideks" võib toota eksponentsiaalseid agentide sünnitusi. Kui lubad, eelartlikult range eelarvega.
Millal tsüklid on vastuvõetavad
Mitte kõik tsüklid pole halvad. Mõned ülesanded nõuavad õigustatult palju iteratsioone:
- Koodi iteratiivne viimistlemine (kirjuta, testi, paranda, korda).
- Mitmesammuline uurimine hargnemisega.
- Optimeerimisülesanded (proovi variante, hinda, viimistle).
Nende jaoks on tsüklid töö, mitte tõrge. Mustrid nihkuvad:
- Helded sammu-eelarved (50–200 sammu).
- Selge "iteratsiooni" raamistus, mitte "tsükli" raamistus.
- Kvaliteediparanduse jälgimine — iga iteratsioon peab parandama mõõdikut.
- Karm peatus, kui paranemine tasapinnaks muutub.
Põhimõte: erista "ettenähtud iteratiivset tööd" "ettenägematutest tsüklitest". Rakenda mustreid igaühele kohaselt.
Kokkuvõte
Agendid, mis jäävad lõputult tsüklisse, on etteennustatavad, levinud ja välditavad. Mustrid on hästi teada: sammu-eelarved, edasimineku jälgimine, korduste tuvastamine, mõtisklemine, eesmärgi ankurdamine, väljapääsud, tööriista-piirded, välised monitorid.
Need pole valikuline lihv. Need on vahe agentide vahel, mis tootmisse lähevad, ja nende vahel, mis toodavad üllatusi neljakohaliste arvedega.
Iga produktsiooniagendi jaoks on kontrollnimekiri:
- [ ] Maksimaalne sammu-eelarve.
- [ ] Maksimaalne tokeni-eelarve.
- [ ] Maksimaalne kulu eelarve.
- [ ] Maksimaalne ajaeelarve.
- [ ] Korduvate kutsete tuvastamine.
- [ ] Edasimineku jälgimine.
- [ ] Perioodiline mõtisklemine.
- [ ] Eesmärgi ankurdamine.
- [ ] Mitu väljapääsu.
- [ ] Väline monitor tapmisvõimekusega.
Iga ühte on lihtne implementeerida. Koos teevad nad vahe "see agent on ohtlik jätta jooksma" ja "see agent on produktsioonis usaldusväärne" vahel.
Ehita mustrid sisse. Testi neid. Saba-risk, mida sa kõrvaldad, on tehtud töö mitmekordselt väärt.