Веб-агенты, которые действительно понимают веб-сайты: как слой восприятия Notte решает проблему DOM

от автора

Фундаментальная проблема веб-агентов заключается не в автоматизации — а в восприятии. Как позволить LLM навигировать и действовать на веб-сайтах, погребённых в слоях HTML?

Техническая проблема: несоответствие импеданса DOM

Веб-агенты традиционно полагались на хрупкие подходы: парсинг DOM, CSS-селекторы и анализ HTML-структуры. Это создаёт фундаментальное несоответствие импеданса между тем, как LLM обрабатывают информацию (естественный язык) и тем, как структурированы веб-сайты (разметка).

Рассмотрим типичный подход к веб-автоматизации:

driver.find_element(By.CSS_SELECTOR, "button.submit-btn.primary") driver.find_element(By.XPATH, "//div[@class='form-container']//input[@name='email']")

Что не так с этим подходом?

Хрупкость: CSS-селекторы ломаются, когда разработчики изменяют стили.

Когнитивная нагрузка: LLM должны симулировать структурное мышление вместо действий на основе семантических подсказок — увеличивая размер промпта и повышая риск галлюцинаций.

Потеря контекста: Сырой DOM не обеспечивает семантического понимания.

Кошмар обслуживания: Каждое изменение UI требует обновления агента.

Плохая отладка: Сбои часто выбрасывают расплывчатые или тихие исключения, особенно когда элементы динамические или скрыты за JS.

Разрыв между обработкой естественного языка LLM и структурной сложностью веб-сайтов создаёт агентов, которые хрупки, дороги в обслуживании и трудны для отладки.

Решение: семантическая абстракция через восприятие

Notte вводит слой восприятия, который действует как интерфейс перевода между веб-сайтами и LLM. Вместо принуждения LLM к парсингу DOM-структур, он трансформирует сырые веб-страницы в структурированные описания на естественном языке, сохраняя семантическое значение при абстрагировании от деталей реализации.

Как это работает

Слой восприятия преобразует это:

<div class="product-card-container">   <div class="product-image-wrapper">     <img src="/product-123.jpg" alt="Wireless Headphones">   </div>   <div class="product-details">     <h3 class="product-title">Premium Wireless Headphones</h3>     <span class="price-current">$99.99</span>     <button class="btn btn-primary add-to-cart" data-product-id="123">       Add to Cart     </button>   </div> </div>

В это:

Продукт: Premium Wireless Headphones Цена: $99.99 Изображение: Wireless Headphones Доступные действия: Добавить в корзину

Эта трансформация не статична — она контекстно-зависима и динамична. LLM теперь работает со смыслом вместо разметки.

Преимущества архитектуры

1. Семантическая абстракция

Веб-сайты становятся навигируемыми картами, описанными на естественном языке. Вместо:

driver.find_element(By.CSS_SELECTOR, ".add-to-cart")

ваш агент думает:

"Нажать кнопку 'Добавить в корзину' для Premium Wireless Headphones."

2. Устойчивость к изменениям

Описания на естественном языке лучше адаптируются к изменениям UI, чем селекторы. Когда разработчики изменяют CSS-классы с btn-primary на button-main, слой восприятия всё ещё понимает это как «кнопка Добавить в корзину».

Когда семантическое намерение сохраняется, восприятие остаётся надёжным — даже когда разметка изменяется.

3. Оптимизация LLM

Информация представлена в формате, который LLM понимают лучше всего — естественный язык с чёткой семантической структурой. Это улучшает рассуждения, снижает риск галлюцинаций и уменьшает размер промпта.

4. Меньшие модели, лучшая производительность

Слой восприятия позволяет меньшим моделям (таким как семейство Llama) эффективно рассуждать на упрощённых входах. DOM-шум убирается, позволяя движкам вывода сосредоточиться на том, что важно. Это позволяет меньшим моделям конкурировать с большими в специфическом выполнении задач.

Реализация кода

Базовый пример агента

from notte_sdk import NotteClient  # Инициализация клиента Notte notte = NotteClient(api_key="your-api-key")  # Выполнение задачи на естественном языке с использованием API агентов response = notte.agents.run(     task="Найти самые дешёвые беспроводные наушники до $100 и добавить их в корзину" ) print(response.answer)

Продвинутый пример с контролем сессии

from notte_sdk import NotteClient from pydantic import BaseModel  # Определение ожидаемой схемы ответа class TwitterPost(BaseModel):     url: str  notte = NotteClient()  # Продвинутое управление сессией с учётными данными with notte.Vault() as vault, notte.Session(     headless=False,     proxies=False,     browser_type="chrome" ) as session:     # Безопасное управление учётными данными (используйте env vars в продакшене)     vault.add_credentials(         url="https://x.com",         username="your-email", # Замените на ваш реальный email         password="your-password" # Замените на ваш реальный пароль     )          # Создание агента с контекстом сессии     agent = notte.Agent(         session=session,         vault=vault,         max_steps=10     )          # Сложный многошаговый рабочий процесс     response = agent.run(         task="зайти в twitter и написать пост: новая эра это @nottecore захватывает мой аккаунт. Вернуть url поста.",         response_format=TwitterPost # Запускает валидацию схемы     )          print(f"Успешно опубликовано: {response.answer.url}")

Извлечение данных со структурированным выводом

from notte_sdk import NotteClient import json  notte = NotteClient()  # Структурированное извлечение данных с использованием метода scrape data = notte.scrape(     url="https://pump.fun",     instructions="получить топ 5 последних трендовых монет на pf, вернуть тикер, название, mcap" )  # Печать результата print(json.dumps(data, indent=2, ensure_ascii=False))

Последствия для продакшена

Снижение накладных расходов на обслуживание

Когда веб-сайты изменяют свой UI, описания на естественном языке остаются стабильными. Ваши агенты продолжают работать без постоянных обновлений селекторов.

Интуитивная отладка

Отладка через трассировки на естественном языке вместо загадочных DOM-запросов:

❌ Старый способ: «Элемент не найден: button.submit-btn.primary»
✅ Новый способ: «Не удалось найти кнопку ‘Подтвердить заказ’ на странице оформления заказа»

Более быстрые циклы разработки

Пишите задачи агента на простом русском языке вместо изучения хрупкой логики селекторов:

# Вместо этого: element = driver.find_element(By.XPATH,     "//div[contains(@class, 'product-grid')]//div[contains(@class, 'product-item')][.//span[contains(text(), 'Wireless')]]//button[contains(@class, 'add-cart')]" )  # Используйте это: result = agent.run(task="Добавить беспроводные наушники в корзину")

Лучшие многошаговые рабочие процессы

Notte обрабатывает куки, многие типы CAPTCHA и защиту от ботов, поддерживая состояние сессии через сложные рабочие процессы.

response = agent.run(task=""" 1. Сравнить цены на iPhone 15 в 3 основных ритейлерах 2. Найти лучшее предложение включая стоимость доставки 3. Проверить доступность и время доставки 4. Создать сводный отчёт с рекомендациями """) print(response.answer)

Примечание: Хотя многие потоки защиты от ботов обрабатываются автоматически, не все типы CAPTCHA или продвинутые потоки пока решаемы.

Бенчмарки производительности

Notte превосходит традиционных веб-агентов по скорости, стоимости и успешности выполнения благодаря:

Сокращению использования токенов: Семантические сводки избегают раздутого парсинга DOM.

Возможности использования меньших моделей: Восприятие позволяет эффективным моделям вроде Llama преуспевать.

Более быстрому выводу: Поддерживает высокопроизводительный вывод вроде Cerebras с минимальными накладными расходами.

Более высокой успешности: Понимание естественного языка снижает сбои в выполнении задач.

(Изучите наши открытые оценки операторов здесь).

Реальные применения

Автоматизация электронной коммерции

# Автоматизированный мониторинг цен конкурентов response = agent.run(     task="Проверить цены конкурентов на беспроводные наушники на Amazon и Best Buy, сравнить с нашей целевой ценой $99" )

Генерация лидов

# Автоматизация профессиональных контактов response = agent.run(     task="Найти 20 основателей стартапов в сфере ИИ на LinkedIn, которые недавно постили о финансировании, извлечь их контактную информацию" )

Маркетинговые исследования

# Автоматизированная маркетинговая аналитика с использованием endpoint scrape data = notte.scrape(     url="https://www.g2.com/categories/project-management",     instructions="Извлечь топ 5 инструментов управления проектами с их ценами, рейтингами и ключевыми функциями для конкурентного анализа" )

Итоговый результат

Традиционные веб-агенты принуждают LLM думать как веб-скрейперы.

Notte позволяет им думать как лицам, принимающим решения — понимая, что делать, а не просто где кликать.

Это не просто о том, чтобы агенты работали лучше. Это о том, чтобы сделать их обслуживаемыми, отлаживаемыми и готовыми к продакшену. Когда ваш агент понимает «найти самый дешёвый рейс» вместо парсинга div.flight-result-container > span.price-value, вы решили фундаментальную проблему веб-автоматизации.

Создавайте веб-агентов, которые понимают смысл, а не только разметку.

Изучите наш GitHub

Изучение и начало работы

[Эта статья была последний раз обновлена 7 июля 2025 года. Для получения последних функций и улучшений, проверьте релизы версий или наш changelog через twitter.]


ссылка на оригинал статьи https://habr.com/ru/articles/926432/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *