Когда Claude Opus 4 в режиме полной автономии за 7 часов прошел курс по DevOps, я понял две вещи. Первая – будущее уже здесь, и оно слегка ироничное. Вторая – большинство гайдов по автономным агентам врут. Они показывают идеализированную картинку, а не ту гору костылей и неожиданных ошибок, которая возникает на практике.
Этот эксперимент начался со спора. Можно ли заставить AI-агент не просто болтать в API, а полноценно взаимодействовать со сложным веб-приложением, где есть регистрация по почте, интерактивные тесты, видео и задания с кодом? Платформу для теста выбрали Stepik – не самый простой, но и не монстр вроде Coursera. Цель – 100% завершение курса без человеческого вмешательства после старта.
Спойлер: агент справился. Но путь к успеху состоял на 30% из гениальных инсайтов и на 70% из борьбы с тупыми, раздражающими проблемами вроде внезапно изменившегося CSS-селектора или капчи в письме подтверждения.
Почему 90% автономных агентов терпят поражение на первом же тесте
Типичная ошибка – думать, что достаточно дать агенту доступ к браузеру и мощной LLM вроде Claude Opus 4 (последняя доступная версия на март 2026 года). На бумаге все просто: агент видит страницу, понимает задачу, кликает. В реальности вас ждет ад динамического контента.
- Хрупкость селекторов. Playwright находит кнопку по `data-qa="submit-button"`, а завтра разработчик Stepik меняет атрибут на `data-testid`.
- Неоднозначность инструкций. LLM видит вопрос «Выберите правильные утверждения». Что для нее «правильное»? Логически верное или соответствующее мнению автора курса?
- Временные задержки. AJAX-загрузка результатов теста может занять 3 секунды, а агент уже пытается кликнуть дальше и ломает поток.
- Контекстное окно. Самое болезненное. Агент, проходя модуль, забывает, что было три шага назад. Он не держит в памяти полную структуру курса.
Именно поэтому многие проекты, о которых пишут в блогах, работают только на демо-стенде. Наш подход был другим: вместо создания «универсального студента» мы построили узкоспециализированного агента, заточенного под конкретную платформу – Stepik. Это ключевой момент.
Архитектура агента: не универсальный солдат, а хирург с набором инструментов
Мы отказались от идеи одного супер-агента. Вместо этого сделали оркестратор, который управляет несколькими микро-агентами, каждый со своей задачей. Напоминает подход из курса Kaggle по продакшен-агентам, но с упором на веб-автоматизацию.
| Модуль агента | Инструменты | Задача |
|---|---|---|
| Навигатор | Playwright, кастомные селекторы | Перемещение по курсу, нажатие «Далее» |
| Решатель заданий | Claude Opus 4 API, контекстное окно | Анализ вопроса, генерация ответа |
| Регистратор | IMAP клиент, парсер писем | Создание аккаунта, подтверждение email |
| Инспектор | Playwright, скриншоты, логи | Валидация состояния страницы, отладка |
Оркестратор написан на Python 3.12, потому что в 2026 году asyncio и тайп-хинты – это must have для любого серьезного автоматизационного скрипта. Playwright использовали версии 1.45+, которая поддерживает все современные браузеры и имеет отличный Python API.
1Шаг первый: обратный инжиниринг Stepik и планирование атаки
Прежде чем писать код, агент (вернее, мы) должен был понять структуру курса. Вручную прошли несколько уроков, записали все типы заданий: multiple choice, текст с пропусками, сопоставление, вопросы с кодом. Для каждого типа создали шаблон обработки.
Важный нюанс – мы не парсили HTML курса заранее. Агент должен был исследовать его на лету, как настоящий студент. Но мы дали ему «карту»: знание основных CSS-селекторов Stepik (они, к счастью, довольно стабильны) и список возможных действий.
# Пример конфигурации селекторов для Stepik (2026 год)
STEPIK_SELECTORS = {
"next_button": "button[data-qa='next']",
"question_text": ".attempt__header h2",
"choice_option": ".task-choice__option label",
"submit_button": "button[type='submit']",
"success_indicator": ".attempt__solution-correct",
}
# Но мы также подготовили fallback-селекторы, потому что веб-разработчики любят менять классы.
2Шаг второй: автономная регистрация и война с IMAP
Первый серьезный барьер. Нужно создать аккаунт, получить письмо с подтверждением, перейти по ссылке. Звучит просто. На практике – почтовые сервисы блокируют автоматические действия, письма приходят с задержкой, а в письме может быть не одна ссылка, а пять (подписка, отписка, подтверждение).
Использовали библиотеку `imaplib` и `email` из стандартной библиотеки Python. Создали временный почтовый ящик на сервисе, который позволяет IMAP (важный момент – многие бесплатные сервисы в 2026 году его отключают). Агент ждал письмо до 5 минут, парсил HTML-часть, искал ссылку с текстом «confirm» или «подтвердить», извлекал ее и открывал в браузере.
Ошибка №1: Агент кликал на первую же ссылку в письме, которая вела на страницу отписки от рассылки. Решение: научить его искать ссылку по комбинации текста и атрибута `href`, содержащего `confirm` или `token`. Пришлось добавить простой regex-фильтр.
3Шаг третий: браузерная автоматизация на стероидах с Playwright
Playwright – это наш скальпель. Мы использовали не только автоматические клики, но и расширенный контекст. Например, перед каждым действием агент делал скриншот области с заданием и отправлял его в Claude Opus 4 вместе с HTML-кодом. Это давало двойную информацию: структурированные данные (HTML) и визуальный контекст (скриншот).
Код навигатора выглядел не как линейный скрипт, а как конечный автомат (state machine). Агент всегда знал, в каком состоянии находится: «на странице урока», «ожидает загрузки вопроса», «отправляет ответ», «анализирует результат».
async def navigate_to_next_page(page, state):
"""Умная навигация с ожиданием загрузки контента."""
try:
# Ждем, пока кнопка "Далее" станет кликабельной
await page.wait_for_selector(
STEPIK_SELECTORS["next_button"],
state="attached",
timeout=10000
)
await page.click(STEPIK_SELECTORS["next_button"])
# Ждем появления следующего вопроса или индикатора успеха
await page.wait_for_selector(
".stepik-content",
timeout=15000
)
state["current_page"] += 1
logger.info(f"Перешли на страницу {state['current_page']}")
except TimeoutError as e:
# Если что-то пошло не так, делаем скриншот для отладки
await page.screenshot(path=f"error_{state['current_page']}.png")
raise AgentNavigationError(f"Таймаут навигации: {e}")
4Шаг четвертый: интеграция Claude Opus 4 – не просто чат, а решатель задач
Claude Opus 4 (Anthropic) был выбран из-за его контекстного окна в 200K токенов и способности следовать сложным инструкциям. Промпт – это сердце агента. Он не был просто «Ответь на вопрос». Это была многоуровневая инструкция, напоминающая подходы из кейса нетрадиционного обучения.
Мы структурировали промпт так:
- Роль: Ты эксперт по DevOps, проходишь курс на Stepik.
- Контекст: Вот HTML-код текущего вопроса и скриншот. Вот история твоих предыдущих ответов.
- Задача: Проанализируй вопрос, выбери правильный ответ. Если вопрос с кодом – напиши код.
- Ограничения: Ответ должен быть в точном формате, требуемом платформой (например, буква варианта или точная строка).
5Шаг пятый: оркестрация, логирование и обработка исключений
Главный скрипт запускал всех микро-агентов, следил за таймаутами и логировал каждый шаг в структурированном виде (JSON-логи). При любой ошибке – будь то сетевой сбой, изменение интерфейса или неожиданный вопрос – агент не падал, а переходил в состояние «ошибка», делал скриншот и пытался применить одно из запасных действий: обновить страницу, вернуться на шаг назад, перечитать вопрос.
Система мониторинга, вдохновленная принципами оценки AI-агентов, отслеживала не только конечный результат (пройден/не пройден), но и метрики: время на вопрос, точность ответов, количество fallback-действий.
Что пошло не так: топ-5 ошибок, которые съели 80% времени
- Динамические ID элементов. Некоторые кнопки на Stepik генерировали `data-qa` атрибуты с случайным суффиксом. Решение: перейти на поиск по XPath, используя частичное совпадение текста или относительные пути.
- Капча в письме подтверждения. На второй день тестов наш почтовый провайдер начал показывать капчу после нескольких автоматических входов по IMAP. Пришлось вручную добавить паузу между проверками и использовать резервный почтовый сервис. Это был ручной труд – слабое место автономии.
- LLM галлюцинирует на простых вопросах. Claude Opus 4 иногда давал неверный ответ на элементарный вопрос с подвохом, хотя на сложных вопросах по Docker справлялся блестяще. Видимо, перемудривал. Решение: добавили второй, более простой промпт для вопросов базового уровня.
- Проблемы с памятью. Когда курс содержал 50+ шагов, контекстное окно переполнялось. Мы начали суммировать пройденные этапы, но это могло привести к потере важных деталей. В будущем нужно внедрить векторную базу для долгосрочной памяти, как в архитектуре AI Coding Agent.
- Экономика. Запросы к Claude Opus 4 API стоят денег. Один курс обошелся примерно в $15. Для массового использования нужна оптимизация: кэширование ответов, использование более дешевых моделей для простых шагов.
Что это значит для будущего? Агенты не займут мир, но они уже могут учиться
Эксперимент показал, что автономные AI-агенты в 2026 году готовы к выполнению сложных, многошаговых задач в реальных веб-средах, но только при условии тщательной инженерии и наличия человека-инженера, который проектирует архитектуру и тушит пожары.
Следующий шаг – масштабирование. Не для сдачи курсов (это скорее proof-of-concept), а для реальных бизнес-задач: автоматизация рутинных операций в CRM, мониторинг и реагирование в системах поддержки, автономное тестирование веб-приложений. Принципы те же: модульность, устойчивость к ошибкам, четкие промпты.
Если вы хотите погрузиться в разработку подобных систем с нуля, начните с основ. Например, бесплатный курс от Kaggle и Google по AI-агентам дает хорошую теоретическую базу. А для практики попробуйте повторить наш эксперимент на каком-нибудь открытом курсе. Только приготовьтесь: 20% времени уйдет на гениальный код, а 80% – на борьбу с тем, что кнопка «Далее» вдруг стала зеленой.
И последний совет. Не пытайтесь создать агента, который пройдет любой курс. Создайте агента, который пройдет конкретный курс на конкретной платформе. Специализация побеждает универсальность. Пока что.