Mikä AI agent on: viisi klassista tyyppiä, kaksi kilpailevaa määritelmää
Vacuum-maailma rikotaan neljästi: jokainen murros tuottaa yhden viidestä agent-tyypistä. Sitten yksi työkalu muuttaa 39 tokenin kutsun 420:ksi.
Tällä sivulla
Tässä on sama kysymys, esitetty kahdesti samalle mallille, samoilla painoilla ja greedy decodingilla. Ainoa ero on, että toisella kerralla katalogissa oli yksi työkalu.
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 msYhdestä kutsusta tuli kaksi. Kolmestakymmenestäyhdeksästä input tokenista tuli 420, kerroin 10,8. Alle sekunnista tuli lähes seitsemän. Ja vastaus sai mukaan faktan, jota kukaan ei pyytänyt, työkalusta, jonka malli päätti kutsua kysymykseen, jossa säätä ei koskaan mainittu.
Toinen järjestelmä on se, mitä suurin osa toimialasta vuonna 2026 kutsuu agentiksi. Tai sitten se ei ole sellainen, riippuen siitä, kumman kahdesta luetuimmasta määritelmästä avaat — eivätkä ne kaksi sano samaa asiaa. Toinen ei ole edes samaa mieltä itsensä kanssa.
Tämä erimielisyys on tämän luvun aihe. Kyse ei ole sanastoriidasta: kaksi määritelmää vetävät rajan eri akseleille, ja valitsemasi akseli päättää, mitä rakennat ja mistä sinua laskutetaan. Molemmat nojaavat vanhempaan taksonomiaan, ja halvin tapa ansaita se on rakentaa maailman huonoin agent.
Näytä lisätiedot
Mitä tämä luku tarvitsee aiemmista luvuista.
- Luku 13 mittasi, mitä yksi kutsu maksaa ajassa; tämä luku kertoo sen vuorojen määrällä.
- Luku 15: prompt on mallin koko tila, koska mikään ei selviä kutsusta.
- Luku 16: input tokenit kasvavat keskustelun neliön mukana.
- Luku 18: työkalukatalogi ja edestakainen kierros, jossa malli pyytää ja sinun koodisi suorittaa.
Ei tensoreita täällä. Luku on TypeScriptiä, kuten luku 14:n kielisääntö määrää, ja sen silmukka on luvun 23 silmukan suora esi-isä.
Robotti kahdessa huoneessa
Linkki osioon: Robotti kahdessa huoneessaAlan vanhin esimerkki on pölynimuri kahden ruudun maailmassa, A ja B, joista kumpikin on joko puhdas tai likainen.1 Se elää jokaisessa oppikirjassa, koska se on pienin maailma, jossa agent voi olla oikeassa tai väärässä.
Havainto on pari — missä olen ja onko tässä likaista — ja toiminnot ovat SUCK, LEFT ja RIGHT. Koko ohjelma on yksi rivi.
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"; Aja se kaikkia kahden ruudun maailman lähtötiloja vasten:
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=trueTämä on simple reflex agent: se toimii vain nykyisen havainnon perusteella, ilman muistia mistään aiemmasta. Ei lelukategoria — termostaatti on sellainen, samoin yksi kielimallikutsu ilman siihen liitettyä keskustelua.
Riko se nyt samalla tavalla kuin todellisuus rikkoo. Oikealla imurirobotilla on pölyanturi ja puskuri, ei maton alla A:lla merkittyä ruutua. Ota sijainti pois havainnosta äläkä muuta mitään muuta:
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} -> RIGHTSama ohjelma, kaksi ruutua. Yhdestä lähtötilasta se valmistuu kolmessa askeleessa; toisesta se ajaa oikeanpuoleiseen seinään viisisataa kertaa ja jatkaisi, kunnes akku kuolisi. Se ei pysty havaitsemaan kahden tilanteen eroa, joten se ei voi toimia niissä eri tavalla. Russell ja Norvig ilmaisevat yleisen tuloksen yhdessä rivissä: infinite loopit ovat usein väistämättömiä simple reflex agent -järjestelmille osittain havaittavissa ympäristöissä.1
On olemassa korjaus, joka maksaa yhden rivin eikä lainkaan muistia, ja se kannattaa mitata ennen kuin tavoitellaan mitään nokkelampaa.
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);
const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT"); Kaksituhatta ajoa kokonaan likaisessa käytävässä kolmella koolla, sama seeded generator koko ajan:
| huoneet | keskimääräiset askeleet | mediaani | huonoin 2 000:sta | ei koskaan valmistunut |
|---|---|---|---|---|
| 2 | 4,0 | 4 | 13 | 0 |
| 4 | 16,6 | 14 | 81 | 0 |
| 8 | 68,7 | 52 | 306 | 0 |
Satunnaistus poistaa silmukan kokonaan. Se myös maksaa: kahdeksan huonetta vaatii viisitoista liikettä, jos tiedät mitä teet, ja tämä agent käyttää keskimäärin 68,7 ja kerran 306. Siinä koko luku pienoiskoossa. Jokainen lisäämämme kyvykkyys ostaa oikeellisuutta tilanteessa, jota edellinen agent ei osannut käsitellä, ja veloittaa siitä valuutassa, joka sinun on ensin nimettävä.
Osien nimeäminen, kun niitä nyt tarvitaan
Linkki osioon: Osien nimeäminen, kun niitä nyt tarvitaanAgent havaitsee ympäristöään sensoreiden kautta ja toimii aktuaattoreiden kautta. Agent-ohjelma on funktio havainnoista toimintoihin — jokainen yllä oleva listaus on sellainen. Havaintosekvenssi on kaikki tähän asti havaittu, ja simple reflex agent sivuuttaa siitä kaiken paitsi viimeisen kohdan.
Rationaalisuus on sana, jonka useimmat artikkelit ymmärtävät väärin, ja sen ymmärtäminen oikein tekee tämän luvun lopusta käyttökelpoisen. Agent ei ole itsessään rationaalinen tai irrationaalinen. Russell ja Norvig määrittelevät rationaalisen agentin sellaiseksi, joka jokaiselle mahdolliselle havaintosekvenssille valitsee toiminnon, jonka odotetaan maksimoivan sen suoritusmitan, kun huomioon otetaan kyseisen sekvenssin todistusaineisto ja mikä tahansa sisäänrakennettu tieto.1 Suoritusmitta ei ole agentin sisällä: se kuuluu suunnittelijalle, ja rationaalisuus määritellään vain suhteessa siihen.
Määritys kirjoitetaan perinteisesti neljänä asiana, PEAS: performance measure, environment, actuators, sensors.
| imurirobotti | support-agent tuotannossa | |
|---|---|---|
| Performance measure | puhtaat ruudut, akkuyksikköä kohti | ratkaistut tiketit, dollaria kohti, ilman eskalointia |
| Environment | lattia, lika, huonekalut, matto | tikettijono, tietokantasi, asiakas |
| Actuators | pyörät, imu | tool calls |
| Sensors | pölyanturi, puskuri | käyttäjän viesti, työkalutulokset |
Huomaa, mikä rivi on poikkeus. Lähes jokainen agent-järjestelmiä vuonna 2026 rakentava tiimi kirjoittaa ylös E:n, A:n ja S:n — työkaluschemat, integraatiot, viestimuodon — koska koodi ei käynnisty ilman niitä. Lähes kukaan ei kirjoita ylös P:tä. Ilman sitä lauseella "agentimme toimii hyvin" ei ole tarkistettavaa merkitystä, eikä sanaa "rationaalinen" voi soveltaa järjestelmään lainkaan, vain demonstraatioon. Luku 29 käsittelee P:n muuttamista numeroksi, ja siksi se on olemassa.
┌───────────────────────── 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 itTehtäväympäristöt luokitellaan lisäksi seitsemällä akselilla, joista viisi ratkaisee suurimman osan vaikeudesta täällä: täysin tai osittain havaittava, deterministinen tai ei, episodinen tai sekventiaalinen, staattinen tai dynaaminen, tunnettu tai tuntematon.1 Agent, joka puhuu oikeille työkaluille oikean verkon yli, on kaikkien viiden vaikeassa nurkassa — epädeterministinen jopa lämpötilassa nolla (luku 17), ja aliarvostettuna kohtana tuntematon, koska sinulla ei ole luotettavaa mallia siitä, mitä omat työkalusi tekevät maailmalle. Siksi luvun 23 silmukka tarvitsee virheenkäsittelyä enemmän kuin suunnittelua.
Muistin lisääminen ja seuraavan seinän löytäminen
Linkki osioon: Muistin lisääminen ja seuraavan seinän löytäminenOikeat lattiat eivät ole yksiulotteisia, joten nosta maailma pohjapiirrokseksi. Ristikot ovat seiniä, tähdet likaa, ja robotti aloittaa keskimmäisestä kammiosta:
col 0 1 2 3 4 5 6
row 0 * . . # . . *
row 1 . # . # . # .
row 2 . # . S . # . S = the robot starts here
row 3 . # . # . # .
row 4 * . . # . . *Ilmeinen päivitys on muisti. Agent pitää karttaa: jokainen ruutu, jossa se on seissyt, ja jokainen ruutu, jossa puskuri laukesi. Sen sääntö on kävellä viereiseen ruutuun, jossa se ei ole käynyt — oikealle, sitten alas, sitten vasemmalle, sitten ylös — ja perääntyä, kun kaikki ympärillä on tunnettua. Tämä on model-based reflex agent: se ylläpitää sisäistä tilaa havaintohistoriasta, joten se voi toimia sen perusteella, mitä se ei tällä hetkellä näe.
Se on todellinen parannus, eikä silti riitä:
5,000 steps allowed -> steps=5,000 distinct squares visited=13/25 still dirty=2/4Viisituhatta liikettä, puolet lattiasta näkemättä. Kartta on oikea ja säännöt ovat oikeat. Agent ei osaa käyttää karttaa mennäkseen johonkin: sen säännöt vastaavat aina vain kysymykseen "mihin neljästä naapuristani minun pitäisi astua", joten kun viereiset käymättömät ruudut loppuvat, sillä ei ole tapaa ilmaista ajatusta kahdeksan liikkeen päässä on käymätön ruutu ja haluaisin seisoa siinä. Se tietää missä on. Se ei tiedä, missä se haluaa olla.
Tavoite ja sitten syy suosia yhtä reittiä toisen sijaan
Linkki osioon: Tavoite ja sitten syy suosia yhtä reittiä toisen sijaanGoal-based agent pitää maailmamallinsa lisäksi kuvauksen tilanteesta, jonka se haluaa saada aikaan, ja valitsee toimintoja etsimällä niiden sekvenssejä, kunnes löytää sellaisen, joka päättyy sinne. Tavoitteet muuttavat toiminnon valinnan hausta hakutaulukkoon — tai tarkemmin lookupista etsinnäksi.
Tavoite on "yhtään likaista ruutua ei jää". Haku on leveyshaku lähimpään likaiseen ruutuun, ja sen palauttama polku on suunnitelma.
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,0Kaksikymmentäseitsemän liikettä, lattia puhdas. Mutta katso akkukolumnia ja suunnitelman viimeistä osuutta. Sarake 0 on kokolattiamattoa: matolla olevan ruudun ylittäminen maksaa kuusi akkuyksikköä, laattaruudun yksi. Agent meni kotiin saraketta 0 pitkin, koska se on neljä liikettä kahdeksan sijaan, ja nuo neljä mattoliikettä maksoivat 24 siinä missä kahdeksan liikkeen kiertotie olisi maksanut 13.
Se ei voi tehdä toisin. Tavoite on binäärinen testi: lattia on puhdas tai se ei ole. Jokainen suunnitelma, joka päättyy puhtaaseen lattiaan, täyttää sen yhtä hyvin, joten kun useampi onnistuu, agentilla ei ole mitään, minkä perusteella valita niiden välillä. Yhden onnistumisen suosiminen toisen sijaan tarvitsee tulosten yli numeron, ja tuo numero on utility function. Agent, joka maksimoi sen, on utility-based agent.
Koodimuutos on yksi termi haun sisällä. Leveyshaku laskee liikkeitä; pane se laskemaan kustannusta, niin sinulla on Dijkstran algoritmi ja erilainen agent:
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,0Neljä lisäliikettä, yksitoista akkuyksikköä vähemmän: kaksikymmentäyksi prosenttia halvempi. Sama tavoite, sama kartta, sama koodi yhtä termiä lukuun ottamatta. Nämä kaksi agentia eroavat vain siinä, missä ne yrittävät olla hyviä, ja ne kulkevat eri reittejä kotiin.
Tämä on myös ensimmäinen kohta, jossa agent tarvitsee jotakin, mitä se ei voi tuottaa. Jonkun täytyy päättää, mitä yksi akkuyksikkö on arvoltaan suhteessa yhteen liikkeeseen. Utility on suoritusmitta muodossa, jolla agent voi laskea, ja sen kirjoittaminen on suunnittelijan työ. Kun ihmiset sanovat, että agent "optimoi väärää asiaa", he tarkoittavat melkein koskaan bugia. He tarkoittavat, että tämä rivi kirjoitettiin huolimattomasti.
Viides tyyppi ja tapa, jolla se menee pieleen
Linkki osioon: Viides tyyppi ja tapa, jolla se menee pieleenAnna lian nyt palata. Neljä huonetta likaantuu uudelleen neljällä eri nopeudella, eikä agentille kerrota niitä koskaan. Se käy yhdessä huoneessa per tick ja näkee vain sen huoneen. Suoritusmitta on likaisina vietetyt huone-tickit 4 000 tickin aikana — pienempi on parempi.
Learning agent on oppikirjan jäsennyksessä mikä tahansa yllä olevista plus kolme osaa: learning element, joka muuttaa agentia, critic, joka kertoo miten agent pärjää kiinteää suoritusstandardia vasten, ja problem generator, joka ehdottaa toimintoja, joita kannattaa kokeilla sen perusteella, mitä ne opettaisivat.1 Kolme politiikkaa samassa ympäristössä. Ensimmäinen ei opi; toinen ja kolmas oppivat saman asian ja käyttävät sitä eri tavalla.
| politiikka | likainen-huone-tickit yli 4 000:n | verrattuna partioon |
|---|---|---|
| kiinteä round-robin-partio, ei oppimista | 2 290 | — |
| oppija A: arvioi jokaisen huoneen likaantumisnopeus, mene sitten sinne missä lika on todennäköisintä | 11 820 | 5,2× huonompi |
| oppija B: samat arviot, painotettuna ajalla viime käynnistä | 1 576 | 31 % parempi |
Piilotetut nopeudet olivat 0,35 keittiölle, 0,05 eteiselle, 0,02 työhuoneelle ja 0,01 ullakolle — ja oppija A löysi ne. Se tunnisti oikein keittiön talon likaisimmaksi huoneeksi ja meni sitten keittiöön jokaisella tickillä simulaation loppuun asti, samalla kun kolme muuta istuivat likaisina ikuisesti. Se on viisi kertaa huonompi kuin olla oppimatta lainkaan, eikä se ole rikki.
Opetus on sama kuin utility-osiossa. Oppija A maksimoi "todennäköisyys, että huone, johon olen menossa, on likainen". Suoritusmitta oli "likaisina vietetyt huone-tickit". Eri numerot; jälkimmäistä critic pisteytti, eikä kukaan kertonut agentille. Oppija B kertoo saman opitun nopeuden ajalla viime käynnistä — lian määrällä, jonka se odottaa löytävänsä, eikä todennäköisyydellä löytää yhtään — ja päihittää partion, josta aloitti.
Yksi toteutusyksityiskohta ratkaisi tuloksen. Oppija B:n ensimmäisessä versiossa huone, jossa likaa ei ollut ilmestynyt kolmella käynnillä, sai nopeudeksi tasan nolla — ja nolla kertaa mikä tahansa on nolla, joten siellä ei käyty enää koskaan eikä arviota voitu koskaan korjata. Murtoluvun tasoitus, onnistumiset plus yksi jaettuna kokeilla plus kaksi, muutti 11 895:n luvuksi 1 576. "Ei vielä havaittu" ja "mitattu ja tulos oli nolla" ovat eri väitteitä, ja järjestelmä, joka tallentaa ne samaan kenttään, tekee päätöksiä, joita se ei voi perua.
Viisi tyyppiä ja mitä ne ovat vuonna 2026
Linkki osioon: Viisi tyyppiä ja mitä ne ovat vuonna 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 aboveJokainen viidestä on tuotannossa tänään toisella nimellä.
| klassinen tyyppi | mitä se kantaa havaintojen välillä | sen muoto vuonna 2026 | mitä se ei voi tehdä |
|---|---|---|---|
| simple reflex | ei mitään | yksi mallikutsu ilman historiaa: luokitin, poimintaendpoint, yhden vuoron completion | mitään, mikä riippuu edellisestä vuorosta |
| model-based reflex | sisäinen tila, joka rakentuu havaintohistoriasta | chat: transcript, lähetetään kokonaan uudelleen joka kutsulla | valita, mihin keskustelun pitäisi päätyä |
| goal-based | tila plus kuvaus halutusta tilanteesta | reason-and-act-silmukka, jossa on pysäytysehto2 | suosia yhtä onnistunutta suunnitelmaa toisen sijaan |
| utility-based | tila, tavoite ja numero tulosten yli | evaluator–optimiser-silmukat ja ehdokasvastausten ranking kirjoitetulla kriteerillä (luku 25) | keksiä kriteeriä |
| learning | kaikki se, plus critic ja problem generator | Reflexion, joka kirjoittaa omat oppinsa episodiseen puskuriin sen sijaan, että päivittäisi painoja;3 pysyvä käyttäjämuisti (luku 24) | valita standardia, jota vasten critic pisteyttää |
Kaksi riviä ovat enemmän kuin analogia tavalla, joka maksaa rahaa.
Chat on model-based reflex agent, jonka malli ei ole sisäinen. Oppikirjassa tila on muuttuja agent-ohjelman sisällä. Chatissa se on transcript: se elää sinun puolellasi, lähetetään kokonaan uudelleen jokaisella kutsulla ja rakennetaan mallin sisällä tyhjästä joka kerta. Se on luvun 16 neliöllinen lasku, ja se on sama olio, jonka oppikirja piirsi laatikkona nimeltä "tila". Tässä ero mitattuna yhdellä jatkokysymyksellä, jossa kaksi aiempaa viestiä ovat mukana tai eivät:
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."Sama malli, samat kolme käyttäjän input-sanaa, ja toinen on käytävärobotti ajamassa seinään. Tuossa ajossa ei ollut työkaluja, joten 15 on keksitty — mutta tila on se, mikä tekee jatkokysymyksestä ylipäätään merkityksellisen. Rakennat sen joka kerta uudelleen ja maksat siitä 2,3× input tokenit kahden vuoron keskustelussa. Luku 16 mittasi, mihin tuo kerroin nousee vuorolla neljäkymmentä.
Reflexion on learning agent, joka muuttaa inputia eikä ohjelmaansa. Oppikirjan jäsennyksessä learning element muokkaa performance elementiä. Reflexion jättää painot rauhaan ja kirjoittaa reflektiivistä tekstiä episodiseen puskuriin, jonka seuraava yritys lukee.3 Learning element on prompt, muisti on tietokantarivi, performance element on jäädytetty malli — ja kaavio on oppikirjan, muuttumattomana.
Ja tässä on kartoituksen rehellinen raja. Viisi tyyppiä luokittelevat agent-ohjelman. Vuonna 2026 tuo ohjelma on jaettu keskeltä: osa siitä on sinun koodiasi, osa on painojen sisällä, joita et kouluttanut. Kun malli päättää itse kutsua työkalua, onko tavoitetesti sinun ohjelmassasi vai mallissa? Taksonomialla ei ole vastausta, koska kun se kirjoitettiin, sille ei ollut muutakaan paikkaa — ja juuri tämän kysymyksen kohdalla kaksi modernia määritelmää erkanevat.
Vastaaminen, kutsuminen ja pysähtyminen yhdessä tracessa
Linkki osioon: Vastaaminen, kutsuminen ja pysähtyminen yhdessä tracessaMääritelmät ovat väitteitä käyttäytymisestä, ja niitä on paljon helpompi arvioida, kun trace on edessä.
Alla oleva silmukka lähettää keskustelun mallille; jos vastaus sisältää tool callin, se suorittaa työkalun, lisää tuloksen ja lähettää koko asian uudelleen. Se ajaa paikallista Qwen2.5-0.5B-Instructia OpenAI:n muotoisen endpointin takana tällä koneella — luvun 14 saumaa, joten silmukka ei tiedä eikä välitä, mitä portin takana on.
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");
}Kaksi riviä kantaa koko idean, ja molemmat on merkitty; loppu on kirjanpitoa. Kaikki kolme käyttäytymistä näkyvät yhdessä ajossa. Kun mallilta kysytään jotain, minkä se osaa itse, se vastaa. Kun kysytään jotain, mitä se ei osaa, se kutsuu:
=== 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 callJa se pysähtyy — kolmas käyttäytyminen ja helpoin ohittaa, koska se näyttää siltä, ettei mitään tapahdu. Silmukka päättyy, koska vuoro 2 palasi ilman tool callia. Kukaan ei päättänyt sitä; malli päätti sen tuottamalla proosaa. Tämän ohjelman päättymisehto on poissaolon merkki.
Kaksi lisäajoa ansaitsee tilan. Kun mallia pyydetään vertaamaan kahta kaupunkia, se antaa molemmat tool callit yhdellä vuorolla, saa molemmat lukemat takaisin ja tekee vertailun väärin:
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."Työkalut toimivat. Rinnakkainen kutsu toimi. Silmukka toimi. Vastaus on epätosi, ja molemmat oikeat numerot ovat transcriptissa. Mallin kääriminen silmukkaan ei tee siitä päättelevää; se antaa väärässä olevalle mallille kyvyn toimia väärässä olemisen pohjalta — mikä on luku 30 etukäteen ja puolet luvusta 29.
Poista nyt merkitty return ja anna silmukan ajaa kattoonsa asti. Sama kysymys, sama malli:
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 capNeljä kertaa input tokenit, neljä kertaa seinäkello, ja loppu, jossa agent on unohtanut, mitä siltä kysyttiin, ja kuulustelee käyttäjää kysymyksestä, johon tämä vastasi vuorolla yksi. Oikea vastaus oli ruudulla vuorolla 2, ja jokainen sen jälkeinen vuoro teki transcriptista huonomman.
Agent ei siis ole silmukka. Se on silmukka plus sääntö siitä poistumiselle, ja tällä on täsmälleen yksi sellainen sääntö. Luku 23 löytää viisi ja näyttää, mitä rikkoutuu, kun kukin puuttuu.
Kaksi määritelmää rinnakkain
Linkki osioon: Kaksi määritelmää rinnakkainMolemmat lainattuina eikä parafraaseina, koska parafraasit ovat paikka, jossa sekaannus valmistetaan.
Ensimmäinen määritelmä asettaa rajan siihen, kuka kontrolloi kulkua. Anthropicin Building effective agents nimeää epäselvyyden ja tekee ratkaisun:
"Anthropicilla luokittelemme kaikki nämä variaatiot agentic systems -järjestelmiksi, mutta teemme tärkeän arkkitehtonisen eron workflowien ja agentien välille: workflowt ovat järjestelmiä, joissa LLM:t ja työkalut orkestroidaan ennalta määriteltyjen koodipolkujen kautta. Agentit taas ovat järjestelmiä, joissa LLM:t ohjaavat dynaamisesti omia prosessejaan ja työkalujen käyttöään sekä säilyttävät kontrollin siitä, miten ne suorittavat tehtäviä."4
Testi on kysymys lähdekoodistasi: kuka valitsi seuraavan askeleen? switch ohjelmassasi: workflow. Malli: agent. Sama dokumentti sanoo, että agentit "ovat tyypillisesti vain LLM:iä, jotka käyttävät työkaluja ympäristöpalautteen perusteella silmukassa" — mikä on täsmälleen yllä oleva listaus.
Toinen määritelmä asettaa rajan riippumattomuuteen käyttäjästä. OpenAI:n A practical guide to building agents avaa määrittelysivunsa näin:
"Siinä missä tavanomainen ohjelmisto auttaa käyttäjiä virtaviivaistamaan ja automatisoimaan workfloweja, agentit pystyvät suorittamaan samat workflowt käyttäjien puolesta korkealla riippumattomuuden asteella. Agentit ovat järjestelmiä, jotka suorittavat tehtäviä itsenäisesti puolestasi."5
Kaksi virkettä myöhemmin, samalla sivulla, se sulkee pois:
"Sovellukset, jotka integroivat LLM:iä mutta eivät käytä niitä workflow-suorituksen kontrollointiin — ajattele yksinkertaisia chatbotteja, yhden vuoron LLM:iä tai sentimenttiluokittimia — eivät ole agenteja."5
Lue nuo lainaukset järjestyksessä. Avausvirkkeet vetävät rajan riippumattomuuteen: lähteekö tämä asia tekemään työn valmiiksi ilman minua? Neljäs vetää sen suorituksen kontrolliin, joka on täsmälleen Anthropicin raja. Eri testit, sama sivu, ja on olemassa oikeita järjestelmiä, joista ne ovat eri mieltä.
Alla on sanastotörmäys, ja se aiheuttaa väittelyjä oikeissa kokouksissa. Ensimmäisessä dokumentissa workflow on arkkitehtuuri ja se on asia, joka ei ole agent. Toisessa workflow on "askelten sekvenssi, joka täytyy suorittaa käyttäjän tavoitteen saavuttamiseksi" — itse työ, joita jokaisella agentilla on yksi. "Korvasimme workflowin agentilla" on ensimmäisen määritelmän alla johdonmukainen ja toisen alla lähes merkityksetön.
Kolme järjestelmää, luokiteltuna kahdesti
Linkki osioon: Kolme järjestelmää, luokiteltuna kahdestiKolme vuonna 2026 olemassa olevaa järjestelmää, molempien määritelmien alla.
Coding agent terminaalissa
Linkki osioon: Coding agent terminaalissaKuvaat tehtävän; se lukee tiedostoja, ajaa testisarjan, muokkaa, ajaa ne uudelleen ja pysähtyy, kun ne menevät läpi tai kun se luovuttaa. Mikään koodissasi ei päätä, että seuraava askel on "aja testit" — malli tekee sen sen perusteella, mitä edellinen työkalu palautti.
Määritelmä yksi: agent, koska malli ohjaa omaa prosessiaan. Määritelmä kaksi: agent, koska se suorittaa tehtävän itsenäisesti, tunnistaa valmistumisen ja luovuttaa kontrollin takaisin. Molemmat dokumentit siteeraavat tätä muotoa keskeisenä esimerkkinään.
Öinen tikettilajittelun pipeline
Linkki osioon: Öinen tikettilajittelun pipelineJokaiselle uudelle support-tiketille kolme mallikutsua kiinteässä järjestyksessä — luokittele, poimi kentät, luonnostele vastaus — ja sitten se lähettää. Mikään malli ei koskaan valitse, mitä seuraavaksi tapahtuu; for-silmukka tekee sen. Se ajaa kello 03.00 eikä kukaan katso sitä.
Määritelmä yksi: ei agent. Se on prompt chaining, listattu nimeltä workflowksi. Määritelmä kaksi: molemmat vastaukset. Avausvirkkeiden mukaan se suorittaa tehtäviä itsenäisesti puolestasi; neljännen mukaan se ei käytä mallia workflow-suorituksen kontrollointiin ja suljetaan pois. Tämä järjestelmä on syy lukea koko sivu eikä vain nostolainausta.
Chat assistant hakutyökalulla
Linkki osioon: Chat assistant hakutyökalullaYksi käyttäjävuoro. Malli päättää itse, hakeeko se ennen vastaamista, sitten se vastaa ja odottaa sinua.
Määritelmä yksi: agent, koska malli ohjaa dynaamisesti omaa työkalujen käyttöään ympäristön tulosten perusteella, mikä on ilmoitettu testi. Määritelmä kaksi: ei agent, koska riippumattomuutta ei ole — yksi vuoro, sitten se luovuttaa takaisin — ja "yksinkertaiset chatbotit" ovat poissulkulistalla nimeltä.
Kaksi kolmesta vaihtaa puolta. Se ei ole kummankaan dokumentin epäonnistuminen. Se on varoitus kokoustyypistä, jossa kaksi ihmistä, jotka ovat täysin samaa mieltä siitä, mitä järjestelmä tekee, käyttävät tunnin erimielisyyteen siitä, millä nimellä sitä kutsutaan.
Tie ulos on kaksi akselia, ei yksi
Linkki osioon: Tie ulos on kaksi akselia, ei yksiMääritelmät törmäävät, koska kumpikin litistää kaksi riippumatonta kysymystä yhteen sanaan. Erota ne, ja erimielisyydestä tulee taulukko, joka on hyödyllisempi kuin tuomio.
| sinun koodisi valitsee seuraavan askeleen | malli valitsee seuraavan askeleen | |
|---|---|---|
| ihminen katsoo joka vuoroa | lomake, jonka sisällä on malli: luokittimet, poiminta, yhden vuoron completion | chat työkaluilla — määritelmä yksi sanoo agent, määritelmä kaksi sanoo ei |
| kukaan ei katso ennen kuin se on valmis | pipeline — määritelmä kahden avaus sanoo agent, sen neljäs virke sanoo ei | kaikki ovat samaa mieltä: agent |
Kukin määritelmä kiistää eri solun, eivätkä kaksi muuta ole kiistanalaisia lainkaan. Joten kun nimilapulla on väliä — sopimuksessa, riskikatselmuksessa, postmortemissa — kaksi kirjoittamisen arvoista virkettä eivät ole "onko se agent", vaan kuka valitsi seuraavan askeleen ja kuka katsoi. Molempiin voi vastata lukemalla koodia, kumpikaan ei tarvitse kenenkään määritelmää, ja yhdessä ne kantavat kaikki seuraukset, joita nimilappu oli edustamassa.
Mikään tästä ei ole uutta. Wooldridge ja Jennings kartoittivat sanan "agent" kilpailevat merkitykset vuonna 1995;6 Franklin ja Graesser kysyivät tämän luvun kysymyksen vuonna 1996, kokosivat liikkeellä olleet määritelmät ja havaitsivat, että ne olivat eri mieltä.7 Vuoden 2023 katsaus määrittelee agentit yhä ensimmäisistä periaatteista — "keinotekoisia olioita, jotka aistivat ympäristönsä, tekevät päätöksiä ja toimivat"8 — koska mitään vakiintunutta ei ollut, mihin viitata, ja CoALA kuvaa osia sen sijaan, että vetäisi rajaa lainkaan.9 Kolmekymmentä vuotta haluttomuutta sopia kertoo, että sana tekee useampaa kuin yhtä työtä.
Agent on N kutsua, ei yksi
Linkki osioon: Agent on N kutsua, ei yksiNyt seuraus, joka saapuu ennen filosofiaa: lasku.
Jokaisella tämän luvun mittauksella on sama muoto. Yksi kutsu maksoi 39 input tokenia; sama kysymys yhdellä työkalulla maksoi 420 kahden kutsun yli; silmukka, josta pysäytyssääntö poistettiin, maksoi 1 688 kuuden yli. Kasvu on lineaarista pahempaa, koska vuoro n kantaa mukanaan jokaisen aiemman vuoron: tuon kuuden vuoron ajon prompt-sarake on 187, 238, 261, 302, 327, 373. Luku 16 johti, että kokonaismäärä on , ja sovitti käyrän oikeaan keskusteluun. Agent muuttaa jokaisen tehtävän tuollaiseksi keskusteluksi, näki ihminen sitä tai ei.
Jos nuo mitatut token-määrät olisivat menneet kaupalliseen endpointiin hinnoilla, jotka luku 16 luki 6. syyskuuta 2026 — $2,00 per miljoona input tokenia ja $12,00 per miljoona output tokenia — neljä ajoa hinnoittuisivat näin:
| ajo | mallikutsut | input tokenit | output tokenit | kustannus |
|---|---|---|---|---|
| kysymys, ei työkaluja | 1 | 39 | 8 | $0.000174 |
| sama kysymys, yksi työkalu katalogissa | 2 | 420 | 38 | $0.001296 |
| kysymys, joka tarvitsee työkalun | 2 | 425 | 33 | $0.001246 |
| sama, pysäytyssääntö poistettuna | 6 | 1 688 | 124 | $0.004864 |
Rivi kaksi suhteessa riviin yksi on numero, joka kannattaa muistaa. Seitsemän ja puoli kertaa kustannus, huonommasta vastauksesta kysymykseen, jonka malli jo tiesi. Mikään ei ollut väärin konfiguroitu: työkalu oli olemassa, joten malli käytti sitä — ja luvun 18 havainto, että katalogin hinta eikä sen tarkkuus on se, mikä sattuu, saa tässä halvimman demonstraationsa yhden työkalun katalogilla.
Siksi kummankin dokumentin hyödyllinen puolisko on se puolisko, joka käsittelee tämän rakentamatta jättämistä. Anthropic sanoo suoraan: etsi yksinkertaisin mahdollinen ratkaisu ja lisää monimutkaisuutta vain tarvittaessa, mikä "voi tarkoittaa, ettei agentic systems -järjestelmiä rakenneta lainkaan", koska agentic systems "vaihtavat latenssia ja kustannusta parempaan tehtäväsuorituskykyyn" ja "monissa sovelluksissa yksittäisten LLM-kutsujen optimointi retrievalillä ja in-context-esimerkeillä riittää yleensä".4 Sen tapaus agentin puolesta on kapea: avoimet ongelmat, joissa et voi ennustaa askelten määrää etkä hardcodeata polkua, ympäristössä johon luotat, hyväksyen "korkeammat kustannukset ja kumuloituvien virheiden mahdollisuuden".4 OpenAI:n seula on peilikuva — monimutkainen harkinta, ylläpitokelvottomat sääntöjoukot, jäsentymätön data — ja päättyy samalla tavalla: "muussa tapauksessa deterministinen ratkaisu voi riittää".5
Tämän luvun taksonomiassa: kiinteä määrä askelia kiinteässä järjestyksessä on pipeline, eikä sen kutsuminen agentiksi tee siitä nopeampaa. Jos askelten määrä riippuu siitä, mitä matkan varrella löydät, haluat silmukan — ja ostat tuon joustavuuden N kutsulla, neliöllisellä transcriptilla ja järjestelmällä, joka voi olla väärässä N kertaa yhden sijaan.
Minne tämä menee seuraavaksi
Linkki osioon: Minne tämä menee seuraavaksiSinulla on nyt taksonomia, molemmat modernit määritelmät, kaksi akselia, jotka tekevät niistä yhteensopivat, ja lyhyt silmukka, joka vastaa, kutsuu ja pysähtyy.
Tuolla silmukalla on yksi tapa päättyä: malli lopettaa työkalujen pyytämisen. Luku 23 rikkoo sen tahallaan seitsemän kertaa, ja jokainen rikkominen lisää palan. Mahdoton tehtävä, eikä se koskaan pääty — vuorokatto. Yön mittainen ajo, ja lasku saapuu — budjetti dollareissa. Työkalu epäonnistuu — virhe, jonka perusteella malli voi toimia. Sama kutsu kahdesti — idempotency key. Tiedosto, johon sen ei olisi pitänyt koskea — ihmisen hyväksyntä. Uudelleenkäynnistys puolivälissä — session persistence. Työkalu, joka kestää kolme minuuttia hiljaisuudessa — edistyminen ja peruutus. Tuloksena on harness, tiedosto, jolla tämän kurssin loppu ajetaan.
Jäljelle jää kysymys, josta tämän luvun kiistanalainen diagonaali oikeasti kertoi. Silmukan, joka päättää oman seuraavan askeleensa, täytyy päättää milloin pysähtyä, ja näimme juuri mitä tapahtuu, kun se ei pysty: kuusi vuoroa, nelinkertainen lasku ja agent kuulustelemassa käyttäjää kysymyksestä, johon se oli jo vastannut. Pysähtyminen ei ole yksi ehto. Kuinka monta niitä on, ja mikä laukeaa ensin?
Lähteet ja menetelmä
Linkki osioon: Lähteet ja menetelmäLilian Wengin LLM Powered Autonomous Agents (2023) on tunnetuin kieli-agentin purku suunnitteluun, muistiin ja työkalujen käyttöön, ja se on oikea seuraava lukukohde kahden toimittajadokumentin rinnalla; sen kolme komponenttia ovat tämän kurssin luvut 23, 24 ja 18 tässä järjestyksessä.
Jokainen tämän luvun numero tuotettiin tällä koneella eikä mitään arvioitu. Käytävä, pohjapiirros, neljä sitä kävelevää agentia ja kolme partiopolitiikkaa ovat yllä olevaa TypeScriptiä, ajettuna Node 22:lla; satunnaistetun agentin luvut ovat keskiarvoja 2 000 seeded-ajosta kussakin ja partioluvut ovat yksittäisiä seeded-ajoja 4 000 tickillä. Mallitracet tulevat Qwen2.5-0.5B-Instruct:stä float32:na CPU:lla ja greedy decodingilla, loopbackin yli tarjoiltuna pienellä paikallisella Python-endpointilla, joka lataa painot ja puhuu OpenAI chat-completions -muotoa — taas sama sauma, tensorit Python-puolella ja silmukka TypeScript-puolella — joten token-määrät ovat kyseisen mallin tokenizerin ja latenssit kyseisen koneen. Ainoat muualta otetut luvut ovat kustannustaulukon kaksi hintaa, jotka ovat hinnat, jotka luku 16 luki OpenAI:n hinnoittelusivulta 6. syyskuuta 2026, sovellettuna tässä paikallisesti mitattuihin token-määriin havainnollistuksena eikä havaittuna laskuna.
Viitteet
Linkki osioon: Viitteet-
Russell, S. ja Norvig, P. Artificial Intelligence: A Modern Approach, 4. painos, luku 2, Intelligent Agents. Lähde vacuum-maailmalle, PEAS-määritykselle, rationaalisuuden määritelmälle suhteessa suoritusmittaan, tehtäväympäristöjen seitsemälle ominaisuudelle, tässä käytetyille viidelle agent-tyypille ja havainnolle, että infinite loopit ovat usein väistämättömiä simple reflex agent -järjestelmille osittain havaittavissa ympäristöissä. Kirjan companion code on
aimacode/aima-pythonGitHubissa (8 806 tähteä, viimeksi pushattu 30. kesäkuuta 2026, luettu 7. syyskuuta 2026) — se kannattaa nimetä täsmällisesti siksi mitä se on. Se on kirjan oheisrepository, ei referenssitoteutus, jonka päälle muut projektit rakentavat samalla tavalla kuinkarpathy/micrograd(17 412) jakarpathy/nanoGPT(62 852). Siksi tämä luku siteeraa ja linkittää sitä eikä käännä sitä, ja siksi ekosysteemiargumentti, joka piti luvun 5 Pythonissa, ei päde täällä: mikään tässä luvussa ei koske tensoria, ja yllä kirjoitettu silmukka on luvun 23 suora esi-isä. ↩ ↩2 ↩3 ↩4 ↩5 -
Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. ja Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). Reasoning tracejen ja toimintojen lomittaminen, johon kartoitustaulukon goal-based-rivi viittaa. ↩
-
Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. ja Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). Paperin oma tiivistelmä mekanismista on syy, miksi se karttuu learning agent -tyyppiin: se vahvistaa agenteja "ei päivittämällä painoja, vaan kielellisen palautteen kautta", agenteilla jotka "reflektoivat tehtäväpalautteen signaaleja sanallisesti ja ylläpitävät sitten omaa reflektiivistä tekstiään episodisessa memory bufferissa parantaakseen päätöksentekoa myöhemmissä yrityksissä". ↩ ↩2
-
Anthropic, Building effective agents, 19. joulukuuta 2024,
anthropic.com/engineering/building-effective-agents, luettu 7. syyskuuta 2026. Lähde yllä lainatulle workflow/agent-erottelulle, sateenvarjotermille "agentic systems", kuvaukselle agenteista "tyypillisesti vain LLM:inä, jotka käyttävät työkaluja ympäristöpalautteen perusteella silmukassa", ohjeelle etsiä yksinkertaisin mahdollinen ratkaisu ja sille, että tämä "voi tarkoittaa, ettei agentic systems -järjestelmiä rakenneta lainkaan", sekä agentien puolesta ja vastaan esitetylle tapaukselle, mukaan lukien "korkeammat kustannukset ja kumuloituvien virheiden mahdollisuus" sekä suositus pysäytysehdoista "kuten iteraatioiden enimmäismäärä" kontrollin säilyttämiseksi. ↩ ↩2 ↩3 -
OpenAI, A practical guide to building agents, sivut 4–7, luettu 7. syyskuuta 2026. Lähde lauseelle "Agentit ovat järjestelmiä, jotka suorittavat tehtäviä itsenäisesti puolestasi", "yksinkertaisten chatbotien, yhden vuoron LLM:ien tai sentimenttiluokittimien" poissulkemiselle, workflowin määritelmälle "askelten sekvenssinä, joka täytyy suorittaa käyttäjän tavoitteen saavuttamiseksi", agentin kahdelle ydinominaisuudelle, kolmelle komponentille — malli, työkalut, ohjeet — ja seulontakriteereille sille, milloin sellainen kannattaa rakentaa, päättyen lauseeseen "muussa tapauksessa deterministinen ratkaisu voi riittää". ↩ ↩2 ↩3
-
Wooldridge, M. ja Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, volyymi 10, numero 2 (1995). Katsaus, joka jakoi alan käytön heikkoon agency-käsitteeseen — autonomia, sosiaalinen kyky, reaktiivisuus, proaktiivisuus — ja vahvempiin käsitteisiin, jotka lainaavat mentaalista sanastoa. Tänään luettuna se on tallenne samasta väittelystä, jota tämän luvun kaksi dokumenttia käyvät edelleen. ↩
-
Franklin, S. ja 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). Siteerattu täällä siksi mitä se on eikä lainauksen takia: katsaus, joka kokosi silloin liikkeellä olleet "agent"-määritelmät, havaitsi niiden olevan eri mieltä ja ehdotti taksonomiaa väittelyn korvaamiseksi. Kolmekymmentä vuotta myöhemmin väittely on paremmin suunnitellussa dokumentaatiossa ja muuten muuttumaton. ↩
-
Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). Lainattu yllä sen avausmääritelmästä, "AI agents ovat keinotekoisia olioita, jotka aistivat ympäristönsä, tekevät päätöksiä ja toimivat", joka on oppikirjamääritelmä uudelleen esitettynä vuonna 2023, koska mitään sovittua modernia määritelmää ei ollut siteerattavaksi. ↩
-
Sumers, T. R., Yao, S., Narasimhan, K. ja Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Jäsentää language agentit "modulaarisiksi memory-komponenteiksi, rakenteiseksi action spaceksi sisäisen muistin ja ulkoisten ympäristöjen kanssa vuorovaikuttamiseksi sekä yleistetyksi päätöksentekoprosessiksi toimintojen valitsemiseksi", ja sijoittaa ne eksplisiittisesti symbolisen AI:n ja kognitiotieteen historiaan. Muistitaksonomia palaa luvussa 24, jossa kolmen varaston taulukko on sen käytännön varjo. ↩