Изучаю механизм проактивного АИ-агента. Часть 2

В первой части я рассказал про концепт проактивного AI-агента и показал примеры сообщений, которые он мог бы присылать. Последние 3 дня я занимался реализацией — и сегодня пришло первое сообщение от него
За основу я взял популярный OpenClaw, но захотел переписать бота по-своему и разобраться с тем, как живёт и думает эта сущность
Архитектура: из чего состоят подобные OpenClaw агенты
Heartbeat — сердце агента
Это цикл, который раз в N минут триггерит основные события, проверки и запускает переписывание файлов, если нужно
«Проснись, посмотри, что изменилось, подумай, что предложить пользователю».
Memory — память агента
Нужно было спроектировать аналог краткосрочной и долгосрочной памяти, примерно как у людей.
Краткосрочная — контекст текущей сессии, что происходило сегодня, какие задачи обсуждали, что пользователь ответил. Долгосрочная — в случае OpenClaw это SQLite с механизмом эмбеддингов. Ну можно поставить любую другую векторную бд
Плюс есть еще такие файлы как Soul, Agents, Identity, User, Memory и еще несколько. Все они сразу попадают в Context Window
Без разделения на два типа памяти агент либо забывает всё на следующий день, либо тонет в контексте и начинает галлюцинировать.
Memory Compaction — сжатие памяти
В OpenClaw агент хранит часть контекста в файлах формата MEMORY_MM_DD_YYYY с историей каждого дня.
По прошествию нескольких дней агент делает Compact этих файлов и удаляет / архзивирует их исходники
Context Routing — маршрутизация контекста
Как и чем нужно заполнять контекст на протяжении времени? Как его сжимать?
Контекстное окно — ресурс ограниченный. Нельзя каждый раз загружать все цели, всю память, все задачи. Нужно выбирать: что релевантно сейчас, что можно опустить, что критично.
Context routing решает, какие куски информации попадут в промпт для конкретного цикла работы агента.
Prompt Assembly — сборка промпта
Как структурировать промпт? Какая информация в нём приоритетнее, а что можно поджать? Как выбираются цели на конкретный день?
Это отдельная инженерная задача. Промпт агента — не статичный текст. Он собирается динамически из кусков: текущие цели, релевантная память, задачи из таск-трекера, контекст дня недели и времени.
---------------
Что я добавил к исходному варианту OpenClaw от себя
Reflection — самооценка агента
Экспериментальный блок, где модель оценивает сама себя по 4 шкалам:
Actionability — дал ли конкретные шаги?
Relevance — был ли совет по теме цели?
Novelty — сказал ли что-то новое?
Overall quality — общее качество
Зачем это нужно: без обратной связи агент быстро скатывается в банальности типа «Не забудь поработать над своими целями!». Reflection заставляет его критически оценивать свой же output и со временем улучшать качество предложений.
К чему он у меня подключен
TickTick — мой таск-трекер, откуда бот смотрит задачи и ставит новые
Telegram — сюда он мне пишет и предлагает задачку на сегодня
Discord — самый лучший по функционалу на сегодня
----------------
Что я понял в процессе
Создание проактивного агента — это совсем другой уровень сложности по сравнению с обычным чат-ботом.
В чат-боте пользователь задаёт вопрос → получает ответ. Всё. Контекст понятен из вопроса.
В проактивном агенте нужно решить кучу вопросов, которые в чат-боте просто не возникают: когда писать, о чём писать, как не повторяться, как не раздражать, как понять, что задача уже неактуальна, как сжимать память, чтобы не выжирать токены.
Это, по сути, проектирование UX для системы, у которой нет интерфейса в привычном смысле — только текст в мессенджере.
Вот такие промежуточные итоги — получилось хоть немного разобраться в возможном механизме оркестрации под капотом агента
Если где то нашли неточность, то пинганите в комментах
В третей части напишу подробнее про OpenClaw, так как пока решил его потестировать
















