Загрузка 0
ПОДЕЛИТЬСЯ

Мой блог

Листай вниз

Архитектура ИИ-агентов: как устроена автономность и собираем кастомного бота за вечер

Архитектура ИИ-агентов: как устроена автономность и собираем кастомного бота за вечер

За последние месяцы профильные каналы и издания переполнены публикациями об автономных ИИ-агентах. Тема OpenClaw, Hermes и их многочисленных аналогов не сходит с уст разработчиков. Я внимательно изучил ключевые материалы, проверил решения на практике и хочу систематизировать накопленный опыт.

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

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

Реклама
Схема архитектуры автономных нейросетевых агентов
Общая схема взаимодействия модулей в автономных системах
Диаграмма вызова внешних инструментов из LLM
Процесс сопоставления JSON Schema и локального исполнения функций
Сравнение структур памяти Hermes и OpenClaw
Различие в подходах к хранению контекста и навыков в агентных системах
Панель мониторинга запросов к ИИ-роутеру
Отслеживание расхода токенов и количества запросов к API
Настройка файла конфигурации .env
Безопасное хранение API-ключей и параметров подключения
Код диспетчера инструментов в файле tools.js
Реализация функции execute для запуска инструментов по имени
Запись периодических задач в системный cron
Автоматическое добавление задач расписания в планировщик сервера
Финальная схема развертывания проекта в облаке
Готовая инфраструктура агента на базе облачного сервера и Telegram API
Архитектура ИИ-агентов: как устроена автономность и собираем кастомного бота за вечер
Архитектура ИИ-агентов: как устроена автономность и собираем кастомного бота за вечер
Архитектура ИИ-агентов: как устроена автономность и собираем кастомного бота за вечер
Архитектура ИИ-агентов: как устроена автономность и собираем кастомного бота за вечер
Архитектура ИИ-агентов: как устроена автономность и собираем кастомного бота за вечер

В этом руководстве мы подробно разберем, почему агентный подход переживает второе рождение, изучим внутреннее устройство автономных циклов и с нуля соберем, настроим и развернем собственного ИИ-агента на удаленном сервере.

От AutoGPT к современным агентам: почему концепция заработала только сейчас

Предшественники современных фреймворков появились еще весной 2023 года, когда индустрию всколыхнул релиз AutoGPT. Логика работы была аналогичной: зацикленные обращения к LLM, интерпретация ответов и последовательный вызов внешних скриптов. Репозиторий мгновенно набрал рекордное количество звезд на GitHub, но первоначальный ажиотаж быстро сменился разочарованием.

Причина кроется в ограничениях действовавших тогда нейросетей. Модели уровня GPT-4 с трудом удерживали длительный контекст в многошаговых сценариях: они сбивались с алгоритма, циклились на одних и тех же действиях, ошибались при формировании аргументов для функций и теряли итоговую цель. Сама программная обвязка была работоспособной, но управляющему ядру не хватало точности мышления.

Качественный перелом произошел с выходом нового поколения флагманских моделей — Claude 4.5, GPT-5.1, DeepSeek V3.2/v4 и их аналогов. Имея высокий уровень рассуждений и работы с инструментами, они позволили ранее созданной архитектуре раскрыться в полной мере. Теперь автономный цикл способен доводить сложные многоходовые поручения до логического финала.

Схема управляющего цикла ИИ-агента
Классический цикл работы ИИ-агента: триггер, обработка в LLM и запуск функций

При этом бутылочное горлышко переместилось из области возможностей LLM в плоскость инфраструктуры и прав доступа. Автономным системам по-прежнему не хватает безопасных платежных шлюзов, методов авторизации в закрытых сервисах и стандартизированных API. Попросить бота узнать погоду не имеет смысла — это быстрее сделать вручную. А вот сценарий «заказать продукты по кулинарному рецепту с оплатой и доставкой» упирается в отсутствие готовых интерфейсов взаимодействия между ИИ и торговыми площадками.

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

Архитектура и принципы работы ИИ-агента

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

Интерфейс настройки ИИ-роутера в панели управления
Настройка единого API-шлюза для работы с языковыми моделями

Триггер и стартовый импульс

Автономный процесс не возникает самопроизвольно. Входной точкой служит внешний сигнал: входящее сообщение в Telegram, команда планировщика cron, вебхук от стороннего сервиса или системное событие в операционной системе.

Реклама

Формирование запроса к нейросети

При получении триггера управляющая программа формирует структурированный запрос в формате JSON. Он содержит два основных блока:

  • Контекст: системные инструкции (правила поведения), история предыдущих итераций и новые входные данные.
  • Спецификация инструментов (Tools): перечень доступных функций с их текстовым описанием и строгой схемой параметров в формате JSON Schema.

Ответ модели и структура служебных данных

Нейросеть обрабатывает сформированный контекст и возвращает JSON-ответ. В нем зафиксированы текстовое сообщение для пользователя и/или указание на запуск конкретного инструмента с подготовленными аргументами. Также ответ включает служебные флаги (например, finish_reason), определяющие состояние задачи.

Диспетчер вызовов и запуск инструментов

Локальный скрипт-диспетчер принимает ответ от LLM. Если модель сформировала запрос на вызов функции, программа запускает соответствующий локальный код, считывает результат выполнения и добавляет его обратно в исторический контекст. После этого итерация повторяется: модель получает удлиненную историю, содержащую фактический результат работы инструмента.

Завершение цикла и возврат ответа

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

Важно подчеркнуть: языковая модель сама по себе не исполняет код на вашем сервере. Она лишь генерирует текстовые инструкции. Запуск команд и работу с файлами осуществляет ваш локальный диспетчер. Следовательно, безопасность всей системы полностью зависит от архитектуры вашего кода.

Безопасность и роль текстовых инструкций

В традиционном программировании ветвление логики задается жесткими условиями if/else. В агентных системах выбор пути делегирован нейросети, а разработчик направляет этот выбор через описание инструментов.

Например, инструкция вида Never exec sleep/poll as timer в описании планировщика задач представляет собой мягкое текстовое ограничение. Она снижает риск ошибочных действий модели, но не является аппаратным запретом. Все критические ограничения безопасности должны дублироваться строгими проверками на уровне JS-кода.

Устройство памяти в агентных системах

Продвинутые фреймворки вроде Hermes используют многоуровневую структуру хранения данных:

Запуск Node.js скрипта бота в консоли
Успешный локальный старт управляющего скрипта и прослушивание входящих сообщений
  • Локальные профили: файлы с описанием проекта и предпочтений пользователя, загружаемые при старте.
  • Архив диалогов: база данных с поддержкой семантического поиска для извлечения релевантных контекстов.
  • Репозиторий навыков: каталог успешных сценариев, сохраненных для повторного использования.

Из чего складывается кодовая база фреймворков

Хотя концептуальный цикл агента занимает не более сотни строк кода, развитые фреймворки содержат масштабные репозитории. Основной объем кода приходится на инженерную обвязку: обработку сетевых ошибок, повторные запросы, интеграции с внешними API, разграничение прав и интерфейсы взаимодействия.

Выбор параметров облачного сервера
Настройка конфигурации виртуального сервера для размещения ИИ-агента

Сравнение OpenClaw и Hermes

OpenClaw спроектирован как централизованный узел управления с обширной экосистемой расширений. Hermes делает упор на динамическое накопление опыта и формирование навыков. При разнице в интерфейсах и механизмах памяти оба решения базируются на едином итеративном цикле общения с LLM.

Просмотр сетевых портов и публичного IP
Получение публичного IP-адреса для SSH-подключения к удаленному серверу

Векторы атак и риски Prompt Injection

Поскольку в контекст нейросети попадают внешние данные (содержимое веб-страниц, писем, файлов), существует риск атак типа Prompt Injection. Вредоносный текст во внешнем источнике может перехватить управление моделью. По этой причине категорически не рекомендуется запускать агента в окружении с конфиденциальными данными и боевыми API-ключами без изоляции.

Пошаговое создание собственного ИИ-агента

Создадим практического бота для формирования утреннего новостного дайджеста по искусственному интеллекту в Telegram. Бот будет собирать свежие материалы по расписанию, а в остальное время — отвечать на вопросы по найденным новостям в режиме диалога.

Реклама
Подтверждение SSH ключа в консоли
Подтверждение доверия к отпечатку ключа удаленного сервера при подключении

Постановка задачи и разработка архитектурного промпта

Для генерации базового каркаса на Node.js сформируем подробный технический промпт. В нем зафиксируем структуру файлов, параметры подключения к API через единый шлюз Selectel AI Router, набор инструментов и логику работы цикла:

Успешная авторизация в консоли сервера
Успешный вход в систему Ubuntu под пользователем root
Напиши ИИ-агента на Node.js (ESM, чистый JS, без сторонних фреймворков).

Структура проекта:
- agent.js — ядро, управляющий цикл loop() и точка входа main().
- tools.js — описание инструментов в TOOLS и диспетчер execute().
- .env — переменные окружения (BASE_URL, MODEL, API_KEY, TELEGRAM_TOKEN, TELEGRAM_CHAT_ID).

Требования к API:
- Запросы к модели отправлять по OpenAI-совместимому протоколу на {BASE_URL}/chat/completions.
- Использовать BASE_URL=https://api.selectel.ru/aig/v1 и MODEL=deepseek/deepseek-v4-flash-0731.

Инструменты в tools.js:
1. search_web(query) — поиск информации в сети.
2. fetch_url(url) — скачивание и очистка содержимого веб-страницы.
3. remember(note) — запись заметок в файл notes.md.
4. schedule(cron, task) — добавление задачи в cron сервера.
5. list_schedules() — просмотр активных задач cron.
6. unschedule(task) — удаление задачи из cron.

Логика agent.js:
- Функция loop(task) формирует массив сообщений и доступных tools, отправляет запрос к LLM в цикле (максимум 25 итераций).
- Если модель возвращает tool_calls, выполняем их через execute(), добавляем результаты в историю и повторяем итерацию.
- Функция main() поддерживает два режима: long polling для сообщений Telegram и разовое выполнение задачи из аргументов CLI для cron.

Безопасное управление секретами и ключами

Создаем файл .env для хранения токенов. Обязательно добавляем .env в файл .gitignore, чтобы исключить утечку секретов в публичные репозитории.

Получим токен Telegram-бота у BotFather, а API-ключ для доступа к моделям сгенерируем в панели управления Selectel в разделе «ИИ-роутер».

Разбор архитектуры ядра: agent.js

Ниже представлена реализация ключевой функции цикла loop из файла agent.js:

export async function loop(task, notes = '') {
  const messages = [
    { role: 'system', content: systemPrompt(notes) },
    { role: 'user', content: task },
  ];

  const tools = TOOLS.map((t) => ({
    type: 'function',
    function: { name: t.name, description: t.description, parameters: t.parameters },
  }));

  for (let round = 0; round < MAX_ROUNDS; round++) {
    const data = await callModel(messages, tools);
    const choice = data.choices?.[0] || {};
    const msg = choice.message || {};
    messages.push(msg);

    if (msg.tool_calls?.length) {
      for (const tc of msg.tool_calls) {
        let args = {};
        try { args = JSON.parse(tc.function.arguments || '{}'); } catch {}
        const result = await execute(tc.function.name, args);
        messages.push({ role: 'tool', tool_call_id: tc.id, content: String(result) });
      }
      continue;
    }

    const text = (msg.content || '').trim();
    if (!text || choice.finish_reason === 'length') {
      messages.push({ role: 'user', content: 'Ответ пуст или обрезан. Заверши задачу текстом.' });
      continue;
    }
    return text;
  }
  throw new Error('Превышен лимит итераций цикла');
}

Реализация инструментов и диспетчера: tools.js

В файле tools.js функция execute сопоставляет запрошенное имя инструмента с соответствующей обработкой, а функция fetch_url очищает запрашиваемый HTML от лишних тегов для экономии токенов:

Копирование файлов проекта через SCP
Передача директории проекта с локального компьютера на облачный сервер
export async function execute(name, args) {
  const fn = IMPL[name];
  if (!fn) return `Неизвестный инструмент: ${name}`;
  try {
    return await fn(args || {});
  } catch (e) {
    return `Ошибка инструмента ${name}: ${e.message}`;
  }
}

async function fetch_url({ url }) {
  const res = await fetchWithRetry(url, { headers: { 'user-agent': 'Mozilla/5.0' } });
  const html = await res.text();
  const text = html
    .replace(//gi, ' ')
    .replace(//gi, ' ')
    .replace(/<[^>]+>/g, ' ');
  return decode(text).replace(/\s+/g, ' ').trim().slice(0, 4000);
}

Конфигурационный файл .env

Структура конфигурации имеет следующий вид:

BASE_URL=https://api.selectel.ru/aig/v1
MODEL=deepseek/deepseek-v4-flash-0731
API_KEY=YOUR_SELECTEL_API_KEY
TELEGRAM_TOKEN=YOUR_TELEGRAM_BOT_TOKEN
TELEGRAM_CHAT_ID=

Запуск локального тестирования выполняется командой node agent.js. При отправке сообщения боту в консоли отображается статус прослушивания Telegram, и агент оперативно выдает ответ.

Развертывание и запуск на облачном сервере

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

Подготовка серверной инфраструктуры

В панели управления Selectel создаем новый облачный сервер со следующими характеристиками:

  • ОС: Ubuntu 22.04 LTS 64-bit;
  • Конфигурация: 1 vCPU, 1 ГБ RAM, SSD 5 ГБ (подходит тариф Shared Line или прерываемая виртуальная машина для дополнительной экономии);
  • Регион: Выбираем ближайшую локацию (например, Санкт-Петербург).

Подключение по SSH и настройка Node.js

После создания сервера копируем его публичный IP-адрес из раздела «Порты» и подключаемся через терминал:

Результат выполнения тестового дайджеста в Telegram
Получение утренней сводки новостей по ИИ в чате Telegram
ssh root@178.72.165.12

Подтверждаем добавление ключа хоста (вводим yes) и вводим пароль. Затем обновляем пакеты и устанавливаем актуальную версию Node.js 22:

Проверка работы веб-поиска ИИ-агентом
Агент корректно находит и обобщает дополнительные данные из сети
apt update && apt upgrade -y && curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && apt install -y nodejs

Перенос проекта и проверка работоспособности

С локального компьютера копируем директорию проекта на сервер с помощью утилиты scp:

scp -r ./custom-agent-6 root@178.72.165.12:~/

Переходим в каталог проекта на сервере и выполняем тестовый запуск:

cd ~/custom-agent-6 && node agent.js

Отправляем боту в Telegram задание на формирование ежедневного утреннего дайджеста в 07:00. Агент зарегистрирует расписание в cron и подготовит тестовую подборку новостей.

Автоматизация работы через системную службу systemd

Чтобы бот работал автономно в фоновом режиме и автоматически перезапускался при сбоях, создадим сервис systemd:

nano /etc/systemd/system/agent.service

Вставляем следующий конфигурационный блок:

Статус службы systemd в консоли
Подтверждение активного фонового состояния сервиса agent.service
[Unit]
Description=AI News Agent Service
After=network.target

[Service]
WorkingDirectory=/root/custom-agent-6
ExecStart=/usr/bin/node /root/custom-agent-6/agent.js
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Сохраняем файл и активируем службу:

systemctl daemon-reload && systemctl enable --now agent

Проверяем состояние службы командой systemctl status agent. Зеленый статус active (running) подтверждает, что агент успешно работает в фоновом режиме.

Перспективы и идеи для самостоятельного развития

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

  • Поддержку разметки Markdown и интерактивных ссылок в Telegram;
  • Модуль распознавания и голосовых ответов;
  • Векторную базу данных для долговременной памяти;
  • Инструмент безопасного редактирования собственного конфигурационного файла.

Главная задача разработчика сегодня — проектирование надежной инфраструктуры, в которой нейросеть сможет безопасно и эффективно решать поставленные задачи.

Источник: habr.com

Реклама
01.