Pull to refresh

Изучаю механизм проактивного АИ-агента. Часть 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, так как пока решил его потестировать

Tags:
+1
Comments2

Articles