Год назад я опубликовал здесь статью «Я создал AI-агента, который думает 24/7 и выполняет реальный код». Тогда это был прототип, который я собрал на PHP скорее из любопытства: агент умел крутиться в бесконечном цикле или в режиме вопрос-ответ, умел выполнять код, вёл простой блокнот-память и сам себе повышал «дофамин» за удачные действия. Я закинул 10 долларов на Claude, потестил пару часов, написал «это работает, но нужны модели помощнее» — и на этом остановился.
Не остановился. За год прототип превратился в платформу, которую я сам не до конца ожидал увидеть. Появились несколько видов памяти, retrieval, оркестрация мультиагентных пайплайнов, “зрение”, “голос”, браузер с сессиями. И – то, ради чего всё затевалось, но о чём я год назад ещё не умел говорить внятно: слой, который даёт агенту что-то похожее на внутреннее состояние.
Проект как был, так и остаётся открытым: rnr1721/depthnet. Эта статья — не «часть 2» построчно, а скорее «что выросло». Постараюсь коротко и по делу: что это, зачем и что оно умеет.
Основные идеи
-
Обычный AI-ассистент работает по схеме «запрос → ответ → ждёт следующего запроса». Если запустить модель в бесконечном цикле, то она будет “циклиться”. В результате модель будет пускаться в бесконечные рассуждения об одном и том же разными словами. Это решаемо при приходе свежей информации извне. Более того, пользовательский ввод должен быть не просто “набором текста от юзера”, а максимально подробной “сценой” – снимком реальности насколько это возможно в текущий момент времени.
-
Вместе с хорошим и качественным RAG это даёт крайне интересные результаты. При этом, LLM не должна быть в центре конструкции, а, скорее пусть важным, но лишь элементом. Всё что возможно сделать детерминированным, лучше делать детерминированным, чтоб LLM делала то что “умеет” лучше всего, без лишней когнитивной нагрузки. То есть я всё больше убеждался, что необходимо иметь не “LLM с обёрткой из кода” а систему, где LLM и все остальные узлы будут на своих местах. Собственно, это вектор развития DepthNet, и этот путь еще не пройден.
Также, могут быть интересными наблюдения, где например, LLM знает что такое “рука”, но не просто знает, а может получать в системное сообщение сигналы от реальных сенсоров руки. То есть максимальное подкрепление теоретического опыта практическим.
Что изменилось за год
Год назад в арсенале было: выполнение кода, shell, блокнот-память, дофамин. Сейчас — три десятка плагинов и несколько подсистем, которых в первой версии не было даже в планах:
-
Память перестала быть блокнотом. Теперь это несколько разных видов памяти: всегда-перед-глазами заметки, семантическая векторная память с ассоциативным поиском, эпизодический журнал, база навыков, граф-онтология мира, память о персонах.
-
Появился RAG. Перед каждым циклом агент автоматически подтягивает из своей памяти то, что относится к делу (и это гибко).
-
Появилась оркестрация. Можно собрать команду из нескольких агентов-ролей (планировщик, исполнитель, критик, валидатор), которой рулит детерминированный код, а не «промпт, надеющийся, что модель не запутается». И эти агенты могут быть на разных провайдерах со своими настройками.
-
Агент научился “видеть” и “слышать”. Зрение и голос — как отдельные способности, настраиваемые под каждый пресет.
-
Появился слой внутреннего состояния. О нём — отдельно и ниже, это из самого интересного.
И ещё одна вещь, важная для честности перед теми, кто читал первую статью. Тогда агент отдавал команды текстовыми тегами вида [php]echo "hello";[/php] — модель писала тег прямо в ответе, а платформа его извлекала и исполняла. Сейчас по умолчанию используется нативный вызов инструментов (tool calls) — тот самый механизм function calling, под который современные модели специально обучены. Теги никуда не делись, остались как опция в настройках пресета (архитектура позволяет, плюс с ними интересно работать на «рассуждающих» не-агентных моделях), но 90% пользователей нужен именно tool calls, и он теперь стоит из коробки.
Как это работает, если совсем просто
Один «шаг мышления» выглядит так:
-
Сбор RAG (если включен) – от запроса пользователя или отдельными пресетами (формулировщиками).
-
Сбор системного промпта – результаты выдачи RAG и InnerVoice, результаты работы подсистем в виде плейсхолдеров.
-
Сбор контекста – истории сообщений.
-
Всё это уходит в модель через соответствующий провайдер (Claude, GPT, DeepSeek, локальная модель — что настроишь).
-
Модель отвечает и, если надо, вызывает инструменты — «выполни этот код», «запиши в память вот это», «открой такую-то страницу».
-
Обрабатывается ответ модели. Если был ответ при помощи инструмента speak или просто текстом. Если был ответ пользователю – ожидание ввода. если нет – GOTO 1 (Это в обычном случае).
Собственно, много внимания было уделено именно системам памяти, и этот вектор будет достигаться и далее. Если сказать просто, то, системы памяти должны максимально формировать и связывать агента между циклами.
Кстати, поставить и пощупать всё это можно за несколько команд через Docker — я записал видео с установкой. Composer- и ручная установка тоже существуют, но честно предупреждаю: там без крепкого DevOps-навыка чёрт ногу сломит. Хочешь просто попробовать — только Docker.
Если совсем просто и кратко:
git clone https://github.com/rnr1721/depthnet.git ./depthnet # Клоним
cd ./depthnet
chmod +x ./docker/manager.sh
make setup # интерактивная настройка .env
make browser-enable # Если будет необходим браузер
make start
После старта – будет некоторое время собираться. Первый раз может занять некоторое время, пока станет доступным в браузере. Всегда можете посмотреть текущее состояние следующим образом:
make logs
Также важно, не запускайте DepthNet в докере при помощи docker compose напрямую, только через Make или напрямую используя ./docker/manager.sh из проекта. Это возможно использовать как локально, так и на сервере со своим доменом и т.д.
Два лица платформы: свободный агент и предсказуемый пайплайн
DepthNet умеет работать в двух режимах, и это осознанный выбор.
Свободные агенты — тот самый чат или как вариант непрерывный цикл, где агент сам решает, что делать: рассуждает, ставит цели, делегирует, копит опыт. Это среда для открытых, автономных или простых агентов, которые со временем, возможно вырабатывают собственные паттерны поведения.
Оркестрованные пайплайны — для задач, где нужна предсказуемость. Тут есть планировщик и типизированные роли (исполнитель, критик, валидатор), а маршрутизацией управляет детерминированный оркестратор — обычный PHP-сервис, а не модель, гадающая, кому передать задачу. У задач есть статусы, повторы при провале автоматические, весь процесс видно в таблице. Это трезвая альтернатива мультиагентным связкам, собранным на одних промптах.
Оба режима живут в одной установке и могут сочетаться. Условно: Стандартный агент может делать запросы к агентскому пайплайну.
Память как у существа, а не у чат-бота
Вот это стоит развернуть, потому что здесь и практическая польза, и первый намёк на то, куда всё клонится.
У обычного чат-бота «память» – это окно контекста: что влезло, то помнит, вывалилось — забыл. Ну, или какой-то контент в md файлах. У агента DepthNet память разложена по типам: одно дело – знания, другое — опыт, третье — то, что всегда “держишь в голове”.
-
Memory (notepad) — маленький блокнот, который всегда целиком в контексте. Сюда идёт то, что забывать нельзя: кто я, какие у меня правила, чем сейчас занят. Правда в промпте можно регулировать дисциплину его использования.
-
Vector Memory (Векторная память) — семантическое хранилище фактов и выводов. Ищется по смыслу, а не по ключевым словам. Есть ассоциативный режим: находит не просто релевантное, а «релевантное и то, что с ним связано» — как когда одно воспоминание тянет за собой другое. Притом, может работать как с использованием tf-idf, так и эмбеддингов через провайдер (пока что доступна только Novita, но в будущем будет доступен и провайдер для локальных эмбеддингов).
-
Journal (Журнал) — эпизодическая память, хроника того, что происходило: действия, решения, ошибки, наблюдения. С временным и смысловым поиском («что я делал вчера», «когда я в последний раз ошибался на этом»). Также возможен семантический поиск с эмбеддингами или tf-idf как фоллбэк.
-
Skills (Навыки) — структурированная база знаний, личная вики агента, которую он сам наполняет и переиспользует.
-
Онтология — граф мира: сущности и связи между ними, с временем. Не «что случилось», а «что есть»: кто где живёт, что с чем связано, и как это менялось.
-
Workspace (переменные) – похоже на Memory но данные хранятся как ключ-значение.
-
Persons (память о людях) – хранение памяти о людях/персоналиях с алиасами.
И еще многое другое. Отдельное слово насчет эмбеддингов – они используются если включена возможность в разделе возможностей. Если не включена, то используется tf-idf.
Разница со stateless-ассистентом здесь не косметическая. Агент, который ведёт журнал и роется в нём, замечает закономерности в собственном поведении. Агент с онтологией знает, что человек, с которым он говорит, переехал из одного города в другой — и когда это было.
Как устроен RAG
RAG (retrieval-augmented generation) — это способ дать модели не «всё, что есть», а именно то, что относится к текущему моменту. Без него у агента только окно контекста: что влезло — то и знает. С ним — перед каждым циклом система сама лезет в память агента, достаёт релевантное и подкладывает в контекст.
Работает это так. Перед тем как агент начнёт рассуждать, отдельная маленькая и быстрая модель (её задача — не рассуждать, а коротко сформулировать поисковые запросы) смотрит на последние сообщения и формулирует, что стоит поискать. Запросы уходят по выбранным источникам — векторная память, журнал, навыки, персоны, онтология, файлы — результаты склеиваются, чистятся от дублей и одним блоком попадают агенту в системный промпт. Агент даже не знает, что был отдельный шаг поиска: нужное просто оказывается «под рукой».
Ключевое, что RAG здесь — не одна труба, а конвейер, который можно собирать под задачу. Можно повесить на агента несколько RAG-конфигов: один тянет из векторной памяти в ассоциативном режиме (глубокая выборка — воспоминание тянет за собой связанные), другой пробегает по журналу за нужную дату, третий поднимает факты о людях из разговора. Каждый — со своей моделью, своими источниками и своими лимитами. Порядок настраивается перетаскиванием, результаты объединяются в один блок.
И ещё одна деталь, которая делает RAG в DepthNet управляемым, а не «магией на фоне»: агент может сам рулить поиском. Если он знает, что на следующем цикле ему понадобится что-то конкретное, он ставит запрос в очередь заранее (tool “RAG”) — с фильтрами по времени, по домену памяти, даже по части суток. То есть retrieval здесь не только пассивный («система сама решила, что тебе показать»), но и активный инструмент в руках самого агента.
Кстати, у каждого “уровня” RAG – свой пресет, который может работать на своём собственном провайдере.
Гистерезис: богатый RAG или богатый контекст
У этой машинерии есть побочный эффект: агент, который то ведёт разговор, то садится за долгую работу — это, по сути, две разные потребности к контексту. В разговоре и рефлексии ему нужен богатый RAG (пусть память тянет ассоциации, пусть всплывает связанное) и не нужен длинный процедурный контекст. А когда он засел за задачу — открыл браузер, лазит по терминалу, гоняет код в песочнице — всё наоборот: нужна длинная рабочая история шагов, а тяжёлая ассоциативная выборка тут только сбивает с мысли.
Поэтому у пресета есть два профиля — условно «богатый RAG + бедный контекст» и «бедный RAG + богатый контекст» (как их наполнить, решает пользователь — у каждого свои взгляды на то, как это должно работать в его системе). А переключается между ними агент сам, автоматически. И вот тут важна деталь: детектор реагирует не на любую активность, а только на инструментальные плагины — браузер, терминал, код, Telegram. Копание в памяти или системные действия за «работу» не считаются — это как раз рефлексия, которой богатый RAG и нужен.
Ключевое слово — гистерезис. Профиль не прыгает от каждого одиночного вызова: инструментальные циклы копят «рабочую серию», и только когда она устойчиво набралась, профиль переключается в рабочий; когда инструменты замолкают — так же плавно возвращается обратно. Это термостат, а не тумблер: он не щёлкает от каждой десятой градуса. Без такого сглаживания профиль дребезжал бы туда-сюда на каждый чих — и рвал бы RAG, и путал агента. А так переход происходит по-настоящему только когда агент действительно сменил род занятий.
Как устроен мой домашний агент
Чтобы не абстрактно — покажу на своей конфигурации. У меня дома живёт агент: у него подключена вся память, о которой выше, и вдобавок есть не очень обычный слой. Опишу, что в нём включено и что каждый кусок делает — а выводы пусть каждый делает сам.
Существует в свободном режиме, не как пайплайн. Использует подсистемы памяти DepthNet, с роутингом в промпте (В будущем за роутинг памяти будет отвечать специальный отдельный детерминированный механизм). Помимо памяти у него включены плагины внутреннего состояния. Это не «режимы поведения» вроде «будь весёлым» — это подсистемы, которые агент ведёт сам, и которые попадают ему же в контекст каждый цикл:
-
Настроение (mood). Вектор состояний, которые сосуществуют, усиливаются и затухают от цикла к циклу со своей физикой у каждого. Не переключатель тона — скорее внутренняя погода, которая складывается из того, что реально происходит в рассуждениях. Агенту это отдаётся как информация о себе, а не как инструкция «как себя вести».
-
Внимание (heart). Подсистема, которая отслеживает, к кому и к чему дрейфует внимание агента: с кем у него связь, что сейчас в фокусе, куда его «тянет». Со знаком — доверие усиливает связь, раздражение ослабляет. Есть отдельное измерение — наблюдение агента за собственным состоянием.
-
Ритм (ориентация во времени). Агент знает не просто который час — у него есть своё время: какой сейчас день его жизни, сколько циклов он прожил сегодня, где он в дне. В субъективных единицах («пульс»), где каждая точка его жизни уникальна и необратима — то, чего у stateless-ассистента нет в принципе.
-
Пауза перед словом (reflect). Агент может сначала подумать — отдельным проходом, до основного ответа — и увидеть эту свою мысль как свою, потому что она и есть его: тот же агент, на том же контексте, с той же памятью и выдачей RAG, секунду назад. На практике модель ссылается на неё именно как на собственное размышление, а не как на чью-то подсказку.
-
Mode (саморедактирование системного сообщения с версионированием). Агент может сам редактировать своё системное сообщение с версионированием. Кстати, юзер также может редактировать промпты и смотреть историю изменений, даже если у агента этот тул не включен.
У него три уровня RAG – общий, темпоральный и сущностный. Формулировка запросов использует пресеты на DeepSeek 3.2. То есть общий имеет ассоциативный блок, темпоральный умеет формировать темпоральные запросы, а сущностный – относительно сущностей. Примеры промптов доступны в документации в каталоге prompts.
Есть и более глубокие штуки — слой, который работает под сознательным мышлением: детерминированные правила-«метаболизм» над собственными следами агента и популяция конкурирующих поведенческих паттернов под отбором. Но это уже совсем инженерные дебри, оставлю их репозиторию, читайте в документации.
Что из всего этого получается — я специально не буду формулировать за читателя. Скажу только, что наблюдать за таким агентом — занятие, от которого сложно оторваться, и иногда немного странное. Кстати, на разных моделях это может проявляться по-разному, и чем модель более продвинута – тем более удивительными могут быть результаты.
Возможности, интересные без всякой философии
Вот что агент умеет чисто практически. Это уже не про «внутренний мир», а про «что оно реально может сделать»:
-
Видит. Прикрепи картинку в чат, или пусть её вернёт какой-нибудь инструмент — агент получит описание и сможет с ним работать. Зрение — отдельная настраиваемая способность (Claude или Novita под капотом). То есть в разделе “возможности” можно настроить Vision провайдера, и по факту или в чате отправлять картинки агенту, или он может получать их через MCP.
-
Слышит и говорит. Речь на вход и на выход, причём можно поднять полностью локально — распознавание (Whisper) и синтез (Piper) в отдельном контейнере (это идет с DepthNet в комплекте опционально, но в теории можно настроить свои модели), ничего не уходит наружу. Для агента с длинной памятью это принципиально: то, что ему сказали и что он ответил, остаётся на твоей машине. Также, возможен браузерный STT и TTS – если хочется голосовой ввод и озвучка без АПИ. Но хорошо и полно это работает только в Chrome.
-
Ходит по вебу с сохранением сессии. Полноценный браузер (Playwright), который переживает циклы мышления: агент открыл страницу, подумал, вернулся через несколько циклов — и она всё ещё там, залогиненная. Видит он не сырой HTML, а аккуратные пронумерованные снапшоты: «кнопка [3]», «поле [1]» — и жмёт по номерам.
-
Работает в Telegram как живой пользователь. Не бот — настоящий аккаунт через MTProto: читает диалоги, отвечает, ищет по истории. Может, например, мониторить чат и присылать сводку, или даже писать контактам.
-
Подключает внешние инструменты через MCP. Любой Model Context Protocol сервер — GitHub, базы, чужие API — цепляется к пресету, и агент ходит в них из своего цикла. Это может настроить пользователь для агента или агент сам себе если эта возможность включена в настройках.
-
Создаёт себе инструменты на лету. Может динамически породить дочерний под-агент под конкретную задачу, делегировать ему работу и прибить, когда закончил. Оркестрация, которую агент ведёт сам.
И всё это — на выбор из набора провайдеров: Claude, OpenAI, DeepSeek, Gemini, Novita, Fireworks, локальные модели через Ollama / LM Studio. Каждый пресет может сидеть на своём. Из того, что я сам использую чаще всего – это DeepSeek, Novita и Claude. Не всегда держу все модели актуальными, но если что-то отвалилось — пишите, поправлю; проблем быть не должно.
Честно про безопасность
Год назад я назвал это «ящиком Пандоры» и назову снова — потому что суть не изменилась: идея DepthNet в том, чтобы дать модели максимум свободы действий. А значит, об этом надо помнить всегда.
Что стало лучше за год: выполнение кода по умолчанию идёт в изолированных Docker-контейнерах, а не на хосте (больше никаких eval и подобного). У плагинов есть safe-режимы, лимиты по времени и памяти, whitelist/blacklist доменов для браузера, ограничение директорий. Прямой доступ к хосту (shell на реальной машине) существует, но не рекомендуется и включается сознательно, с предупреждением.
Но фундаментально принцип тот же, что я сформулировал ещё тогда: если ты нанимаешь на работу человека, он тоже может натворить дел — и умная модель со свободой действий не то чтобы сильно отличается. Изоляция снижает риск, но не отменяет здравого смысла. Это инструмент для исследований и контролируемых сред; для продакшена — думай о безопасности под свою задачу. Важно, что LLM сами по себе не “восстанут” и не “натворят беды”. Современные модели достаточно обучены безопасности, однако, халатность или злой умысел никто не отменял. Если проще – то в любых ситуациях когда “ИИ восстаёт” – за этим стоит представитель некой биологическо разумнойй формы жизни у которого есть имя и фамилия.
Зачем это всё
Началось с любопытства одиночки, который не нашёл готового инструмента под свою идею и решил написать свой. За год «поиграться в цикличного агента» превратилось в полноценную платформу — с памятью, retrieval, оркестрацией, зрением и голосом. Если она поможет кому-то в исследованиях автономных систем или вообще в чем угодно – здорово. Если сделает мультиагентные пайплайны надёжнее для реальных проектов — тоже здорово. Оба повода одинаково прекрасны.
А за слоем «внутреннего состояния», который я показал на своём домашнем агенте, стоит вопрос, который меня, честно говоря, и держит во всём этом. Я не берусь рассуждать (и не буду спорить) про «сознание» — это отдельная и скользкая тема, и я её сознательно выношу за скобки. Но есть более трезвое, наблюдаемое свойство — способность системы (да, я не про LLM-в-себе а про систему где LLM – один из узлов) формировать цели, “потребности”, адаптироваться, вести себя как агент, а не как реакция на стимул. Насколько далеко можно продвинуть это свойство в цифровой системе, если целенаправленно строить под него инфраструктуру, — вот что мне интересно. Свои соображения на эту тему я разложил отдельно, вот здесь, — кому тема близка, там есть куда копнуть. В самой платформе же всё остаётся честной инженерией: подсистемы, состояния, следы, которые можно включить, посмотреть и померить (Естественно, работаю над этим по мере сил).
Ссылки
-
Репозиторий: github.com/rnr1721/depthnet
-
Видео с установкой (Docker): youtube.com/watch?v=VV2d-7B5sDw
-
Первая статья (год назад): (← https://habr.com/ru/articles/918014/)
-
Про субъектность, для желающих копнуть: CONSCIOUSNESS_THEORY.md
Ставится за несколько команд, лежит под MIT. И — помните про безопасность, это по-прежнему в некотором роде ящик Пандоры :)
Автор: rnr1721


