← Your First AI Agent: From Zero to Autonomy
01 / 07 · 35 min

What Is an Agent: Loop, Tools, Memory

How an agent differs from a chatbot and a workflow: the decide-act-observe loop, tools as the model's hands, and memory as its desk.

Lesson content is currently available in Russian.

What you will learn

  • →Формулировать разницу между одним вызовом LLM, workflow и агентом.
  • →Называть три обязательных компонента агента: цикл, инструменты, память.
  • →Определять, когда агент — лишнее усложнение, а когда без него не обойтись.

Агент — это цикл, а не большой промпт

Главное отличие агента от обычного вызова LLM — то, у кого находится управление. В чат-боте управление всегда у вашего кода: отправили запрос, получили текст, показали пользователю, конец. В workflow управление у заранее нарисованного графа: шаг A, потом шаг B, потом ветвление — маршрут известен до запуска, модель лишь заполняет узлы. В агенте управление передаётся модели: она сама решает, какой инструмент вызвать следующим, глядя на результат предыдущего шага. Anthropic в статье «Building effective agents» проводит именно эту границу: workflow — это LLM внутри предопределённого кода, агент — это LLM, который динамически управляет собственным процессом.

Формула агента укладывается в четыре строки псевдокода:

история = [задача]
пока не готово:
    решение = модель(история)          # текст ИЛИ вызов инструмента
    если решение — вызов инструмента:
        результат = выполнить(решение)  # это делает ВАШ код
        история += [решение, результат]
    иначе: вернуть решение              # финальный ответ

Всё остальное — обвязка вокруг этого цикла: какие инструменты доступны, как хранится история, когда цикл обязан остановиться. Заметьте важную деталь: модель никогда ничего не исполняет сама. Она лишь выражает намерение — «вызови поиск с таким-то запросом», — а исполняет намерение ваш код. Это и рычаг контроля: между намерением и исполнением вы можете вставить проверку, лимит или вопрос человеку.

В литературе этот цикл называют по-разному — ReAct, agent loop, orchestration loop, — но суть одна: чередование рассуждения и действия с наблюдением результата. Запомните слово «наблюдение»: именно возврат результата инструмента обратно в историю превращает набор разрозненных вызовов в поведение, способное корректировать курс.

Инструменты: руки модели

Инструмент — это обычная функция вашего кода, о существовании которой модель знает из описания. Вы передаёте провайдеру список инструментов: имя, назначение и JSON-схему аргументов. Модель, решив воспользоваться инструментом, возвращает не текст, а структурированный вызов — имя функции плюс аргументы в JSON. Ваш код исполняет функцию и кладёт результат обратно в историю сообщений, после чего модель продолжает рассуждение уже с учётом результата.

Из этого устройства следуют три практических вывода. Первый: качество описания инструмента напрямую определяет, будет ли модель им пользоваться и правильно ли. Описание «ищет данные» бесполезно; описание «полнотекстовый поиск по базе тикетов поддержки, возвращает до 10 совпадений с id и заголовком» — рабочее. Второй: набор инструментов — это и есть граница возможностей агента. Агент без инструмента «отправить письмо» физически не может отправить письмо, сколько бы его ни просили, — и это способ проектировать безопасность, а не ограничение. Третий: инструменты бывают читающими (поиск, чтение файла, HTTP GET) и пишущими (создать тикет, изменить метку, отправить сообщение). Читающие можно давать агенту щедро, пишущие — скупо и под контролем; к этому разделению мы будем возвращаться весь курс, особенно в уроке про guardrails.

Память: рабочий стол и архив

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

Поэтому в зрелых агентах память расслаивается. Scratchpad — явные рабочие заметки: план из пунктов, список уже проверенных гипотез, промежуточные выводы. Его агент ведёт сам, через инструмент или структурированное поле состояния, и он переживает обрезку истории. Long-term память — внешнее хранилище (файл, база, векторный индекс), куда агент откладывает знания между запусками: «пользователь предпочитает ответы по-русски», «в этом репозитории тесты запускаются командой make test».

На старте достаточно запомнить иерархию: массив сообщений — рабочий стол, scratchpad — пришпиленная к монитору бумажка с планом, long-term — архив в шкафу. Урок 4 разберёт каждый слой с кодом; пока важно одно — «память агента» это не магия, а решения о том, какие байты вы кладёте в контекст следующего вызова.

Когда агент не нужен

Самая частая ошибка новичка — строить агента там, где хватит функции. Правило из практики: автономия — это цена, которую платят за неизвестный заранее маршрут. Если маршрут известен — платить незачем.

Три проверочных вопроса перед стартом. Первый: детерминирована ли задача? «Извлечь сумму и дату из счёта» — это один вызов модели со structured output, цикл не нужен. Второй: известна ли последовательность шагов заранее? «Получить текст → перевести → саммаризировать → отправить» — это workflow: три вызова, склеенные обычным кодом; он дешевле, быстрее и предсказуемее агента. Третий: нужен ли вообще LLM? Отфильтровать строки по регулярному выражению агентом — профессиональный позор.

Агент оправдан, когда путь к результату зависит от того, что выяснится по дороге: отладка («запусти тесты, посмотри, что упало, почини, повтори»), исследование («найди, в каких файлах используется этот API, и оцени масштаб миграции»), triage («прочитай issue, поищи дубликаты, реши, какие метки поставить»). Общий знаменатель — ветвление по промежуточным результатам, которое нельзя зашить в код заранее.

За автономию вы платите трижды: латентность (каждый шаг — полный проход модели), деньги (история растёт, токены дорожают с каждым шагом) и недетерминизм (один и тот же запуск может пойти разными путями). Начинайте с простейшего решения и добавляйте автономию только под давлением реальной задачи — это прямой совет из «Building effective agents», и он самый ценный в статье.

Practice

Классификация: вызов, workflow или агент

Возьмите пять реальных задач: извлечение полей из PDF-счёта, ответы на вопросы по базе знаний, автоматическое ревью pull request, ежедневный дайджест новостей команды, починка упавшего CI. Для каждой решите: один вызов LLM, workflow или агент — и обоснуйте одним предложением через вопрос «известен ли маршрут заранее». Для одной задачи, которую вы отнесли к агентам, распишите цикл: какие инструменты нужны, что лежит в истории, каково условие остановки.

Deliverable

Таблица из пяти строк (задача → класс → обоснование) плюс псевдокод цикла для одной агентной задачи с перечнем инструментов и условием остановки.

Checkpoint

Чем агент отличается от одного вызова LLM с очень хорошим промптом и от workflow из пяти вызовов?

  • ✓ Названо ключевое отличие: в агенте следующий шаг выбирает модель по результатам предыдущих, а не код.
  • ✓ Упомянуто, что инструменты исполняет код разработчика, а модель только выражает намерение.
  • ✓ Приведена цена автономии: латентность, стоимость токенов или недетерминизм.

Check yourself

Что делает систему агентом, а не просто применением LLM?

01Что делает систему агентом, а не просто применением LLM?

Кто фактически исполняет инструмент при tool calling?

02Кто фактически исполняет инструмент при tool calling?

Чем workflow принципиально отличается от агента?

03Чем workflow принципиально отличается от агента?

Что является short-term памятью агента по умолчанию?

04Что является short-term памятью агента по умолчанию?

Для какой задачи агент — плохой выбор?

05Для какой задачи агент — плохой выбор?

Sources

What Is an Agent: Loop, Tools, Memory · Your First AI Agent: From Zero to Autonomy · VORCL