Слово «агент» за последние два года прилипло почти ко всему. Агентом называют чат-бота с кнопкой «поиск в интернете», надстройку над таблицей, скрипт с одним HTTP-запросом и полноценную систему, которая сама открывает браузер и правит файлы. В результате читатель, который выбирает инструмент, не может сравнить два продукта: у обоих на лендинге написано «AI agent», а внутри разные вещи.
Это не филологическая придирка. От того, агент перед вами или нет, зависят три практических вещи: сколько денег вы потратите на токены за один запрос, что произойдёт при ошибке модели и кому вы отдаёте право на действие. Чат, который ошибся, выдал плохой текст. Агент, который ошибся, удалил папку.
Ниже — определение, которое можно проверить, не заглядывая в чужой исходный код: по внешнему поведению системы. Плюс раздел о том, когда агент — заведомо неправильный инструмент, потому что это половина всей темы, а пишут о ней редко.
#Определение через три признака
Система является агентом, если выполнены одновременно все три условия:
- Цикл. Модель вызывается не один раз, а в петле: вывод очередного шага становится входом следующего. Петлю замыкает программа, а не человек.
- Инструменты. У модели есть способ повлиять на мир за пределами своего текста: прочитать файл, сходить в сеть, записать строку в базу. Результат инструмента возвращается в контекст.
- Состояние. Между шагами что-то сохраняется: список наблюдений, план, промежуточные результаты. Без состояния каждый шаг начинается с нуля, и цикл не сходится.
Три признака — это чек-лист. Возьмите любой продукт и задайте три вопроса:
- Может ли он сделать несколько шагов подряд, пока я не нажимаю ничего?
- Есть ли у него хоть один инструмент, меняющий что-то вне чата?
- Помнит ли он результат шага 2 на шаге 5?
Три «да» — агент. Два «да» — чат с инструментами, полезная и часто более разумная штука, но не агент. Одно «да» — просто чат.
Граница между «чат с инструментами» и «агент» проходит по тому, кто замыкает петлю; подробный разбор этой промежуточной ступени — в материале о том, где проходит граница между агентом и чат-ботом.
#Как выглядит цикл изнутри
Базовая петля почти во всех реализациях одна и та же и известна как ReAct — reasoning + acting. Схематично один проход:
запрос пользователя
│
▼
┌─────────────────────────────────────┐
│ 1. МЫСЛЬ модель решает, что │
│ делать дальше │
│ 2. ДЕЙСТВИЕ модель печатает вызов │
│ инструмента │
│ 3. ВЫПОЛНЕНИЕ ваш код исполняет │
│ вызов │
│ 4. НАБЛЮДЕНИЕ результат дописан │
│ в контекст │
└─────────────────────────────────────┘
│
├── условие остановки не выполнено ──▶ назад к шагу 1
│
▼
ответ пользователю
Ключевой и постоянно упускаемый пункт — третий. Модель ничего не выполняет. Она выдаёт текст, который ваш код распознаёт как просьбу вызвать инструмент, и решение выполнять или нет принимает код. Это не деталь реализации, а место, где живёт вся безопасность системы; разбор этого механизма — в статье про function calling и точку ответственности.
Второй постоянно упускаемый пункт — четвёртый. Каждое наблюдение дописывается в контекст и остаётся там до конца задачи. На шаге 12 модель видит одиннадцать предыдущих наблюдений, и это главная причина, по которой длинные цепочки деградируют: подробности — в разборе паттерна ReAct и роста контекста по шагам.
#Инструменты: что агент реально умеет
Инструмент — это функция вашей программы с описанием, которое видит модель. Описание попадает в системный промпт: имя, назначение, список параметров. Модель, увидев его, может напечатать вызов в оговорённом синтаксисе.
Инструменты принято делить по тому, что они могут испортить. Это деление не косметическое: оно определяет, какие вызовы допустимы без человека.
| Класс | Что делает | Пример | Можно ли без подтверждения |
|---|---|---|---|
| Чтение | Не меняет ничего | список файлов, поиск в сети | Да |
| Сетевой риск | Ходит по произвольным адресам | открыть страницу в браузере | Нет, нужна проверка адреса |
| Изменение | Пишет локально, обратимо | создать файл, поставить напоминание | По ситуации |
| Выполнение | Запускает код | команда в терминале | Нет |
| Разрушение | Необратимо удаляет | удалить папку | Нет |
Из таблицы следует правило по умолчанию: автономно, то есть без явного участия человека, агенту можно отдавать только первый класс. Всё остальное проходит через подтверждение или через явное разрешение владельца. Как строится такая политика на практике — в руководстве по белым спискам и правам агента по умолчанию.
Отдельная сложность — откуда инструменты берутся. Раньше каждый клиент интегрировал каждый инструмент отдельно, и число связок росло как произведение. Ответ индустрии — единый протокол подключения, MCP, который превращает произведение в сумму.
#Типовые режимы отказа
У агента отказы устроены иначе, чем у чата. Чат либо ответил плохо, либо не ответил. Агент может отработать «успешно» и оставить после себя мусор. Пять режимов, которые встречаются чаще остальных:
| Режим отказа | Как выглядит снаружи | Где ловится |
|---|---|---|
| Сломан синтаксис вызова | Агент «рассказывает», что сделал, ничего не сделав | Парсер вызова не нашёл ни одного вызова |
| Неверное наблюдение | Уверенный неправильный ответ | Первый вызов инструмента в трассировке |
| Блуждание | Много шагов, нет прогресса | Повторяющиеся аргументы у одного инструмента |
| Упёрся в лимит | Обрыв на середине | Счётчик шагов достиг предела |
| Частичное действие | Файл создан, но не дописан | Сравнение состояния диска с намерением |
Отдельно стоит последний. Агент, который создал файл и упал на следующем шаге, оставляет систему в промежуточном состоянии, из которого её никто не выведет: у модели нет транзакций. Отсюда практическое требование — пишущие инструменты должны быть идемпотентными или обратимыми, а не «просто работать».
Первые четыре режима видны в трассировке, и почти всегда — раньше, чем в финальном ответе. Поэтому логи вызовов включаются до того, как включается первый пишущий инструмент, а не после первого неприятного случая.
#Состояние: чем агент отличается от последовательности запросов
Можно вызвать модель пять раз подряд и не получить агента. Пять независимых запросов — это пять чатов. Агентом система становится, когда пятый шаг знает, что произошло на втором.
Состояние в агенте бывает трёх сортов, и их постоянно смешивают:
- Контекст хода — то, что физически лежит в промпте прямо сейчас: цель, наблюдения, промежуточные выводы. Живёт до конца задачи, ограничен окном модели.
- Память — факты, которые переживают задачу: предпочтения, имена, проекты. Это отдельное хранилище, а не длинный промпт.
- Навык — записанная процедура: «когда просят собрать отчёт, делай так-то». Тоже переживает задачу, но описывает не факт, а способ действия.
Смешение этих трёх — самая частая архитектурная ошибка в самодельных агентах: человек кладёт процедуру в память, память в контекст, и через неделю не может понять, почему агент делает не то. Разделение с примерами — в материале про навыки агента и повторяемые процедуры.
#Планирование: почему цикла мало
Голая петля «мысль — действие — наблюдение» хорошо работает на задачах в три-четыре шага. Дальше она начинает бродить: модель делает разумный локальный выбор, но теряет общую цель.
Ответ — план. Практика показала, что план, составленный один раз в начале, тоже почти всегда ломается: он строился на предположениях о мире, а первое же наблюдение эти предположения опровергает. Работает перепланирование — короткий план, который пересматривается после значимых наблюдений. Сравнение обоих подходов на одном примере — в разборе того, как агент разбивает задачу на шаги.
#Когда агент — неправильный инструмент
Это самый важный раздел статьи, и в большинстве материалов про агентов его нет.
Задача решается одним запросом. Если ответ — это текст, который модель может выдать сразу, петля добавляет только стоимость и задержку. Перевести абзац, переформулировать письмо, объяснить термин — здесь агент вреден.
Задача решается детерминированным кодом. Переименовать файлы по маске, разложить строки по столбцам, посчитать сумму — всё это делает скрипт: быстрее, дешевле, воспроизводимо и без риска, что модель «поймёт по-своему». Модель уместна там, где нужна интерпретация неструктурированного текста, а не там, где правило можно записать.
Цена ошибки высока, а проверить результат дорого. Агент, который делает бухгалтерскую проводку или пишет в продовую базу, экономит минуты и создаёт риск на порядки больше. Если проверка результата занимает столько же времени, сколько сама работа, автономность не даёт выигрыша.
Модель маленькая, а шагов много. Компактные локальные модели удовлетворительно делают один-два вызова инструмента и начинают путать формат на третьем-четвёртом. Это не настройка, а свойство размера. Подробнее — ниже и в отдельном разборе.
Нет способа посмотреть, что агент делал. Без трассировки агент — чёрный ящик, который иногда прав. Отладка такой системы состоит из угадывания.
Практическое правило: агент оправдан, когда шагов заведомо больше двух, каждый шаг зависит от результата предыдущего, а результаты промежуточных шагов нельзя предсказать заранее.
#Мифы и заблуждения
«Агент — это автономный ИИ, который сам решает, что делать». Агент решает, какой из заранее данных ему инструментов вызвать. Список инструментов, границы каталогов, лимит шагов и права задаёт человек в коде. Автономность агента ровно такова, какой её сделали, и ни на грамм больше.
«Модель сама выполняет команды». Нет. Модель печатает текст. Например, в Persona это буквально текстовый маркер вида <tool>list_dir({"path": "."})</tool>, который разбирается регулярным выражением в app/mcp/builtin_tools.py, и только потом соответствующая функция запускается кодом. Ни один провайдер модели ничего на вашей машине не запускает.
«Больше агентов — лучше результат». Для личных задач чаще наоборот: каждый дополнительный агент — это дополнительные вызовы модели, дополнительная точка потери контекста и дополнительный способ ошибиться. Мультиагентные схемы оправданы в узком наборе случаев, и «сложная задача» в него не входит.
«Агент запомнит всё, что происходило». Контекст хода — не память. По завершении задачи он исчезает, если его специально не сохранили в отдельное хранилище. Это разные подсистемы, и вторая обычно делается отдельно и позже.
«Локальная модель справится, надо только промпт получше». Соблюдение синтаксиса вызова инструментов у компактных моделей заметно хуже, чем у крупных, и промпт это не лечит. Он снижает частоту сбоев, но не убирает их.
«Если агент ошибся, значит модель плохая». В подавляющем большинстве разобранных случаев ошибка видна раньше — на первом неверном наблюдении: инструмент вернул не то, что решил, что вернул, автор. Модель после этого рассуждала правильно на неверных данных.
#Как начать: агент за один вечер, без ущерба
Порядок, который снижает шанс потерять данные на первой неделе:
- Выберите ровно одну задачу, где шагов больше двух и результат легко проверить глазами. Например: «найди в моих заметках все упоминания проекта X и собери их в один файл».
- Дайте один инструмент на чтение. Список файлов или поиск. Ничего пишущего.
- Поставьте жёсткий лимит шагов. Пять — нормальное начальное значение. Цикл, который упёрся в лимит, должен отдавать частичный результат, а не молчать.
- Включите запись трассировки. Каждый вызов: имя, аргументы, результат, время. Без этого следующий пункт невозможен.
- Прогоните двадцать запусков и прочитайте логи, а не только ответы. Вы увидите реальную частоту сбоев формата и типичные места блуждания.
- Добавьте первый пишущий инструмент только после этого — и сразу с белым списком каталогов.
- Выполнение команд оставьте на конец или не включайте вовсе: у этого инструмента нет проверяемых параметров, поэтому ограничить его по смыслу невозможно.
Ошибка новичка — начать с пункта 6, потому что «интереснее», и получить первый неприятный опыт до того, как появилась трассировка, по которой можно понять, что произошло.
#Что из этого следует для личного ассистента
Личный агент отличается от корпоративного не техникой, а ценой ошибки и составом данных. У корпоративного агента данные принадлежат компании и есть служба, которая чинит последствия. У личного — ваши письма, ваши файлы, ваш календарь и никакой службы.
Отсюда три требования, которые в личном сценарии не обсуждаются:
- Права по умолчанию — минимальные. Не «включим всё, потом ограничим».
- Все действия видны. Список вызовов с аргументами и результатами доступен вам, а не только в отладочном логе.
- Всё, что необратимо, проходит через подтверждение. Именно так это устроено в Persona: класс инструмента определяется в
app/mcp/tool_policy.py, автономно модели отдаются только инструменты чтения, а исполняющие и разрушающие вызовы из Telegram паркуются за одноразовой кнопкой подтверждения и читают свои аргументы из записи в базе, а не из нажатия.
Если вы собираете личного агента — начните с чтения, лимита шагов и логов; всё остальное добавляется потом и по одной штуке за раз. Persona устроена по этому же порядку, и именно поэтому многие агентные функции в ней по умолчанию выключены.
#Частые вопросы
#Чем ИИ-агент отличается от чат-бота?
Чат-бот отвечает текстом на реплику: один запрос — один ответ. Агент выполняет несколько шагов подряд, вызывая инструменты и используя результат предыдущего шага как вход следующего, причём петлю замыкает программа, а не нажатие человека. Промежуточный случай — чат с инструментами, где вызов происходит, но следующий шаг инициирует человек: это ещё не агент.
#Может ли ИИ-агент работать на локальной модели?
Может, с оговорками. Компактные модели удовлетворительно делают один-два вызова инструмента и заметно чаще ломают синтаксис вызова на третьем-четвёртом шаге. Практический подход — дробить задачу на короткие цепочки по два-три шага, давать минимум инструментов с очень явными описаниями и не рассчитывать на длинные автономные прогоны.
#Насколько ИИ-агент автономен на самом деле?
Ровно настолько, насколько ему разрешили. Модель выбирает из списка инструментов, который дал разработчик, в пределах лимита шагов, который тоже задан кодом. «Агент сам решил» всегда означает «агент выбрал из того, что мы ему дали». Если инструмента удаления в списке нет, никакая формулировка запроса его не создаст.
#Сколько стоит один запуск агента?
Больше, чем один запрос к модели, обычно в несколько раз: каждый шаг — это отдельный вызов, и контекст на каждом шаге длиннее предыдущего. Точной цифры без вашей задачи и вашей модели не существует. Если считаете бюджет — умножайте цену одного вызова на ожидаемое число шагов и добавляйте рост контекста; в локальном режиме вместо денег платится время процессора.
#Может ли агент удалить мои файлы?
Может, если вы дали ему инструмент удаления и не поставили ограничений. Именно поэтому разумная конфигурация не включает разрушающие инструменты по умолчанию, ограничивает работу белым списком каталогов и требует подтверждения на всё необратимое. В Persona удаление отнесено к отдельному классу риска, а границы рабочего каталога проверяются на каждом обращении.
#Что делать, если агент зациклился?
Сначала посмотреть трассировку и найти, на каком шаге он начал повторяться: механизмов зацикливания несколько, и предохранители у них разные. Общий лимит шагов спасает от бесконечного прогона, но не устраняет причину. Разбор по механизмам — в отдельном материале про зацикливание.
#Нужен ли мне вообще агент?
Если ваши задачи решаются одним запросом к модели или обычным скриптом — нет, и агент только добавит стоимость и риск. Агент оправдан, когда шагов заведомо больше двух, каждый следующий зависит от результата предыдущего, и заранее нельзя сказать, каким этот результат будет.
#Вывод
Проверяйте продукты по трём признакам: цикл, инструменты, состояние. Если хотя бы одного нет — перед вами не агент, и это не обязательно плохо: чат с инструментами часто уместнее и почти всегда дешевле.
Если вы решили, что агент вам нужен: начинайте с одной задачи, одного инструмента на чтение, лимита в пять шагов и включённой трассировки. Если ваша задача решается скриптом — пишите скрипт. Если цена ошибки высока, а проверка результата дорога, автономность не окупится, и правильное решение — оставить человека в петле.