AI-агенты: планирование, память, инструменты, оркестрация и multi-agent
В предыдущих темах курса мы собрали основу AI-Backend (слои API, сервисы, данные, очереди, наблюдаемость), научились интегрировать LLM в Python (SDK, structured outputs, tool calling) и построили RAG в продакшене (ингест, векторный поиск, качество).
Следующий логичный шаг — AI-агенты: системы, которые не только генерируют текст, но и достигают цели, выполняя шаги, выбирая инструменты, сохраняя состояние и взаимодействуя с другими агентами.
В продакшене «агент» — это не библиотека, а паттерн архитектуры: цикл принятия решений + строгие контракты инструментов + память + оркестрация и ограничения.
Что такое AI-агент и чем он отличается от «LLM-чатбота»
LLM-чатбот обычно делает один шаг: получил текст, сгенерировал текст.
AI-агент делает цикл:
Получает цель или пользовательский запрос.
Строит план или выбирает следующий шаг.
При необходимости вызывает инструменты (tool calling).
Сохраняет состояние и память.
Повторяет шаги, пока задача не завершена или не сработали лимиты.Ключевое отличие: агент может выполнять действия во внешних системах (CRM, Jira, БД, почта), а значит появляются требования к безопасности, наблюдаемости, идемпотентности и авторизации.
!Цикл работы агента и ключевые точки контроля
Место агента в архитектуре AI-Backend
Свяжем агента с архитектурой из первой статьи.
API-слой (FastAPI) принимает запрос, делает аутентификацию, выдаёт trace_id, не содержит логики планирования.
Сервисный слой (orchestrator) решает, какой режим использовать: обычный ответ, RAG или агент.
Agent runtime управляет циклом: шаги, tool calling, лимиты, обработка ошибок.
Tool registry / integrations содержит инструменты с жёсткими схемами входа и политиками доступа.
Память хранит краткосрочное состояние и долгосрочные знания (часто через RAG).
Observability пишет трассы и метрики по каждому шагу.Полезные ссылки для контекста:
FastAPI Documentation
OpenAI Function calling guide
OpenTelemetry DocumentationПланирование: как агент решает, что делать дальше
Планирование — это способ превратить запрос пользователя в последовательность шагов. В продакшене важно, чтобы план был:
ограничен по шагам и стоимости,
проверяем и трассируем,
совместим с правами доступа и политиками.Основные стратегии планирования
| Стратегия | Идея | Когда подходит | Риски |
|---|---|---|---|
| ReAct-подход | модель попеременно «думает» и вызывает инструменты | простые задачи и быстрый старт | сложнее контролировать траекторию, возможны лишние шаги |
| Plan-and-execute | сначала создаём план, затем выполняем шаги | задачи из нескольких этапов, где нужен контроль | план может устареть при ошибках инструментов |
| Router + specialists | сначала классифицируем запрос, затем запускаем специализированного агента | много типов задач, разные политики | нужна качественная маршрутизация |
| Граф/машина состояний | шаги задаются как узлы и переходы, LLM выбирает ветку | строгий контроль и воспроизводимость | больше инженерной работы |
Если вам нужен высокий контроль, на практике часто выигрывает подход «граф выполнения», где LLM ограничена выбором переходов.
Инструментальные варианты для оркестрации графов:
LangGraph DocumentationПлан как структурированные данные
Чтобы план был управляемым, удобнее получать его не «в тексте», а как JSON по схеме, которую вы валидируете (идея из темы про structured outputs).
Пример схемы плана:
Дальше orchestrator может:
провалидировать план,
проверить, что tool_name входит в allowlist,
проверить права пользователя до выполнения,
выполнить шаги с лимитами.Инструменты: контракты, безопасность, идемпотентность
Инструменты (tools) — это то, что делает агента полезным для бизнеса. Но это же и главный источник рисков.
Правила хорошего инструмента
Строгая схема входа
- параметры описаны через JSON Schema или Pydantic
-
additionalProperties запрещены
Детерминированность
- инструмент возвращает понятный результат, без «магии»
Явные ошибки
- различайте
not_found,
forbidden,
timeout,
validation_error
Идемпотентность для операций записи
- повторный вызов не должен создавать дубли
- используйте
idempotency_key
Авторизация до выполнения
- модель не должна быть единственным «решателем», можно ли делать действие
> Правило продакшена: модель может предложить вызов инструмента, но решение выполнять или нет всегда остаётся за backend.
Пример: инструмент с валидацией и идемпотентностью
Память агента: что хранить и где
Память нужна, чтобы агент был полезен не только в рамках одного вызова. Важно разделять несколько типов памяти.
Виды памяти в backend-реализации
| Тип памяти | Что это | Где хранить | Пример |
|---|---|---|---|
| Краткосрочная память | последние сообщения и промежуточное состояние выполнения | Redis или PostgreSQL | текущий план, уже выполненные шаги |
| Сжатая память диалога | краткое резюме истории, чтобы экономить токены | PostgreSQL | итоговые факты: «пользователь работает в отделе X» |
| Долгосрочная семантическая память | поиск по прошлым диалогам/заметкам через эмбеддинги | векторная БД | «мы уже обсуждали возврат товара 2 недели назад» |
| Память знаний | корпоративные документы и базы знаний | RAG-конвейер | «политика отпусков» |
Заметьте, что долгосрочная память технически очень похожа на RAG: вы индексируете тексты (например, заметки и решения) и извлекаете релевантное по запросу.
Практика: как не раздувать контекст
Окно последних сообщений
- в контекст попадает только последние реплик
Суммаризация
- старые части диалога сворачиваются в короткое резюме
Семантическое извлечение
- вместо всей истории вы вытаскиваете только релевантные фрагменты (векторный поиск)
Важно: память должна быть владельцем данных, а LLM — только потребителем. Это снижает риск утечек и помогает соблюдать политики хранения.
Оркестрация агента: лимиты, состояния, очереди задач и наблюдаемость
Агент в продакшене должен быть управляемым. Оркестрация отвечает за:
Лимиты
-
max_steps на задачу
-
max_tool_calls на ответ
- бюджет токенов и таймауты
Управление состоянием
- что уже сделано
- какие ошибки были
- можно ли продолжать
Отказоустойчивость
- ретраи для временных ошибок инструментов
- fallback на безопасный ответ
Асинхронность
- долгие операции (поиск по большим системам, генерация отчётов) лучше уносить в воркеры
Для асинхронных задач из архитектуры первой статьи часто используют:
Celery DocumentationНаблюдаемость агентных шагов
Минимум, который стоит логировать на каждый запрос:
trace_id и conversation_id
модель и параметры генерации
число шагов и число вызовов инструментов
какие инструменты вызывались и с какими типами аргументов (с редактированием PII)
коды ошибок инструментов
токены и задержки по этапамТехническая основа для трассировки:
OpenTelemetry DocumentationMulti-agent: когда один агент уже не справляется
Multi-agent — это система из нескольких агентов с разными ролями. Это имеет смысл, когда:
задачи требуют разных компетенций и политик доступа,
нужно параллельно исследовать варианты,
нужен контроль качества через «проверяющего» агента.!Типовая топология multi-agent с координатором и специалистами
Типовые паттерны multi-agent
| Паттерн | Как работает | Плюсы | Минусы |
|---|---|---|---|
| Manager-Worker | координатор дробит задачу и собирает результат | простая модель контроля | координатор может стать узким местом |
| Specialist Routing | маршрутизатор выбирает агента по типу запроса | гибкие политики и промпты | ошибки маршрутизации бьют по качеству |
| Critic/Reviewer | один агент делает, другой проверяет | выше качество и безопасность | дороже по токенам |
| Parallel Search | несколько агентов параллельно ищут факты/источники | выше покрытие | нужно дедуплицировать и ранжировать |
Важно: multi-agent почти всегда дороже и сложнее в отладке. В продакшене его обычно вводят после того, как одиночный агент упёрся в качество или контроль.
Фреймворк, который часто используют для multi-agent прототипирования:
Microsoft AutoGen (GitHub)Практический скелет агента на Python: цикл, инструменты, память
Ниже пример упрощённого агентного рантайма без привязки к конкретному фреймворку. Он показывает главное: цикл, обработку tool calling, валидацию и лимиты.
Что важно в этом скелете:
LLM не получает «суперспособностей», она работает только через allowlist инструментов.
Есть лимиты max_steps и max_tool_calls.
Память вынесена в отдельный интерфейс.
В точке исполнения инструмента явно подразумеваются проверки прав и валидация.Если вы используете агентные фреймворки (например, LangChain), всё равно полезно понимать этот базовый цикл.
LangChain DocumentationТиповые угрозы и защитные меры для агентов
Prompt injection и «враждебный ввод»
Атака часто выглядит так: пользователь пытается заставить агента вызвать опасный инструмент, обойти правила или утянуть закрытый контент.
Защитные меры:
не передавать секреты в промпт
retrieval только с ACL-фильтрами (урок из RAG темы)
allowlist инструментов и запрет «универсальных» инструментов
строгая валидация входов и выходов
политики: какие инструменты можно вызывать в каком контекстеОпасные инструменты
Особенно рискованны:
произвольные SQL-запросы
произвольные HTTP-запросы
выполнение кодаЕсли они необходимы, вводите ограничения:
шаблоны запросов
read-only режим
песочницы
обязательный human-in-the-loopКак тестировать агентные сценарии
Тестирование агента — это сочетание детерминированных и вероятностных проверок.
Unit-тесты инструментов (детерминированно)
Контрактные тесты схем (валидация аргументов и результатов)
Сценарные тесты (набор диалогов и ожидаемых действий)
Регрессионные тесты стоимости (лимиты токенов и шагов)
Оценка качества через офлайн датасет задач> Практика: чем больше логики вы выносите в детерминированные инструменты и схемы, тем проще тестировать систему целиком.
Как эта тема связывает курс в единую систему
Теперь у нас есть три опоры:
LLM-интеграция даёт tool calling и structured outputs.
RAG в продакшене даёт доступ к знаниям и контроль качества retrieval.
Агенты связывают всё это в цикл действий: планирование, память, вызовы инструментов, оркестрация и ограничения.Дальше по курсу это естественно продолжать практикой:
реестр инструментов и политики доступа
агентный orchestrator в сервисном слое (не в роуте)
фоновые задачи для долгих операций
наблюдаемость агентных шагов и оценка качества