Почему все ваши браузерные боты ломаются через неделю (и как это исправить)
Вы потратили три дня на настройку идеального Playwright-скрипта. Он логинится, кликает по кнопкам, заполняет формы. Работает как часы. А потом в пятницу вечером приходит релиз - и всё. Кнопка теперь не btn-primary, а button--main. Селектор сломан. Форма переехала в модалку. Ваш бот тупо уставился в пустоту.
Знакомо? Это не баг - это фундаментальная проблема. Традиционная автоматизация работает с хрупкими селекторами, а не с намерениями. Она знает где кликнуть, но не понимает зачем.
Статистика на 2026 год: 78% автоматизации браузера ломается после первого же обновления UI. Среднее время жизни скрипта - 11 дней.
Exogram решает это радикально. Вместо хрупких селекторов - процедурная память. Вместо тупого следования инструкциям - понимание контекста. Агент, который помнит не только как делать, но и почему это работает.
Что такое процедурная память и зачем она нужна вашему агенту
Представьте, что вы учите новичка работать в CRM. Вы не говорите: "Нажми на кнопку с классом .js-save-contact". Вы объясняете: "Чтобы сохранить контакт, найди поле 'Имя', заполни его, затем нажми кнопку 'Сохранить' где-то внизу формы".
Процедурная память в Exogram - это именно это. Не координаты пикселей, а семантические правила. Не "кликни здесь", а "найди элемент, который выглядит как кнопка сохранения, и нажми его".
Технически это работает так: агент учится на ваших действиях, дистиллирует их в семантические правила, а затем применяет эти правила через 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 анализирует последовательность действий и выводит:
- Намерения (что пользователь пытался сделать)
- Шаблоны поиска (как найти нужные элементы в DOM)
- Fallback-стратегии (что делать, если шаблон не сработал)
- Условия успеха (как понять, что действие выполнено правильно)
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}")
Что делает агент во время выполнения?
- Загружает страницу и получает DOM
- Для каждого шага workflow: ищет элементы по семантическим правилам
- Если не находит - использует fallback-стратегии (например, спрашивает LLM: "Где здесь может быть кнопка сохранения?")
- Выполняет действие и проверяет условие успеха
- Если что-то пошло не так - адаптирует правила на лету
Пять ошибок, которые сломают вашего агента (и как их избежать)
Я видел десятки попыток внедрить 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. Посмотрите, как он переживёт следующий релиз. Вы удивитесь.
А если удивитесь слишком сильно - проверьте, не начал ли агент обучать других агентов. Это следующий этап. Но это уже совсем другая история.