Mi az AI agent: öt klasszikus típus, két rivális definíció
A porszívóvilág négyszer törik el; minden törés kiérdemel egy klasszikus agent-típust. Egy eszköz 39 tokenből 420-at csinál.
Ezen az oldalon
Ugyanaz a kérdés, kétszer feltéve ugyanannak a modellnek, ugyanazokkal a súlyokkal és greedy decodinggal. Az egyetlen különbség: másodszor volt egy eszköz a katalógusban.
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 msEgy hívásból kettő lett. Harminckilenc input tokenből 420, vagyis 10,8-szoros szorzó. Egy másodperc alatti időből majdnem hét lett. És a válasz felvett egy olyan tényt, amelyet senki sem kért, egy olyan eszköztől, amelyet a modell maga választott ki egy olyan kérdéshez, amely sosem említette az időjárást.
A második rendszer az, amit az iparág nagy része 2026-ban agentnek nevez. Vagy nem az, attól függően, hogy a két legolvasottabb definíció közül melyiket nyitod meg — és ez a kettő nem ugyanazt mondja. Az egyik még önmagával sem ért egyet.
Erről a nézeteltérésről szól ez a fejezet. Nem szókincsvita: a két definíció más tengelyeken húzza meg a határt, és az általad választott tengely dönti el, mit építesz és miért számláznak neked. Mindkettő egy régebbi taxonómián áll, és a legolcsóbb módja annak, hogy kiérdemeld, ha megépíted a világ legrosszabb agentjét.
Részletek megjelenítése
Amire ennek a fejezetnek szüksége van a korábbiakból.
- 13. fejezet megmérte, időben mennyibe kerül egyetlen hívás; ez a fejezet ezt megszorozza a körök számával.
- 15. fejezet: a prompt a modell teljes állapota, mert semmi sem éli túl a hívást.
- 16. fejezet: az input tokenek száma a beszélgetés négyzetével nő.
- 18. fejezet: az eszközkatalógus, és a körút, amelyben a modell kér, a kódod pedig végrehajt.
Itt nincsenek tenzorok. A fejezet TypeScriptben van, ahová a 14. fejezet nyelvi szabálya helyezi, a ciklusa pedig a 23. fejezet ciklusának közvetlen őse.
Egy robot két szobával
Link a szakaszhoz: Egy robot két szobávalA terület legrégebbi példája egy porszívó egy két négyzetből, A-ból és B-ből álló világban, ahol mindkettő vagy tiszta, vagy piszkos.1 Minden tankönyvben túléli, mert ez a legkisebb világ, amelyben egy agentnek igaza lehet vagy tévedhet.
A percept egy pár — hol vagyok, és piszkos-e itt —, a műveletek pedig SUCK, LEFT és RIGHT. Az egész program egy sor.
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"; Futtasd le a két négyzetből álló világ összes kezdőkonfigurációján:
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=trueEz egy egyszerű reflex agent: kizárólag az aktuális percept alapján cselekszik, bármi előzmény emléke nélkül. Ez nem játékkategória — egy termosztát is ilyen, és ugyanilyen egy nyelvi modell egyetlen hívása is, ha nincs hozzá kapcsolt beszélgetés.
Most törd el úgy, ahogy a valóság teszi. Egy valódi porszívórobotnak koszérzékelője és ütközője van, nem pedig a szőnyeg alá címkézett A négyzete. Vedd ki a helyet a perceptből, és semmi máson ne változtass:
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} -> RIGHTUgyanaz a program, két négyzet. Az egyik kezdőállapotból három lépés alatt végez; egy másikból ötszázszor nekihajt a jobb oldali falnak, és menne tovább, amíg le nem merül az akkumulátor. Nem képes érzékelni a különbséget a két helyzet között, ezért nem is tud bennük másképp cselekedni. Russell és Norvig egy sorban mondják ki az általános eredményt: részlegesen megfigyelhető környezetekben az infinite loopok gyakran elkerülhetetlenek az egyszerű reflex agentek számára.1
Van egy javítás, amely egy sorba és nulla memóriába kerül; érdemes megmérni, mielőtt bármi okosabbhoz nyúlnánk.
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);
const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT"); Kétezer futtatás egy teljesen piszkos folyosón, három méretben, végig ugyanazzal a seedelt generátorral:
| szobák | átlagos lépések | medián | legrosszabb 2.000-ből | sosem fejezte be |
|---|---|---|---|---|
| 2 | 4,0 | 4 | 13 | 0 |
| 4 | 16,6 | 14 | 81 | 0 |
| 8 | 68,7 | 52 | 306 | 0 |
A randomizálás teljesen eltünteti a loopot. De ára is van: nyolc szobához tizenöt mozdulat kell, ha tudod, mit csinálsz, ez az agent pedig átlagosan 68,7-et tesz meg, és egyszer 306-ig jutott. Ez az egész fejezet kicsiben. Minden hozzáadott képesség helyességet vásárol egy olyan esetben, amelyet az előző agent nem tudott kezelni, és olyan pénznemben számláz érte, amelyet először meg kell nevezned.
Az alkatrészek elnevezése, most, hogy szükség van rájuk
Link a szakaszhoz: Az alkatrészek elnevezése, most, hogy szükség van rájukEgy agent szenzorokon keresztül érzékeli a környezetét, és aktuátorokon keresztül cselekszik. Az agent program a perceptekről műveletekre képező függvény — a fenti összes listing ilyen. A percept sequence mindaz, amit eddig érzékelt, és egy egyszerű reflex agent ebből mindent figyelmen kívül hagy az utolsó elem kivételével.
A racionalitás az a szó, amelyet a legtöbb cikk rosszul használ, és ha helyesen használod, a fejezet többi része is használhatóvá válik. Egy agent önmagában nem racionális vagy irracionális. Russell és Norvig szerint a racionális agent minden lehetséges percept sequence esetén azt a műveletet választja, amely várhatóan maximalizálja a teljesítménymérőjét, az adott sequence bizonyítékai és bármilyen beépített tudása alapján.1 A teljesítménymérő nincs az agentben: a tervezőhöz tartozik, a racionalitás pedig csak ehhez képest értelmezhető.
A specifikációt hagyományosan négy dologként írják fel: PEAS — performance measure, environment, actuators, sensors.
| a porszívórobot | egy support agent productionben | |
|---|---|---|
| Performance measure | tiszta négyzetek, akkumulátoregységenként | megoldott ticketek, dolláronként, eszkaláció nélkül |
| Environment | a padló, a kosz, a bútorok, a szőnyeg | a ticket-sor, az adatbázisod, az ügyfél |
| Actuators | kerekek, szívás | eszközhívások |
| Sensors | koszérzékelő, ütköző | a felhasználó üzenete, eszközeredmények |
Figyeld meg, melyik sor lóg ki. Szinte minden csapat, amely 2026-ban agenteket épít, leírja az E-t, az A-t és az S-t — az eszközsémákat, az integrációkat, az üzenetformátumot —, mert a kód ezek nélkül nem fut. Szinte senki nem írja le a P-t. Enélkül annak, hogy „az agentünk jól teljesít”, nincs ellenőrizhető jelentése, a „racionális” pedig egyáltalán nem alkalmazható a rendszerre, csak egy demóra. A 29. fejezet arról szól, hogyan lesz a P-ből szám, és ezért létezik.
┌───────────────────────── 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 itA feladatkörnyezeteket további hét tengely mentén osztályozzák, amelyek közül itt öt határozza meg a nehézség nagy részét: teljesen vagy részlegesen megfigyelhető, determinisztikus vagy nem, epizodikus vagy szekvenciális, statikus vagy dinamikus, ismert vagy ismeretlen.1 Egy agent, amely valódi eszközökkel beszél valódi hálózaton, mind az öt kemény sarkában van — még temperature nullán is nem determinisztikus (17. fejezet), és, ez az alulértékelt rész, ismeretlen, mert nincs megbízható modelled arról, hogy a saját eszközeid mit tesznek a világgal. Ezért kell a 23. fejezet loopjának jobban a hibakezelés, mint a tervezés.
Memória hozzáadása, és a következő fal megtalálása
Link a szakaszhoz: Memória hozzáadása, és a következő fal megtalálásaA valódi padlók nem egydimenziósak, ezért emeljük a világot alaprajzzá. A kettőskeresztek falak, a csillagok koszfoltok, a robot pedig a középső kamrából indul:
col 0 1 2 3 4 5 6
row 0 * . . # . . *
row 1 . # . # . # .
row 2 . # . S . # . S = the robot starts here
row 3 . # . # . # .
row 4 * . . # . . *A kézenfekvő fejlesztés a memória. Az agent térképet tart fenn: minden négyzetről, amelyen már állt, és minden négyzetről, ahol megszólalt az ütköző. A szabálya az, hogy belép egy szomszédos, még meg nem látogatott négyzetre — jobbra, aztán le, aztán balra, aztán fel —, és visszalép, amikor körülötte már minden ismert. Ez egy modellalapú reflex agent: belső állapotot tart fenn a percept historyból, ezért tud olyan alapján cselekedni, amit éppen nem lát.
Ez valódi javulás, és még mindig nem elég:
5,000 steps allowed -> steps=5,000 distinct squares visited=13/25 still dirty=2/4Ötezer mozdulat, a padló fele sosem látszik. A térkép helyes, a szabályok helyesek. Amit az agent nem tud megtenni: a térképet arra használni, hogy eljusson valahová. A szabályai mindig csak erre válaszolnak: „a négy szomszédom közül melyikbe lépjek”, ezért amint elfogynak mellette a meg nem látogatott négyzetek, nincs módja kifejezni a gondolatot, hogy nyolc lépésre van egy meg nem látogatott négyzet, és szeretnék ott állni. Tudja, hol van. Nem tudja, hol szeretne lenni.
Egy cél, majd ok arra, hogy az egyik útvonalat előnyben részesítsük a másikkal szemben
Link a szakaszhoz: Egy cél, majd ok arra, hogy az egyik útvonalat előnyben részesítsük a másikkal szembenA célalapú agent a világról alkotott modellje mellett tartalmazza annak a helyzetnek a leírását is, amelyet létre akar hozni, és műveleteket úgy választ, hogy műveletsorozatok között keres, amíg nem talál olyat, amely ott ér véget. A célok a műveletválasztást lookupból kereséssé alakítják.
A cél: „ne maradjon piszkos négyzet”. A keresés breadth-first séta a legközelebbi piszkos négyzethez, és a visszaadott út a terv.
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,0Huszonhét mozdulat, tiszta padló. De nézd az akkumulátor oszlopot és a terv utolsó szakaszát. A 0. oszlop szőnyeges: egy szőnyeges négyzeten áthaladni hat akkumulátoregységbe kerül, egy csempés négyzeten egybe. Az agent a 0. oszlopon ment haza, mert az négy mozdulat nyolc helyett, és ez a négy szőnyeges mozdulat 24-be került, miközben a nyolcmozdulatos kerülő 13-ba került volna.
Nem tud mást tenni. A cél bináris teszt: a padló tiszta, vagy nem. Minden terv, amely tiszta padlóval ér véget, ugyanúgy kielégíti, ezért amikor több is sikeres, az agentnek nincs mi alapján választania közöttük. Ahhoz, hogy az egyik sikert előnyben részesítse a másikkal szemben, szám kell a kimenetek fölött, ez a szám pedig egy hasznossági függvény. Az agent, amely ezt maximalizálja, utility-based agent.
A kód változása egyetlen tag a keresésben. A breadth-first search a mozdulatokat számolja; számolja helyette a költséget, és máris Dijkstra-algoritmusod és egy másik agented van:
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,0Négy extra mozdulat, tizeneggyel kevesebb akkumulátoregység: huszonegy százalékkal olcsóbb. Ugyanaz a cél, ugyanaz a térkép, ugyanaz a kód egyetlen tag kivételével. A két agent csak abban különbözik, miben próbál jó lenni, és más útvonalon mennek haza.
Ez az első pont is, ahol az agentnek olyasmire van szüksége, amit nem tud előállítani. Valakinek el kell döntenie, mennyit ér egy akkumulátoregység egy mozdulathoz képest. A hasznosság a teljesítménymérő olyan formában, amellyel az agent számolni tud, és ennek megírása a tervező dolga. Amikor az emberek azt mondják, hogy egy agent „rossz dolgot optimalizált”, szinte sosem bugra gondolnak. Arra gondolnak, hogy ezt a sort gondatlanul írták meg.
Az ötödik típus, és hogyan romlik el
Link a szakaszhoz: Az ötödik típus, és hogyan romlik elMost térjen vissza a kosz. Négy szoba négy különböző ütemben piszkolódik újra, az agent pedig sosem kapja meg ezeket az ütemeket. Tickenként egy szobát látogat meg, és csak azt a szobát látja. A teljesítménymérő a piszkosan töltött szoba-tickek száma 4.000 tick alatt — az alacsonyabb jobb.
A tanuló agent a tankönyvi felbontásban a fentiek bármelyike plusz három rész: egy tanulóelem, amely megváltoztatja az agentet, egy kritikus, amely megmondja, hogyan teljesít az agent egy rögzített teljesítményszabványhoz képest, és egy problémagenerátor, amely olyan műveleteket javasol, amelyeket érdemes kipróbálni azért, amit taníthatnak.1 Három policy ugyanabban a környezetben. Az első nem tanul; a második és a harmadik ugyanazt tanulja meg, és másképp használja.
| policy | piszkos szoba-tickek 4.000 alatt | a járőrhöz képest |
|---|---|---|
| fix round-robin járőr, tanulás nélkül | 2.290 | — |
| tanuló A: megbecsüli minden szoba koszolódási ütemét, majd oda megy, ahol a kosz a legvalószínűbb | 11.820 | 5,2× rosszabb |
| tanuló B: ugyanazok a becslések, súlyozva az utolsó látogatás óta eltelt idővel | 1.576 | 31 % jobb |
A rejtett ütemek: 0,35 a konyhára, 0,05 az előszobára, 0,02 a dolgozószobára és 0,01 a padlásra — és az A tanuló megtalálta őket. Helyesen azonosította a konyhát a ház legpiszkosabb szobájaként, majd a szimuláció hátralévő részében minden tickben a konyhába ment, miközben a másik három örökre piszkos maradt. Ötször rosszabb, mint egyáltalán nem tanulni, és nincs elromolva.
A tanulság a hasznossági szakaszé. Az A tanuló azt maximalizálta, hogy „valószínűleg piszkos-e a szoba, amelyet most meglátogatok”. A teljesítménymérő ez volt: „piszkosan töltött szoba-tickek”. Különböző számok; a másodikat pontozta a kritikus, és senki sem mondta meg az agentnek. A B tanuló ugyanazt a megtanult ütemet megszorozza az utolsó látogatás óta eltelt idővel — vagyis a várhatóan megtalált koszt, nem pedig annak esélyét, hogy talál-e bármennyit —, és legyőzi a járőrt, amelyből indult.
Egy implementációs részlet döntötte el az eredményt. A B tanuló első verziójában egy szoba, ahol három látogatás alatt nem jelent meg kosz, pontosan nulla ütemet kapott — és nulla szorozva bármivel nulla, így soha többé nem látogatták meg, a becslést pedig sosem lehetett korrigálni. A tört simítása, sikerek plusz egy osztva próbák plusz kettővel, 11.895-ből 1.576-ot csinált. A „még nem figyeltük meg” és a „megmértük, és nulla lett” különböző állítások, és egy rendszer, amely ugyanabban a mezőben tárolja őket, olyan döntéseket hoz, amelyeket nem tud visszavonni.
Az öt típus, és mik ezek 2026-ban
Link a szakaszhoz: Az öt típus, és mik ezek 2026-ban 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 aboveMind az öt productionben van ma, más néven.
| klasszikus típus | mit visz tovább a perceptek között | 2026-os alakja | mire képtelen |
|---|---|---|---|
| egyszerű reflex | semmit | egy modellhívás history nélkül: classifier, extraction endpoint, single-turn completion | bármi, ami az előző körtől függ |
| modellalapú reflex | a percept historyból épített belső állapot | chat: a transcript, minden hívásnál egészben újraküldve | kiválasztani, hová jusson el a beszélgetés |
| célalapú | állapot plusz a kívánt helyzet leírása | reason-and-act loop megállási feltétellel2 | előnyben részesíteni az egyik sikeres tervet a másikkal szemben |
| utility-based | állapot, cél és egy szám a kimenetek fölött | evaluator–optimiser loopok, és jelölt válaszok rangsorolása írott kritérium alapján (25. fejezet) | feltalálni a kritériumot |
| tanuló | mindez, plusz egy kritikus és egy problémagenerátor | Reflexion, amely saját tanulságait epizodikus bufferbe írja a súlyok frissítése helyett;3 tartós felhasználói memória (24. fejezet) | kiválasztani a standardot, amelyhez képest a kritikus pontoz |
Két sor több mint analógia — pénzbe kerülő módon.
A chat olyan modellalapú reflex agent, amelynek a modellje nem belső. A tankönyvben az állapot egy változó az agent programon belül. Egy chatben ez a transcript: a te oldaladon él, minden hívásnál teljes egészében újraküldöd, és a modellen belül minden alkalommal nulláról épül újra. Ez a 16. fejezet négyzetes számlája, és ugyanaz az objektum, amelyet a tankönyv „állapot” feliratú dobozként rajzolt meg. Itt a különbség, egyetlen follow-up kérdésen mérve, az előtte lévő két üzenettel és azok nélkül:
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."Ugyanaz a modell, ugyanaz a három szónyi felhasználói input, és a második a folyosórobot, amely a falnak hajt. Ebben a futásban nem voltak eszközök, tehát a 15 kitalált — de az állapot az, amitől a follow-up egyáltalán jelent valamit. Minden alkalommal újraépíted, és egy kétkörös beszélgetésben 2,3× input tokennel fizetsz érte. A 16. fejezet megmérte, hová jut ez a szorzó a negyvenedik körre.
A Reflexion olyan tanuló agent, amely nem a programját, hanem az inputját változtatja meg. A tankönyvi felbontásban a tanulóelem módosítja a teljesítményelemet. A Reflexion békén hagyja a súlyokat, és reflektív szöveget ír egy epizodikus bufferbe, amelyet a következő próbálkozás olvas.3 A tanulóelem egy prompt, a memória egy adatbázissor, a teljesítményelem egy fagyasztott modell — a diagram pedig változatlanul a tankönyvé.
És itt a megfeleltetés őszinte határa. Az öt típus az agent programot osztályozza. 2026-ban ez a program ketté van hasítva: egy része a te kódod, egy része olyan súlyokban van, amelyeket nem te tanítottál. Amikor egy modell magától dönt úgy, hogy eszközt hív, a célteszt a te programodban van, vagy a modellben? A taxonómiának nincs válasza, mert amikor írták, nem is lehetett volna máshol — és pontosan ennél a kérdésnél válik szét a két modern definíció.
Válaszadás, hívás és megállás, egy trace-ben
Link a szakaszhoz: Válaszadás, hívás és megállás, egy trace-benA definíciók viselkedésről szóló érvek, és sokkal könnyebb megítélni őket, ha van előtted egy trace.
Az alábbi loop elküldi a beszélgetést egy modellnek; ha a válasz eszközhívást tartalmaz, végrehajtja az eszközt, hozzáfűzi az eredményt, és újra elküldi az egészet. Egy helyi Qwen2.5-0.5B-Instruct ellen fut, OpenAI-alakú endpoint mögött ezen a gépen — ez a 14. fejezet varrata, így a loopnak sem tudnia, sem érdekelnie nem kell, mi van a port mögött.
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");
}Két sor hordozza az egész gondolatot, és mindkettő meg van jelölve; a többi könyvelés. Mindhárom viselkedés látszik egy futásban. Ha olyat kérdeznek tőle, amit maga is meg tud csinálni, a modell válaszol. Ha olyat kérdeznek tőle, amit nem tud, hív:
=== 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És megáll — a harmadik viselkedés, és a legkönnyebb észre sem venni, mert úgy néz ki, mintha semmi sem történne. A loop azért ér véget, mert a 2. kör eszközhívás nélkül jött vissza. Ezt senki nem döntötte el; a modell tette, prózát kibocsátva. Ennek a programnak a terminációs feltétele egy hiány jele.
Még két futás megéri a helyet. Két város összehasonlítására kérve a modell mindkét eszközhívást kiadja egy körben, mindkét leolvasást visszakapja, és elrontja az összehasonlítást:
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."Az eszközök működtek. A párhuzamos hívás működött. A loop működött. A válasz hamis, miközben mindkét helyes szám ott ül a transcriptben. Attól, hogy egy modellt loopba csomagolsz, még nem fog gondolkodni; csak megadod egy tévedő modellnek a képességet, hogy a tévedése alapján cselekedjen — ez előre a 30. fejezet, és a 29. fejezet fele.
Most töröld a megjelölt return részt, és hagyd, hogy a loop a plafonjáig fusson. Ugyanaz a kérdés, ugyanaz a modell:
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 capNégyszer annyi input token, négyszer annyi wall clock idő, és egy befejezés, amelyben az agent elfelejtette, mit kérdeztek tőle, és a felhasználót faggatja egy olyan kérdésről, amelyre az első körben már válaszolt. A helyes válasz a 2. körben a képernyőn volt, és minden további kör rontotta a transcriptet.
Tehát az agent nem loop. Loop plusz egy szabály arra, hogyan lehet kilépni belőle, és ennek pontosan egy ilyen szabálya van. A 23. fejezet ötöt talál, és megmutatja, mi törik el, ha bármelyik hiányzik.
A két definíció egymás mellett
Link a szakaszhoz: A két definíció egymás mellettIdézve, nem átfogalmazva, mert a zavar az átfogalmazásokban készül.
Az első definíció ott húzza meg a határt, hogy ki irányítja a folyamatot. Az Anthropic Building effective agents című írása megnevezi a kétértelműséget, és állást foglal:
„Az Anthropicnál ezeket a változatokat mind agentic systemsként kategorizáljuk, de fontos architekturális különbséget teszünk workflowk és agentek között: a workflowk olyan rendszerek, amelyekben az LLM-eket és eszközöket előre definiált kódutak mentén orkestrálják. Az agentek ezzel szemben olyan rendszerek, amelyekben az LLM-ek dinamikusan irányítják saját folyamataikat és eszközhasználatukat, megtartva az irányítást afelett, hogyan hajtják végre a feladatokat.”4
A teszt a forráskódodra vonatkozó kérdés: ki választotta a következő lépést? Egy switch a programodban: workflow. A modell: agent. Ugyanez a dokumentum azt mondja, hogy az agentek „jellemzően csak LLM-ek, amelyek környezeti visszajelzés alapján eszközöket használnak egy loopban” — ami pontosan a fenti listing.
A második definíció ott húzza meg a határt, hogy mennyire független a felhasználótól. Az OpenAI A practical guide to building agents című anyaga így nyitja a definíciós oldalt:
„Míg a hagyományos szoftverek lehetővé teszik a felhasználóknak, hogy workflowkat egyszerűsítsenek és automatizáljanak, az agentek képesek ugyanezeket a workflowkat a felhasználók nevében, nagy fokú függetlenséggel végrehajtani. Az agentek olyan rendszerek, amelyek önállóan hajtanak végre feladatokat a nevedben.”5
Két mondattal később, ugyanazon az oldalon, kizárja ezt:
„Azok az alkalmazások, amelyek LLM-eket integrálnak, de nem használják őket a workflow-végrehajtás irányítására — gondolj egyszerű chatbotokra, single-turn LLM-ekre vagy sentiment classifierökre —, nem agentek.”5
Olvasd ezeket az idézeteket sorrendben. A nyitó mondatok a függetlenségnél húzzák meg a vonalat: elmegy-e ez a dolog, és befejezi-e helyettem a munkát? A negyedik a végrehajtás irányításánál húzza meg, ami pontosan az Anthropic vonala. Más tesztek, ugyanazon az oldalon, és vannak valódi rendszerek, amelyeknél nem ugyanazt mondják.
Alatta szókincsbeli ütközés van, és valódi meetingeken okoz vitákat. Az első dokumentumban a workflow egy architektúra, és ez az, ami nem agent. A másodikban a workflow „lépések sorozata, amelyet végre kell hajtani a felhasználó céljának eléréséhez” — maga a munka, amellyel minden agent rendelkezik. A „lecseréltük a workflowt agentre” az első definíció szerint koherens, a második szerint majdnem értelmetlen.
Három rendszer, kétszer osztályozva
Link a szakaszhoz: Három rendszer, kétszer osztályozvaHárom 2026-ban létező rendszer, mindkét definíció alatt.
Egy coding agent terminálban
Link a szakaszhoz: Egy coding agent terminálbanLeírsz egy feladatot; fájlokat olvas, futtatja a tesztcsomagot, szerkeszt, újra futtatja, és megáll, amikor átmennek, vagy amikor feladja. A kódodban semmi nem dönti el, hogy a következő lépés „futtasd a teszteket” — a modell teszi, abból, amit az utolsó eszköz visszaadott.
Első definíció: agent, mert a modell irányítja a saját folyamatát. Második definíció: agent, mert önállóan végrehajtja a feladatot, felismeri a befejezést, és visszaadja az irányítást. Mindkét dokumentum ezt az alakot hozza központi példaként.
Egy éjszakai ticket-triage pipeline
Link a szakaszhoz: Egy éjszakai ticket-triage pipelineMinden új support ticketre három modellhívás fix sorrendben — osztályozás, mezők kinyerése, válaszvázlat —, aztán elküldi. Egyetlen modell sem választja ki soha, mi történik ezután; egy for loop teszi. 03:00-kor fut, és senki nem figyeli.
Első definíció: nem agent. Ez prompt chaining, név szerint workflowként felsorolva. Második definíció: mindkét válasz. A nyitó mondatok szerint önállóan hajt végre feladatokat a nevedben; a negyedik szerint nem a modellt használja a workflow-végrehajtás irányítására, ezért ki van zárva. Ez a rendszer az oka, hogy az egész oldalt elolvasod, nem csak a kiemelt idézetet.
Egy chat assistant keresőeszközzel
Link a szakaszhoz: Egy chat assistant keresőeszközzelEgy felhasználói kör. A modell maga dönti el, hogy válaszadás előtt keres-e, aztán válaszol, és rád vár.
Első definíció: agent, mert a modell dinamikusan irányítja saját eszközhasználatát a környezetből érkező eredmények alapján, ami a megadott teszt. Második definíció: nem agent, mert nincs függetlenség — egy kör, aztán visszaadja —, és az „egyszerű chatbotok” név szerint szerepelnek a kizárási listán.
A háromból kettő oldalt vált. Ez nem egyik dokumentum kudarca sem. Figyelmeztetés egy olyan meetingtípusra, ahol két ember, aki teljesen egyetért abban, mit csinál egy rendszer, egy órát tölt azzal, hogy vitatkozzon, minek nevezzék.
A kiút két tengely, nem egy
Link a szakaszhoz: A kiút két tengely, nem egyA definíciók azért ütköznek, mert mindkettő két független kérdést sűrít egyetlen szóba. Válaszd szét őket, és a nézeteltérésből táblázat lesz, ami hasznosabb, mint egy ítélet.
| a te kódod választja a következő lépést | a modell választja a következő lépést | |
|---|---|---|
| egy ember minden kört figyel | űrlap modellel benne: classifierök, extraction, single-turn completion | chat eszközökkel — az első definíció szerint agent, a második szerint nem |
| senki nem figyeli, amíg kész nincs | pipeline — a második definíció nyitánya szerint agent, a negyedik mondata szerint nem | mindenki egyetért: agent |
Mindegyik definíció másik cellát vitat, a másik kettő pedig egyáltalán nem vitás. Ezért amikor a címke számít — szerződésben, kockázati review-ban, postmortemben —, nem azt a két mondatot érdemes leírni, hogy „agent-e”, hanem ezt: ki választotta a következő lépést, és ki figyelte. Mindkettő megválaszolható a kód olvasásával, egyikhez sem kell senki definíciója, és együtt hordozzák mindazt a következményt, amelyet a címke helyettesített.
Ebből semmi sem új. Wooldridge és Jennings 1995-ben áttekintették az „agent” versengő jelentéseit;6 Franklin és Graesser 1996-ban feltették ennek a fejezetnek a kérdését, összegyűjtötték az akkor forgalomban lévő definíciókat, és azt találták, hogy nem értenek egyet.7 Egy 2023-as survey még mindig első elvekből definiálja az agenteket — „mesterséges entitások, amelyek érzékelik környezetüket, döntéseket hoznak és cselekszenek”8 —, mert nem volt kész, elfogadott modern definíció, amelyet idézhetett volna, a CoALA pedig részeket ír le, nem határt húz.9 Harminc évnyi meg nem egyezés azt mondja, hogy a szó egynél több munkát végez.
Egy agent N hívás, nem egy
Link a szakaszhoz: Egy agent N hívás, nem egyMost a következmény, amely a filozófia előtt érkezik: a számla.
Itt minden mérés ugyanazt az alakot veszi fel. Az egyszeri hívás 39 input tokenbe került; ugyanaz a kérdés egy eszközzel 420-ba, két híváson át; a loop a megállási szabály eltávolításával 1.688-ba, hat híváson át. A növekedés rosszabb, mint lineáris, mert az n. kör minden előző kört magával visz: ennek a hatkörös futásnak a prompt oszlopa 187, 238, 261, 302, 327, 373. A 16. fejezet levezette, hogy az összeg , és illesztette a görbét egy valódi beszélgetésre. Egy agent minden feladatot ilyen beszélgetéssé alakít, akár látja ember, akár nem.
Ha ezeket a mért token-számokat egy kereskedelmi endpoint kapta volna a 16. fejezet által 2026. szeptember 6-án olvasott díjakkal — $2,00 millió input tokenenként és $12,00 millió output tokenenként —, a négy futás ára így alakulna:
| futás | modellhívások | input tokenek | output tokenek | költség |
|---|---|---|---|---|
| a kérdés, eszközök nélkül | 1 | 39 | 8 | $0.000174 |
| ugyanaz a kérdés, egy eszköz a katalógusban | 2 | 420 | 38 | $0.001296 |
| kérdés, amelyhez kell az eszköz | 2 | 425 | 33 | $0.001246 |
| ugyanez, a megállási szabály eltávolításával | 6 | 1.688 | 124 | $0.004864 |
A második sor az elsőhöz képest az a szám, amelyet érdemes megtartani. Hétszer és félszeres költség, rosszabb válaszért egy olyan kérdésre, amelyet a modell már eleve tudott. Semmi sem volt rosszul konfigurálva: létezett egy eszköz, ezért a modell használta — és a 18. fejezet megállapítása, hogy a katalógus ára fáj, nem a pontossága, itt kapja a legolcsóbb demonstrációját egy darabos katalógussal.
Ezért mindkét dokumentum hasznos fele az, amely arról szól, hogy ezt ne építsd meg. Az Anthropic nyers: találd meg a lehető legegyszerűbb megoldást, és csak akkor adj hozzá komplexitást, amikor szükség van rá, ami „akár azt is jelentheti, hogy egyáltalán nem építünk agentic systemeket”, mivel az agentic systemek „latenciát és költséget cserélnek jobb feladatteljesítményre”, és „sok alkalmazásnál az egyszeri LLM-hívások optimalizálása retrievallel és in-context példákkal általában elég”.4 Az agent melletti esete szűk: nyitott végű problémák, ahol nem tudod előre megjósolni a lépések számát, és nem tudsz hardcode-olt utat adni, olyan környezetben, amelyben megbízol, elfogadva a „magasabb költségeket és az egymásra rakódó hibák lehetőségét”.4 Az OpenAI szűrője ennek tükörképe — komplex ítélőképesség, karbantarthatatlan szabálykészletek, strukturálatlan adatok —, és ugyanoda fut ki: „különben egy determinisztikus megoldás is elegendő lehet”.5
Tehát ennek a fejezetnek a taxonómiájában: fix számú lépés fix sorrendben pipeline, és attól, hogy agentnek nevezed, nem lesz gyorsabb. Ha a lépések száma attól függ, mit találsz útközben, loopot akarsz — és ezt a rugalmasságot N hívással, négyzetes transcripttel és egy olyan rendszerrel vásárolod meg, amely egyszer helyett N-szer tévedhet.
Innen merre tovább
Link a szakaszhoz: Innen merre továbbMost már megvan a taxonómia, mindkét modern definíció, a két tengely, amely kompatibilissé teszi őket, és egy rövid loop, amely válaszol, hív és megáll.
Ennek a loopnak egy módja van a befejezésre: a modell abbahagyja az eszközök kérését. A 23. fejezet szándékosan töri el, hétszer, és minden törés hozzáad egy darabot. Lehetetlen feladat, és sosem ér véget — turn cap. Egy éjszaka futás, és megérkezik a számla — dollárkeret. Egy eszköz hibázik — hiba, amelyre a modell reagálhat. Ugyanaz a hívás kétszer — idempotency key. Egy fájl, amelyhez nem kellett volna nyúlnia — emberi jóváhagyás. Újraindítás félúton — session persistence. Egy eszköz három percig tart csendben — progress és cancellation. Ami kijön belőle, az egy harness, a fájl, amelyen a kurzus többi része fut.
Marad a kérdés, amelyről ennek a fejezetnek a vitatott átlója valójában szólt. Egy loopnak, amely maga dönti el a következő lépését, el kell döntenie, mikor álljon meg, és épp most néztük meg, mi történik, ha nem tudja: hat kör, négyszeres számla, és egy agent, amely a felhasználót faggatja egy olyan kérdésről, amelyet már megválaszolt. A megállás nem egyetlen feltétel. Hány van, és melyik tüzel először?
Források és módszer
Link a szakaszhoz: Források és módszerLilian Weng LLM Powered Autonomous Agents (2023) című írása a language agent tervezésre, memóriára és eszközhasználatra bontásának legismertebb felosztása, és a két vendor-dokumentum melletti megfelelő következő olvasmány; három komponense ennek a kurzusnak a 23., 24. és 18. fejezete, ebben a sorrendben.
Ebben a fejezetben minden szám ezen a gépen készült, és semmi nem becslés. A folyosó, az alaprajz, az azon járó négy agent és a három járőr-policy a fenti TypeScript, Node 22-n futtatva; a randomizált agent számai egyenként 2.000 seedelt futás átlagai, a járőrszámok pedig 4.000 tickes egyszeri seedelt futások. A modell trace-ek a Qwen2.5-0.5B-Instruct modellből származnak, float32-ben CPU-n, greedy decodinggal, loopbacken kis helyi Python endpointtal kiszolgálva, amely betölti a súlyokat és OpenAI chat-completions alakban beszél — megint ugyanaz a varrat, a tenzorok a Python oldalon, a loop pedig a TypeScript oldalon —, így a token-számok annak a modellnek a tokenizeréből, a latenciák pedig annak a gépnek a méréséből jönnek. Az egyetlen máshonnan vett szám a költségtáblázat két ára, amelyek azok a díjak, amelyeket a 16. fejezet az OpenAI árazási oldaláról olvasott 2026. szeptember 6-án; itt a helyben mért token-számokra alkalmazzuk őket illusztrációként, nem megfigyelt számlaként.
Hivatkozások
Link a szakaszhoz: Hivatkozások-
Russell, S. és Norvig, P. Artificial Intelligence: A Modern Approach, 4. kiadás, 2. fejezet, Intelligent Agents. A porszívóvilág, a PEAS-specifikáció, a teljesítménymérőhöz viszonyított racionalitás definíciója, a feladatkörnyezetek hét tulajdonsága, az itt használt öt agent-típus, valamint annak a megfigyelésnek a forrása, hogy részlegesen megfigyelhető környezetekben az infinite loopok gyakran elkerülhetetlenek az egyszerű reflex agentek számára. A könyv kísérő kódja a
aimacode/aima-pythona GitHubon (8.806 csillag, utolsó push 2026. június 30., olvasva 2026. szeptember 7.) — érdemes pontosan megnevezni, mi ez. Egy könyv kísérő repositoryja, nem olyan referenciaimplementáció, amelyre más projektek építenek, ahogy akarpathy/micrograd(17.412) és akarpathy/nanoGPT(62.852). Ezért ez a fejezet idézi és linkeli, nem pedig lefordítja, és ezért nem érvényes itt az ökoszisztéma-érv, amely az 5. fejezetet Pythonban tartotta: ebben a fejezetben semmi nem érint tenzort, a fent írt loop pedig a 23. fejezet közvetlen őse. ↩ ↩2 ↩3 ↩4 ↩5 -
Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. és Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). A reasoning trace-ek és műveletek váltakozása, amelyre a megfeleltetési táblázat célalapú sora utal. ↩
-
Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. és Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). A cikk saját mechanizmus-összefoglalója az oka, hogy tanuló agentre képezhető le: az agenteket „nem a súlyok frissítésével, hanem nyelvi visszajelzésen keresztül” erősíti meg, olyan agentekkel, amelyek „verbálisan reflektálnak a feladat-visszajelzési jelekre, majd saját reflektív szövegüket epizodikus memória bufferben tartják fenn, hogy későbbi próbákban jobb döntéshozatalt idézzenek elő”. ↩ ↩2
-
Anthropic, Building effective agents, 2024. december 19.,
anthropic.com/engineering/building-effective-agents, olvasva 2026. szeptember 7. A fent idézett workflow/agent megkülönböztetés, az „agentic systems” ernyőfogalom, az agentek „jellemzően csak LLM-ek, amelyek környezeti visszajelzés alapján eszközöket használnak egy loopban” leírásának, annak az útmutatásnak a forrása, hogy a lehető legegyszerűbb megoldást kell megtalálni, és ez „akár azt is jelentheti, hogy egyáltalán nem építünk agentic systemeket”, valamint az agentek melletti és elleni érvek forrása, beleértve a „magasabb költségeket és az egymásra rakódó hibák lehetőségét”, és az olyan megállási feltételek ajánlását, „mint az iterációk maximális száma” az irányítás fenntartására. ↩ ↩2 ↩3 -
OpenAI, A practical guide to building agents, 4–7. oldal, olvasva 2026. szeptember 7. Az „az agentek olyan rendszerek, amelyek önállóan hajtanak végre feladatokat a nevedben”, az „egyszerű chatbotok, single-turn LLM-ek vagy sentiment classifierök” kizárásának, a workflow „lépések sorozata, amelyet végre kell hajtani a felhasználó céljának eléréséhez” definíciójának, az agent két alapvető jellemzőjének, a három komponensnek — modell, eszközök, instrukciók — és annak a szűrési kritériumnak a forrása, hogy mikor érdemes ilyet építeni, amely így zárul: „különben egy determinisztikus megoldás is elegendő lehet”. ↩ ↩2 ↩3
-
Wooldridge, M. és Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, 10. kötet, 2. szám (1995). Az a survey, amely a terület használatát az agency gyenge fogalmára — autonómia, társas képesség, reaktivitás, proaktivitás — és mentális szókincset kölcsönző erősebb fogalmakra bontotta. Ma olvasva ugyanannak az érvnek a feljegyzése, amelyet ennek a fejezetnek a két dokumentuma még mindig folytat. ↩
-
Franklin, S. és 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). Nem idézetért szerepel itt, hanem azért, ami: egy survey, amely összegyűjtötte az „agent” akkor forgalomban lévő definícióit, megállapította, hogy nem értenek egyet, és taxonómiát javasolt az érv helyett. Harminc évvel később az érv jobb megjelenésű dokumentációban van, és egyébként változatlan. ↩
-
Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). Fent az opening definition miatt idéztük: „az AI agentek mesterséges entitások, amelyek érzékelik környezetüket, döntéseket hoznak és cselekszenek”, ami a tankönyvi definíció 2023-as újramondása, mert nem volt elfogadott modern definíció, amelyet idézni lehetett volna. ↩
-
Sumers, T. R., Yao, S., Narasimhan, K. és Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). A language agenteket „moduláris memóriakomponensekként, a belső memóriával és külső környezetekkel való interakcióra szolgáló strukturált cselekvési térként, valamint a cselekvések kiválasztására szolgáló általánosított döntéshozatali folyamatként” szervezi, és expliciten a szimbolikus AI és a kognitív tudomány történetébe helyezi őket. A memória taxonómiája a 24. fejezetben tér vissza, ahol a háromtáras táblázat a gyakorlati árnyéka. ↩