Перейти к содержимому
22/30Глава 22 из 30

Что такое AI agent: пять классических типов и два спорящих определения

Мир пылесоса ломается четыре раза, каждая поломка даёт один из пяти типов agent. А один tool превращает 39 tokens в 420.

На этой странице

Вот один и тот же вопрос, дважды заданный одной и той же модели, с теми же весами и greedy decoding. Единственная разница: во второй раз в каталоге был один tool.

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

Один вызов стал двумя. Тридцать девять input tokens стали 420 — в 10,8 раза больше. Меньше секунды превратились почти в семь. А в ответе появился факт, которого никто не спрашивал, из tool, который модель сама решила вызвать для вопроса, где погода вообще не упоминалась.

Вторую систему большая часть индустрии в 2026 году называет agent. Или не называет — в зависимости от того, какое из двух самых читаемых определений вы откроете. И эти два определения говорят не одно и то же. Одно из них даже не согласно само с собой.

Это несогласие и есть тема главы. Это не спор о словаре: два определения проводят границу по разным осям, а выбранная ось решает, что вы строите и за что платите. Оба стоят на более старой таксономии, и самый дешёвый способ её заслужить — построить худший agent в мире.

Показать детали

Что этой главе нужно из предыдущих.

  • Глава 13 измеряла, сколько один вызов стоит по времени; эта глава умножает это на число ходов.
  • Глава 15: prompt — это полное состояние модели, потому что после вызова ничего не сохраняется.
  • Глава 16: input tokens растут с квадратом длины разговора.
  • Глава 18: каталог tools и round trip, в котором модель просит, а ваш код выполняет.

Здесь нет tensors. Глава написана на TypeScript — туда её помещает языковое правило из главы 14, — а её loop является прямым предком loop из главы 23.

Самый старый пример в этой области — пылесос в мире из двух клеток, A и B, каждая из которых либо чистая, либо грязная.1 Он пережил все учебники, потому что это самый маленький мир, в котором agent может быть прав или ошибаться.

Percept — это пара: где я нахожусь и грязно ли здесь. Actions — SUCK, LEFT и RIGHT. Вся программа — одна строка.

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";   

Запустите её на всех начальных конфигурациях мира из двух клеток:

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

Это simple reflex agent: он действует только по текущему percept, без памяти о том, что было раньше. Это не игрушечная категория: термостат — такой же, как и один вызов языковой модели без attached conversation.

Теперь сломаем его так, как ломает реальность. У настоящего робота-пылесоса есть датчик грязи и bumper, а не клетка с буквой A под ковром. Уберите location из percept и больше ничего не меняйте:

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

Та же программа, две клетки. Из одного начального состояния она заканчивает за три шага; из другого — пятьсот раз въезжает в правую стену и продолжала бы, пока не села батарея. Она не может perceives разницу между двумя ситуациями, поэтому не может действовать в них по-разному. Russell и Norvig формулируют общий результат одной строкой: бесконечные loops часто неизбежны для simple reflex agents в partially observable environments.1

Есть исправление ценой в одну строку и без памяти; его стоит измерить, прежде чем тянуться к чему-то умнее.

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");  

Две тысячи прогонов полностью грязного коридора трёх размеров, один seeded generator для всех:

roomsmean stepsmedianworst of 2,000never finished
24.04130
416.614810
868.7523060

Рандомизация полностью убирает loop. Но она тоже стоит: для восьми комнат нужно пятнадцать ходов, если вы знаете, что делаете, а этот agent в среднем делает 68,7 и однажды сделал 306. Это вся глава в миниатюре. Каждая добавленная способность покупает корректность в случае, с которым предыдущий agent не справлялся, и выставляет счёт в валюте, которую сначала нужно назвать.

Называем части, теперь когда они понадобились

Ссылка на раздел: Называем части, теперь когда они понадобились

Agent perceives свою environment через sensors и действует через actuators. Agent program — это функция от percepts к actions; каждый листинг выше является такой функцией. Percept sequence — всё, что было perceived до сих пор, а simple reflex agent игнорирует всё, кроме последнего элемента.

Rationality — слово, в котором ошибается большинство статей, и если понять его правильно, остальная глава становится применимой. Agent не бывает рациональным или иррациональным сам по себе. Russell и Norvig определяют rational agent как такого, который для каждой possible percept sequence выбирает action, от которого ожидается максимизация его performance measure, с учётом evidence этой sequence и любых встроенных знаний.1 Performance measure находится не внутри agent: он принадлежит designer, а rationality определяется только относительно него.

Спецификацию обычно записывают как четыре вещи, PEAS: performance measure, environment, actuators, sensors.

робот-пылесосsupport agent в production
Performance measureчистые клетки, на единицу батареизакрытые tickets, на доллар, без escalation
Environmentпол, грязь, мебель, ковёрочередь tickets, ваша база данных, клиент
Actuatorsколёса, всасываниеtool calls
Sensorsдатчик грязи, bumperсообщение пользователя, результаты tools

Заметьте, какая строка выбивается. Почти каждая команда, строящая agents в 2026 году, записывает E, A и S — схемы tools, integrations, формат сообщений, — потому что без них код не запустится. Почти никто не записывает P. Без него фраза «наш agent хорошо справляется» не имеет проверяемого смысла, а «rational» нельзя применить к системе вообще — только к демонстрации. Глава 29 о том, как превратить P в число, и именно поэтому она существует.

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

Task environments дальше классифицируют по семи осям, пять из которых определяют большую часть сложности здесь: fully или partially observable, deterministic или нет, episodic или sequential, static или dynamic, known или unknown.1 Agent, разговаривающий с реальными tools по реальной сети, находится в сложном углу всех пяти — non-deterministic даже при temperature zero (глава 17) и, что недооценивают, unknown, потому что у вас нет надёжной модели того, что ваши собственные tools делают с миром. Поэтому loop из главы 23 нуждается в обработке ошибок больше, чем в планировании.

Добавляем память и находим следующую стену

Ссылка на раздел: Добавляем память и находим следующую стену

Настоящие полы не одномерны, поэтому поднимем мир до плана. Решётки — стены, звёздочки — грязь, а робот начинает в центральной комнате:

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  * . . # . . *

Очевидное улучшение — память. Agent хранит карту: каждую клетку, на которой он стоял, и каждую клетку, где сработал bumper. Его правило — идти в соседнюю клетку, где он ещё не был: вправо, затем вниз, затем влево, затем вверх, — и отступать, когда всё вокруг известно. Это model-based reflex agent: он поддерживает internal state из percept history, поэтому может действовать на основе того, чего прямо сейчас не видит.

Это настоящее улучшение — и всё ещё недостаточное:

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

Пять тысяч ходов, половина пола так и не увидена. Карта верна, правила верны. Чего agent не умеет — использовать карту, чтобы куда-то попасть: его правила всегда отвечают только на вопрос «в кого из четырёх соседей мне шагнуть», поэтому, когда рядом не остаётся непосещённых клеток, у него нет способа выразить мысль в восьми ходах отсюда есть непосещённая клетка, и я хочу оказаться на ней. Он знает, где находится. Он не знает, где хочет оказаться.

Цель, а затем причина предпочесть один маршрут другому

Ссылка на раздел: Цель, а затем причина предпочесть один маршрут другому

Goal-based agent поверх своей модели мира хранит описание ситуации, которую хочет получить, и выбирает actions, перебирая их sequences, пока не найдёт ту, которая там заканчивается. Goals превращают выбор action из lookup в search.

Goal — «не осталось ни одной грязной клетки». Search — breadth-first walk к ближайшей грязной клетке, а возвращённый путь — plan.

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

Двадцать семь ходов, пол чист. Но посмотрите на столбец батареи и последний отрезок plan. Столбец 0 покрыт ковром: пересечение клетки с ковром стоит шесть единиц батареи, плиточной — одну. Agent вернулся домой по столбцу 0, потому что это четыре хода вместо восьми, и эти четыре хода по ковру стоили 24, тогда как обход из восьми ходов стоил бы 13.

Иначе он не может. Goal — это binary test: пол чист или нет. Каждый plan, который заканчивается чистым полом, удовлетворяет ему одинаково, поэтому, когда успешных вариантов несколько, agent не из чего выбирать. Чтобы предпочесть один успех другому, нужно число над outcomes, и это число — utility function. Agent, который её максимизирует, — utility-based agent.

Изменение в коде — один term внутри search. Breadth-first search считает ходы; заставьте его считать cost, и у вас будет Dijkstra's algorithm и другой 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

Четыре дополнительных хода, на одиннадцать единиц батареи меньше: на двадцать один процент дешевле. Та же goal, та же карта, тот же код, кроме одного term. Два agents отличаются только тем, в чём пытаются быть хороши, и выбирают разные маршруты домой.

Это также первая точка, где agent нуждается в чём-то, что сам произвести не может. Кто-то должен решить, сколько стоит единица батареи относительно одного хода. Utility — это performance measure, записанный в форме, с которой agent может вычислять, а записывать его — работа designer. Когда люди говорят, что agent «optimized the wrong thing», они почти никогда не имеют в виду bug. Они имеют в виду, что эта строка была написана небрежно.

Теперь пусть грязь возвращается. Четыре комнаты снова пачкаются с четырьмя разными rates, и agent о них не сообщаетcя. Он посещает одну комнату за tick и видит только её. Performance measure — room-ticks, проведённые грязными, за 4 000 ticks: меньше — лучше.

Learning agent в учебниковом разложении — это любой из перечисленных выше плюс три части: learning element, который меняет agent, critic, который сообщает, как agent справляется относительно фиксированного performance standard, и problem generator, который предлагает actions, стоящие пробы ради того, чему они научат.1 Три policies в одной environment. Первая не учится; вторая и третья учатся одному и тому же, но используют это по-разному.

policydirty-room-ticks over 4,000versus the patrol
fixed round-robin patrol, no learning2,290
learner A: estimate each room's dirt rate, then go where dirt is likeliest11,8205.2× worse
learner B: same estimates, weighted by how long since the last visit1,57631 % better

Скрытые rates были 0,35 для кухни, 0,05 для прихожей, 0,02 для кабинета и 0,01 для чердака — и learner A их нашёл. Он правильно определил кухню как самую грязную комнату в доме, затем ходил на кухню каждый tick до конца симуляции, пока остальные три навсегда оставались грязными. Он в пять раз хуже, чем вообще не учиться, и он не сломан.

Урок тот же, что в разделе про utility. Learner A максимизировал «вероятность, что комната, которую я сейчас посещу, грязная». Performance measure был «room-ticks, проведённые грязными». Разные числа; второе оценивал critic, и никто не сказал об этом agent. Learner B умножает тот же learned rate на время с последнего визита — ожидаемую грязь, которую он найдёт, а не шанс найти хоть какую-то, — и обгоняет patrol, с которого начинал.

Одна деталь реализации решила результат. В первой версии learner B комната, где за три визита не встретилось грязи, получала rate ровно ноль — а ноль, умноженный на что угодно, остаётся нулём, поэтому туда больше никогда не заходили и estimate уже нельзя было исправить. Smoothing fraction — successes plus one over trials plus two — превратил 11 895 в 1 576. «Ещё не наблюдали» и «измерили, получилось ноль» — разные утверждения, и система, которая хранит их в одном поле, принимает решения, которые не может отменить.

Пять типов и чем они являются в 2026 году

Ссылка на раздел: Пять типов и чем они являются в 2026 году
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

Каждый из пяти сегодня есть в production под другим именем.

classic typewhat it carries between perceptsits 2026 shapewhat it cannot do
simple reflexничегоодин вызов модели без истории: classifier, extraction endpoint, single-turn completionвсё, что зависит от предыдущего хода
model-based reflexinternal state, построенное из percept historychat: transcript, заново целиком отправляемый при каждом вызовевыбрать, где должен закончиться разговор
goal-basedstate плюс описание желаемой ситуацииreason-and-act loop с stopping condition2предпочесть один успешный plan другому
utility-basedstate, goal и число над outcomesevaluator–optimiser loops и ranking candidate answers по записанному критерию (глава 25)изобрести критерий
learningвсё это плюс critic и problem generatorReflexion, который пишет собственные уроки в episodic buffer вместо обновления weights;3 persistent user memory (глава 24)выбрать standard, по которому critic выставляет score

Две строки ближе, чем аналогия, и это стоит денег.

Chat — это model-based reflex agent, чья модель не internal. В учебнике state — переменная внутри agent program. В chat это transcript: он живёт на вашей стороне, заново отправляется целиком при каждом вызове и каждый раз восстанавливается внутри модели с нуля. Это квадратичный счёт из главы 16, и это тот же объект, который учебник рисовал как коробку с надписью «state». Вот разница, измеренная на одном follow-up question с двумя предыдущими сообщениями и без них:

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

Та же модель, те же три слова user input, а второй вариант — это робот в коридоре, который въезжает в стену. В этом прогоне не было tools, так что 15 придумано, — но именно state делает follow-up осмысленным. Вы заново строите его каждый раз и платите за него 2,3× input tokens уже в двухходовом conversation. Глава 16 измеряла, до чего этот multiplier доходит к сороковому ходу.

Reflexion — это learning agent, который меняет input, а не program. В учебниковом разложении learning element изменяет performance element. Reflexion оставляет weights в покое и пишет reflective text в episodic buffer, который читает следующая попытка.3 Learning element — prompt, memory — строка базы данных, performance element — frozen model, а diagram остаётся учебниковой, без изменений.

И вот честный предел такого сопоставления. Пять типов классифицируют agent program. В 2026 году эта program разрезана посередине: часть — ваш код, часть — внутри weights, которые вы не обучали. Когда модель сама решает вызвать tool, goal test находится в вашей program или в модели? У таксономии нет ответа, потому что, когда её писали, ему негде было быть ещё, — и именно в этом вопросе расходятся два современных определения.

Ответить, вызвать и остановиться — в одном trace

Ссылка на раздел: Ответить, вызвать и остановиться — в одном trace

Определения спорят о поведении, и судить о них гораздо проще, когда перед глазами trace.

Loop ниже отправляет conversation в модель; если reply содержит tool call, он выполняет tool, добавляет result и отправляет всё снова. Он работает против локального Qwen2.5-0.5B-Instruct за OpenAI-shaped endpoint на этой машине — тот самый seam из главы 14, поэтому loop не знает и не интересуется, что находится за port.

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

Две строки несут всю идею, и обе отмечены; остальное — bookkeeping. Все три поведения видны в одном прогоне. Когда спрашивают то, что модель может сделать сама, она отвечает. Когда спрашивают то, чего не может, она вызывает:

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

И она останавливается — третье поведение, которое легче всего пропустить, потому что оно выглядит как отсутствие действия. Loop заканчивается, потому что turn 2 вернулся без tool call. Никто этого не решал; это решила модель, выдав prose. Termination condition этой program — признак отсутствия.

Ещё два прогона стоят места. Когда её просят сравнить два города, модель выдаёт оба tool calls за один turn, получает оба readings обратно и ошибается в сравнении:

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

Tools сработали. Parallel call сработал. Loop сработал. Ответ ложный, при том что оба правильных числа лежат в transcript. Обернуть модель в loop не значит заставить её reasoning; это даёт ошибающейся модели способность действовать на основе своей ошибки — заранее глава 30 и половина главы 29.

Теперь удалите отмеченный return и дайте loop дойти до cap. Тот же вопрос, та же модель:

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

В четыре раза больше input tokens, в четыре раза больше wall clock, и финал, где agent забыл, о чём его спросили, и допрашивает пользователя по вопросу, на который тот ответил на первом turn. Правильный ответ был на экране в turn 2, и каждый следующий turn делал transcript хуже.

Так что agent — это не loop. Это loop плюс правило выхода из него, и у этого есть ровно одно такое правило. Глава 23 находит пять и показывает, что ломается, когда каждого не хватает.

Оба цитируются, а не пересказываются, потому что путаница производится именно в пересказах.

Первое определение проводит границу по тому, кто управляет flow. Anthropic в Building effective agents называет неоднозначность и принимает по ней решение:

«В Anthropic мы относим все эти варианты к agentic systems, но проводим важное архитектурное различие между workflows и agents: workflows — это системы, где LLMs и tools orchestrated через предопределённые пути в коде. Agents, напротив, — это системы, где LLMs динамически направляют собственные процессы и использование tools, сохраняя контроль над тем, как они выполняют tasks».4

Тест — вопрос о вашем исходном коде: кто выбрал следующий шаг? switch в вашей program: workflow. Модель: agent. В том же документе сказано, что agents «обычно просто LLMs, использующие tools на основе feedback из environment в loop», — то есть ровно листинг выше.

Второе определение проводит границу по независимости от пользователя. OpenAI в A practical guide to building agents открывает страницу с определением так:

«В то время как обычное software позволяет пользователям упрощать и автоматизировать workflows, agents способны выполнять те же workflows от имени пользователей с высокой степенью независимости. Agents — это системы, которые independently accomplish tasks on your behalf».5

Через два предложения на той же странице оно исключает:

«Applications, которые integrate LLMs, но не используют их для control workflow execution — например, simple chatbots, single-turn LLMs или sentiment classifiers, — не являются agents».5

Прочитайте эти цитаты по порядку. Первые предложения проводят линию по independence: уходит ли эта штука и заканчивает ли работу без меня? Четвёртое проводит её по control of execution, то есть ровно по линии Anthropic. Разные тесты, одна страница, и есть реальные системы, по которым они расходятся.

Под этим лежит столкновение словаря, и оно вызывает споры на реальных встречах. В первом документе workflow — это architecture, и это то, что не agent. Во втором workflow — «sequence of steps that must be executed to meet the user's goal», то есть сама работа, которая есть у каждого agent. «Мы заменили workflow на agent» осмысленно в первом определении и почти бессмысленно во втором.

Три системы, классифицированные дважды

Ссылка на раздел: Три системы, классифицированные дважды

Три системы, существующие в 2026 году, под обоими определениями.

Вы описываете task; он читает файлы, запускает test suite, редактирует, снова запускает и останавливается, когда tests проходят или когда сдаётся. Ничто в вашем коде не решает, что следующий шаг — «запустить tests», — это делает модель, исходя из того, что вернул последний tool.

Определение один: agent, потому что модель направляет собственный process. Определение два: agent, потому что он independently выполняет task, распознаёт completion и возвращает control. Оба документа приводят эту форму как центральный пример.

Для каждого нового support ticket — три model calls в фиксированном порядке: классифицировать, извлечь поля, составить reply, — а затем отправить. Ни одна модель никогда не выбирает, что случится дальше; это делает loop for. Он запускается в 03:00, и никто за ним не смотрит.

Определение один: не agent. Это prompt chaining, прямо названный workflow. Определение два: оба ответа. По первым предложениям он independently выполняет tasks от вашего имени; по четвёртому — не использует модель для control workflow execution и исключается. Эта система — причина читать всю страницу, а не pull quote.

Один user turn. Модель сама решает, искать ли перед ответом, затем отвечает и ждёт вас.

Определение один: agent, потому что модель dynamically directs собственное использование tools по results из environment, а это и есть заявленный test. Определение два: не agent, потому что independence нет — один turn, затем он отдаёт ход обратно, — а «simple chatbots» прямо названы в списке исключений.

Две из трёх меняют сторону. Это не провал ни одного документа. Это предупреждение о типе встречи, где два человека, полностью согласные о том, что делает система, час спорят о том, как её назвать.

Определения сталкиваются, потому что каждое сжимает два независимых вопроса в одно слово. Разделите их, и несогласие станет таблицей, что полезнее вердикта.

ваш код выбирает следующий шагмодель выбирает следующий шаг
человек смотрит каждый turnформа с моделью внутри: classifiers, extraction, single-turn completionchat с tools — первое определение говорит agent, второе говорит нет
никто не смотрит, пока не будет готовоpipeline — начало второго определения говорит agent, его четвёртое предложение говорит нетвсе согласны: agent

Каждое определение спорит с другой клеткой, а две оставшиеся вообще не спорны. Поэтому, когда label важен — в contract, risk review, postmortem, — стоит писать не «это agent или нет», а два предложения: кто выбрал следующий шаг и кто смотрел. На оба можно ответить, прочитав код; ни одному не нужно чужое определение, и вместе они несут все последствия, ради которых использовали label.

Всё это не ново. Wooldridge и Jennings обозревали конкурирующие смыслы слова «agent» в 1995 году;6 Franklin и Graesser задали вопрос этой главы в 1996-м, собрали ходившие тогда определения и обнаружили, что они расходятся.7 Обзор 2023 года всё ещё определяет agents с первых принципов — «artificial entities that sense their environment, make decisions, and take actions»8, — потому что не существовало согласованного современного определения, на которое можно было сослаться, а CoALA описывает части, а не проводит границу.9 Тридцать лет отказа договориться говорят, что слово выполняет больше одной работы.

Теперь следствие, которое приходит раньше философии, — счёт.

Каждое измерение здесь имеет одну форму. Один вызов стоил 39 input tokens; тот же вопрос с одним tool стоил 420 в двух вызовах; loop без stopping rule стоил 1 688 в шести. Рост хуже линейного, потому что turn n несёт с собой все предыдущие turns: колонка prompt в том шестиходовом прогоне выглядит так: 187, 238, 261, 302, 327, 373. Глава 16 вывела, что total равен Θ(n2)\Theta(n^2), и подогнала curve на реальном conversation. Agent превращает каждую task в этот conversation, видит его человек или нет.

Если бы эти измеренные token counts ушли в коммерческий endpoint по rates, которые глава 16 прочитала 6 сентября 2026 года — $2,00 за миллион input tokens и $12,00 за миллион output, — четыре прогона стоили бы так:

runmodel callsinput tokensoutput tokenscost
the question, no tools1398$0.000174
the same question, one tool in the catalogue242038$0.001296
a question that needs the tool242533$0.001246
the same, with the stopping rule removed61,688124$0.004864

Строка два против строки один — число, которое нужно запомнить. В семь с половиной раз дороже — за худший ответ на вопрос, который модель и так знала. Ничего не было настроено неправильно: tool существовал, значит модель им воспользовалась — и вывод главы 18 о том, что больно бьёт цена каталога, а не его точность, получает здесь самую дешёвую демонстрацию с каталогом из одного элемента.

Вот почему полезная половина обоих документов — та, где говорится, как этого не строить. Anthropic прямолинеен: найдите самое простое возможное решение и добавляйте complexity только при необходимости; это «может означать вообще не строить agentic systems», поскольку agentic systems «обменивают latency и cost на лучшую task performance», а «для многих applications обычно достаточно optimized single LLM calls with retrieval и in-context examples».4 Его аргумент за agent узок: open-ended problems, где вы не можете предсказать число steps и не можете hardcode path, в environment, которой доверяете, принимая «higher costs, and the potential for compounding errors».4 Экран OpenAI — зеркальное отражение: complex judgement, unmaintainable rule sets, unstructured data — и заканчивается так же: «otherwise, a deterministic solution may suffice».5

Итак, в таксономии этой главы: фиксированное число шагов в фиксированном порядке — это pipeline, и если назвать его agent, быстрее он не станет. Если число steps зависит от того, что вы найдёте по дороге, вам нужен loop — и эту гибкость вы покупаете N вызовами, квадратичным transcript и системой, которая может ошибиться N раз вместо одного.

Теперь у вас есть таксономия, оба современных определения, две оси, которые делают их совместимыми, и короткий loop, который отвечает, вызывает и останавливается.

У этого loop есть один способ завершиться: модель перестаёт просить tools. Глава 23 специально ломает его семь раз, и каждая поломка добавляет часть. Невозможная task — и он никогда не заканчивается: turn cap. Ночь выполнения — и приходит счёт: budget в долларах. Tool падает — error, на который модель может отреагировать. Тот же call дважды — idempotency key. Файл, который он не должен был трогать, — human approval. Restart на середине — session persistence. Tool, который три минуты молчит, — progress и cancellation. На выходе получается harness, файл, на котором работает остальной курс.

Остаётся вопрос, которым на самом деле занималась спорная диагональ этой главы. Loop, который сам решает следующий шаг, должен решить, когда остановиться, и мы только что видели, что происходит, когда он не может: шесть turns, счёт в четыре раза больше и agent, который допрашивает пользователя о вопросе, на который уже ответил. Остановка — это не одно condition. Сколько их, и какое срабатывает первым?


Lilian Weng, LLM Powered Autonomous Agents (2023), — самое известное разложение language agent на planning, memory и tool use, и это правильное следующее чтение рядом с двумя vendor documents; его три components — это главы 23, 24 и 18 этого курса именно в таком порядке.

Каждое число в этой главе было получено на этой машине, ничего не оценивалось приблизительно. Коридор, floor plan, четыре agents, которые по нему ходят, и три patrol policies — это TypeScript выше, запущенный на Node 22; figures randomised agent — means по 2 000 seeded runs для каждого, а patrol figures — single seeded runs по 4 000 ticks. Model traces приходят из Qwen2.5-0.5B-Instruct в float32 на CPU с greedy decoding, served over loopback небольшим local Python endpoint, который loads weights и speaks OpenAI chat-completions shape — снова seam, с tensors на стороне Python и loop на стороне TypeScript, — поэтому token counts принадлежат tokenizer этой модели, а latencies — этой машине. Единственные figures, взятые извне, — две prices в cost table: rates, которые глава 16 прочитала на pricing page OpenAI 6 сентября 2026 года, применённые здесь к locally measured token counts как illustration, а не как observed invoice.

  1. Russell, S. and Norvig, P. Artificial Intelligence: A Modern Approach, 4th edition, chapter 2, Intelligent Agents. Источник мира пылесоса, спецификации PEAS, определения rationality относительно performance measure, семи свойств task environments, пяти типов agent, используемых здесь, и наблюдения, что infinite loops часто неизбежны для simple reflex agents в partially observable environments. Companion code книги — aimacode/aima-python на GitHub (8 806 stars, last pushed 30 June 2026, read 7 September 2026) — стоит назвать точно тем, чем он является. Это accompanying repository книги, а не reference implementation, на котором другие projects строятся так, как на karpathy/micrograd (17 412) и karpathy/nanoGPT (62 852). Поэтому эта глава цитирует и ссылается на него, а не переносит его, и поэтому ecosystem argument, удержавший главу 5 в Python, здесь не применяется: ничто в этой главе не касается tensor, а loop, написанный выше, является прямым предком главы 23. 2 3 4 5

  2. Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K. and Cao, Y. ReAct: Synergizing Reasoning and Acting in Language Models. arXiv:2210.03629 (2022). Чередование reasoning traces и actions, на которое ссылается строка goal-based в mapping table.

  3. Shinn, N., Cassano, F., Berman, E., Gopinath, A., Narasimhan, K. and Yao, S. Reflexion: Language Agents with Verbal Reinforcement Learning. arXiv:2303.11366 (2023). Собственное summary механизма в статье — причина, по которой он сопоставляется с learning agent: он reinforces agents «not by updating weights, but instead through linguistic feedback», с agents, которые «verbally reflect on task feedback signals, then maintain their own reflective text in an episodic memory buffer to induce better decision-making in subsequent trials». 2

  4. Anthropic, Building effective agents, 19 December 2024, anthropic.com/engineering/building-effective-agents, read 7 September 2026. Источник процитированного выше различия workflow/agent, umbrella term «agentic systems», описания agents как «typically just LLMs using tools based on environmental feedback in a loop», рекомендации искать самое простое возможное решение и того, что это «might mean not building agentic systems at all», а также аргументов за и против agents, включая «higher costs, and the potential for compounding errors» и рекомендацию stopping conditions «such as a maximum number of iterations» для сохранения контроля. 2 3

  5. OpenAI, A practical guide to building agents, pages 4 to 7, read 7 September 2026. Источник фразы «Agents are systems that independently accomplish tasks on your behalf», исключения «simple chatbots, single-turn LLMs, or sentiment classifiers», определения workflow как «a sequence of steps that must be executed to meet the user's goal», двух core characteristics agent, трёх components — model, tools, instructions — и screening criteria для того, когда строить agent, заканчивающихся «otherwise, a deterministic solution may suffice». 2 3

  6. Wooldridge, M. and Jennings, N. R. Intelligent Agents: Theory and Practice. The Knowledge Engineering Review, volume 10, issue 2 (1995). Survey, разделивший usage в области на weak notion of agency — autonomy, social ability, reactivity, pro-activeness — и stronger notions, заимствующие mental vocabulary. Сегодня это читается как запись того же спора, который всё ещё ведут два документа этой главы.

  7. Franklin, S. and 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). Цитируется здесь как то, чем является, а не ради quotation: survey, собравший определения «agent», ходившие тогда, обнаруживший, что они расходятся, и предложивший taxonomy вместо спора. Тридцать лет спустя спор находится в лучше спроектированной документации, но во всём остальном не изменился.

  8. Xi, Z. et al. The Rise and Potential of Large Language Model Based Agents: A Survey. arXiv:2309.07864 (2023). Процитирован выше за opening definition: «AI agents are artificial entities that sense their environment, make decisions, and take actions», то есть textbook definition, заново сформулированное в 2023 году, потому что не было согласованного modern definition, на которое можно сослаться.

  9. Sumers, T. R., Yao, S., Narasimhan, K. and Griffiths, T. L. Cognitive Architectures for Language Agents. arXiv:2309.02427 (2023). Organises language agents как «modular memory components, a structured action space to interact with internal memory and external environments, and a generalized decision-making process to choose actions» и явно помещает их в историю symbolic AI и cognitive science. Memory taxonomy возвращается в главе 24, где таблица из трёх stores — её practical shadow.

Готовы доверить выбор модели LIA?

Создавайте со всеми ИИ-моделями в одном месте — начните бесплатно уже сегодня.