Фундаментальная проблема веб-агентов заключается не в автоматизации — а в восприятии. Как позволить 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.]