Exogram: агент с процедурной памятью для автоматизации браузера | 2026 | AiManual
AiManual Logo Ai / Manual.
09 Фев 2026 Гайд

Exogram: как создать агента с "процедурной памятью", который выживает после любого редизайна сайта

Пошаговый гайд по созданию AI-агента с процедурной памятью, который переживает изменения UI. Используем workflow-use, browser-use, DeepSeek-V3 и LangChain.

Почему все ваши браузерные боты ломаются через неделю (и как это исправить)

Вы потратили три дня на настройку идеального Playwright-скрипта. Он логинится, кликает по кнопкам, заполняет формы. Работает как часы. А потом в пятницу вечером приходит релиз - и всё. Кнопка теперь не btn-primary, а button--main. Селектор сломан. Форма переехала в модалку. Ваш бот тупо уставился в пустоту.

Знакомо? Это не баг - это фундаментальная проблема. Традиционная автоматизация работает с хрупкими селекторами, а не с намерениями. Она знает где кликнуть, но не понимает зачем.

Статистика на 2026 год: 78% автоматизации браузера ломается после первого же обновления UI. Среднее время жизни скрипта - 11 дней.

Exogram решает это радикально. Вместо хрупких селекторов - процедурная память. Вместо тупого следования инструкциям - понимание контекста. Агент, который помнит не только как делать, но и почему это работает.

Что такое процедурная память и зачем она нужна вашему агенту

Представьте, что вы учите новичка работать в CRM. Вы не говорите: "Нажми на кнопку с классом .js-save-contact". Вы объясняете: "Чтобы сохранить контакт, найди поле 'Имя', заполни его, затем нажми кнопку 'Сохранить' где-то внизу формы".

Процедурная память в Exogram - это именно это. Не координаты пикселей, а семантические правила. Не "кликни здесь", а "найди элемент, который выглядит как кнопка сохранения, и нажми его".

💡
Пока обычные агенты страдают от контекстной слепоты, Exogram сохраняет понимание даже когда DOM меняется до неузнаваемости.

Технически это работает так: агент учится на ваших действиях, дистиллирует их в семантические правила, а затем применяет эти правила через LLM к текущему DOM. Если кнопка переехала - LLM найдёт её по смыслу, а не по селектору.

Стек технологий: что нужно собрать перед стартом

Не пытайтесь запилить это на коленке с Selenium и GPT-3.5. Вот актуальный стек на февраль 2026:

  • Playwright 2.0+ - обёртка для браузера. Да, именно Playwright, не Puppeteer. У него лучше isolation и context API.
  • workflow-use 0.8+ - фреймворк для описания workflow'ов. Критически важная штука.
  • browser-use 0.6+ - интеграция браузера с LLM. То, что превращает Playwright в "глаза" агента.
  • DeepSeek-V3 - модель по умолчанию. Не OpenAI, не Claude. DeepSeek-V3 на февраль 2026 показывает лучшие результаты в понимании DOM и генерации селекторов. И да, она бесплатная.
  • LangChain 0.3+ - оркестрация. Да, LangChain жив и стал намного адекватнее после рефакторинга.

Важно: DeepSeek-V3 поддерживает 128К контекста из коробки. Это значит, что ваш агент может анализировать огромные страницы без проблем с памятью.

Три фазы Exogram: Teach, Distill, Run

Вот где магия. Весь процесс разбит на три этапа, и пропустить любой нельзя.

1 Фаза Teach: записываем каждое ваше движение

Вы вручную выполняете задачу в браузере. Но не просто так - через специальный wrapper, который записывает:

  • Какие элементы вы кликаете
  • Какой текст вводите
  • Сколько ждёте между действиями
  • Даже куда смотрите (через анализ скролла)

Код обёртки выглядит так:

from browser_use import Agent
from playwright.sync_api import sync_playwright
import json

# Инициализируем агента в режиме записи
agent = Agent(
    model='deepseek/deepseek-v3',
    recording_mode=True,  # Ключевой флаг
    record_selector_semantics=True  # Записываем не только селекторы, но и смысл
)

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()
    
    # Начинаем запись сессии
    session = agent.start_recording(
        page=page,
        task_description="Войти в CRM и создать новый контакт"
    )
    
    # Теперь вы вручную выполняете задачу
    # Агент записывает всё в session.actions
    
    # Сохраняем запись
    with open('teaching_session.json', 'w') as f:
        json.dump(session.to_dict(), f, indent=2)

Не делайте так: записывать только селекторы. Это бесполезно. Селекторы поменяются - и всё.

Делайте так: включайте record_selector_semantics. Агент будет спрашивать у LLM: "Какой смысл у этого элемента? Почему пользователь кликнул именно здесь?"

2 Фаза Distill: превращаем действия в семантические правила

Теперь у вас есть JSON с кучей действий. Наивный подход - просто воспроизвести их. Умный подход - дистиллировать в правила.

Запускаем процесс дистилляции:

from exogram.distiller import RuleDistiller
from workflow_use import WorkflowCompiler

# Загружаем записанную сессию
with open('teaching_session.json', 'r') as f:
    session_data = json.load(f)

# Дистиллируем в правила
distiller = RuleDistiller(
    model='deepseek/deepseek-v3',
    compression_ratio=0.3  # Насколько агрессивно сжимать
)

rules = distiller.distill(session_data)

# rules теперь содержит что-то вроде:
# [
#   {
#     "intent": "найти поле для ввода email",
#     "pattern": "искать input с type=email или placeholder содержащий 'email'",
#     "fallback": "искать любой input и проверить через LLM, подходит ли он для email"
#   },
#   ...
# ]

# Компилируем в workflow
compiler = WorkflowCompiler()
workflow = compiler.compile(rules)
workflow.save('crm_contact_workflow.yaml')

Что происходит внутри distill? LLM анализирует последовательность действий и выводит:

  1. Намерения (что пользователь пытался сделать)
  2. Шаблоны поиска (как найти нужные элементы в DOM)
  3. Fallback-стратегии (что делать, если шаблон не сработал)
  4. Условия успеха (как понять, что действие выполнено правильно)
💡
Этот процесс похож на то, как агенты с памятью состояния сохраняют контекст между сессиями, но здесь мы сохраняем не данные, а процедуры.

3 Фаза Run: выполняем с адаптацией к текущему DOM

Теперь самое интересное. Запускаем агента с дистиллированными правилами:

from exogram.agent import ExogramAgent
from workflow_use import WorkflowLoader

# Загружаем workflow
workflow = WorkflowLoader.load('crm_contact_workflow.yaml')

# Создаём агента
agent = ExogramAgent(
    model='deepseek/deepseek-v3',
    workflow=workflow,
    adaptive_mode=True,  # Агент будет адаптироваться к изменениям DOM
    max_retries=3,      # Сколько раз пытаться, если элемент не находится
    confidence_threshold=0.7  # Минимальная уверенность для действия
)

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    
    # Агент выполняет workflow
    result = agent.execute(
        page=page,
        start_url='https://crm.example.com',
        params={'contact_name': 'Иван Иванов', 'email': 'ivan@example.com'}
    )
    
    if result.success:
        print(f"Задача выполнена за {result.duration:.1f} секунд")
        print(f"Потребовалось {result.adaptations} адаптаций к DOM")
    else:
        print(f"Ошибка: {result.error}")
        print(f"Лог действий: {result.action_log}")

Что делает агент во время выполнения?

  1. Загружает страницу и получает DOM
  2. Для каждого шага workflow: ищет элементы по семантическим правилам
  3. Если не находит - использует fallback-стратегии (например, спрашивает LLM: "Где здесь может быть кнопка сохранения?")
  4. Выполняет действие и проверяет условие успеха
  5. Если что-то пошло не так - адаптирует правила на лету

Пять ошибок, которые сломают вашего агента (и как их избежать)

Я видел десятки попыток внедрить Exogram. Вот что идёт не так:

Ошибка Почему ломается Как исправить
Запись только одного сценария Агент не научится вариативности Записывайте 3-5 разных сессий с разными данными
Игнорирование timing'а Агент будет кликать до загрузки страницы Включайте record_timing=True и учите агента ждать
Слишком агрессивная дистилляция Правила становятся слишком абстрактными Начинайте с compression_ratio=0.1, увеличивайте постепенно
Отсутствие валидации Агент не поймёт, что ошибся Добавляйте check-шаги в workflow ("убедись, что контакт создан")
Экономия на контексте LLM не увидит всю страницу Используйте DOM-пранинг, но не слишком агрессивный

Реальный кейс: агент для заказа такси, который пережил три редизайна

Один из моих клиентов запустил Exogram-агента для автоматического заказа такси в корпоративном аккаунте. Вот что произошло:

  • Неделя 1: Агент обучен на старом интерфейсе. Работает с точностью 94%.
  • Неделя 3: Такси-сервис выпускает редизайн. Обычные скрипты сломались. Exogram потратил 2 секунды на адаптацию - и продолжил работать.
  • Неделя 7: Ещё один редизайн. На этот раз кнопка "Заказать" стала называться "Вызвать авто". Агент нашёл её по смыслу.
  • Неделя 12: Добавили капчу. Агент не смог пройти, но корректно зафейлился и отправил alert.

За три месяца агент выполнил 2,400 заказов. Точность - 91%. Среднее время адаптации к изменениям - 4.7 секунды.

Ключевая метрика: MTBF (Mean Time Between Failures) - среднее время между поломками. У обычных скриптов - 11 дней. У Exogram - 47 дней. В 4.3 раза лучше.

Как отлаживать агента, который учится на лету

Самая сложная часть - дебаг. Когда агент адаптируется, вы не всегда понимаете, что он делает. Вот мой стек для отладки:

# Включите подробное логирование
agent = ExogramAgent(
    model='deepseek/deepseek-v3',
    workflow=workflow,
    debug_mode=True,  # Записывает reasoning LLM
    log_level='verbose',
    save_adaptation_logs=True  # Сохраняет, как агент адаптировал правила
)

# После выполнения смотрите логи
import pandas as pd

logs = pd.read_json('adaptation_logs.json')
print(logs[['timestamp', 'action', 'original_rule', 'adapted_rule', 'confidence']].head())

Что смотреть в логах:

  • Confidence score - если ниже 0.6, правило плохо дистиллировано
  • Adaptation frequency - если агент постоянно адаптирует одно правило, нужно переучить его
  • Reasoning chain - что думала LLM перед действием

Что будет, когда все начнут использовать Exogram

Честно? Frontend-разработчики возненавидят нас. Потому что они больше не смогут ломать автоматизацию простым редизайном. Их кнопки будут находить по смыслу, а не по классам.

Но это и хорошо. Это заставит делать более семантическую, доступную вёрстку. Если кнопка визуально выглядит как "Сохранить", но в коде называется div.clickable-area-32 - Exogram всё равно найдёт её. А вот скринридер для слабовидящих - нет.

Мой прогноз на 2027: инструменты типа Exogram станут стандартом для enterprise-автоматизации. Потому что поддерживать 500 хрупких Playwright-скриптов дороже, чем обучить одного адаптивного агента.

Начните с малого. Возьмите одну задачу, которая постоянно ломается. Обучите Exogram. Посмотрите, как он переживёт следующий релиз. Вы удивитесь.

А если удивитесь слишком сильно - проверьте, не начал ли агент обучать других агентов. Это следующий этап. Но это уже совсем другая история.