Прикладной ИИ · архитектура агентов · разбор
Как устроены ИИ-агенты:
инструменты, память и участие человека
Языковая модель сама по себе получает текст и возвращает текст. Она не ходит в интернет, не открывает таблицы, не помнит вчерашний разговор и не отправляет письма. Всё это делает приложение вокруг неё: передаёт модели нужные сведения, выполняет запрошенные ею действия, сохраняет промежуточные результаты и решает, когда остановиться или позвать человека. Именно такую конструкцию обычно и называют ИИ-агентом.
Антон Коннов · 20 октября 2026 · 10 минут
Ниже — восемь её составляющих и различия между ними, которые полезно понимать, прежде чем заказывать или оценивать подобную систему. Технические утверждения сопровождаются ссылками на первоисточники; рекомендации отмечены отдельно.
Сквозной пример
Пример вымышленный. Небольшая производственная компания хочет сравнить несколько поставщиков упаковки: цену, срок поставки, минимальную партию, условия оплаты. Нужный результат — сравнительная таблица, где у каждой цифры есть ссылка на источник, расчёт полной стоимости на единицу продукции и черновик письма поставщикам с запросом коммерческих предложений. Письмо уходит наружу только после того, как его одобрит ответственный менеджер.
1. Workflow, агент и граф: кто выбирает следующий шаг
Главное различие — кто определяет порядок действий. В workflow путь задан заранее в коде: получить список поставщиков, собрать прайсы, посчитать, оформить таблицу. В агенте модель на каждом шаге сама выбирает следующее действие с учётом уже полученных результатов (LangGraph: workflows и агенты).
Граф — не третий конкурирующий продукт, а способ описать процесс как набор шагов (узлов) и переходов между ними, в том числе условных. В одном графе могут соседствовать жёстко заданные участки и участок, где действует агент. Название LLMChain из старых учебных материалов относится к ранним интерфейсам LangChain; это не обязательная технология для современного workflow.
| Workflow | Агент | Граф | |
|---|---|---|---|
| Кто выбирает следующий шаг | Разработчик заранее | Модель по ходу работы | Разработчик задаёт узлы и правила переходов; внутри узла может работать агент |
| Где уместен | Стабильный повторяемый маршрут | Заранее неизвестное число шагов | Процесс с ветвлениями, возвратами и остановками |
| Типичный риск | Не справляется с непредусмотренным случаем | Лишние шаги, зацикливание, рост стоимости | Избыточная сложность, если ветвлений больше, чем нужно |
В нашем примере сбор прайсов с известных и однотипных сайтов можно сделать обычным workflow. Агент нужен там, где путь заранее неясен: у одного поставщика цена в PDF-файле, у другого только в форме запроса, у третьего страница явно устарела.
2. ReAct: действие, наблюдение, следующий шаг
ReAct — метод, в котором модель чередует рассуждение о задаче и действия во внешней среде, а результат каждого действия (наблюдение) учитывается на следующем шаге (Yao и др., ReAct). Например: «нужна цена поставщика Б» → поиск по его сайту → найдена страница, где цена указана без НДС → прежде чем сравнивать, нужно привести её к общей базе.
Две оговорки. Во-первых, ReAct — способ организации работы, а не гарантия правильности: агент может неверно прочитать страницу или решить, что данных уже достаточно. Во-вторых, для контроля не нужно видеть скрытый внутренний ход рассуждений модели. Достаточно видимого: план, какие инструменты вызваны, что они вернули, на какие источники опирается вывод, и краткое объяснение решения.
Современный агент в LangChain устроен как цикл «модель — инструменты» с обвязкой: инструкциями, набором инструментов и промежуточными обработчиками (middleware). Модель лишь запрашивает вызов инструмента — выполняет его приложение (LangChain: агенты). Это значит, что надёжность определяется не только моделью, но и тем, что приложение разрешает и как обрабатывает ошибки.
3. Память: разговор, долгосрочные сведения и RAG
Модель не помнит предыдущие запросы сама. Если менеджер сначала пишет «сравни поставщиков упаковки», а потом «добавь срок поставки», второй запрос понятен, только если приложение передало модели историю или её сжатое изложение. Длинную историю приходится сокращать, суммировать или отбирать: окно контекста ограничено, а лишний текст удорожает запрос и может ухудшить ответ (LangChain: краткосрочная память).
Полезно различать три вещи:
- Краткосрочная память — состояние текущего разговора или задачи: сообщения, промежуточные результаты, вызовы инструментов.
- Долгосрочная память — сведения, которые приложение решило сохранить между разными разговорами, например что компания всегда сравнивает цены с НДС. В LangGraph состояние отдельного потока работы хранит checkpointer, а сведения, общие для разных потоков, — отдельное хранилище (store), содержимое которого определяет само приложение (LangGraph: persistence).
- RAG — поиск по источникам (документам, базам) и передача найденных фрагментов модели. Это извлечение знаний, а не память о диалоге; подробнее — в статье о RAG для базы знаний компании.
Инструкция в промпте «помни всё» хранилища не создаёт.
4. Инструменты, API и проверка формата данных
API — способ, которым одна программа обращается к другой: к поисковому сервису, CRM, справочнику цен. Чтобы агент мог им пользоваться, нужны учётные данные, отправка запроса, разбор ответа и обработка ошибок — всё это делает приложение.
Модель формирует параметры вызова и может ошибиться: пропустить обязательное поле или передать значение не того типа. Здесь помогает описание данных по схеме, например с помощью библиотеки Pydantic для Python. Условно (это псевдокод, а не готовая интеграция):
ЗапросЦены:
поставщик — текст, обязательно
артикул — текст, обязательно
количество — целое число больше нуля
валюта — одно из: RUB, USD, CNY
Если приложение проверяет параметры до обращения к API, запрос, не прошедший проверку схемы, не отправляют, а ошибку передают на исправление. При этом есть ограничения (Pydantic: модели). По умолчанию Pydantic может приводить совместимые значения: строку «500» превратит в число 500, если не выбран строгий режим. Проверка формата ничего не говорит о правдивости: корректно оформленная цена может быть устаревшей или относиться к другому товару. Проверка схемы не даёт и права на действие — разрешения задаются отдельно. Наконец, сама библиотека никакой API не вызывает.
5. Уточнение, декомпозиция и независимая проверка
Уточнение. Запрос «сравни поставщиков» неполон: входит ли доставка в цену, какая партия, с НДС или без? Хорошая система спрашивает только о том, что действительно меняет результат, а очевидное определяет сама.
Декомпозиция. Большая задача делится на проверяемые шаги: список поставщиков → сбор условий со ссылками → приведение к общей базе (единица, валюта, налог) → расчёт → таблица → черновик письма. Каждый шаг можно проверить отдельно и увидеть, где именно возникла ошибка.
Проверка. Самокритика модели («проверь себя») может быть полезным дополнительным проходом, но не является независимым доказательством: та же модель нередко повторяет собственную ошибку. Надёжнее программная проверка (пересчитать стоимость кодом, сверить итоги), сверка каждой цифры с сохранённым источником и, где это важно, проверка другим исполнителем — человеком или отдельной системой.
Рекомендация: ограничивайте число повторных попыток. Если после одной-двух доработок для поставщика нет подтверждённой цены, честнее поставить в таблице «нет данных, источник не найден», чем запускать бесконечный цикл улучшений или позволить модели заполнить ячейку правдоподобной цифрой.
6. Состояние, контрольные точки и повторное выполнение
Состояние (state) — общее рабочее пространство процесса: какие поставщики уже обработаны, какие цены найдены, какие ссылки сохранены. Checkpointer записывает это состояние по ходу выполнения, привязывая его к идентификатору потока работы. После сбоя или паузы процесс можно продолжить с сохранённого места, а не начинать заново (LangGraph: persistence).
Две детали часто упускают. Сохранение в оперативной памяти (in-memory saver) годится для экспериментов, но не переживает остановку процесса: для настоящего восстановления нужны постоянное хранилище и стабильный идентификатор потока. И контрольная точка сама по себе не гарантирует, что действие выполнится ровно один раз. Если шаг успел отправить письмо, а сбой произошёл до сохранения состояния, при повторе письмо может уйти снова.
Рекомендация: делайте внешние действия идемпотентными, то есть безопасными при повторе. Если сервис поддерживает ключ идемпотентности, используйте его. Для писем одного журнала «отправлено» недостаточно: сначала сохраняют намерение отправки, затем — квитанцию. Если связь оборвалась и результат неизвестен, отправку не повторяют вслепую, а восстанавливают её статус. Иначе письмо могло уйти до сбоя, хотя отметка об успехе не сохранилась.
7. Человек в процессе: где нужна остановка
Human-in-the-loop — возможность приостановить процесс и запросить у человека данные или решение. В LangGraph для этого есть interrupt: граф останавливается, а после ответа продолжается командой возобновления с тем же потоком и тем же checkpointer (LangGraph: interrupts). Важная техническая деталь: при возобновлении узел, в котором стояла остановка, запускается с начала, поэтому код перед точкой остановки может выполниться повторно. Размещать там отправку письма без защиты от повтора нельзя.
В нашем примере человек нужен в двух местах: когда данных не хватает для существенного решения («учитывать ли поставщика без подтверждённого срока?») и перед внешним действием — отправкой запроса поставщикам. Просить одобрения на каждый поиск или пересчёт не нужно: это превращает менеджера в оператора и обесценивает автоматизацию. Остановку ставят там, где решение существенно или требует полномочий: внешняя отправка, деньги, обязательства, изменение данных в чужих системах.
8. Промпт и контекст
Промпт — инструкция модели: цель, ограничения, формат результата, критерии качества. Слабый вариант: «сравни поставщиков и сделай хороший отчёт». Сильнее: какие поставщики, какая единица сравнения, с НДС или без, каждая цифра со ссылкой, недостающие значения помечать явно и не придумывать, результат — таблица с заданными столбцами.
Но промпт не заменяет архитектуру. Он не даст доступа к интернету, если инструмент поиска не подключён, и не создаст памяти без хранилища. Помимо инструкции, на результат сильно влияет контекст — какие именно документы, история и ответы инструментов переданы модели в данный момент. Слишком мало контекста — модель додумывает; слишком много — важное теряется среди лишнего.
Как это работает вместе
Условная последовательность для нашего примера:
- Менеджер ставит задачу; система уточняет только существенное — партию, учёт НДС и доставки.
- Граф запускает сбор условий; на участках с непредсказуемыми источниками действует агент в цикле «действие — наблюдение».
- Параметры каждого вызова проходят проверку формата, а найденные цифры сохраняются в состоянии вместе со ссылками.
- Полную стоимость считает код, а не текстовый ответ модели; результаты сверяются с источниками.
- Пробелы помечаются как «нет данных»; число доработок ограничено.
- Граф останавливается: менеджер видит таблицу, источники и черновик письма.
- Только после одобрения письмо отправляется — с защитой от повторной отправки.
Наличие всех блоков ещё не делает процесс надёжным. Модель генерирует текст и предлагает действия, приложение исполняет и проверяет их, человек принимает решения в согласованных точках контроля. Ценность системы — в выполненной работе и снятой ручной рутине, а не в числе компонентов. Как выбрать задачу, где такая конструкция вообще оправдана, — в материале об ИИ-агентах для бизнеса.
Обсудить задачу
Нужен рабочий AI-контур?
Разберём процесс, границы автономности, данные и безопасный первый запуск.