Ce este un AI agent: cinci tipuri clasice, două definiții rivale
Lumea aspiratorului stricată de patru ori: fiecare ruptură câștigă unul dintre cele cinci tipuri clasice de agent.
Pe această pagină
Iată aceeași întrebare, pusă de două ori aceluiași model, cu aceleași weights și greedy decoding. Singura diferență este că a doua oară exista un tool în catalog.
no tools in the catalogue
turn 1 prompt= 39 out= 8 finish=stop TEXT "The capital of France is Paris."
=> model calls=1 prompt tokens=39 output=8 wall=974 ms
one tool in the catalogue: get_temperature(city)
turn 1 prompt= 185 out= 20 finish=tool_calls CALL get_temperature({"city": "Paris"})
tool get_temperature -> {"city":"Paris","celsius":11}
turn 2 prompt= 235 out= 18 finish=stop TEXT "The capital of France is Paris. It is
currently at 11 degrees Celsius."
=> model calls=2 prompt tokens=420 output=38 wall=6,685 msUn apel a devenit două. Treizeci și nouă de token de intrare au devenit 420, un factor de 10,8. Sub o secundă a devenit aproape șapte. Iar răspunsul a primit un fapt pe care nu îl ceruse nimeni, dintr-un tool pe care modelul a ales să îl apeleze pentru o întrebare care nu menționa niciodată vremea.
Al doilea sistem este ceea ce cea mai mare parte a industriei din 2026 numește agent. Sau nu este unul, în funcție de care dintre cele două definiții cel mai des citite o deschizi — iar cele două nu spun același lucru. Una nici măcar nu este de acord cu ea însăși.
Acest dezacord este capitolul de față. Nu este o ceartă de vocabular: cele două definiții trasează granița pe axe diferite, iar axa pe care o alegi decide ce construiești și pentru ce ești facturat. Ambele se sprijină pe o taxonomie mai veche, iar cea mai ieftină cale de a o câștiga este să construiești cel mai prost agent din lume.
Afișează detaliile
De ce are nevoie acest capitol din cele anterioare.
- Capitolul 13 a măsurat cât costă un singur apel în timp; acest capitol înmulțește asta cu numărul de ture.
- Capitolul 15: prompt este starea completă a modelului, pentru că nimic nu supraviețuiește apelului.
- Capitolul 16: token de intrare cresc cu pătratul conversației.
- Capitolul 18: catalogul de tool-uri și turul dus-întors în care modelul cere, iar codul tău execută.
Fără tensori aici. Capitolul este TypeScript, acolo unde îl pune regula de limbaj din Capitolul 14, iar bucla lui este strămoșul direct al celei din Capitolul 23.
Un robot cu două camere
Link către secțiunea: Un robot cu două camereCel mai vechi exemplu din domeniu este un aspirator într-o lume cu două pătrate, A și B, fiecare fie curat, fie murdar.1 A supraviețuit în fiecare manual pentru că este cea mai mică lume în care un agent poate avea dreptate sau se poate înșela.
Perceptul este o pereche — unde sunt și dacă aici este murdar — iar acțiunile sunt SUCK, LEFT și RIGHT. Întregul program este o singură linie.
type Percept = { dirty: boolean; where?: "A" | "B" };
type Action = "SUCK" | "LEFT" | "RIGHT";
const textbook = (p: Percept): Action =>
p.dirty ? "SUCK" : p.where === "A" ? "RIGHT" : "LEFT"; Rulează-l împotriva fiecărei configurații inițiale a lumii cu două pătrate:
A dirty, B dirty, start A -> steps=3 clean=true
A clean, B dirty, start A -> steps=2 clean=true
A dirty, B clean, start B -> steps=2 clean=trueAcesta este un simple reflex agent: acționează doar pe perceptul curent, fără memorie a vreunui lucru de dinainte. Nu este o categorie-jucărie — un termostat este una, la fel și un singur apel către un model de limbaj fără conversație atașată.
Acum strică-l așa cum o face realitatea. Un robot aspirator real are un senzor de murdărie și o bară de protecție, nu un pătrat etichetat A sub covor. Scoate locația din percept și nu schimba nimic altceva:
const dirtOnly = (p: Percept): Action => (p.dirty ? "SUCK" : "RIGHT");A dirty, B dirty, start A -> steps=3 clean=true still dirty=0
t=0 at=A percept={dirty:true} -> SUCK
t=1 at=A percept={dirty:false} -> RIGHT
t=2 at=B percept={dirty:true} -> SUCK
A dirty, B clean, start B -> steps=500 clean=false still dirty=1
t=0 at=B percept={dirty:false} -> RIGHT
t=1 at=B percept={dirty:false} -> RIGHT
t=2 at=B percept={dirty:false} -> RIGHT
t=3 at=B percept={dirty:false} -> RIGHTAcelași program, două pătrate. Dintr-o stare inițială termină în trei pași; din alta intră în peretele din dreapta de cinci sute de ori și ar continua până i s-ar termina bateria. Nu poate percepe diferența dintre cele două situații, deci nu poate acționa diferit în ele. Russell și Norvig formulează rezultatul general într-o singură linie: buclele infinite sunt adesea inevitabile pentru simple reflex agents în medii parțial observabile.1
Există o rezolvare care costă o linie și zero memorie, merită măsurată înainte să întindem mâna după ceva mai inteligent.
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);
const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT"); Două mii de rulări ale unui coridor complet murdar la trei dimensiuni, cu același generator seed-uit peste tot:
| camere | pași medii | mediană | cel mai rău din 2.000 | nu a terminat niciodată |
|---|---|---|---|---|
| 2 | 4,0 | 4 | 13 | 0 |
| 4 | 16,6 | 14 | 81 | 0 |
| 8 | 68,7 | 52 | 306 | 0 |
Randomizarea elimină complet bucla. Dar costă: opt camere au nevoie de cincisprezece mișcări dacă știi ce faci, iar acest agent are o medie de 68,7 și o dată a avut nevoie de 306. Acesta este întregul capitol în miniatură. Fiecare capabilitate pe care o adăugăm cumpără corectitudine într-un caz pe care agentul anterior nu îl putea gestiona și facturează pentru ea într-o monedă pe care trebuie mai întâi să o numești.
Numirea părților, acum că sunt necesare
Link către secțiunea: Numirea părților, acum că sunt necesareUn agent percepe mediul prin senzori și acționează prin actuatori. Programul de agent este funcția de la percepturi la acțiuni — fiecare listare de mai sus este una. Secvența de percepturi este tot ce a fost perceput până acum, iar un simple reflex agent ignoră totul în afară de ultimul element.
Raționalitatea este cuvântul pe care cele mai multe articole îl greșesc, iar dacă îl nimerești, restul capitolului devine utilizabil. Un agent nu este rațional sau irațional în sine. Russell și Norvig definesc un agent rațional ca fiind unul care, pentru fiecare secvență posibilă de percepturi, selectează acțiunea despre care se așteaptă să maximizeze măsura de performanță, având în vedere dovezile acelei secvențe și orice cunoștințe încorporate are.1 Măsura de performanță nu este în interiorul agentului: aparține designerului, iar raționalitatea este definită doar relativ la ea.
Specificația se scrie convențional ca patru lucruri, PEAS: măsură de performanță, mediu, actuatori, senzori.
| robotul aspirator | un support agent în producție | |
|---|---|---|
| măsura de Performanță | pătrate curate, pe unitate de baterie | tichete rezolvate, pe dolar, fără escaladare |
| mEdiul | podeaua, murdăria, mobila, covorul | coada de tichete, baza ta de date, clientul |
| Actuatorii | roți, aspirație | tool calls |
| Senzorii | senzor de murdărie, bară de protecție | mesajul utilizatorului, rezultatele tool-urilor |
Observă care rând este cel ciudat. Aproape fiecare echipă care construiește agents în 2026 notează E, A și S — schemele tool-urilor, integrările, formatul mesajului — pentru că fără ele codul nu rulează. Aproape nimeni nu notează P. Fără ea, „agentul nostru se descurcă bine” nu are un sens pe care cineva să îl poată verifica, iar „rațional” nu poate fi aplicat deloc sistemului, ci doar unei demonstrații. Capitolul 29 este despre transformarea lui P într-un număr, iar acesta este motivul pentru care există.
┌───────────────────────── the environment ─────────────────────────┐
│ │
│ ┌──────────────────────── the agent ─────────────────────┐ │
│ │ │ │
───┼──►│ sensors ──► the agent program ──► actuators ─────┼──────┼──►
percept │ │ action
│ └────────────────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────────────────┘
▲
the performance measure lives out here, in the head of
whoever built the thing, and the agent cannot change itMediile de sarcină sunt clasificate în continuare de-a lungul a șapte axe, dintre care cinci decid cea mai mare parte a dificultății de aici: complet sau parțial observabil, determinist sau nu, episodic sau secvențial, static sau dinamic, cunoscut sau necunoscut.1 Un agent care vorbește cu tool-uri reale printr-o rețea reală se află în colțul greu al tuturor celor cinci — nedeterminist chiar și la temperatură zero (Capitolul 17) și, cel subestimat, necunoscut, pentru că nu ai un model fiabil despre ce fac propriile tale tool-uri lumii. De aceea bucla din Capitolul 23 are nevoie de tratarea erorilor mai mult decât de planificare.
Adăugarea memoriei și găsirea următorului perete
Link către secțiunea: Adăugarea memoriei și găsirea următorului peretePodelele reale nu sunt unidimensionale, așa că promovează lumea la un plan. Diezii sunt pereți, asteriscurile sunt murdărie, iar robotul pornește în camera din mijloc:
col 0 1 2 3 4 5 6
row 0 * . . # . . *
row 1 . # . # . # .
row 2 . # . S . # . S = the robot starts here
row 3 . # . # . # .
row 4 * . . # . . *Upgrade-ul evident este memoria. Agentul păstrează o hartă: fiecare pătrat pe care a stat și fiecare pătrat unde s-a declanșat bara de protecție. Regula lui este să meargă într-un pătrat adiacent pe care nu l-a vizitat — dreapta, apoi jos, apoi stânga, apoi sus — și să se retragă când totul în jurul lui este cunoscut. Acesta este un model-based reflex agent: menține stare internă din istoricul percepturilor, așa că poate acționa pe baza a ceea ce nu vede în momentul curent.
Este o îmbunătățire reală și tot nu este suficient:
5,000 steps allowed -> steps=5,000 distinct squares visited=13/25 still dirty=2/4Cinci mii de mișcări, jumătate din podea nevăzută. Harta este corectă, iar regulile sunt corecte. Ce nu poate face agentul este să folosească harta ca să meargă undeva: regulile lui răspund mereu doar la „în care dintre cei patru vecini ar trebui să pășesc”, așa că odată ce rămâne fără pătrate nevizitate lângă el, nu are nicio cale să exprime gândul există un pătrat nevizitat la opt mișcări distanță și aș vrea să stau pe el. Știe unde este. Nu știe unde vrea să fie.
Un obiectiv, apoi un motiv să preferi o rută în locul alteia
Link către secțiunea: Un obiectiv, apoi un motiv să preferi o rută în locul alteiaUn goal-based agent deține, pe lângă modelul său despre lume, o descriere a situației pe care vrea să o producă și alege acțiuni căutând prin secvențe ale acestora până găsește una care se termină acolo. Obiectivele transformă selecția acțiunii dintr-o căutare în tabel într-o căutare propriu-zisă.
Obiectivul este „nu rămâne niciun pătrat murdar”. Căutarea este o parcurgere breadth-first până la cel mai apropiat pătrat murdar, iar calea pe care o returnează este planul.
goal-based (fewest moves) -> moves=27 battery=52 still dirty=0
from 2,3 -> 4,6 via 5 moves: 2,3 2,4 3,4 4,4 4,5 4,6
from 4,6 -> 0,6 via 4 moves: 4,6 3,6 2,6 1,6 0,6
from 0,6 -> 4,0 via 10 moves: 0,6 0,5 0,4 1,4 2,4 2,3 2,2 3,2 4,2 4,1 4,0
from 4,0 -> 0,0 via 4 moves: 4,0 3,0 2,0 1,0 0,0Douăzeci și șapte de mișcări, podea curată. Dar uită-te la coloana bateriei și la ultimul segment al planului. Coloana 0 este mochetată: traversarea unui pătrat cu mochetă costă șase unități de baterie, un pătrat cu gresie costă una. Agentul s-a întors acasă pe coloana 0 pentru că sunt patru mișcări în loc de opt, iar acele patru mișcări pe mochetă au costat 24, în timp ce ocolul de opt mișcări ar fi costat 13.
Nu poate face altfel. Un obiectiv este un test binar: podeaua este curată sau nu este. Fiecare plan care se termină cu o podea curată îl satisface la fel, așa că atunci când mai multe reușesc, agentul nu are pe ce să aleagă între ele. Ca să preferi o reușită în locul alteia ai nevoie de un număr peste rezultate, iar acel număr este o funcție de utilitate. Un agent care o maximizează este un utility-based agent.
Schimbarea în cod este un singur termen în interiorul căutării. Breadth-first search numără mișcări; fă-l să numere costul în schimb și ai algoritmul lui Dijkstra și un agent diferit:
const nd = dist.get(k)! + (byCost ? cell.cost : 1); // <- the entire differencegoal-based (fewest moves) -> moves=27 battery=52 still dirty=0
utility-based (cheapest route) -> moves=31 battery=41 still dirty=0
from 4,0 -> 0,0 via 8 moves: 4,0 4,1 4,2 3,2 2,2 1,2 0,2 0,1 0,0Patru mișcări în plus, unsprezece unități de baterie în minus: cu douăzeci și unu la sută mai ieftin. Același obiectiv, aceeași hartă, același cod cu excepția unui termen. Cei doi agents diferă doar prin ceea ce încearcă să facă bine și iau rute diferite spre casă.
Acesta este și primul punct în care agentul are nevoie de ceva ce nu poate produce. Cineva trebuie să decidă cât valorează o unitate de baterie relativ la o mișcare. Utilitatea este măsura de performanță scrisă într-o formă cu care agentul poate calcula, iar scrierea ei este treaba designerului. Când oamenii spun că un agent „a optimizat lucrul greșit”, aproape niciodată nu vorbesc despre un bug. Vor să spună că această linie a fost scrisă neglijent.
Al cincilea tip și felul în care o ia razna
Link către secțiunea: Al cincilea tip și felul în care o ia raznaAcum lasă murdăria să reapară. Patru camere se murdăresc din nou la patru rate diferite, iar agentului nu i se spun niciodată. Vizitează o cameră per tick și vede doar acea cameră. Măsura de performanță este numărul de room-ticks petrecute murdare pe parcursul a 4.000 de ticks — mai puțin este mai bine.
Un learning agent, în descompunerea din manual, este oricare dintre cele de mai sus plus trei părți: un element de învățare care schimbă agentul, un critic care îi spune cum se descurcă agentul față de un standard fix de performanță și un generator de probleme care propune acțiuni ce merită încercate pentru ceea ce ar preda.1 Trei politici în același mediu. Prima nu învață; a doua și a treia învață același lucru și îl folosesc diferit.
| politică | room-ticks murdare din 4.000 | față de patrulare |
|---|---|---|
| patrulare fixă round-robin, fără învățare | 2.290 | — |
| learner A: estimează rata de murdărire a fiecărei camere, apoi merge unde murdăria este cea mai probabilă | 11.820 | de 5,2× mai rău |
| learner B: aceleași estimări, ponderate după cât timp a trecut de la ultima vizită | 1.576 | cu 31 % mai bine |
Ratele ascunse erau 0,35 pentru bucătărie, 0,05 pentru hol, 0,02 pentru birou și 0,01 pentru pod — iar learner A le-a găsit. A identificat corect bucătăria ca fiind cea mai murdară cameră din casă, apoi a mers în bucătărie la fiecare tick pentru restul simulării, în timp ce celelalte trei au rămas murdare pentru totdeauna. Este de cinci ori mai rău decât să nu învețe deloc și nu este stricat.
Lecția este cea din secțiunea despre utilitate. Learner A a maximizat „probabilitatea ca încăperea pe care urmează să o vizitez să fie murdară”. Măsura de performanță era „room-ticks petrecute murdare”. Numere diferite; al doilea este ceea ce puncta criticul, iar nimeni nu i-a spus agentului. Learner B înmulțește aceeași rată învățată cu timpul scurs de la ultima vizită — murdăria pe care se așteaptă să o găsească, nu șansa de a găsi oricare — și bate patrularea de la care a pornit.
Un detaliu de implementare a decis rezultatul. În prima versiune a lui learner B, o cameră în care nu apăruse nicio murdărie în trei vizite primea o rată exact zero — iar zero înmulțit cu orice este zero, deci nu mai era vizitată niciodată și estimarea nu mai putea fi corectată. Netezirea fracției, reușite plus unu peste încercări plus doi, a transformat 11.895 în 1.576. „Încă nu a fost observat” și „măsurat și a ieșit zero” sunt afirmații diferite, iar un sistem care le stochează în același câmp ia decizii pe care nu le poate desface.
Cele cinci tipuri și ce sunt ele în 2026
Link către secțiunea: Cele cinci tipuri și ce sunt ele în 2026 1 simple reflex percept ────────────────────────────────► rules ────► action
2 model-based percept ──► [state] ──────────────────► rules ────► action
3 goal-based percept ──► [state] ──► [goal] ──────► search ───► action
4 utility-based percept ──► [state] ──► [goal] ──► [U] ──► argmax ► action
5 learning all of the above, plus [critic] ──► changes the parts aboveFiecare dintre cele cinci este astăzi în producție sub alt nume.
| tip clasic | ce poartă între percepturi | forma sa din 2026 | ce nu poate face |
|---|---|---|---|
| simple reflex | nimic | un apel de model fără istoric: un clasificator, un endpoint de extragere, o completare single-turn | orice depinde de tura anterioară |
| model-based reflex | stare internă construită din istoricul percepturilor | un chat: transcriptul, retrimis integral la fiecare apel | să aleagă unde ar trebui să ajungă conversația |
| goal-based | stare plus o descriere a situației dorite | o buclă reason-and-act cu o condiție de oprire2 | să prefere un plan reușit în locul altuia |
| utility-based | stare, obiectiv și un număr peste rezultate | bucle evaluator–optimizer și clasificarea răspunsurilor candidate după un criteriu scris (Capitolul 25) | să inventeze criteriul |
| learning | toate acestea, plus un critic și un generator de probleme | Reflexion, care își scrie propriile lecții într-un buffer episodic în loc să actualizeze weights;3 memorie persistentă de utilizator (Capitolul 24) | să aleagă standardul după care punctează criticul |
Două rânduri sunt mai aproape decât o analogie, într-un mod care costă bani.
Chatul este un model-based reflex agent al cărui model nu este intern. În manual, starea este o variabilă în interiorul programului de agent. Într-un chat este transcriptul: trăiește la tine, este retrimis integral la fiecare apel și este reconstruit de la zero în interiorul modelului de fiecare dată. Aceasta este factura pătratică din Capitolul 16 și este același obiect pe care manualul l-a desenat ca o cutie etichetată „stare”. Iată diferența, măsurată pe o singură întrebare de follow-up, cu și fără cele două mesaje dinainte:
with the transcript prompt=67 "The current temperature in Lisbon, Portugal is 15°C."
without the transcript prompt=29 "Lisbon is the capital of Portugal, not a city in Portugal."Același model, aceleași trei cuvinte de input de la utilizator, iar al doilea este robotul din coridor care intră în perete. Nu au existat tool-uri în acea rulare, deci 15 este inventat — dar starea este ceea ce face ca follow-up-ul să însemne ceva. O reconstruiești de fiecare dată și plătești de 2,3× mai mulți token de intrare pentru ea într-o conversație de două ture. Capitolul 16 a măsurat unde ajunge multiplicatorul până la tura patruzeci.
Reflexion este un learning agent care își schimbă inputul, nu programul. În descompunerea din manual, elementul de învățare modifică elementul de performanță. Reflexion lasă weights în pace și scrie text reflexiv într-un buffer episodic pe care următoarea încercare îl citește.3 Elementul de învățare este un prompt, memoria este un rând în baza de date, elementul de performanță este un model înghețat — iar diagrama este cea din manual, neschimbată.
Și iată limita onestă a mapării. Cele cinci tipuri clasifică programul de agent. În 2026, acel program este rupt pe mijloc: o parte este codul tău, o parte este în weights pe care nu le-ai antrenat. Când un model decide singur să apeleze un tool, testul de obiectiv este în programul tău sau în model? Taxonomia nu are niciun răspuns, pentru că atunci când a fost scrisă nu exista alt loc unde să fie — iar întrebarea aceasta este exact locul în care cele două definiții moderne se despart.
Răspuns, apelare și oprire, într-un singur trace
Link către secțiunea: Răspuns, apelare și oprire, într-un singur traceDefinițiile sunt argumente despre comportament și sunt mult mai ușor de judecat cu un trace în față.
Bucla de mai jos trimite conversația către un model; dacă răspunsul conține un tool call, execută tool-ul, atașează rezultatul și trimite totul din nou. Rulează împotriva unui Qwen2.5-0.5B-Instruct local, în spatele unui endpoint cu formă OpenAI, pe această mașină — cusătura din Capitolul 14, deci bucla nici nu știe, nici nu îi pasă ce se află în spatele portului.
const BASE = process.env.LLM_BASE_URL ?? "http://127.0.0.1:8799/v1";
async function loop(question: string, maxTurns = 6) {
const messages: Msg[] = [
{ role: "system", content: SYSTEM },
{ role: "user", content: question },
];
for (let turn = 1; turn <= maxTurns; turn++) {
const reply = await call(messages, TOOLS);
const calls = reply.choices[0].message.tool_calls ?? [];
messages.push(reply.choices[0].message);
if (!calls.length) return messages;
for (const c of calls) {
const out = runTool(c.function.name, JSON.parse(c.function.arguments));
messages.push({ role: "tool", name: c.function.name, content: out });
}
}
throw new Error("turn cap reached");
}Două linii poartă întreaga idee, iar ambele sunt marcate; restul este bookkeeping. Toate cele trei comportamente sunt vizibile într-o singură rulare. Întrebat ceva ce poate face singur, modelul răspunde. Întrebat ceva ce nu poate, apelează:
=== a question the model cannot answer, one tool available
turn 1 prompt= 187 out= 21 finish=tool_calls CALL get_temperature({"city": "Oslo"})
tool get_temperature -> {"city":"Oslo","celsius":4}
turn 2 prompt= 238 out= 12 finish=stop TEXT "The current temperature in Oslo is 4
degrees Celsius."
=> model calls=2 prompt tokens=425 output=33 wall=6,257 ms
=> stopped by: the model produced text instead of a callȘi se oprește — al treilea comportament și cel mai ușor de ratat, pentru că arată ca și cum nu s-ar întâmpla nimic. Bucla se termină pentru că tura 2 a revenit fără un tool call. Nimeni nu a decis asta; modelul a decis, emițând proză. Condiția de terminare a acestui program este semnul unei absențe.
Încă două rulări merită spațiul. Întrebat să compare două orașe, modelul emite ambele tool calls într-o singură tură, primește ambele valori înapoi și greșește comparația:
turn 1 prompt= 188 out= 43 finish=tool_calls CALL get_temperature({"city": "Oslo"}),
get_temperature({"city": "Lisbon"})
tool get_temperature -> {"city":"Oslo","celsius":4}
tool get_temperature -> {"city":"Lisbon","celsius":19}
turn 2 prompt= 284 out= 13 finish=stop TEXT "Oslo is currently warmer than Lisbon
at 4°C."Tool-urile au funcționat. Apelul paralel a funcționat. Bucla a funcționat. Răspunsul este fals, cu ambele numere corecte așezate în transcript. Împachetarea unui model într-o buclă nu îl face să raționeze; îi dă unui model care greșește capacitatea de a acționa pe baza faptului că greșește — ceea ce este Capitolul 30 în avans și jumătate din Capitolul 29.
Acum șterge return marcat și lasă bucla să ruleze până la limita ei. Aceeași întrebare, același model:
turn 1 prompt= 187 out= 21 CALL get_temperature({"city": "Oslo"})
turn 2 prompt= 238 out= 12 TEXT "The current temperature in Oslo is 4 degrees Celsius."
turn 3 prompt= 261 out= 30 TEXT "Could you please specify the exact location you're..."
turn 4 prompt= 302 out= 14 TEXT "Sure! Could you tell me which city you're interested in?"
turn 5 prompt= 327 out= 35 TEXT "I'm sorry, but I need more details to provide an..."
turn 6 prompt= 373 out= 12 TEXT "Which city would you like to know the temperature for?"
=> model calls=6 prompt tokens=1,688 output=124 wall=25,261 ms stopped by: turn capDe patru ori mai mulți token de intrare, de patru ori mai mult timp de ceas și un final în care agentul a uitat ce fusese întrebat și interoghează utilizatorul despre o întrebare la care acesta răspunsese în tura unu. Răspunsul corect era pe ecran la tura 2, iar fiecare tură de după a făcut transcriptul mai rău.
Așadar, un agent nu este o buclă. Este o buclă plus o regulă pentru a ieși din ea, iar aceasta are exact o astfel de regulă. Capitolul 23 găsește cinci și arată ce se strică atunci când fiecare lipsește.
Cele două definiții, una lângă alta
Link către secțiunea: Cele două definiții, una lângă altaAmbele citate, nu parafrazate, pentru că parafrazele sunt locul unde se fabrică confuzia.
Definiția unu pune granița la cine controlează fluxul. Building effective agents de la Anthropic numește ambiguitatea și decide asupra ei:
„La Anthropic, categorisim toate aceste variații drept sisteme agentic, dar trasăm o distincție arhitecturală importantă între workflows și agents: Workflows sunt sisteme în care LLM-urile și tool-urile sunt orchestrate prin căi de cod predefinite. Agents, pe de altă parte, sunt sisteme în care LLM-urile își direcționează dinamic propriile procese și propria utilizare a tool-urilor, menținând controlul asupra modului în care îndeplinesc sarcinile.”4
Testul este o întrebare despre codul tău sursă: cine a ales pasul următor? Un switch în programul tău: workflow. Modelul: agent. Același document spune că agents „sunt de obicei doar LLM-uri care folosesc tool-uri pe baza feedbackului din mediu într-o buclă” — exact listarea de mai sus.
Definiția doi pune granița la independența față de utilizator. A practical guide to building agents de la OpenAI își deschide pagina de definiții așa:
„În timp ce software-ul convențional le permite utilizatorilor să simplifice și să automatizeze workflows, agents pot realiza aceleași workflows în numele utilizatorilor, cu un grad ridicat de independență. Agents sunt sisteme care îndeplinesc independent sarcini în numele tău.”5
Două propoziții mai târziu, pe aceeași pagină, exclude:
„Aplicațiile care integrează LLM-uri, dar nu le folosesc pentru a controla execuția workflow-ului — gândiți-vă la chatbots simpli, LLM-uri single-turn sau clasificatoare de sentiment — nu sunt agents.”5
Citește aceste citate în ordine. Propozițiile de deschidere trag linia la independență: pleacă acest lucru și termină treaba fără mine? A patra o trage la controlul execuției, adică exact linia Anthropic. Teste diferite, aceeași pagină, și există sisteme reale asupra cărora nu sunt de acord.
Dededesubt există o coliziune de vocabular și ea provoacă dispute în ședințe reale. În primul document, un workflow este o arhitectură și este lucrul care nu este un agent. În al doilea, un workflow este „o secvență de pași care trebuie executați pentru a îndeplini obiectivul utilizatorului” — treaba însăși, din care fiecare agent are una. „Am înlocuit workflow-ul cu un agent” este coerent sub prima definiție și aproape lipsit de sens sub a doua.
Trei sisteme, clasificate de două ori
Link către secțiunea: Trei sisteme, clasificate de două oriTrei sisteme care există în 2026, sub ambele definiții.
Un coding agent într-un terminal
Link către secțiunea: Un coding agent într-un terminalDescrii o sarcină; citește fișiere, rulează suita de teste, editează, le rulează din nou și se oprește când trec sau când renunță. Nimic din codul tău nu decide că pasul următor este „rulează testele” — modelul o face, din ce a returnat ultimul tool.
Definiția unu: agent, pentru că modelul își direcționează propriul proces. Definiția doi: agent, pentru că îndeplinește independent sarcina, recunoaște finalizarea și predă controlul înapoi. Ambele documente citează această formă ca exemplu central.
Un pipeline nocturn de triere a tichetelor
Link către secțiunea: Un pipeline nocturn de triere a tichetelorPentru fiecare tichet nou de suport, trei apeluri de model într-o ordine fixă — clasifică, extrage câmpurile, redactează răspunsul — și apoi îl trimite. Niciun model nu alege vreodată ce se întâmplă mai departe; o buclă for o face. Rulează la 03:00 și nimeni nu îl urmărește.
Definiția unu: nu este agent. Este prompt chaining, listat pe nume ca workflow. Definiția doi: ambele răspunsuri. După propozițiile de deschidere, îndeplinește independent sarcini în numele tău; după a patra, nu folosește modelul pentru a controla execuția workflow-ului și este exclus. Acest sistem este motivul pentru care citești toată pagina, nu citatul extras.
Un asistent de chat cu tool de căutare
Link către secțiunea: Un asistent de chat cu tool de căutareO singură tură de utilizator. Modelul decide singur dacă să caute înainte să răspundă, apoi răspunde și te așteaptă.
Definiția unu: agent, pentru că modelul își direcționează dinamic propria utilizare a tool-urilor pe baza rezultatelor din mediu, care este testul declarat. Definiția doi: nu este agent, pentru că nu există independență — o tură, apoi predă înapoi — iar „chatbots simpli” sunt în lista de excluderi pe nume.
Două dintre cele trei schimbă tabăra. Aceasta nu este o defecțiune a vreunuia dintre documente. Este un avertisment despre un tip de ședință în care doi oameni care sunt complet de acord despre ce face un sistem petrec o oră contrazicându-se despre cum să îl numească.
Ieșirea este în două axe, nu una
Link către secțiunea: Ieșirea este în două axe, nu unaDefinițiile se ciocnesc pentru că fiecare comprimă două întrebări independente într-un singur cuvânt. Separă-le și dezacordul devine un tabel, mai util decât un verdict.
| codul tău alege pasul următor | modelul alege pasul următor | |
|---|---|---|
| o persoană urmărește fiecare tură | un formular cu un model în el: clasificatoare, extragere, completare single-turn | un chat cu tool-uri — definiția unu spune agent, definiția doi spune nu |
| nimeni nu urmărește până când se termină | un pipeline — deschiderea definiției doi spune agent, a patra propoziție spune nu | toată lumea este de acord: un agent |
Fiecare definiție contestă o celulă diferită, iar celelalte două nu sunt contestate deloc. Deci atunci când eticheta contează — într-un contract, o analiză de risc, un postmortem — cele două propoziții care merită scrise nu sunt „este agent?” ci cine a ales pasul următor și cine urmărea. Ambele pot primi răspuns citind cod, niciuna nu are nevoie de definiția cuiva, iar împreună poartă fiecare consecință pe care eticheta trebuia să o reprezinte.
Nimic din acestea nu este nou. Wooldridge și Jennings au trecut în revistă sensurile concurente ale cuvântului „agent” în 1995;6 Franklin și Graesser au pus întrebarea acestui capitol în 1996, au adunat definițiile aflate în circulație și au constatat că nu erau de acord.7 Un survey din 2023 încă definește agents de la primele principii — „entități artificiale care își simt mediul, iau decizii și întreprind acțiuni”8 — pentru că nu exista nimic stabilit de citat, iar CoALA descrie părți în loc să traseze o graniță.9 Treizeci de ani de refuz de a ajunge la un acord spun că acest cuvânt face mai mult de o treabă.
Un agent înseamnă N apeluri, nu unul
Link către secțiunea: Un agent înseamnă N apeluri, nu unulAcum consecința care sosește înaintea filosofiei, adică factura.
Fiecare măsurătoare de aici are aceeași formă. Apelul unic a costat 39 token de intrare; aceeași întrebare cu un tool a costat 420 pe două apeluri; bucla cu regula de oprire eliminată a costat 1.688 pe șase. Creșterea este mai rea decât liniară, pentru că tura n poartă cu ea fiecare tură anterioară: coloana prompt a acelei rulări de șase ture citește 187, 238, 261, 302, 327, 373. Capitolul 16 a derivat că totalul este și a potrivit curba pe o conversație reală. Un agent transformă fiecare sarcină în acea conversație, indiferent dacă un om o vede vreodată sau nu.
Dacă acele numărători de token măsurate ar fi mers la un endpoint comercial la tarifele citite de Capitolul 16 pe 6 septembrie 2026 — $2,00 per milion de token de intrare și $12,00 per milion de ieșire — cele patru rulări ar arăta ca preț astfel:
| rulare | apeluri de model | token de intrare | token de ieșire | cost |
|---|---|---|---|---|
| întrebarea, fără tool-uri | 1 | 39 | 8 | $0,000174 |
| aceeași întrebare, un tool în catalog | 2 | 420 | 38 | $0,001296 |
| o întrebare care are nevoie de tool | 2 | 425 | 33 | $0,001246 |
| aceeași, cu regula de oprire eliminată | 6 | 1.688 | 124 | $0,004864 |
Rândul doi față de rândul unu este numărul de ținut minte. De șapte ori și jumătate costul, pentru un răspuns mai prost la o întrebare pe care modelul o știa deja. Nimic nu era configurat greșit: exista un tool, așa că modelul l-a folosit — iar constatarea din Capitolul 18, că prețul unui catalog, nu acuratețea lui, este ceea ce doare, are aici cea mai ieftină demonstrație cu un catalog de unu.
De aceea jumătatea utilă a ambelor documente este jumătatea despre a nu construi asta. Anthropic este direct: găsește cea mai simplă soluție posibilă și adaugă complexitate doar când este necesar, ceea ce „ar putea însemna să nu construiești deloc sisteme agentic”, deoarece sistemele agentic „schimbă latență și cost pe performanță mai bună a sarcinii” și „pentru multe aplicații, optimizarea apelurilor LLM unice cu retrieval și exemple in-context este de obicei suficientă”.4 Cazul său pentru un agent este îngust: probleme deschise unde nu poți prezice numărul de pași și nu poți hardcoda o cale, într-un mediu în care ai încredere, acceptând „costuri mai mari și potențialul de erori care se compun”.4 Ecranul OpenAI este imaginea în oglindă — judecată complexă, seturi de reguli imposibil de întreținut, date nestructurate — și se termină la fel: „altfel, o soluție deterministă poate fi suficientă”.5
Așadar, în taxonomia acestui capitol: un număr fix de pași într-o ordine fixă este un pipeline, iar faptul că îl numești agent nu îl va face mai rapid. Dacă numărul de pași depinde de ce găsești pe drum, vrei o buclă — și cumperi acea flexibilitate cu N apeluri, un transcript pătratic și un sistem care poate greși de N ori în loc de o singură dată.
Unde mergem mai departe
Link către secțiunea: Unde mergem mai departeAcum ai taxonomia, ambele definiții moderne, cele două axe care le fac compatibile și o buclă scurtă care răspunde, apelează și se oprește.
Acea buclă are o singură cale de a se termina: modelul nu mai cere tool-uri. Capitolul 23 o strică intenționat, de șapte ori, iar fiecare ruptură adaugă o piesă. O sarcină imposibilă, și nu se termină niciodată — o limită de ture. O noapte de rulare, și factura sosește — un buget în dolari. Un tool care eșuează — o eroare pe care modelul o poate folosi. Același apel de două ori — o cheie de idempotency. Un fișier pe care nu ar fi trebuit să îl atingă — o aprobare umană. Un restart la jumătate — persistența sesiunii. Un tool care durează trei minute în tăcere — progres și anulare. Ce iese este un harness, fișierul pe care rulează restul acestui curs.
Ceea ce lasă întrebarea despre care era de fapt diagonala disputată a acestui capitol. O buclă care își decide singură pasul următor trebuie să decidă când se oprește, iar tocmai am văzut ce se întâmplă când nu poate: șase ture, de patru ori factura și un agent care interoghează utilizatorul despre o întrebare la care răspunsese deja. Oprirea nu este o singură condiție. Câte sunt și care se declanșează prima?
Surse și metodă
Link către secțiunea: Surse și metodăLLM Powered Autonomous Agents (2023) de Lilian Weng este cea mai cunoscută descompunere a unui language agent în planificare, memorie și utilizarea tool-urilor și este lectura următoare potrivită alături de cele două documente de vendor; cele trei componente ale sale sunt Capitolele 23, 24 și 18 ale acestui curs, în această ordine.
Fiecare număr din acest capitol a fost produs pe această mașină și nimic nu a fost estimat. Coridorul, planul etajului, cei patru agents care îl parcurg și cele trei politici de patrulare sunt TypeScript-ul de mai sus, rulat pe Node 22; cifrele agentului randomizat sunt medii peste câte 2.000 de rulări seed-uite, iar cifrele de patrulare sunt rulări seed-uite unice de 4.000 de ticks. Trace-urile de model vin din Qwen2.5-0.5B-Instruct în float32 pe CPU cu greedy decoding, servite peste loopback de un mic endpoint Python local care încarcă weights și vorbește forma OpenAI chat-completions — din nou cusătura, cu tensorii pe partea de Python și bucla pe cea de TypeScript — deci numărătorile de token sunt cele ale tokenizerului acelui model, iar latențele sunt ale acelei mașini. Singurele cifre luate din altă parte sunt cele două prețuri din tabelul de cost, care sunt tarifele citite de Capitolul 16 din pagina de prețuri OpenAI pe 6 septembrie 2026, aplicate aici numărătorilor de token măsurate local ca ilustrare, nu ca factură observată.
Referințe
Link către secțiunea: Referințe-
Russell, S. și Norvig, P. Artificial Intelligence: A Modern Approach, ediția a 4-a, capitolul 2, Intelligent Agents. Sursa lumii aspiratorului, a specificației PEAS, a definiției raționalității relative la o măsură de performanță, a celor șapte proprietăți ale mediilor de sarcină, a celor cinci tipuri de agent folosite aici și a observației că buclele infinite sunt adesea inevitabile pentru simple reflex agents în medii parțial observabile. Codul companion al cărții este
aimacode/aima-pythonpe GitHub (8.806 stele, ultimul push pe 30 iunie 2026, citit pe 7 septembrie 2026) — merită numit precis pentru ceea ce este. Este repository-ul însoțitor al unei cărți, nu o implementare de referință pe care alte proiecte construiesc în felul în care suntkarpathy/micrograd(17.412) șikarpathy/nanoGPT(62.852). De aceea acest capitol îl citează și îl leagă, nu îl traduce, și de aceea argumentul de ecosistem care a ținut Capitolul 5 în Python nu se aplică aici: nimic din acest capitol nu atinge un tensor, iar bucla scrisă mai sus este strămoșul direct al celei din Capitolul 23. ↩ ↩2 ↩3 ↩4 ↩5 -
Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. și Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). Împletirea urmelor de raționare și a acțiunilor la care se referă rândul goal-based din tabelul de mapare. ↩
-
Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. și Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). Rezumatul propriu al mecanismului din lucrare este motivul pentru care se mapează pe learning agent: întărește agents „nu prin actualizarea weights, ci prin feedback lingvistic”, cu agents care „reflectează verbal asupra semnalelor de feedback ale sarcinii, apoi își mențin propriul text reflexiv într-un buffer de memorie episodică pentru a induce luarea unor decizii mai bune în încercările ulterioare”. ↩ ↩2
-
Anthropic, Building effective agents, 19 decembrie 2024,
anthropic.com/engineering/building-effective-agents, citit pe 7 septembrie 2026. Sursa distincției workflow/agent citate mai sus, a termenului-umbrelă „agentic systems”, a descrierii agents ca „de obicei doar LLM-uri care folosesc tool-uri pe baza feedbackului din mediu într-o buclă”, a recomandării de a găsi cea mai simplă soluție posibilă și că asta „ar putea însemna să nu construiești deloc sisteme agentic”, precum și a argumentelor pro și contra agents, inclusiv „costuri mai mari și potențialul de erori care se compun” și recomandarea unor condiții de oprire „precum un număr maxim de iterații” pentru a menține controlul. ↩ ↩2 ↩3 -
OpenAI, A practical guide to building agents, paginile 4–7, citit pe 7 septembrie 2026. Sursa pentru „Agents sunt sisteme care îndeplinesc independent sarcini în numele tău”, pentru excluderea „chatbots simpli, LLM-uri single-turn sau clasificatoare de sentiment”, pentru definiția unui workflow ca „o secvență de pași care trebuie executați pentru a îndeplini obiectivul utilizatorului”, pentru cele două caracteristici de bază ale unui agent, pentru cele trei componente — model, tool-uri, instrucțiuni — și pentru criteriile de triere când să construiești unul, încheind cu „altfel, o soluție deterministă poate fi suficientă”. ↩ ↩2 ↩3
-
Wooldridge, M. și Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, volumul 10, numărul 2 (1995). Survey-ul care a împărțit utilizarea din domeniu într-o noțiune slabă de agentivitate — autonomie, abilitate socială, reactivitate, proactivitate — și noțiuni mai puternice care împrumută vocabular mental. Citit astăzi, este o înregistrare a aceluiași argument pe care încă îl poartă cele două documente din acest capitol. ↩
-
Franklin, S. și Graesser, A. Is It an Agent, or Just a Program? A Taxonomy for Autonomous Agents. Proceedings of the Third International Workshop on Agent Theories, Architectures, and Languages, Springer (1996). Citat aici pentru ceea ce este, nu pentru un citat: un survey care a adunat definițiile pentru „agent” aflate atunci în circulație, a constatat că nu erau de acord și a propus o taxonomie care să înlocuiască disputa. Treizeci de ani mai târziu, disputa se află în documentație mai bine proiectată și este altfel neschimbată. ↩
-
Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). Citat mai sus pentru definiția de deschidere, „AI agents sunt entități artificiale care își simt mediul, iau decizii și întreprind acțiuni”, care este definiția din manual reformulată în 2023 pentru că nu exista una modernă agreată de citat. ↩
-
Sumers, T. R., Yao, S., Narasimhan, K. și Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Organizează language agents ca „componente modulare de memorie, un spațiu de acțiune structurat pentru a interacționa cu memoria internă și mediile externe și un proces generalizat de luare a deciziilor pentru a alege acțiuni” și îi plasează explicit în istoria AI simbolice și a științei cognitive. Taxonomia memoriei revine în Capitolul 24, unde tabelul cu trei depozite este umbra ei practică. ↩