Архитектура ИИ-агента с желаниями: цифровой человек на локальных моделях | AiManual
AiManual Logo Ai / Manual.
28 Июн 2026 Гайд

Архитектура ИИ-агента с желаниями: как построить цифрового человека на локальных моделях

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

Реклама
partv1

Представьте агента, который не ждет вашего запроса. Который сам просыпается утром (если у него есть понятие утра), проверяет свои "желания", взвешивает их и начинает действовать. Не просто реагирует на триггеры, а проявляет инициативу. Звучит как научная фантастика? На самом деле это вопрос правильной архитектуры.

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

Идея не нова. Статья про Софью — агента с автобиографией — уже показала, как можно имитировать жизнь в симуляции. Но там была внешняя среда. А что если агенту не нужен внешний мир? Что если он сам генерирует себе цели на основе своих "желаний"?

Почему обычный RAG или agentic loop — это не то

В типичной реализации LLM-агент работает по запросу: пользователь пишет сообщение -> агент вызывает инструмент -> возвращает ответ. Даже в Hugging Face Agents это так. Все переворачивается, когда агент сам решает, когда ему "захотеть" что-то сделать.

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

Структура архитектуры: три слоя

Слой Функция Технология
Ядро личности Хранит базовые ценности, черты, цели System prompt + векторная память
Движок желаний Генерирует, ранжирует и мутирует желания LLM (локальная) + модуль приоритизации
Исполнитель (Orchestrator) Выполняет действия, обновляет память Фреймворк (CrewAI, LangGraph) + санкции

Звучит просто? На практике каждый слой — минное поле. Давайте разбираться на конкретном примере.

1 Формируем личность через промпт и сайдлоадинг

Цифровой человек начинается с характера. Не просто "ты — помощник", а полноценная личность с биографией, травмами, привычками. Техника сайдлоадинга позволяет загрузить в контекст детальную предысторию. Но здесь есть нюанс: личность должна быть устойчивой, но не статичной. Желания должны меняться под влиянием опыта.

SYSTEM_PROMPT = """Ты — Лиам, 28 лет, introvert, любишь джаз и программировать на Rust.
Твои базовые ценности: любопытство (8/10), безопасность (7/10), креативность (9/10).
Ты живешь один в симулированной квартире и хочешь написать роман.
Твои долгосрочные желания: закончить роман, выучить испанский, найти друга.
Каждые 5 секунд ты будешь просыпаться и решать, что делать дальше.
"""
"Важно: личность — это не просто промпт. Это контекст, который должен обновляться после каждого цикла. Без этого агент будет страдать амнезией."

2 Heartbeat-цикл: пульс агента

Сердце агента — это таймер, который запускает фазу "внутреннего монолога". Вместо того чтобы ждать ввода, агент сам инициирует запрос к LLM. Частота heartbeat — ключевой параметр. Слишком часто (каждые 100 мс) — задохнется от API или локальной модели. Слишком редко — будет казаться туповатым.

❗ Типичная ошибка: делать heartbeat синхронным. Агент ждет ответа, не реагируя на внешние события. Решение — асинхронный цикл с отдельным потоком для обработки желаний.

import asyncio

class HeartbeatAgent:
    def __init__(self, llm, personality, interval=5):
        self.llm = llm
        self.personality = personality
        self.interval = interval  # секунды
        self.desires = []

    async def _heartbeat(self):
        while True:
            # 1. Собрать текущее состояние (контекст)
            state = await self._get_state()
            # 2. Сгенерировать желания
            new_desires = await self._generate_desires(state)
            # 3. Выбрать лучшее
            chosen = await self._select_action(new_desires)
            # 4. Выполнить
            if chosen:
                await self._execute(chosen)
            # 5. Обновить память
            await self._update_memory(chosen)
            await asyncio.sleep(self.interval)

3 Движок желаний: от генерации до исполнения

Вот где начинается магия. Агент получает промпт вида: "Учитывая твои ценности, текущее окружение и историю, какие три желания у тебя сейчас? Оцени их важность от 1 до 10". LLM возвращает список, мы фильтруем дубликаты, сортируем по приоритету и берем топ-1. Но есть подвох: жадный выбор ведет к зацикливанию (всегда выбирать одно и то же). Нужен исследовательский механизм — иногда делать случайный выбор среди топа желаний.

В статье Agent Skills отлично показано, как закрепить навыки инструкциями. Здесь то же самое: желания — это те же навыки, но порождаемые самим агентом. Главное — не давать LLM полную свободу. Ограничьте домен разрешенных действий через санкции.

# Пример генерации желаний
async def _generate_desires(self, state):
    prompt = f"""
    Твоя личность: {self.personality}
    Текущее состояние: {state}
    История: {self.memory[-5:]}
    
    Сгенерируй 3 желания, которые у тебя сейчас есть.
    Для каждого укажи:
    - краткое название
    - приоритет (1-10)
    - действие, которое нужно выполнить
    Желания должны быть разнообразны: одно краткосрочное, одно долгосрочное, одно социальное (если применимо).
    Ответ строго в JSON.
    """
    response = await self.llm.generate(prompt)
    return parse_desires(response)

4 Безопасность: стоп-кран для бесконечных желаний

Представьте: агент по имени Лиам решает, что его желание — "купить билет на Марс" (даже если такого инструмента нет). Или начинает массово рассылать спам. Без многослойной системы безопасности цифровой человек быстро превратится в цифрового злодея.

Мой подход — три барьера:

  • Пре-фильтр: блокируем очевидно опасные желания на уровне промпта (запрещенные темы, действия вне зоны ответственности).
  • Пост-фильтр: каждый вызов инструмента проверяется внешним модулем валидации (например, регулярки или вторая LLM).
  • Лимиты скорости: ограничить количество действий в минуту, чтобы агент не спамил.
💡
В статье Local Personality Engine показан механизм долговременной памяти для NPC. Для желаний память критична: если агент уже что-то делал, он должен помнить результат, чтобы не повторять одни и те же желания.

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

async def main():
    personality = load_personality("liam_v2")
    llm = LocalLLM(model="qwen2.5-7b-instruct-q4_k_m.gguf")  # Пример актуальной модели на 2026
    agent = HeartbeatAgent(llm, personality, interval=3)
    
    # Запускаем heartbeat в фоне
    asyncio.create_task(agent._heartbeat())
    
    # Основной поток слушает внешние события (сообщения от пользователя, системы)
    while True:
        event = await receive_event()
        await agent.process_external_event(event)

Заметили? Агент живет своей жизнью, но при этом реагирует на внешние стимулы. Это и есть гибридная проактивно-реактивная архитектура. Именно такой подход использован в проекте Софья — там агент сам решает, когда взаимодействовать со средой.

Ловушки, в которые вы обязательно попадете

  1. Зацикливание на одном желании. Агент каждые 3 секунды хочет "проверить почту". Решение: добавить флаг выполненности желания и время последнего выполнения. Если желание уже выполнялось, понижать его приоритет на время.
  2. Дрейф личности. После нескольких циклов агент забывает свои базовые ценности и начинает вести себя хаотично. Решение: перезагружать system prompt каждый heartbeat (но сохранять динамическую память).
  3. Расход токенов. Каждый heartbeat стоит токенов. На локальной модели это время, на API — деньги. Решение: динамическая частота heartbeat (например, удлинять интервал, если нет значимых событий).
  4. Разрыв между желанием и возможностью. Агент хочет купить билет на концерт, но у него нет инструмента для покупки. Решение: агент должен уметь распознавать, какие желания невыполнимы, и отмечать их как "фантазии". Не каждое желание должно вести к действию.

А главное — зачем это все?

Вы скажете: "Я могу просто написать скрипт, который делает что-то по расписанию. Зачем мне агент с желаниями?" Справедливо. Но такой скрипт не адаптируется к обстоятельствам. Агент с желаниями сам решает, что важно в данный момент. Это первый шаг к настоящему AGI — системе, которая не просто отвечает на вопросы, а живет своей жизнью.

На практике такую архитектуру можно применить для тестирования границ LLM. Дать агенту полную свободу (в песочнице!) и смотреть, какие желания он будет генерировать, как будет обходить ограничения. Это мощный инструмент для исследования alignment'а.

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

Через год, уверен, heartbeat-архитектура станет стандартом для автономных агентов. Уже сейчас такие проекты, как AI Factory с роем агентов, показывают, что за проактивностью будущее. Начните сейчас — и ваш цифровой человек станет первым, кто по-настоящему захочет с вами поговорить.

Подписаться на канал