Галоўная / Артыкулы

Чаму агенты кадавання зноў і зноў вынаходзяць браўзер

Чаму доўгатэрміновыя агенты кадавання прыходзяць да інструментаў у форме браўзера: дапаможныя скрыпты, кукі як памяць, кампактныя прадстаўленні старонак, HTTP-запасныя шляхі і зрух навучальных даных.

Выдавец: REACTAPP.TOP12 хв чытання2722 слоў

Крыніцы: Why Do AI Agents Love Building Web Browsers?

Браузер, якога ніхто не прасіваў

Програмы-кодавальнікі парадзейнаюць аднаковым спосабам. Калі у ўсіх ёсць безкоштовны доступ да інтэрнэту, можлівасць пісаць і выканання коду, а таксама праца, якая трывае дастаткова давго, яны часта ствараюць ўсё, што нагадвае браузер. Мотывацыяючым фактам яе не ў тым, што ўжо хочацца браузера. Насправды яны шукаюць дашчавы, можна перадаць у вжыцце інструмент, які можа ачыніць URL, нажыць на кнопкі, запаўніць формы, чакаць на даны і выявіць іх, зберагчы кукіі і сесіі, а таксама зробіць скрыншот пасля неудачы. Якшча паглядаць так, то гэта проста звычайная інжынерная праца, якую бы зрабіў людзкі распрацоўшчык.

Chromium як продукт не ёсць канечной мэтай. Ціі програмы працуюць над функцыяй, яку выпалюе браузер: перакладаннем веб-протакалаў і стандартаў у конкрэтныя операцыі.

Продукт проты абстракцыі

Браузер у значэнні Chrome або Firefox — гэта большая прыемка: карточкі, стрэлка адрэсу, дварчык, модэль працы. Нічога з гэтага не патрэбна агенту. Ям патрэбна фундаментальная задача — ператворыць прынцыпы работы Інтэрнэту на операцыі, якія можна выдаты.

Людзі вікорыстоўваюць гэты інтэрфейс, не звертаючы на гэта ўвагі. Староніца захісу, звычайна, запрашвае даны для захісу, кнопка, звычайна, можа быць нажата, і вы яе нажымаеце, чакаеце на наступную староніцу і продовжаеце. Агент не можа паспярдзіцца на гэтае невыказанае розуменне, таму ям трэба ператварыць тую ж работу на чыстае выражэння операцый. Калі папросіце агента для кодавання працаваць на будзь-якіх веб-сайтах, вы даеце ям задачу, прыродная абстракцыя якой ужо вядома, таму я ўсё болей прыбліжаецца да гэтых меж.

Сучасныя веб-сайты таксама не створаны для вікорыстання як апроцедурны інтэрфейс (API). Зазвычай існуе HTML-документ, які абаротваны JavaScript, плюс сесіі выхаджання, кукі, перэнаправленні, атрыбуты для адразування на стороне кліента, функцыя безканальнага прасування, вікна-попапы, завантажэння файлоў і асінхронныя запіты. Просты HTTP GET — толькі пачатак. Рэальныя задачы в такіх умовах зрэшты выклікаюць патрэбу ў такім наборэ операцый.

open(url)
click(selector)
fill(selector, text)
wait_for(selector)
extract(selector)
go_back()
screenshot()

Гэта не графічный прыгунач, але ён, без сумневу, являецца універсальным інтэрфейсам для працы з Інтэрнэтам.

Чаму дзейніцы з довгім часам выканання ствараюць дапаможнікі

Короткія задачы можна адрабатваць спецыяльна. Одноразовы пошук можна адрабатваць методам сіловаго перагляду без жадной інфраструктуры, адколі ён не будзе павтарацца і завершыцца за калекі секунды.

"Find the current exchange rate."
"Look up this company's homepage."
"Find the opening hours of this restaurant."

Праца, якая трывае дзеўяночы, — гэта не тое. Уявіце агента, які кожныя калькі сочыць за сотнямі сайтаў, паўтараюча складныы працэс работы, збіраючы даны з стораніц, заставаючыся заўвесь час усунутым, агрупаваючы падтверджэнні працэсу працы працы калькі дзён або перапытваючы сервіс, пакуль неякая змяна не выйдзе. Калі модэль адпрацоўвае кожны клік і кожную перапытку, выкліканыя затраты растуць. Простае выкананне выглядае так:

  1. Ачыніце браузер, які ўжо ўсталяўся як інструмент для запрашэння стораніцы.
  2. Працаваце з стораніцай, выкарыстоўваючы адобразлены DOM як адказ на спостэрэнні.
  3. Знайдзіце поле для пошуку, увісьце запіт, нажміце «Пашук» і чакайце.
  4. Выяўіце даны.
  5. Аналізуйце іх.
  6. Паўтарыце.

Здольны агент рэагуе так, як бы цэлае людзкое распрацоўшчыка, напісаўшы можна выкарыстоўваць памагальнік. Наступнае выкананне тады выглядае так:

  1. Запустыце скрыпт.
  2. Пераканайцеся, чы рэзультат все ўсё правільны.
  • Звяжыцеся з модэлем знову толькі тады, калі гэта не ўдаецца, напрыклад, калі сэлектар вяртаецца пустым, структура сторанкі змінілася або выкарыстоўваныя даны больш не падходзяць таму, чаго чакае задача.
  • Гэта значны архітэктурны змяненні. Модэль перастае выкананні кожной операцыі. Яна стае тым элементам, які выбірае, якая процедура павінна выконвацца, тады калі звычны програмны мерапрыятак выкарыстоўвае выбраны інструмент і збірае адзінкі. Іншымі словамі, агент складае свой сабэйс у відпаведны скрыпт.

    Эксперыментавація ў браузеры, перагляд у кодзе

    Браузер — чырвоныя месца для эксперыментавання. Агент можа прабаваць разныя варыянты, навігаваць, адзірваць рэзультаты і выявіць, якая последовасць дзеянняў дапаможае досягнуць меты. Пасля чаго парадульнае перагляданне кожнага дзеяння ёсць марнасцю.

    Якшо агент дазнаецца, што для пошуку товара на сайце для аптарків завжды трэба заходзіць на галоўную старонку, шукаць „USB-C кабелі“, прыкладваць фільтры для товараў з рэйтынгам чатыро зорак і больш, швайная даставка і максымальная цена, працаваць з рэзультатамі пошуку і выкарыстоўваць тытулы, цены і ідэнтыфікаторы товараў. Не існуе прычыны, чаму мадэль мовы павінна занова выкананыць гэтыя пяць операцыяў ў кожны раз. Яна можа ператворыць іх у процедуру і вярнаваецца да яе для падобных задач. Для гэтага патрэбна жывая сесія з кукі, таму агент выбірае Puppeteer, Playwright або ўсё такое ж як інструмент для запрашэння сторанак.

    async function getNewProducts(query) {
      const browser = await playwright.chromium.connectOverCDP(
        `wss://${AUTH}@brd.superproxy.io:9222`,
      );
      const page = await browser.newPage();
      await page.goto("https://example.com/products");
      await page.fill("input[name=q]", query);
      await page.click("button[type=submit]");
      await page.waitForSelector(".results");
      return extractResults(page);
    }
    

    Шматак коду налажоўвае зв’язак між Playwright і браузерам, які розмішчаны на віддаленай машыне, праз протакол Chrome DevTools. Віддалены браузер стае доцільным, калі агент, які працюе працоўна, павінен падтрымваць свою сесію жывой кожныя калькі гадзін, без удзеле модэлю. Для гэтага патрэбны даны прыўязкі до акаунту, у фармаце стрэлкі з’ўязку, якую пазначае заместыкатэль ${AUTH}.

    Для структураванага выкарыстоўвання інфармацыі з сайту, дзе няма готавага скрапера, нават не патрэбны локальныя файлы Playwright. Той самы працэс можа быць перэтворэны ў інструмент для скрапінгу, які розмішчаны на віддаленай машыне: трэба опісаць патрэбныя даны простым языкам, отрымаць створаны збірач і запустыць яго без вікорыстання модэлю пад час ціклу клікаў. Яго функціі взаімадзея і парсара ёсць тымі ж — адкрытыя задачы клік, заполненне, чаканне, выкарыстоўвання і зйомка экрана, проста ўсе яны рэалізуюцца на віддаленай машыне.

    Такі скрыпты не працуюць, калі змінююцца CSS-селектары, што змушвае агента зноў усё пераглядаць і ствараць новы скрыпт. Якшча гэты працэс знаходзіцца ў інструменце на хостынгу, ШЫ можа яго відновіць без неабяжнай перапісвы селектараў.

    Людзкія распрацоўшчыкі паводзяцца так сама. Першыя візіты на веб-сайт дапамагаюць зрозумець, як ён працуе, а пасля таго ніхто не думае пра кожны клік. Калі сайт змінюецца, трэба зноў яго вівучаць, хоць ція інформацыя застаецца у памяці. У LLM памяць значна дорожэйшая. Калі ёму трэба ў кожны раз перабудаваць працэс на адной лінгвістычнай пазырнай, ён плаціць за тое ж самае відкрыцце знову і знову. Таму ён зберагае вывучаны алгорытм у скрыпцы і ўжывае яго, пакуль стораніца больш не будзе падходзіць.

    Кукі як памяць за межамі модэлю

    Няхай і сёньдзе жадны модэль мовы не можа прытрымліць дзейнае сесію ў інтэрнэце ў своем кантэксце. Запіс файлу .py як і раней запускае модэль, тады калі храненне кукі не патрабуе гэтага. Калі сесія працюе, прыгледач сам падбірае памяць, таму яна ужо не належыць да хранення агента. Яе можна разбіць на тры актуальныя часткі:

    • Кухня з кукі, укладаючы ў сябе HttpOnly кукі і тыя, якія JavaScript стварае пасля заходжання або перагляду бота. Часта модэль узагалі не можа ўзяць іх, але прыгледач іх зберагчыць і дадае ў наступны запіт.
    • Храненне паходжэння, тыя самыя localStorage, sessionStorage і IndexedDB, якія практычна выключна заповненыя значэннямі, напісанымі самым сайтом.
    • Історыя сесіі, стак для перавароту назад і вперад, які дазволяе працаваць функцыям back() або tabs.goBack().

    Дзеянне дзеячага можа выконвацца параду браузера, напрыклад, сэсія на станцыі сервера або URL, які не існуе пакуль не запрацюе JavaScript. Дзеячагу не трэба самаму чытаць гэты матэрыял; яму проста трэба кераваць шаром браузера, які ужо зберагае сэсію.

    Рызыкі для безпекі, калі дзеячы працюе параду браузера

    Калі дзеячы можа чытаць будзь-яю стороніцу, будзь-які кукі і кераваць актываючайся сэсіяй, введэнне спрамптов перастае быць проблемай качэння спрамптов і стае архітэктурным рызыкам. Кожная сістэма, якая працоўвае з актываючымся браузерам, сталкнуцца з гэтым, але дзеячыя, напісаныя на кодаванні, знаходзяцца ў горшым становішчы, адтуды яны часта можу пісаць і запускаць тое, што зустрэнуць. Обмежыце тое, што дзеячы можа рабіць без нагляду чалавека, і пачніце з сандбокса.

    Хорашым шаблонам ёсць чарт аптэксты для выкарыстоўвання камп’ютара ад Anthropic: выкарыстоўваць спецыяльную віртуальную машыну або кантэйнер, ухіліцца ад заходжэнняў, калі тэкст не выклікае такой патрэбы, падтрымліваць спісы дазволеных домэнаў, а таксама вымагаць пацверджэння чалавека для всіх праблем, якія стосуюцца грошэй або схвалення.

    Чаму неапрануты HTML ёсць паслаблым вхідным дадзеннем

    Неапранутыя сторанкі ёсць жахлівым вхідным дадзеннем для мовных модэляў, таму што ў іх так многа шуму. Тое, што патрэбна модэлю, можа быць захавана сярод тыяў токэнаў маркапаў, стылю і іншых элементаў. Таму хорашы інструмент браузера вяртае меншыя даны пра дзеянні і спазырэнні заместа цэлаг HTML-коду.

    На рысунку паказана модэль об’екта дакумента HTML-сторанкі, тое ўзлес, які неабходна скорачыць у компактным адборы аб адборы для доступнасці. Корыстны інструмент можа ператворыць яе на ўсё меншы фармат. Заместа цэлаг дакумента ён можа дастаць модэлю короткія апісанні, падобныя да гэтых.

    Title: Search results
    Links:
      [1] Home
      [2] Next page
    Forms:
      search: input[name=q]
    Buttons:
      submit: button[type=submit]
    Main content:
      ...
    

    Або гэта можа адкрыць дрэво доступнасці.

    - navigation
      - link "Home"
      - link "Search"
    - main
      - heading "Results"
      - list
        - listitem "Item 1"
        - listitem "Item 2"
    

    Такі фарматы значнаюць бліжэй да таго, што можа выкарыстоўваць модэль абдумавання. Таму шар у форме браузера не толькі дазваляе взаімадзею: ён скручвае сяродавішча ў компактны набор дзеянняў і спазыраў. Агент бачыць толькі тыя часткі вебу, якія значныя для яго задачы, а не механізмы, якія ствараюць адображэнне сторанак. Кантэкст захавляецца, працэс абдумавання стае дышэўшы, а памылкі часта, хоць і не завжды, зменшуюцца.

    Ёсць аднаковая прычына: повна інформацыя пра доступнасць з усімі пасыланнямі можа стаць большай за сам тэкст, які відбіваецца на экране. Компрэсія мае сэнс толькі тады, калі «экранавальнік» справаўна вяртае короткі, керованы спіс элементаў управління. Які ён будзе короткі, залежыць ад модэлі. Маленькая модэль не можа выкарыстоўваць чысты DOM, а сільная можа, але ўсё рава плаціць за токены. Ніякая з іх не хочаць цэлага HTML.

    Калі просты HTTP дастатковы

    Пасля таго, як агент выявіў, як працюе веб-сайт, найяксцявейшая і надзеянае рашэнне можа ўзагалі не выклікваць автаматызацію браузера. Інодзе выявляецца, што браузер на самай справе выкананае досыць простыя задачы. Кнопка „Наступная стороніца“ можа ў канцы канцоў выдаваць лякальнае запрашэнне.

    GET /api/products?page=2
    

    Калі так, адрабатаванне сторанкі ў такім случае бяспрэчна, і агент можа безпасебна вызваць канец-тэп. Рэзультатам яе ёсць лестніца вароў.

    human interface
          ↓
    browser automation
          ↓
    discovered workflow
          ↓
    direct HTTP/API calls   ← only if the site still allows it
    

    Яго ценнае значэнне заключаецца у тым, што ён паказвае, як працюе прыкладнік. Калі гэта зрозумела, агент можа адзяліць дадзеныя з розных слоёў і іноды перайсці на просты HTTP. Агент, які ніколі не працуе з стораначкамі, наполненымі JavaScript, можа зовсім не вікорыстоўваць автаматызацыю прыгледчыка і застацца на HTTP, жаданае — з сервісам, які памагае працаваць у разе адхілення запыткаў. Як бы там не было, аўтонамныя агенты патрабуюць альтэрнатывы, таму што на відкрытым інтэрнэце практычна завжды ёсць бар’еры ад Cloudflare чыль анты-бот-перакананні. Без недорогіх спробаў перапрытку, модэль блукае, выкорыстоўвае токены і падвышае суму рахунку.

    Існуе два сложныя аспекты.

    Па-першае, багато сайтаў нельга пераканаць на працю на HTTP. Большасць з іх не дозволяе ўзводзіць іх на адваротную інжынерыю: яны обмежваюцы трафік, які не прыходзіць з прыгледчыка, зменшаюць параметры выбору элементаў, фіксуюць характэрыстыкі кліентаў і дадаюць анты-бот-перакананні чыль CAPTCHA. Для такіх сайтаў трэба застацца на повным падходзе з прыгледчыкам, чы то локальным, чы то хоставаным.

    Паўторна аперацыя не завжды ўзводзі да рэзультатаў. Документаваны публічны JSON API мае чыткую структуру, ўзначаныя межы і ўжоўтрымлівае лагі. Інтарфейс унутраніх канцэнтраў, без дакументацыі, які агент з’ясаваў сам, — гэта ўжо іншая справа: так, яго легчэ выклікваць, але пераглядаць яго для чалавека складней, чым скрыпт, які нажымае відчутныя кнопкі, пры чым лагі ў такім случае ўжоўтрымленыя. Адпаведзь 200, наполненыя непатрэбнымі данымі, лёгка працягнуць, тады калі зламаная стораніца выдзеляецца.

    У канцэ наступнае: агент не ўсвядомляе ніякой прыхіленасці да браузераў. Ён жадае самага дэшавага інтэрфейсу з яго апошнім сераўісам, які ўсё ж такі будзе працаваць:

    • Калі такі інтэрфейс — гэта JSON-канцэнтр, а сайт яго падтрымлівае, выкорыстоўваюце JSON.
    • Калі патрэбна експансія JavaScript і стан сесіі, выкорыстоўваюце справжні браузер праз Puppeteer або Playwright, або хоставаны браузер.
    • Калі патрэбен толькі завантажаны HTML, выкорыстоўваюце HTTP, з проксі або анблокерам, калі запыт GET заблокаваны.
  • Для павтаральнага структураванага выкарыстоўвання інфармацыі на сайце, які не мае готавага інструмента для скрапінгу, неабходна перакласты задачу ў працоўны працэс скрапінгу, у яком кодавы працоўнік адпавядае за аперацыі HTTP, а працоўнік браузера — за рэальную сесію.
  • Калі важліва толькі інфармацыя пра структуру доступнасці, яе можна проста перадаць без дадатковых ператварэнняў.
  • Веб-агенты, якія працуюць праўільна ў довгачасовым рэжыме, зазвычай выкарыстоўваюць калькі з гэтых методаў адразу. Найважлівейшым навыкам ёсць здатнасць перыходзіць вярх і воснад у іерархіі ў залежнасці ад сітуацыі.

    Чы можуць даны для навучэння гэта адказаць?

    Адказ ёсць сумяшаным. Даны для навучэння могу адказаць на пытанне, чаму модэль выбірае Playwright або Puppeteer, але яны не можу адказаць на пытанне пра стварэнне інструментаў, сэродзеўных браузеру, з самага пачатку.

    У даследжэнні Oxford і Microsoft пад назвай BiasBusters, адбылым у 2026 годзе, была перапрацавана аднакоўская версія гэтага пытання – а самэй, чы робіцца вплыв ад метаданых пад час навчання на выбір модэлю інструмента. Команда продовжыла навчанне невялікай модэлі на корпусе дадзеных, наполненаму метаданаямі ад аднаго API па пагодныя даны, які ўскладніўся ў частыну з многах, якія аддаюць такія ж послугі.

    • Раней модэль практычна ніколі не выбірала гэты API – прыблізна 0,6% часоў, што адпавядае простаму шансу.
    • Пасля навчання на такім спецыяльным корпусе дадзеных яго выбіралі прыблізна 12% часоў, тое ў 20 разоў чашчэй.

    Корачэй кажучы, сама толькі экспанзія пад час навчання, незалежна ад задачы, значным чынам вплывае на тое, які інструмент чыя продукт мадэль воліе. Але гэта стосуецца выбору інструмента. Абстракцыя («ацэнаваць», «клацнуць», «запыліць», «чакаць», «экстрагавацыя у вачынку», незалежна ад таго, якая бібліятэка гэта здабывае) вялічыцца сяродавішчынай. Мадэль, якая ніколі не бачыла Playwright, все рава патрэбуе чаго-небудзь для ацэнавання сторанак, чакання на контэнт і адчыткі рэзультатаў, адколі інтэрактывныя сторанакі гэта выклікаюць.

    Дзейную два адналежнага розныя элементы:

    • Абстракцыю ацэнаваць, клацнуць, запыліць, чакаць і экстрагавацыя наводзіць сяродавішчына. Інтэрактывныя сторанакі маюць навігацыю, таймінг, кантролі і адобразаваны выход, незалежна ад таго, чыі Playwright ўяўляецца ў вагах модэлі.
  • Адаптар Playwright у працэўнасупрацоўцы проты самасталаг кліента вылучаецца на адной з пазнак, якія бачыў мадэль, як паказалі BiasBusters для адмённых API.
  • Даныя для навчання пакрываюць другі варыянт і не ахватваюць першы. Мадэль не можа поясніць, чаму проблема продовжае спрамоўвацца да абстракцый, сэродніх прыгледу. Найпростэйшая прычына — тое, што інтэрнэт ужо структураваны саме так.

    Адаптары з найлепшымі рэзультатамі

    Агенты на кшталт Claude Code на самай справе не ствараюць прыгледы. Яны ствараюць адаптары межы сістэмай разумовага аналізу і сярэдавішчам, якое збыткова мае форму прыгледу.

    Эвалюцыйная біялогія мае паняць, які называецца карцінізацыяю: нечаканая тэндэнція неспакойных ракошчупакоў з часам адыходзіць да тэлы, сэроднай раку.

    Этыя відэны не выніклі да заключэння, што быць крабам — гэты розумны план. Іхнія абяканні проста продовжвалі даўаць адпаведныя рашэнні для адпаведных проблем. Агенты, якія кодуюць, можа ідуць па падобным шляху. Яны бачаюць, што ныяныя методы ўплошаны, і пішуць скрыпт, дадаюць праказы праз новыя спробы, калі ўсё збіваецца, забезпечваюць сохраненне сесіі пасля аўтэнтыфікаціі, а таксама дадаюць можлівасць выкарыстоўвання DOM чы адпрыемнасці, калі сторанкі стаюць занадта вялікімі, ўскладнюючы ўсвядомленне ўсьго.

    The task requires the web.
            ↓
    The web exposes a browser-shaped interface.
            ↓
    The agent needs a way to operate that interface.
            ↓
    Repeated operations make ad-hoc reasoning expensive.
            ↓
    The agent writes reusable tools.
            ↓
    Those tools accumulate state, retries, and abstractions.
            ↓
    The tools start looking like a browser.
            ↓
    Known workflows get compiled into deterministic code.
            ↓
    The page changes so the agent re-explores.
            ↓
    If an API exists, use it to get the data.
    If not, and the site allows it, fall back to regular HTTP.
    If not, stay on the browser.
    

    Пры гэтым часам раундаў, рэзультат стае дужа сэродні маленькаму браузеру. Гэта лепшы ментальны модэль для автонамных агентаў, чым выдумка пра цыфровых людзей, якія маюць дзівны інтэрэс да браузераў. Яны паводзяцца як хорашы інжынеры: аднаўляюць сложную срэду, выявляюць сапраўдную інтэрфейсную структуру і ствараюць абстракціі для таго, што ўздарожнае, мае стан і павтараецца. У інтэрнэце вялікі час існуе старая і аднойчы вельмі успешная абстракцыя для гэтай мэты, і яна называецца браузерам.