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

Мой блог

Листай вниз

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

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

За последние полгода вышли сотни материалов про современные ИИ-агенты, причем наибольший ажиотаж вокруг этой темы вызвали проекты OpenClaw и Hermes. Я изучил, пожалуй, добрую половину из них, протестировал технологию на практике и теперь хочу поделиться своими выводами. Сначала у меня складывалось впечатление, что это очередной раздутый пузырь абсолютно бездумного хайпа. Каждый второй блогер обещает личного цифрового сотрудника, который в автономном режиме разбирает входящую почту, ведет рабочие задачи и трудится круглые сутки, пока владелец спит. Но досматривая подобные ролики и дочитывая статьи до конца, я раз за разом задавался вопросом: а где же конкретно такой агент реально поменял автору жизнь? В чем заключается обещанная революция? Судя по обсуждениям в профильных сообществах, я в этом недоумении далеко не одинок. Давайте честно признаем: по-настоящему полезных кейсов применения сейчас немного, денег вся эта сложная инфраструктура потребляет прилично, а половину демонстрируемых функций гораздо проще и быстрее выполнить в обычном диалоговом чате с искусственным интеллектом. Все это вполне справедливые и валидные претензии к OpenClaw, если рассматривать его исключительно как готовый потребительский продукт. Вот только воспринимать проект подобным образом — большая ошибка. Когда я это осознал, мой взгляд на технологию кардинально изменился. Настоящая революция действительно произошла, но вовсе не там, где ее привыкло искать большинство пользователей. В этой статье мы подробно разберем, почему подобные решения стали важной вехой в индустрии, хотя и не принесли принципиально новых концепций, а затем детально изучим внутреннюю архитектуру автономных программных систем и пошагово пройдем процесс сборки и деплоя собственного цифрового помощника.

Эта идея уже проваливалась три года назад

Давайте мысленно вернемся в март 2023 года, когда на рынке появился фактический прародитель современных ИИ-агентов — проект AutoGPT. Базовая схемотехника и логика работы были ровно теми же: замкнутый цикл, регулярные автоматические обращения к нейросети, вызов внешних инструментов и решение комплексных задач последовательными шагами. Тогда проект буквально взорвал сообщество, набрав более 100 000 звезд на GitHub всего за несколько недель, а следом за ним гремел аналогичный проект под названием BabyAGI. Резонанс был колоссальным, хотя и не столь масштабным, как минувшей зимой. Возникает закономерный вопрос: почему же тогда всё это движение заглохло? Главная причина крылась в технических возможностей самих базовых моделей искусственного интеллекта того периода. В качестве флагмана тогда выступала GPT-4, которая крайне слабо удерживала длинные цепочки логических действий: языковая модель регулярно теряла контекст, начинала циклично повторяться, вызывала совершенно неподходящие инструменты и напрочь забывала изначальную цель всей цепочки. Вся внешняя обвязка, то есть программный код вокруг самой модели, была написана вполне корректно, но системе катастрофически не хватало более умных «мозгов». В результате AutoGPT окрестили бесполезной игрушкой, и интерес к направлению угас на несколько лет.

Качественный перелом и долгожданный сдвиг произошли, когда удачно сошлись сразу несколько факторов: к отлаженной за годы программной обвязке добавились гораздо более мощные модели — Claude 4.5 в версиях Opus и Sonnet, GPT-5.1, DeepSeek V3.2 и другие передовые решения. Прежняя архитектура наконец-то полностью раскрылась и научилась надежно доводить многошаговые задачи до логического завершения благодаря появлению принципиально новых вычислительных «мозгов». Тем не менее, узкое место никуда не исчезло, а лишь сместилось на другой уровень. Теперь, когда нейросети научились уверенно справляться с длинными последовательностями шагов, на передний план вышли новые вызовы: сложная интеграция со сторонними сервисами, жесткие права доступа и общая стоимость инфраструктуры. Автономные помощники всё еще не могут полноценно расплачиваться за услуги, получать авторизованный доступ ко многим закрытым платформам и безопасно оперировать конфиденциальными секретами. Мне лично нет никакого практического смысла отправлять агента проверять текущую погоду за окном — я могу сделать это сам за секунду, и выйдет даже быстрее. А вот куда более масштабная задача вроде «подобрать нужные продукты в онлайн-магазине по строгому рецепту, оплатить их банковской картой и оформить доставку на дом» — это как раз то, что хочется полностью делегировать цифровому ассистенту. Однако в текущих реалиях этот сценарий вызывает массу трудностей: сайты торговых сетей технически не адаптированы под запросы API-агентов, специализированных платежных шлюзов для автономных нейросетей попросту не существует, а безопасное управление учетными данными и процедурами авторизации по-прежнему остается серой зоной. При этом важно понимать принципиальный момент: мы не уперлись в глухой тупик, а просто поднялись на ступеньку выше и столкнулись со следующей технологической преградой. Рано или поздно разработчики найдут решения этих проблем, и тогда агенты смогут эффективно закрывать самые сложные практические сценарии.

Реклама

Поэтому я предлагаю рассматривать OpenClaw или AutoGPT не как готовые продукты, а как инженерную обвязку — удобный фреймворк с циклами, памятью и интеграциями, построенный вокруг вызова ИИ. Революция в том, что появился новый способ соединить нейросеть с реальным миром и сделать его более автономным. Подобный подход будет становиться все популярнее с каждым обновлением моделей. Крупные IT-компании уже строят необходимую инфраструктуру, и именно нам, разработчикам, предстоит с этим работать: создавать специализированных агентов под узкие бизнес-задачи и проектировать среду для них. Для этого нам необходимо отлично понимать, как агенты работают изнутри. К концу чтения материала это понимание у вас уже сформируется, и вы получите навык, который мы скоро увидим в вакансиях. А параллельно сделаем пет-проект — своего кастомного ИИ-агента.

Как работает современный ИИ-агент

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

Вход в цикл

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

Компоновка запроса

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

Пример кода для создания агента
Реализация базовых функций на Node.js
  • Контекст: история переписки (если она есть), системный промт (правила поведения) и новые данные из триггера (например, текст входящего письма).
  • Описание инструментов (tools): их названия, текстовое описание назначения на человеческом языке и схема ожидаемых параметров.

Запрос упаковывается в формат JSON и отправляется по API в нейросеть.

Ответ от ИИ

Модель анализирует запрос и возвращает ответ, также в формате JSON. В нем содержатся две основные сущности: текстовое сообщение для пользователя (например, «Изучаю логи сервера» или финальный ответ на задачу) и указание на вызов конкретного инструмента с нужными параметрами (функции). Также в ответе есть служебные поля (например, finish_reason), по которым система понимает текущий статус выполнения задачи.

Обработка ответа и вызов инструментов

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

Выход из цикла

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

Описание инструмента — тоже часть программирования

Поясню, что имею в виду. Раньше, чтобы решить, выполнять сценарий А или Б, мы писали конструкцию if или else. Условие лежало в коде, мы придумывали его заранее и оно было жестким. В случае с современными ИИ-агентами условия в if определяет сама модель в зависимости от ситуации, а человек лишь предоставляет ей цель и инструменты.

Описание инструмента как способ программирования

Повысить точность выбора модели можно за счет детального и качественного описания доступных инструментов. Рассмотрим показательный пример из кодовой базы проекта OpenClaw, где описание планировщика задач выглядит следующим образом: description: 'Gateway scheduler: reminders, delayed self-wakeups, loops, recurring work, event watchers. Never exec sleep/poll as timer.'. Запрет вроде Never exec sleep/poll as timer («Никогда не используй sleep в качестве таймера») представляет собой не программное ограничение прав, а обычную текстовую инструкцию. Подобная формулировка существенно снижает шанс ошибочного выбора, хотя и не дает абсолютной гарантии. В этом же файле разработчики прописали инструкцию избегать перевода времени в UTC и приложили образец корректного часового пояса. Подобное описание инструмента совмещает функции документации для языковой модели и превентивной защиты от типичных промахов. Часть прикладной логики теперь задается прямо в текстовых описаниях, однако критические проверки безопасности и жесткие запреты по-прежнему реализуются исключительно на уровне программного кода.

Настройка окружения для ИИ-агента
Файл .env с ключами доступа

Как устроена память у агентов

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

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

Откуда берется большая кодовая база

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

OpenClaw против Hermes

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

Откуда берется риск

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

Реклама

Как создать своего ИИ агента

Для разработки нашего прототипа мы соберем каркас приложения с помощью ИИ-ассистента. Это поможет быстро развернуть бойлерплейт, сосредоточиться на проектировании архитектуры и не тратить время на рутинное написание шаблонного кода. Но чтобы получить надежный и безопасный результат, необходимо составить подробный и структурированный промт, описывающий логику каждого модуля. Для начала нужно базово определить, какую задачу вообще будет решать наш агент. Возьмем практичный бытовой сценарий — утренний дайджест новостей. Каждое утро бот будет присылать в Telegram подборку важных событий по интересующим нас темам. Сценарий может показаться простым и заезженным, но я все равно хочу взять именно его, потому что это пока единственная задача, которая прижилась лично у меня. Я пробовал применять агента для множества разных задач, в итоге забросил все, кроме этого сценария.

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

Промт

Вот промт, который мы будем использовать для генерации кода. Сам я дошел до такой формулировки через множество итераций. Он описывает структуру приложения, требования к API и логику работы цикла: Напиши ИИ-агента на Node.js. Чистый JS, ESM, без фреймворков и внешних библиотек.

Файл agent.js

Что собираем: личный ассистент, упрощённый аналог OpenClaw, с которым я переписываюсь в телеграме. Это постоянно работающий процесс: он непрерывно слушает мои сообщения и отвечает на них, умеет сам выполнять задачи по расписанию (cron). Что делать в каждый момент — решает модель, выбирая инструменты. Файлы: tools.js — инструменты: их описания и реализации; agent.js — ядро: цикл и точка входа, импортирует из tools.js только нужное; .env — файл с ключами, токенами и секретами.

Файл tools.js

К модели ходи по протоколу OpenAI: POST на {BASE_URL}/chat/completions. Настройки — BASE_URL, API_KEY, MODEL и токены телеграма — агент подгружает из файла .env рядом с собой при старте (process.loadEnvFile() или простой парсер), а не из экспортированных переменных шелла. Создай .env: внеси значения BASE_URL (https://api.selectel.ru/aig/v1) и MODEL (deepseek/deepseek-v4-flash-0731), секреты (API_KEY, TELEGRAM_TOKEN) оставь пустыми. Поле TELEGRAM_CHAT_ID тоже оставь пустым — агент впишет его сам. В tools.js описан массив TOOLS с параметрами в JSON Schema для поиска в вебе, скачивания страниц, ведения заметок и управления задачами по расписанию через функцию execute.

Файл .env

Модуль agent.js отвечает за цикл loop(task): отправляет модели историю сообщений и описания инструментов, обрабатывает запросы на вызов функций через диспетчер и возвращает итоговый текст пользователю.

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

Функция main() получает задачу одним из двух доступных способов: из аргументов командной строки, если запуск происходит через cron, либо из нового входящего сообщения в мессенджере. В телеграм-режиме main() не завершает работу после первой итерации, а функционирует постоянно. Используя механизм long polling, функция циклически ждет новые сообщения и обрабатывает их по мере поступления, пока процесс не будет остановлен принудительно вручную. В режиме cron, напротив, выполняется ровно одна задача, после чего скрипт завершает работу. Агент взаимодействует только со своим владельцем, причем идентификатор чата не прописывается вручную: при первом же входящем сообщении, если параметр TELEGRAM_CHAT_ID в файле .env остается пустым, система автоматически фиксирует ID отправителя, дописывает его в конфигурационный файл и в дальнейшем работает исключительно с ним, игнорируя любые сторонние запросы. Этот же сохраненный идентификатор используется как адрес для отправки ответа, когда задачу инициирует cron (в этом случае входящего сообщения нет). Перед самым стартом скрипт считывает файл notes.md и подгружает актуальные заметки в контекст, а финальный результат работы цикла отправляется в телеграм.

Системный промпт

Базовая инструкция задает роль личного ассистента с набором инструментов: выполнять поставленную задачу, учитывать пользовательские заметки из файла notes.md, а по завершении выдавать ответ текстом без дополнительных вызовов. В самое начало запроса необходимо подставлять текущие дату и время сервера, чтобы значения «сегодня» и «сейчас» всегда оставались корректными. Любые данные, зависящие от актуальности, должны опираться исключительно на результаты работы инструментов, а не на внутреннюю память модели: если информации нет в свежих данных, запрещено ее домысливать или выдумывать; в таком случае следует прямо сообщить об отсутствии результатов.

Поскольку ответы уходят в телеграм, где стандартная разметка markdown поддерживается не везде, текст пишется без сложных стилистических элементов (никаких звездочек, решеток, квадратных скобок с URLs или обратных кавычек). Заголовки оформляются обычной строкой с добавлением эмодзи, списки размечаются через тире или маркеры, а ссылки выводятся чистым URL, чтобы мессенджер автоматически сделал их кликабельными.

Схема взаимодействия компонентов и памяти в разработке под современные ИИ-агенты
Блок-схема базовых модулей прототипа

Обвязка и стиль

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

  • на всех сетевых вызовах настраивается таймаут и несколько повторов с паузой на случай временных неполадок (сетевые сбои, тайм-ауты, ошибки 429 или 5xx) как для самой языковой модели, так и для используемых инструментов;
  • слишком длинные сообщения автоматически разбиваются на части под лимиты телеграма;
  • чтение входящих сообщений из мессенджера ведется по смещению (offset), исключая повторную обработку одного и того же сообщения.

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

Графическое представление структуры данных и вызовов функций в коде
Диаграмма последовательности выполнения запросов

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

Запустив подготовленный промпт в ИИ-ассистенте, можно параллельно заняться получением необходимых доступов, пока пишется код. Здесь критически важно сделать одно важнейшее предупреждение безопасности. Ни в коем случае не публикуйте файлы .env или любые другие конфигурационные файлы, содержащие реальные секретные ключи, в публичные репозитории на GitHub или аналогичные открытые площадки. Файл с окружением всегда должен добавляться в .gitignore вашего проекта. Если требуется развернуть приложение на боевом сервере в продакшене, применяйте штатные переменные окружения операционной системы или специализированные менеджеры секретов. Важно отметить, что все API-ключи и токены доступа, приведенные в дальнейших примерах кода и иллюстрациях, используются исключительно в демонстрационных целях и на момент публикации материала полностью аннулированы. В готовом коде применяются безопасные заглушки вида YOUR_API_KEY и YOUR_TELEGRAM_TOKEN.

Тестирование работы цифрового помощника
Запуск и отладка скрипта

Теперь можно приступать к получению необходимых данных. Токен для Telegram-бота оформляется предельно просто — его выдает официальный бот BotFather. Подробно всю эту последовательность я уже разбирал ранее в материале, посвященном библиотеке grammY. Следующий шаг — получение API-ключа. В качестве провайдера для подключения к искусственному интеллекту я использую Selectel. У них работает удобный ИИ-роутер, предоставляющий доступ к моделям DeepSeek, OpenAI, Anthropic и многим другим через единый унифицированный интерфейс. Для этого достаточно зарегистрироваться в панели управления провайдера, зайти в соответствующий раздел ИИ-роутера, нажать кнопку создания и скопировать полученный ключ. Его обязательно следует сохранить в надежном месте, например в защищенном менеджерe паролей, а не на бумажном стикере.

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

Реклама

Разбор файла agent.js

Центральная логика ядра современного ИИ-агента сосредоточена в функции цикла loop. Она отвечает за итеративное взаимодействие с языковой моделью до получения окончательного результата.

Пример исходного кода программы на экране для создания тестового приложения
Листинг ключевой функции на языке программирования

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

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

Интеграция ИИ-агента с Telegram
Результат работы бота в мессенджере

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

Стоит отметить, что сам этот цикл сегодня уже не обязательно писать вручную — компания Anthropic выпустила готовое решение в виде библиотеки Claude Agent SDK. Тем не менее, я намеренно попросил языковую модель написать всю логику самостоятельно, чтобы наглядно показать внутреннее устройство механизма.

Помимо основного цикла, файл agent.js содержит следующие компоненты:

  • импорты внешних и внутренних инструментов;
  • блок загрузки конфигурационных параметров из файла .env;
  • системный промт;
  • функцию для вызова API ИИ-роутера;
  • интеграцию с мессенджером Telegram для приема входящих обновлений, отправки ответов и проверки идентификаторов пользователей;
  • главную функцию main(), запускающую бота в постоянном режиме ожидания новых сообщений или выполнения фоновых задач по расписанию через cron.

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

Обработка инструментов и конфигурация

Функция-диспетчер execute сопоставляет текстовое имя инструмента с реальной JavaScript-функцией. Она находит нужный инструмент по имени и запускает его. Если такового не обнаруживается, возвращается соответствующая ошибка прямо в ИИ, а если вызов завершается неудачей, об этом также сообщается модели.

Примером служит реализация инструмента fetch_url, который загружает веб-страницу и очищает ее от лишнего HTML-мусора для экономии токенов. Скрипт запрашивает данные страницы, превращает ответ в обычный текст, удаляет теги скриптов, стилей и прочие HTML-элементы, после чего приводит полученное содержимое к компактному виду и обрезает до разумного размера, чтобы не раздувать контекст.

Конфигурационный файл с настройками параметров подключения и окружения
Параметры запуска в файле конфигурации

Файл .env

Следующим шагом заполняется файл конфигурации секретами, куда подставляются ранее полученные токены и параметры: адрес API, используемая модель, ключ доступа, а также учетные данные Telegram. Если применяется другой ИИ-провайдер или модель, это можно указать сразу в промпте, и тогда базовый URL и модель менять не придется. Идентификатор чата пока оставляется пустым — он заполнится автоматически, когда пользователь впервые напишет боту.

Для локального тестирования запускается команда node agent.js. В терминале появляется строка, указывающая на успешный запуск, после чего можно отправлять тестовый запрос в чат, на который бот отвечает без задержек.

Развертывание ИИ-агента на сервере

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

Настройка сервера

В панели управления облачного провайдера создается новый сервер. В настройках задается имя, регион, пул и выбирается дистрибутив Linux, например Ubuntu 22.04 LTS. Конфигурация подбирается под задачи: можно использовать целое ядро либо воспользоваться тарифными планами с разделением ресурсов, где оплата идет только за фактически потребляемую долю процессора. Для базового запуска достаточно минимальной конфигурации с одним процессорным ядром, небольшим объемом оперативной памяти и SSD-накопителем, а для дополнительной экономии можно задействовать прерываемые серверы.

Развертывание и запуск агента

Он работает не более 24 часов и потому отлично подходит для краткосрочных задач, а стоимость ресурсов у него намного ниже. В рамках этого руководства мы не будем настраивать SSH-ключ — просто скопируем сгенерированный пароль и нажмем кнопку Создать сервер. После создания сервера откроется страница с его параметрами. Здесь доступны вкладки управления, а также настройки, с помощью которых можно выключить или заморозить сервер. Заморозка полезна, если нужно временно остановить сервер, чтобы не переплачивать за простой, но при этом сохранить все данные. В таком режиме вы платите только за диски и публичные IP-адреса. В любой момент сервер можно разморозить, и вам не придется настраивать виртуальную машину заново. На панели также доступны кнопки перезагрузки и другие опции управления. Еще одно преимущество облака: в любой момент можно изменить конфигурацию, добавив или уменьшив ресурсы. Это займет всего пару минут, так как система автоматически мигрирует на другой хост. Если вы решите расширить свой проект, в Selectel можно создать полноценную инфраструктуру благодаря экосистеме сервисов — например, развернуть облачные базы данных, кластеры Kubernetes, подключить объектное хранилище, сеть доставки контента и многое другое в рамках одного провайдера.

Подключение к серверу

Чтобы подключиться к серверу из терминала на локальном компьютере, перейдем во вкладку Порты и скопируем публичный IP-адрес — он нужен для подключения к серверу из терминала на нашем компьютере. Откроем терминал на macOS/Linux или командную строку на Windows и введем команду подключения в формате ssh root@<IP-адрес>. Например, ssh root@178.72.165.12. При первом подключении SSH-клиент спросит, доверяете ли вы этому серверу, так как его ключ еще не сохранен на вашем компьютере. Введем yes, и при следующих подключениях этот вопрос уже не появится. Далее введем скопированный ранее пароль. Подключение установлено, видим результат: пользоваться сервером можно практически сразу благодаря автоматической установке операционной системы — вы получаете готовую и настроенную среду.

Подготавливаем среду выполнения одной командой в консоли сервера: apt update && apt upgrade -y && curl -fsSL https://deb.nodesource.com/setup_22.x | bash – && apt install -y nodejs. Эта команда обновит пакетную базу, подключит официальный репозиторий Node.js 22-й версии и установит ее на сервер. На данном этапе мы будем работать под пользователем root. Это самый быстрый путь для настройки прототипа, однако помните, что root обладает неограниченными правами в системе. Для сервера, где кроме этого бота ничего нет, это осознанный компромисс. Теперь перенесем файлы проекта с локального компьютера на удаленный сервер. Открываем новый терминал на локальной машине и выполняем команду scp, заменив IP-адрес на адрес вашего облачного сервера: scp -r /Users/arseniypomazkov/Desktop/custom-agent-6 root@178.72.165.128:~/. Команда скопирует всю директорию custom-agent-6 в домашний каталог пользователя root на сервере. Проверяем появление папки на сервере: root@ai-agent:~# ls — папка custom-agent-6 появилась. Далее заходим в папку и запускаем агента двумя действиями одной команды: cd ~/custom-agent-6 && node agent.js. В консоли должна появиться знакомая строка: Слушаю Telegram… Настало время настроить утренний дайджест. Отправляем нашему Telegram-боту подробную инструкцию: каждое утро в 7 утра по Москве я хочу получать самые актуальные новости из мира искусственного интеллекта за последние сутки. Меня интересуют только те новости, которые произошли за последние 24 часа и которые важны для индустрии и для меня как для разработчика.

Запуск и проверка работы

Для проверки работоспособности я сформулировал для агента задачу: отбирать главные новости об искусственном интеллекте, интеграции технологий в новые сферы, релизах frontier-моделей и ключевых ИИ-стартапах, игнорируя незначительные релизы на Hugging Face и минорные open-source проекты. После запуска workflow успешно принял задачу, зарегистрировал периодическое задание в серверном планировщике cron и сразу отправил тестовый дайджест. Все подключенные инструменты, включая поисковые системы и парсинг веб-страниц, сработали корректно. Тестовый поиск дополнительной информации также прошел без ошибок.

Настройка системной службы systemd
Конфигурация автозапуска агента

Комбинацией клавиш Ctrl + C я остановил тестовый процесс node. Теперь нужно перевести программу в фоновый режим, чтобы она автономно функционировала и автоматически перезапускалась при любых сбоях или перезагрузке операционной системы. Для этой цели лучше всего подходит стандартный менеджер системных служб systemd.

Создаем конфигурационный файл новой службы командой:

Интерфейс командной строки с результатами успешного выполнения тестов
Логи выполнения интеграционных тестов

nano /etc/systemd/system/agent.service

После этого откроется редактор nano, куда необходимо вставить следующие строки конфигурации:

[Unit]Description=News agent
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

Сохраняем изменения (нажав комбинацию Ctrl + X, затем подтвердив выбор клавишей Y и нажав Enter) и активируем созданную службу одной командой:

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

Проверить текущий статус работы службы можно стандартной системной командой:

systemctl status agent

Если в терминале отображается зеленый маркер active (running), значит, конфигурация выполнена правильно. Теперь можно закрывать терминал — разработанный бот продолжит стабильную работу в фоновом режиме и будет присылать свежую и актуальную подборку новостей точно к утреннему кофе.

Идеи для самостоятельного развития

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

  • добавьте полноценную поддержку разметки Markdown при отправке сообщений в Telegram (использование жирного шрифта, курсива и интерактивных гиперссылок);
  • научите бота распознавать входящие голосовые сообщения от пользователей;
  • реализуйте специальный инструмент, который позволит ИИ-агенту безопасно редактировать собственные файлы конфигурации;
  • спроектируйте более сложную и отказоустойчивую систему долгосрочной памяти, интегрировав внешнюю векторную базу данных.

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

Итоговая диаграмма производительности разработанного программного обеспечения
Метрики эффективности работы готового решения

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

Реклама
01.