Przejdź do treści
22/30Rozdział 22 z 30

Czym jest AI agent: pięć klasycznych typów i dwie rywalizujące definicje

Świat odkurzacza psuty cztery razy — każda awaria daje jeden z pięciu klasycznych typów agent. Potem jedno narzędzie zmienia 39 token w 420.

Na tej stronie

Oto to samo pytanie, zadane dwa razy temu samemu modelowi, z tymi samymi wagami i zachłannym dekodowaniem. Jedyna różnica: za drugim razem w katalogu było jedno narzędzie.

TEXT
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 ms

Jedno wywołanie stało się dwoma. Trzydzieści dziewięć input tokens stało się 420, czyli 10,8 raza więcej. Mniej niż sekunda zmieniła się w prawie siedem. A odpowiedź dostała fakt, o który nikt nie prosił, z narzędzia, które model sam wybrał do wywołania przy pytaniu, które nigdy nie wspomniało o pogodzie.

Drugi system jest tym, co większość branży w 2026 roku nazywa agent. Albo nim nie jest — zależnie od tego, którą z dwóch najczęściej czytanych definicji otworzysz. A te dwie nie mówią tego samego. Jedna nawet nie zgadza się sama ze sobą.

Ten spór jest tematem tego rozdziału. To nie kłótnia o słownictwo: dwie definicje rysują granicę na różnych osiach, a oś, którą wybierzesz, decyduje o tym, co zbudujesz i za co zapłacisz. Obie stoją na starszej taksonomii, a najtańszy sposób, żeby ją zrozumieć, to zbudować najgorszy agent na świecie.

Pokaż szczegóły

Czego ten rozdział potrzebuje z poprzednich.

  • Rozdział 13 zmierzył, ile jedno wywołanie kosztuje w czasie; ten rozdział mnoży to przez liczbę tur.
  • Rozdział 15: prompt jest pełnym stanem modelu, bo nic nie przetrwa wywołania.
  • Rozdział 16: input tokens rosną z kwadratem rozmowy.
  • Rozdział 18: katalog narzędzi i podróż w obie strony, w której model prosi, a twój kod wykonuje.

Tu nie ma tensorów. Rozdział jest w TypeScript, tam gdzie umieszcza go reguła językowa z rozdziału 14, a jego pętla jest bezpośrednim przodkiem pętli z rozdziału 23.

Najstarszy przykład w tej dziedzinie to odkurzacz w świecie dwóch pól, A i B, z których każde jest czyste albo brudne.1 Przetrwał w każdym podręczniku, bo to najmniejszy świat, w którym agent może mieć rację albo się mylić.

Percept to para — gdzie jestem i czy tutaj jest brudno — a akcje to SUCK, LEFT i RIGHT. Cały program to jedna linia.

reflex.tsTS
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";   

Uruchom go dla każdej konfiguracji początkowej świata z dwoma polami:

TEXT
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=true

To jest simple reflex agent: działa wyłącznie na podstawie bieżącego percept, bez pamięci czegokolwiek sprzed chwili. To nie jest zabawkowa kategoria — termostat jest takim agent, podobnie jak pojedyncze wywołanie modelu językowego bez dołączonej rozmowy.

Teraz zepsujmy go tak, jak robi to rzeczywistość. Prawdziwy robot odkurzający ma czujnik brudu i zderzak, a nie kwadrat z etykietą A pod dywanem. Usuń lokalizację z percept i nie zmieniaj niczego innego:

reflex.tsTS
const dirtOnly = (p: Percept): Action => (p.dirty ? "SUCK" : "RIGHT");
TEXT
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} -> RIGHT

Ten sam program, dwa pola. Z jednego stanu początkowego kończy w trzech krokach; z innego wjeżdża w prawą ścianę pięćset razy i jechałby dalej, aż padłaby bateria. Nie potrafi dostrzec różnicy między tymi dwiema sytuacjami, więc nie potrafi zachować się w nich inaczej. Russell i Norvig ujmują ogólny wynik w jednym zdaniu: nieskończone pętle są często nieuniknione dla simple reflex agents w częściowo obserwowalnych środowiskach.1

Jest poprawka, która kosztuje jedną linię i żadnej pamięci — warto ją zmierzyć, zanim sięgniemy po coś sprytniejszego.

reflex.tsTS
let seed = 12345;
const rnd = () => ((seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff);

const coin = (p: Percept): Action => (p.dirty ? "SUCK" : rnd() < 0.5 ? "LEFT" : "RIGHT");  

Dwa tysiące uruchomień całkowicie brudnego korytarza w trzech rozmiarach, wszędzie ten sam seed generatora:

pokojeśrednia krokówmediananajgorszy z 2 000nigdy nie skończył
24,04130
416,614810
868,7523060

Losowość całkowicie usuwa pętlę. Ale też kosztuje: osiem pokoi wymaga piętnastu ruchów, jeśli wiesz, co robisz, a ten agent średnio robi 68,7 i raz potrzebował 306. To cały rozdział w miniaturze. Każda zdolność, którą dodamy, kupuje poprawność w przypadku, z którym poprzedni agent sobie nie radził, i pobiera opłatę w walucie, którą najpierw musisz nazwać.

Nazywanie części, skoro są już potrzebne

Link do sekcji: Nazywanie części, skoro są już potrzebne

Agent postrzega swoje środowisko przez czujniki i działa przez aktuatory. Program agent to funkcja od percepts do akcji — każdy listing powyżej nią jest. Sekwencja percepts to wszystko, co zostało dotąd postrzeżone, a simple reflex agent ignoruje wszystko poza ostatnim elementem.

Racjonalność to słowo, które większość artykułów rozumie źle, a poprawne zrozumienie sprawia, że reszta tego rozdziału zaczyna być użyteczna. Agent nie jest racjonalny ani irracjonalny sam w sobie. Russell i Norvig definiują racjonalny agent jako taki, który dla każdej możliwej sekwencji percepts wybiera akcję, która ma zmaksymalizować jego miarę wydajności, biorąc pod uwagę dowody z tej sekwencji i całą wbudowaną wiedzę, którą ma.1 Miara wydajności nie znajduje się wewnątrz agent: należy do projektanta, a racjonalność jest definiowana tylko względem niej.

Specyfikację zwyczajowo zapisuje się jako cztery rzeczy, PEAS: performance measure, environment, actuators, sensors.

robot odkurzającysupport agent na produkcji
Performance measureczyste pola, na jednostkę bateriirozwiązane tickety, na dolara, bez eskalacji
Environmentpodłoga, brud, meble, dywankolejka ticketów, twoja baza danych, klient
Actuatorskoła, ssanietool calls
Sensorsczujnik brudu, zderzakwiadomość użytkownika, wyniki narzędzi

Zauważ, który wiersz odstaje. Prawie każdy zespół budujący agents w 2026 roku spisuje E, A i S — schematy narzędzi, integracje, format wiadomości — bo bez nich kod się nie uruchomi. Prawie nikt nie zapisuje P. Bez tego „nasz agent działa dobrze” nie ma znaczenia, które da się sprawdzić, a „racjonalny” nie da się zastosować do systemu w ogóle, tylko do demonstracji. Rozdział 29 jest o zamianie P w liczbę — i właśnie dlatego istnieje.

TEXT
    ┌───────────────────────── 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 it

Środowiska zadań klasyfikuje się dalej według siedmiu osi, z których pięć decyduje tutaj o większości trudności: w pełni albo częściowo obserwowalne, deterministyczne albo nie, epizodyczne albo sekwencyjne, statyczne albo dynamiczne, znane albo nieznane.1 Agent rozmawiający z prawdziwymi narzędziami przez prawdziwą sieć znajduje się w trudnym rogu wszystkich pięciu — niedeterministyczny nawet przy temperaturze zero (rozdział 17) i, co jest niedoceniane, nieznany, bo nie masz niezawodnego modelu tego, co twoje własne narzędzia robią ze światem. Dlatego pętla z rozdziału 23 bardziej potrzebuje obsługi błędów niż planowania.

Dodajemy pamięć i znajdujemy następną ścianę

Link do sekcji: Dodajemy pamięć i znajdujemy następną ścianę

Prawdziwe podłogi nie są jednowymiarowe, więc podnieśmy świat do planu. Kratki to ściany, gwiazdki to brud, a robot startuje w środkowej komorze:

TEXT
        col  0 1 2 3 4 5 6
      row 0  * . . # . . *
      row 1  . # . # . # .
      row 2  . # . S . # .        S = the robot starts here
      row 3  . # . # . # .
      row 4  * . . # . . *

Oczywiste ulepszenie to pamięć. Agent prowadzi mapę: każde pole, na którym stał, i każde pole, na którym zadziałał zderzak. Jego reguła każe wejść na sąsiednie pole, którego jeszcze nie odwiedził — w prawo, potem w dół, potem w lewo, potem w górę — i wycofać się, gdy wszystko dookoła jest znane. To model-based reflex agent: utrzymuje stan wewnętrzny z historii percepts, więc może działać na podstawie tego, czego aktualnie nie widzi.

To prawdziwa poprawa, ale wciąż za mało:

TEXT
5,000 steps allowed -> steps=5,000  distinct squares visited=13/25  still dirty=2/4

Pięć tysięcy ruchów, połowa podłogi nigdy niewidziana. Mapa jest poprawna i reguły są poprawne. Agent nie potrafi użyć mapy, żeby gdzieś pójść: jego reguły odpowiadają tylko na pytanie „na którego z moich czterech sąsiadów mam wejść”, więc gdy skończą mu się nieodwiedzone pola obok niego, nie ma sposobu wyrażenia myśli osiem ruchów stąd jest nieodwiedzone pole i chciałbym na nim stać. Wie, gdzie jest. Nie wie, gdzie chce być.

Cel, a potem powód, by woleć jedną trasę od drugiej

Link do sekcji: Cel, a potem powód, by woleć jedną trasę od drugiej

Goal-based agent ma, oprócz swojego modelu świata, opis sytuacji, którą chce doprowadzić do skutku, i wybiera akcje, przeszukując ich sekwencje, aż znajdzie taką, która tam kończy. Cele zmieniają wybór akcji z odczytu z tabeli w wyszukiwanie.

Cel brzmi: „nie zostaje żadne brudne pole”. Wyszukiwanie to breadth-first przejście do najbliższego brudnego pola, a zwrócona ścieżka jest planem.

TEXT
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,0

Dwadzieścia siedem ruchów, podłoga czysta. Ale spójrz na kolumnę baterii i ostatni odcinek planu. Kolumna 0 jest pokryta dywanem: przejście przez pole z dywanem kosztuje sześć jednostek baterii, przez kafelki jedną. Agent wrócił do domu kolumną 0, bo to cztery ruchy zamiast ośmiu, a te cztery ruchy po dywanie kosztowały 24, podczas gdy ośmioruchowy objazd kosztowałby 13.

Nie może zrobić inaczej. Cel jest testem binarnym: podłoga jest czysta albo nie. Każdy plan, który kończy się czystą podłogą, spełnia go tak samo, więc gdy udaje się kilka planów, agent nie ma czym między nimi wybierać. Żeby woleć jeden sukces od drugiego, trzeba mieć liczbę nad wynikami, a ta liczba to funkcja użyteczności. Agent, który ją maksymalizuje, to utility-based agent.

Zmiana w kodzie to jeden składnik wewnątrz wyszukiwania. Breadth-first search liczy ruchy; każ mu liczyć koszt, a masz algorytm Dijkstry i inny agent:

search.tsTS
const nd = dist.get(k)! + (byCost ? cell.cost : 1);   // <- the entire difference
TEXT
goal-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,0

Cztery dodatkowe ruchy, jedenaście jednostek baterii mniej: o dwadzieścia jeden procent taniej. Ten sam cel, ta sama mapa, ten sam kod poza jednym składnikiem. Dwaj agents różnią się tylko tym, w czym próbują być dobrzy, i wybierają różne drogi do domu.

To także pierwszy moment, w którym agent potrzebuje czegoś, czego sam nie potrafi wytworzyć. Ktoś musi zdecydować, ile jednostka baterii jest warta względem ruchu. Użyteczność to miara wydajności zapisana w formie, z którą agent potrafi liczyć, a jej napisanie jest pracą projektanta. Gdy ludzie mówią, że agent „zoptymalizował niewłaściwą rzecz”, prawie nigdy nie mają na myśli błędu. Mają na myśli, że ta linia została napisana niedbale.

Piąty typ i sposób, w jaki się psuje

Link do sekcji: Piąty typ i sposób, w jaki się psuje

Teraz pozwól brudowi wracać. Cztery pokoje brudzą się ponownie w czterech różnych tempach, a agent nigdy ich nie poznaje. Odwiedza jeden pokój na tick i widzi tylko ten pokój. Miara wydajności to room-ticks spędzone w stanie brudnym przez 4 000 ticków — im mniej, tym lepiej.

Learning agent, w podręcznikowym rozkładzie, to dowolny z powyższych plus trzy części: learning element, który zmienia agent, critic, który mówi mu, jak agent wypada względem stałego standardu wydajności, oraz problem generator, który proponuje akcje warte spróbowania ze względu na to, czego mogłyby nauczyć.1 Trzy polityki w tym samym środowisku. Pierwsza się nie uczy; druga i trzecia uczą się tego samego i używają tego inaczej.

politykadirty-room-ticks przez 4 000względem patrolu
stały patrol round-robin, bez uczenia2 290
learner A: oszacuj tempo brudzenia każdego pokoju, potem idź tam, gdzie brud jest najbardziej prawdopodobny11 8205,2× gorzej
learner B: te same estymaty, ważone czasem od ostatniej wizyty1 57631% lepiej

Ukryte tempa wynosiły 0,35 dla kuchni, 0,05 dla holu, 0,02 dla gabinetu i 0,01 dla strychu — a learner A je znalazł. Poprawnie zidentyfikował kuchnię jako najbrudniejszy pokój w domu, po czym chodził do kuchni w każdym ticku przez resztę symulacji, gdy pozostałe trzy pokoje siedziały brudne już zawsze. Jest pięć razy gorszy niż brak uczenia w ogóle i nie jest zepsuty.

Lekcja jest ta sama co w sekcji o użyteczności. Learner A maksymalizował „prawdopodobieństwo, że pokój, który zaraz odwiedzę, jest brudny”. Miara wydajności brzmiała „room-ticks spędzone w stanie brudnym”. Różne liczby; druga jest tym, co oceniał critic, a nikt nie powiedział o niej agent. Learner B mnoży to samo wyuczone tempo przez czas od ostatniej wizyty — oczekiwany brud, który znajdzie, a nie szansę znalezienia jakiegokolwiek — i pokonuje patrol, od którego zaczął.

Jeden szczegół implementacyjny zdecydował o wyniku. W pierwszej wersji learner B pokój, w którym przez trzy wizyty nie pojawił się brud, dostawał tempo dokładnie zero — a zero razy cokolwiek to zero, więc nigdy więcej go nie odwiedzano i estymaty nie dało się poprawić. Wygładzenie ułamka, sukcesy plus jeden przez próby plus dwa, zmieniło 11 895 w 1 576. „Jeszcze nie zaobserwowano” i „zmierzono i wyszło zero” to różne twierdzenia, a system, który zapisuje je w tym samym polu, podejmuje decyzje, których nie potrafi odwrócić.

Pięć typów i czym są w 2026 roku

Link do sekcji: Pięć typów i czym są w 2026 roku
TEXT
  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 above

Każdy z pięciu działa dziś na produkcji pod inną nazwą.

klasyczny typco niesie między perceptsjego postać w 2026 rokuczego nie potrafi zrobić
simple reflexnicjedno wywołanie modelu bez historii: klasyfikator, endpoint ekstrakcji, single-turn completionniczego, co zależy od poprzedniej tury
model-based reflexstan wewnętrzny zbudowany z historii perceptschat: transkrypt, wysyłany ponownie w całości przy każdym wywołaniuwybrać, gdzie rozmowa ma dojść
goal-basedstan plus opis pożądanej sytuacjipętla reason-and-act z warunkiem zatrzymania2woleć jeden skuteczny plan od drugiego
utility-basedstan, cel i liczba nad wynikamipętle evaluator–optimiser oraz ranking odpowiedzi kandydujących według pisanego kryterium (rozdział 25)wymyślić kryterium
learningwszystko powyższe plus critic i problem generatorReflexion, który zapisuje własne lekcje do bufora epizodycznego zamiast aktualizować wagi;3 trwała pamięć użytkownika (rozdział 24)wybrać standard, względem którego critic ocenia

Dwa wiersze są bliżej niż analogia — w sposób, który kosztuje pieniądze.

Chat jest model-based reflex agent, którego model nie jest wewnętrzny. W podręczniku stan jest zmienną wewnątrz programu agent. W chacie jest transkryptem: żyje po twojej stronie, jest ponownie wysyłany w całości przy każdym wywołaniu i za każdym razem odtwarzany od zera wewnątrz modelu. To kwadratowy rachunek z rozdziału 16 i ten sam obiekt, który podręcznik narysował jako pudełko z etykietą „state”. Oto różnica, zmierzona na jednym pytaniu uzupełniającym z dwiema poprzednimi wiadomościami i bez nich:

TEXT
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."

Ten sam model, te same trzy słowa inputu użytkownika, a drugie uruchomienie to robot w korytarzu wjeżdżający w ścianę. W tym przebiegu nie było narzędzi, więc 15 jest zmyślone — ale to stan sprawia, że follow-up w ogóle coś znaczy. Odtwarzasz go za każdym razem i płacisz za niego 2,3× input tokens w rozmowie dwuturowej. Rozdział 16 zmierzył, dokąd ten mnożnik dochodzi przy turze czterdziestej.

Reflexion jest learning agent, który zmienia swój input, a nie program. W podręcznikowym rozkładzie learning element modyfikuje performance element. Reflexion zostawia wagi w spokoju i zapisuje refleksyjny tekst do bufora epizodycznego, który czyta następna próba.3 Learning element to prompt, pamięć to wiersz w bazie danych, performance element to zamrożony model — a diagram jest podręcznikowy, bez zmian.

A oto uczciwe ograniczenie tego mapowania. Pięć typów klasyfikuje program agent. W 2026 roku ten program jest rozcięty na pół: część jest twoim kodem, część znajduje się w wagach, których nie trenowałeś. Gdy model sam decyduje, żeby wywołać narzędzie, czy test celu jest w twoim programie, czy w modelu? Taksonomia nie ma odpowiedzi, bo gdy powstawała, nie było innego miejsca, w którym mógłby być — i właśnie przy tym pytaniu dwie współczesne definicje się rozchodzą.

Odpowiadanie, wywoływanie i zatrzymywanie w jednym trace

Link do sekcji: Odpowiadanie, wywoływanie i zatrzymywanie w jednym trace

Definicje są sporami o zachowanie, a dużo łatwiej je oceniać, mając przed sobą trace.

Pętla poniżej wysyła rozmowę do modelu; jeśli odpowiedź zawiera tool call, wykonuje narzędzie, dopisuje wynik i wysyła całość ponownie. Działa na lokalnym Qwen2.5-0.5B-Instruct za endpointem w kształcie OpenAI na tej maszynie — to szew z rozdziału 14, więc pętla ani nie wie, ani jej nie obchodzi, co jest za portem.

loop.tsTS
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");                       
}

Dwie linie niosą cały pomysł i obie są oznaczone; reszta to księgowość. Wszystkie trzy zachowania widać w jednym przebiegu. Zapytany o coś, co potrafi zrobić sam, model odpowiada. Zapytany o coś, czego nie potrafi, wywołuje:

TEXT
=== 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 zatrzymuje się — trzecie zachowanie, najłatwiejsze do przeoczenia, bo wygląda jak brak zdarzenia. Pętla kończy się, bo tura 2 wróciła bez tool call. Nikt tego nie zdecydował; zrobił to model, emitując prozę. Warunek zakończenia tego programu jest znakiem nieobecności.

Dwa kolejne przebiegi są warte miejsca. Poproszony o porównanie dwóch miast, model wykonuje oba tool calls w jednej turze, dostaje oba odczyty z powrotem i myli porównanie:

TEXT
  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."

Narzędzia zadziałały. Wywołanie równoległe zadziałało. Pętla zadziałała. Odpowiedź jest fałszywa, choć obie poprawne liczby leżą w transkrypcie. Owinięcie modelu pętlą nie sprawia, że rozumuje; daje modelowi, który się myli, zdolność działania na podstawie tej pomyłki — co zapowiada rozdział 30 i połowę rozdziału 29.

Teraz usuń oznaczone return i pozwól pętli biec do limitu. To samo pytanie, ten sam model:

TEXT
  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 cap

Cztery razy więcej input tokens, cztery razy więcej czasu zegarowego i zakończenie, w którym agent zapomniał, o co go zapytano, i przesłuchuje użytkownika w sprawie pytania, na które ten odpowiedział w turze pierwszej. Poprawna odpowiedź była na ekranie w turze 2, a każda kolejna tura pogarszała transkrypt.

Agent nie jest więc pętlą. Jest pętlą plus regułą wyjścia z niej, a ta ma dokładnie jedną taką regułę. Rozdział 23 znajduje ich pięć i pokazuje, co się psuje, gdy każdej brakuje.

Obie cytowane, a nie parafrazowane, bo to w parafrazach produkuje się zamieszanie.

Definicja pierwsza stawia granicę tam, gdzie leży kontrola przepływu. Anthropic w Building effective agents nazywa niejednoznaczność i rozstrzyga ją tak:

„W Anthropic kategoryzujemy wszystkie te warianty jako agentic systems, ale rysujemy ważne rozróżnienie architektoniczne między workflows a agents: Workflows to systemy, w których LLMs i narzędzia są orkiestracji przez z góry zdefiniowane ścieżki kodu. Agents natomiast to systemy, w których LLMs dynamicznie kierują własnymi procesami i użyciem narzędzi, zachowując kontrolę nad tym, jak wykonują zadania.”4

Test jest pytaniem o twój kod źródłowy: kto wybrał następny krok? switch w twoim programie: workflow. Model: agent. Ten sam dokument mówi, że agents „są zazwyczaj po prostu LLMs używającymi narzędzi na podstawie feedbacku środowiska w pętli” — czyli dokładnie listing powyżej.

Definicja druga stawia granicę na niezależności od użytkownika. OpenAI w A practical guide to building agents otwiera stronę definicyjną tak:

„Podczas gdy konwencjonalne oprogramowanie pozwala użytkownikom usprawniać i automatyzować workflows, agents potrafią wykonywać te same workflows w imieniu użytkowników z wysokim stopniem niezależności. Agents to systemy, które niezależnie wykonują zadania w twoim imieniu.”5

Dwa zdania dalej, na tej samej stronie, wyklucza:

„Aplikacje, które integrują LLMs, ale nie używają ich do kontrolowania wykonywania workflow — na przykład proste chatboty, single-turn LLMs albo klasyfikatory sentymentu — nie są agents.”5

Przeczytaj te cytaty po kolei. Zdania otwierające rysują granicę na niezależności: czy to coś odchodzi i kończy robotę beze mnie? Czwarte rysuje ją na kontroli wykonania, czyli dokładnie na linii Anthropic. Różne testy, ta sama strona, i istnieją prawdziwe systemy, co do których się nie zgadzają.

Pod spodem jest kolizja słownictwa, która powoduje spory na prawdziwych spotkaniach. W pierwszym dokumencie workflow jest architekturą i jest tym, co nie jest agent. W drugim workflow to „sekwencja kroków, które trzeba wykonać, aby osiągnąć cel użytkownika” — sama praca, którą każdy agent ma. „Zastąpiliśmy workflow agent” jest spójne w pierwszej definicji i bliskie bezsensu w drugiej.

Trzy systemy, sklasyfikowane dwa razy

Link do sekcji: Trzy systemy, sklasyfikowane dwa razy

Trzy systemy istniejące w 2026 roku, według obu definicji.

Opisujesz zadanie; czyta pliki, uruchamia zestaw testów, edytuje, uruchamia je ponownie i zatrzymuje się, gdy przejdą albo gdy się podda. Nic w twoim kodzie nie decyduje, że następny krok to „uruchom testy” — robi to model na podstawie tego, co zwróciło ostatnie narzędzie.

Definicja pierwsza: agent, bo model kieruje własnym procesem. Definicja druga: agent, bo niezależnie wykonuje zadanie, rozpoznaje ukończenie i oddaje kontrolę. Oba dokumenty cytują ten kształt jako swój centralny przykład.

Nocny pipeline do triage ticketów

Link do sekcji: Nocny pipeline do triage ticketów

Dla każdego nowego ticketu supportu trzy wywołania modelu w stałej kolejności — klasyfikuj, wyciągnij pola, napisz szkic odpowiedzi — a potem wysyłka. Żaden model nigdy nie wybiera, co wydarzy się dalej; robi to pętla for. Działa o 03:00 i nikt go nie obserwuje.

Definicja pierwsza: nie agent. To prompt chaining, wymienione z nazwy jako workflow. Definicja druga: obie odpowiedzi. Według zdań otwierających niezależnie wykonuje zadania w twoim imieniu; według czwartego nie używa modelu do kontrolowania wykonywania workflow i jest wykluczony. Ten system jest powodem, dla którego czytasz całą stronę, a nie wyrwany cytat.

Chat assistant z narzędziem wyszukiwania

Link do sekcji: Chat assistant z narzędziem wyszukiwania

Jedna tura użytkownika. Model sam decyduje, czy wyszukać przed odpowiedzią, potem odpowiada i czeka na ciebie.

Definicja pierwsza: agent, bo model dynamicznie kieruje własnym użyciem narzędzi na podstawie wyników ze środowiska, czyli zgodnie z podanym testem. Definicja druga: nie agent, bo nie ma niezależności — jedna tura, potem oddaje kontrolę — a „proste chatboty” są wymienione z nazwy na liście wykluczeń.

Dwa z trzech zmieniają stronę. To nie jest porażka żadnego dokumentu. To ostrzeżenie przed takim spotkaniem, na którym dwie osoby całkowicie zgadzające się co do tego, co system robi, spędzają godzinę, nie zgadzając się, jak go nazwać.

Wyjściem są dwie osie, nie jedna

Link do sekcji: Wyjściem są dwie osie, nie jedna

Definicje zderzają się, bo każda zwija dwa niezależne pytania w jedno słowo. Rozdziel je, a spór staje się tabelą — bardziej użyteczną niż werdykt.

twój kod wybiera następny krokmodel wybiera następny krok
człowiek obserwuje każdą turęformularz z modelem w środku: klasyfikatory, ekstrakcja, single-turn completionchat z narzędziami — definicja pierwsza mówi agent, definicja druga mówi nie
nikt nie obserwuje, dopóki nie skończypipeline — otwarcie definicji drugiej mówi agent, jej czwarte zdanie mówi niewszyscy się zgadzają: agent

Każda definicja kwestionuje inną komórkę, a pozostałe dwie w ogóle nie są sporne. Więc gdy etykieta ma znaczenie — w umowie, przeglądzie ryzyka, postmortem — dwa zdania warte zapisania nie brzmią „czy to agent”, tylko kto wybrał następny krok i kto obserwował. Na oba da się odpowiedzieć, czytając kod, żadne nie potrzebuje cudzej definicji, a razem niosą każdą konsekwencję, za którą miała stać etykieta.

Nic z tego nie jest nowe. Wooldridge i Jennings opisali konkurujące sensy „agent” w 1995 roku;6 Franklin i Graesser zadali pytanie z tego rozdziału w 1996 roku, zebrali definicje będące wtedy w obiegu i odkryli, że się nie zgadzają.7 Przegląd z 2023 roku wciąż definiuje agents od pierwszych zasad — „sztuczne byty, które postrzegają swoje środowisko, podejmują decyzje i wykonują akcje”8 — bo nie istniało nic ustalonego, co można by zacytować, a CoALA opisuje części, zamiast w ogóle rysować granicę.9 Trzydzieści lat odmowy uzgodnienia mówi, że to słowo wykonuje więcej niż jedną pracę.

Teraz konsekwencja, która przychodzi przed filozofią, czyli rachunek.

Każdy pomiar tutaj ma ten sam kształt. Pojedyncze wywołanie kosztowało 39 input tokens; to samo pytanie z jednym narzędziem kosztowało 420 w dwóch wywołaniach; pętla z usuniętą regułą zatrzymania kosztowała 1 688 w sześciu. Wzrost jest gorszy niż liniowy, bo tura n niesie ze sobą każdą poprzednią turę: kolumna prompt w sześcioturowym przebiegu brzmi 187, 238, 261, 302, 327, 373. Rozdział 16 wyprowadził, że suma to Θ(n2)\Theta(n^2), i dopasował krzywą na prawdziwej rozmowie. Agent zmienia każde zadanie w taką rozmowę, niezależnie od tego, czy człowiek kiedykolwiek ją widzi.

Gdyby te zmierzone liczby token trafiły do komercyjnego endpointu po stawkach, które rozdział 16 odczytał 6 września 2026 roku — $2,00 za milion input tokens i $12,00 za milion output — cztery przebiegi wyceniają się tak:

przebiegwywołania modeluinput tokensoutput tokenskoszt
pytanie, bez narzędzi1398$0,000174
to samo pytanie, jedno narzędzie w katalogu242038$0,001296
pytanie, które potrzebuje narzędzia242533$0,001246
to samo, z usuniętą regułą zatrzymania61 688124$0,004864

Wiersz drugi względem pierwszego to liczba do zapamiętania. Siedem i pół raza większy koszt za gorszą odpowiedź na pytanie, które model już znał. Nic nie było źle skonfigurowane: narzędzie istniało, więc model go użył — a ustalenie z rozdziału 18, że boli cena katalogu, a nie jego dokładność, ma tu najtańszą demonstrację z katalogiem jednoelementowym.

Dlatego użyteczna połowa obu dokumentów to połowa o tym, żeby tego nie budować. Anthropic mówi wprost: znajdź najprostsze możliwe rozwiązanie i dodawaj złożoność tylko wtedy, gdy jest potrzebna, co „może oznaczać, że w ogóle nie budujesz agentic systems”, ponieważ agentic systems „wymieniają latencję i koszt na lepszą wydajność zadania”, a „dla wielu aplikacji optymalizacja pojedynczych wywołań LLM z retrieval i przykładami in-context zwykle wystarcza”.4 Jego argument za agent jest wąski: otwarte problemy, w których nie możesz przewidzieć liczby kroków ani zahardkodować ścieżki, w środowisku, któremu ufasz, akceptując „wyższe koszty i potencjał kumulujących się błędów”.4 Filtr OpenAI jest lustrzanym odbiciem — złożony osąd, nieutrzymywalne zestawy reguł, nieustrukturyzowane dane — i kończy tak samo: „w przeciwnym razie rozwiązanie deterministyczne może wystarczyć”.5

A więc w taksonomii tego rozdziału: stała liczba kroków w stałej kolejności to pipeline, a nazwanie go agent nie przyspieszy go. Jeśli liczba kroków zależy od tego, co znajdziesz po drodze, chcesz pętli — i kupujesz tę elastyczność za N wywołań, kwadratowy transkrypt i system, który może się mylić N razy zamiast raz.

Masz teraz taksonomię, obie współczesne definicje, dwie osie, które czynią je zgodnymi, oraz krótką pętlę, która odpowiada, wywołuje i zatrzymuje się.

Ta pętla ma jeden sposób zakończenia: model przestaje prosić o narzędzia. Rozdział 23 celowo psuje ją siedem razy, a każda awaria dodaje jeden element. Zadanie niemożliwe i nigdy się nie kończy — limit tur. Noc działania i przychodzi rachunek — budżet w dolarach. Narzędzie zawodzi — błąd, na który model może zareagować. To samo wywołanie dwa razy — klucz idempotencji. Plik, którego nie powinien dotknąć — zgoda człowieka. Restart w połowie — trwałość sesji. Narzędzie, które milczy przez trzy minuty — postęp i anulowanie. Wynikiem jest harness, plik, na którym działa reszta tego kursu.

Zostaje pytanie, którego naprawdę dotyczyła sporna przekątna tego rozdziału. Pętla, która sama decyduje o następnym kroku, musi zdecydować, kiedy się zatrzymać, a właśnie zobaczyliśmy, co się dzieje, gdy nie potrafi: sześć tur, cztery razy większy rachunek i agent przesłuchujący użytkownika o pytanie, na które już odpowiedział. Zatrzymanie nie jest jednym warunkiem. Ile ich jest i który odpala pierwszy?


LLM Powered Autonomous Agents Lilian Weng (2023) to najbardziej znany rozkład language agent na planowanie, pamięć i użycie narzędzi, i właściwa kolejna lektura obok dwóch dokumentów vendorów; jego trzy komponenty to rozdziały 23, 24 i 18 tego kursu, w tej kolejności.

Każda liczba w tym rozdziale została wyprodukowana na tej maszynie i nic nie było estymowane. Korytarz, plan piętra, czterej agents, którzy po nim chodzą, oraz trzy polityki patrolu to TypeScript powyżej, uruchomiony na Node 22; liczby randomised agent to średnie z 2 000 seeded uruchomień każda, a liczby patrolu to pojedyncze seeded uruchomienia po 4 000 ticków. Trace modelu pochodzą z Qwen2.5-0.5B-Instruct w float32 na CPU z zachłannym dekodowaniem, serwowanego przez loopback przez mały lokalny endpoint Pythona, który ładuje wagi i mówi kształtem OpenAI chat-completions — znowu ten szew, z tensorami po stronie Pythona i pętlą po stronie TypeScript — więc liczby token są z tokenizer tego modelu, a latencje z tej maszyny. Jedyne liczby wzięte skądinąd to dwie ceny w tabeli kosztów, czyli stawki, które rozdział 16 odczytał ze strony cennika OpenAI 6 września 2026 roku, zastosowane tutaj do lokalnie zmierzonych liczby token jako ilustracja, a nie jako zaobserwowana faktura.

  1. Russell, S. i Norvig, P. Artificial Intelligence: A Modern Approach, wydanie 4, rozdział 2, Intelligent Agents. Źródło świata odkurzacza, specyfikacji PEAS, definicji racjonalności względem miary wydajności, siedmiu własności środowisk zadań, pięciu typów agent użytych tutaj oraz obserwacji, że nieskończone pętle są często nieuniknione dla simple reflex agents w częściowo obserwowalnych środowiskach. Kod towarzyszący książce to aimacode/aima-python na GitHub (8 806 gwiazdek, ostatni push 30 czerwca 2026, odczyt 7 września 2026) — warto nazwać go precyzyjnie tym, czym jest. To repozytorium towarzyszące książce, nie implementacja referencyjna, na której inne projekty budują tak, jak budują na karpathy/micrograd (17 412) i karpathy/nanoGPT (62 852). Dlatego ten rozdział cytuje je i linkuje, zamiast tłumaczyć, i dlatego argument ekosystemowy, który zatrzymał rozdział 5 w Pythonie, nie ma tu zastosowania: nic w tym rozdziale nie dotyka tensora, a pętla napisana powyżej jest bezpośrednim przodkiem pętli z rozdziału 23. 2 3 4 5

  2. 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). Przeplatanie śladów rozumowania i akcji, do którego odnosi się wiersz goal-based w tabeli mapowania.

  3. Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. i Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). Własne streszczenie mechanizmu w artykule jest powodem, dla którego mapuje się on na learning agent: wzmacnia agents „nie przez aktualizację wag, lecz przez feedback językowy”, z agents, które „werbalnie reflektują nad sygnałami feedbacku z zadania, a potem utrzymują własny refleksyjny tekst w buforze pamięci epizodycznej, aby wywołać lepsze podejmowanie decyzji w kolejnych próbach”. 2

  4. Anthropic, Building effective agents, 19 grudnia 2024, anthropic.com/engineering/building-effective-agents, odczyt 7 września 2026. Źródło cytowanego wyżej rozróżnienia workflow/agent, parasolowego terminu „agentic systems”, opisu agents jako „zazwyczaj po prostu LLMs używających narzędzi na podstawie environmental feedback in a loop”, wskazówki, by znaleźć najprostsze możliwe rozwiązanie i że to „może oznaczać, że w ogóle nie budujesz agentic systems”, oraz argumentów za i przeciw agents, w tym „wyższych kosztów i potencjału kumulujących się błędów” oraz rekomendacji warunków zatrzymania „takich jak maksymalna liczba iteracji”, by utrzymać kontrolę. 2 3

  5. OpenAI, A practical guide to building agents, strony 4–7, odczyt 7 września 2026. Źródło „Agents are systems that independently accomplish tasks on your behalf”, wykluczenia „simple chatbots, single-turn LLMs, or sentiment classifiers”, definicji workflow jako „a sequence of steps that must be executed to meet the user's goal”, dwóch podstawowych cech agent, trzech komponentów — model, narzędzia, instrukcje — oraz kryteriów przesiewowych określających, kiedy go budować, kończących się „otherwise, a deterministic solution may suffice”. 2 3

  6. Wooldridge, M. i Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, tom 10, numer 2 (1995). Przegląd, który podzielił użycie terminu agency w dziedzinie na słabe pojęcie — autonomię, zdolność społeczną, reaktywność, proaktywność — oraz silniejsze pojęcia zapożyczające słownik mentalny. Czytany dziś, jest zapisem tego samego sporu, który wciąż prowadzą dwa dokumenty z tego rozdziału.

  7. 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). Cytowane tutaj ze względu na to, czym jest, a nie dla konkretnego cytatu: przegląd, który zebrał krążące wtedy definicje „agent”, stwierdził, że się nie zgadzają, i zaproponował taksonomię zamiast sporu. Trzydzieści lat później spór jest w lepiej zaprojektowanej dokumentacji, a poza tym się nie zmienił.

  8. Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). Cytowany wyżej ze względu na definicję otwierającą, „AI agents are artificial entities that sense their environment, make decisions, and take actions”, czyli podręcznikową definicję powtórzoną w 2023 roku, bo nie było uzgodnionej nowoczesnej definicji, którą można by zacytować.

  9. Sumers, T. R., Yao, S., Narasimhan, K. i Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Organizuje language agents jako „modułowe komponenty pamięci, ustrukturyzowaną przestrzeń akcji do interakcji z pamięcią wewnętrzną i środowiskami zewnętrznymi oraz uogólniony proces podejmowania decyzji do wyboru akcji”, i osadza je jawnie w historii symbolicznej AI oraz kognitywistyki. Taksonomia pamięci wraca w rozdziale 24, gdzie tabela trzech magazynów jest jej praktycznym cieniem.

Gotowy, żeby to LIA wybierała za Ciebie?

Twórz ze wszystkimi modelami AI w jednym miejscu — zacznij dziś za darmo.