Преиспитивање претраге као генерације кода

Развој претраге од монолитних сервиса до програмабилних примитива за ери агенатских окружења.

АуториPerplexity Research

Претрага је кључни примитив за системе вјештачке интелигенције. Напредни модели постају све способнији из мјесеца у мјесец, али им је и даље потребан приступ свјежем, тачном и добро курираном знању из ширег свијета. Претрага је примарни начин на који системи вјештачке интелигенције користе то знање, и стога представља темељну компоненту сваког производа који треба да доноси закључке, предузима акције и обавља посао у стварном свијету.

Вјерујемо да су традиционални цјевоводи претраге све више застарели у ери агената. Традиционална претрага одговара на упите, али данашњи агенти завршавају задатке који могу имати безброј облика. Ови задаци захтијевају од агената да дефинишу стратегије преузимања специфичне за задатак директно у оквиру својих окружења. У оквиру система Perplexity Computer, видјели смо како појединачни задаци покрећу стотине или чак хиљаде операција преузимања у року од неколико минута: ток рада који је немогућ за људе, али потпуно природан за агенте.

У овом свијету, сама претрага мора постати агентна, са својим градивним блоковима доступним директно као SDK-ови у оквиру агенатског окружења. Уводимо Search as Code (SaC) као нову референтну архитектуру претраге компаније Perplexity.

Увод

Систем претраге компаније Perplexity опслужује хиљаде упита сваке секунде кроз наше апликације и API платформу. У септембру 2025. године објавили смо први архитектонски преглед наших система претраге. Константне иновације у оквиру ових система подржале су лансирање нових понуда као што су Search API, Agent API и Computer, при чему петље самопобољшања оптимизују систем претраге како би боље служио корисницима са сваким протеклим даном.

Традиционално, системи вјештачке интелигенције су третирали претрагу као монолит: модел вјештачке интелигенције издаје упит, претраживач покреће свој унапријед дефинисани цјевовод, а модел конзумира резултате као контекст. Углавном је ово добро функционисало за потребе раних корисника вјештачке интелигенције. С обзиром на релативну једноставност њихових захтјева, није било разлога за бригу о томе како је тачно цјевовод претраге дизајниран, нити да ли је архитектура цјевовода оптимална за дат задатак. Претпостављало се да су подразумеване поставке довољно добре, као и подразумевани интерфејси (позивање функција и MCP-ови).

Традиционалне архитектуре претраге излажу један фиксни систем који модели позивају серијски, док Search as Code излаже атомизоване примитеве претраге које агенти комбинују кроз генерисани код.

Ипак, данас овај приступ постаје све застарелији са којим протеклим мјесецом. Корисници захтијевају много више од анализе у једном кораку од вјештачке интелигенције. Они очекују да агенти довршавају задатке од почетка до краја током сати или чак дана. Ови задаци могу бити сложени, отвореног типа и веома промјенљиви у погледу својих потреба за информацијама, а монолитне архитектуре посустају под теретом ових захтјева.

Кључно грло у грлу је у крајњој линији питање контроле. Напредни модели су већ прилично добри у закључивању над фиксним контекстом. Међутим, најмоћнији системи вјештачке интелигенције захтијеваће способност усмјеравања начин на који се тај контекст преузима, обрађује, агрегира и приказује моделу.

Традиционални системи претраге нису дизајнирани са овим степеном контроле на уму. На крају крајева, од људских корисника се не може очекивати да врше прецизну контролу над интерним компонентама цјевовода претраге чак и ако би она била понуђена. Рани модели вјештачке интелигенције могу да контролишу претрагу само кроз линеарну путању позива функција и MCP-ова. Али данашњи напредни модели, покретани агенатским окружењима способним за рад са кодом, могу да врше прецизну контролу над било којим замисливим рачунским примитивима путем компјутерског кода. Наш задатак постаје да обезбиједимо праве примитеве.

Да бисмо одговорили на ову потребу, уводимо нову архитектуру претраге у свим нашим производима: Search as Code (SaC). Ова нова архитектура омогућава моделима да зађу у сам систем претраге умјесто да само конзумирају његове коначне резултате. Основна идеја је једноставна: излажемо компоненте система претраге као примитеве у оквиру SDK-а. За било који захтјев који захтијева претрагу, модел склапа ове примитеве по потреби у цјевовод преузимања прилагођен том специфичном захтјеву.

Склапање овог цјевовода се врши кроз генерацију кода и извршавање унутар безбједног sandbox-а. За разлику од других приступа претрази вођених генерацијом кода, ми не стављамо једноставно традиционални API претраге у оквир шкољке или језичког рунтајма. Умјесто тога, пажљиво смо пројектовали SDK за агентну претрагу који излаже појединачне градивне блокове претраге на што је могуће атомском нивоу.

Search as Code (SaC) унапређује границу перформанси агентне претраге кроз различит скуп референтних тестова.

Наоружан овим градивним блоковима, SaC даје моделима директну контролу над сваким појединачним кораком претраге: преузимањем, рангирањем, филтрирањем, рачвањем, приказивањем и другим. Такође пружа моделу ефикасан приступ средњем стању као што су листе кандидата и сигнали рангирања. Заједно, ове двије полуге контроле и читљивости омогућавају агентима да дизајнирају прилагођене цјевоводе претраге који обухватају хиљаде операција преузимања, оптимизују те цјевоводе у току рада и конзумирају само најкорисније информације као контекст модела.

Овај чланак описује мотивацију, дизајн и имплементацију SaC-а, заједно са емпиријским резултатима на постојећим и новим референтним тестовима. SaC успоставља нову границу цијене и перформанси за агенатску претрагу, и узбуђени смо што је дијелимо са нашим корисницима и широм заједницом вјештачке интелигенције.

Крутост традиционалне претраге

Први свјетски претраживачи изграђени су за људске кориснике. Ови корисници су очекивали предвидиво искуство, које се обично састојало од фиксног броја докумената рангираних по релевантности. Корисници нису жељели да микроменаџују процес претраге; жељели су да унесу упит и пронађу користан резултат.

Као резултат тога, претраживачи усмјерени на људе конвергирали су ка заједничкој монолитној архитектури, усмереној ка производњи страница са резултатима претраживача (SERP) погодних за људе које садрже првих n погодара за улазни упит. Овај образац је подржавао деценије напретка у потрошачкој претрази. Брз је, познат и врло ефикасан за прегледање од стране људи.

Затим су дошли језички модели великих размјера (LLM), а системи вјештачке интелигенције су такође постали потрошачи претраге. Perplexity је био пионир ове промјене са лансирањем нашег погона за одговоре 2022. године. Од тада су наши напори у инжењерингу претраге били усмјерени на то како да оптимизујемо вриједност резултата претраге за модела вјештачке интелигенције. Да бисмо изградили најтачнију и најпоузданију вјештачку интелигенцију на свијету, морали смо да конструишемо систем претраге усредсређен на то да сваки токен буде што је могуће информативно гушћи. Резултујуће иновације у преузимању поддокумената, ефикасности контекста, семантичком разумијевању и другим кључним областима довеле су до драматичних побољшања у способности система вјештачке интелигенције да преузимају информације и дјелују на основу њих.

Међутим, чак су и системи оптимизовани за вјештачку интелигенцију углавном насљедили исти основни уговор као и традиционални претраживачи: прихвати упит, покрени унапријед дефинисани цјевовод претраге, врати потпуно обрађен скуп резултата. За једноставне захтјеве овај приступ добро функционише. Међутим, за сложеније захтјеве ово постаје све ограниченије грло које деградира перформансе, кашњење и цијену.

Традиционални системи претраге приморавају агенатске токове рада да секвенционирају претрагу кроз окрете видљиве моделу. Модели морају више пута да позивају исте цјевоводе претраге преко различитих параметара упита и уносе све резултате у контекст модела.

Модални кварови услед крутости

Традиционални цјевоводи претраге су дизајнирани око једне тачке контроле: параметара упита. Претраживач посједује остатак цјевовода у складу са својом унапријед дефинисаном логиком, а модел мора да се прилагоди томе. За модел је све низводно од параметара упита круто — облик стварног израчунавања је ван контроле модела.

Ово је разумна граница када је потрошач човјек који прегледа везе. То је лоша граница када је потрошач модел вјештачке интелигенције који покушава да ријеши задатке који захтијевају много знања у затвореној петљи. по нашем искуству, ова крутост ствара три мода неуходања која се понављају:

Grub kontekst. AI modeli su osjetljivi na kvalitet i kompaktnost konteksta. I kvalitet i kompaktnost u velikoj mjeri zavise od upita, a monolitni pretraživački pipeline-ovi nijesu dizajnirani da optimalno rade za sve upite. Na primjer, ako modelu treba jedna, veoma precizno ciljano odabrana informacija, a pristup ima samo end-to-end pretraživačkom endpointu koji daje prioritet recall-u, korišćenje tog endpointa unijeće veliku količinu nerelevantnih informacija u kontekst modela. S druge strane, ako su modelu potrebni brojni dijelovi informacija, od kojih svaki zahtijeva različite strategije pretrage, može biti prinuđen da serijski poziva isti suboptimalni pipeline za sve njih, što dovodi do rastućih troškova i bučnog konteksta.

Неуспјех у коришћењу доменског знања. У многим случајевима, модел може имати доменско знање (из свог тренинга, агенатске вјештине, меморије или ранијих токена у LLM путањи) које би требало да води стратегију претраге. Међутим, крути интерфејс претраге спречава модел да искористи то знање. На примјер, модел може схватити за одређени захтјев да треба да помијеша лексичке и семантичке сигнале на одређени начин, да да приоритет одређеним изворима или да агрегира резултате по одређеном кључу. Осим ако се ти увиди не десе да су имплементабилни кроз параметре упита, модел заправо не може да дјелује на основу њих.

Неефикасна контрола тока и загађење контекста. Многи токови рада претраге нису природно серијски. Можда ће им требати рачвање преко варијанти упита, паралелно довлачење, дедупликација и друге операције које захтијевају нелинеаран и асинхрони ток контроле. Приморавање ових корака кроз поновљене окрете модела додаје кашњење и чини ток рада тежим за оптимизацију. Такође загађује контекст модела бучним средњим стањем које можда није корисно за закључивање модела, што резултира лошијим перформансама и чешћим компактирањима.

Мало се могло учинити по питању ових изазова током ера позивања функција и MCP-а вјештачке интелигенције. Када свака операција претраге захтијева сопствено повратни пут до LLM инференције, програмери природно више воле да убаце што је могуће више у тај повратни пут. Ово значи цјевоводе претраге од краја до краја који враћају потпуно обрађене скупове резултата за директну конзумацију од стране модела.

Као резултат тога, већина система претраге усмјерених на вјештачку интелигенцију и данас ради под овим монолитним уговором. Међутим, са континуираним растом интелигенције модела и захтјева корисника, недостаци тог уговора постају израженији. Данашњи најнапреднији системи вјештачке интелигенције, изграђени на врху окружења првог кода, могу да састављају токове рада специфичне за задатак који извршавају хиљаде акција сваког минута. Системи претраге тек треба да у потпуности остваре овај потенцијал.

Дуго смо сумњали да је права граница за претрагу изворну за вјештачку интелигенцију нижа у гомили. Модели не би требало само да позивају претраживач. Требало би да буду у стању да оркестрирају појединачне дијелове система претраге како то захтијева специфичан задатак. То захтијева суштински другачију архитектуру.

Дизајнирање програмабилне архитектуре претраге

Сљедећа генерација архитектура претраге засниваће се на основном принципу: претрага би требало да буде изворно програмабилна од стране агената вјештачке интелигенције. Агент не смије бити ограничен на скуп унапријед одређених цјевовода претраге. Умјесто тога, агент мора бити у стању да конструише цјевовод који захтијева специфичан задатак, користећи композибилне градивне блокове дизајниране на различитим нивоима апстракције.

Наша нова Search as Code (SaC) архитектура утјеловљује овај принцип. У SaC-у, ни једна једина операција преузимања се не шаље кроз интерфејс за позивање функција или MCP. Све операције су умјесто тога оркестриране путем Python кода који генерише модел. За најједноставније потребе претраге, овај код се може састојати од шачице захтјева за крајњу тачку претраге високог нивоа. Али за сложене задатке, код може бити сложен колико год је потребно, укључујући условско извршавање, асинхроност, паралелизам и позиве широком спектру примитива ниског нивоа.

Search as Code (SaC) архитектура се ослања на гомилу која обухвата моделе, рачунске sandbox-ове и SDK за агентну претрагу који се налази на врху инфраструктуре претраге компаније Perplexity.

SaC укључује три чврсто повезана слоја:

Модели служе као контролна раван. Они размишљају о директиви корисника (или матичног агента), разлажу директиву на задатке, одлучују који су цјевоводи за преузимање и обраду потребни за сваки задатак и генеришу код за имплементацију тих цјевовода.

Рачунски sandbox-ови пружају детерминистичко рачунање кроз безбједан рунтајм за извршавање кода. Они пружају платну за моделе за имплементацију тока контроле, сечења у бачеве, поновних покушаја, филтрирања, спајања, агрегације и других детерминистичких операција.

Наш SDK за агентну претрагу излаже систем претраге компаније Perplexity као композибилне примитеве. Он пружа градивне блокове од операција преузимања ниског нивоа до семантичког парсирања високог нивоа. SDK је уграђен у рунтајме за извршавање sandbox-ова, омогућавајући моделима да оркестрирају до хиљаде операција у оквиру једног окрета инференције. У наставку дискутујемо о нашим одлукама о дизајну за сваки слој.

SDK за агентну претрагу

SDK за агентну претрагу дефинише градивне блокове за програмабилну претрагу. Важно је напоменути да наш SDK није претходно постојећи API претраге пакован као библиотека. Током протеклих мјесеци, наш инжењерски тим је реархитектовао наш систем претраге у модуларне, композибилне примитеве. Изградили смо SDK за агентну претрагу како бисмо омогућили директан приступ овим примитивима, чинећи га много моћнијом платном на којој модел може да оркестрира цјевоводе преузимања специфичне за задатак.

Цјевоводи претраге високог нивоа, од краја до краја, су и даље доступни унутар SDK-а, али више нису једина опција. Умјесто тога, они служе као облик скраћенице за уобичајене обрасце претраге. Модел је слободан да их користи или заобиђе како то задатак захтијева.

Избор рунтајма: Размотрили смо Python, Rust, TypeScript и Bash као рунтајм за SDK. Сумњали смо да би Python био најприроднији избор с обзиром на његову свеприсуттност и екосистем библиотека за обраду података. Интерна тестирања су потврдила да је то тако, а верзија SDK-а која се данас пушта у рад заснована је на Python-у. Очекујемо да периодично ревидирамо избор рунтајма како бисмо осигурали да настави да пружа најбоље искуство за агенте.

Kontinuirano poboljšanje putem autoresearch-a: Takođe smo optimizovali upotrebljivost SDK-a za frontier LLM-ove kroz iterativnu autoresearch petlju. Ova petlja, koja neprekidno radi tokom sedmica, predlaže i validira poboljšanja SDK-a u odnosu na metrike koje uključuju latenciju, kvalitet generisanja koda i ukupne performanse zadatka. Autoresearch petlja je već napravila brojne promjene i u strukturi i u estetici SDK-a, sa značajnim dobitcima u svim dimenzijama. Planiramo da dalje dorađujemo SDK putem autoresearch-a kako se budu pojavljivali novi frontier modeli i komponente pretrage.

Sandbox-ови

Sandbox-ови пружају безбједна окружења за дефинисање и покретање SaC цјевовода. Они извршавају код који генерише модел, пружајући приступ SDK-у за агентну претрагу како би олакшали интеракцију са појединачним примитивима претраге.

Направили смо значајна улагања у оптимизацию и ојачавање наших sandbox-ова, а њихов свеобухватни системски дизајн заслужује посебан чланак. Овде се фокусирамо на разматрање дизајна које је најрелевантније за SaC: управљање међустањима.

SaC омогућава агентима да оркестрирају сложене цјевоводе у оквиру једног окрета инференције. Међутим, одређена међустања морају да се пренесу кроз окрете. На примјер, модел можда жели да добави неке документе у 1. окрету, прегледа подсузорак тих докумената у 2. окрету како би одлучио шта да ради даље, а затим развије низводни цјевовод претраге да даље истражи те документе од 3. окрета надалеко. Као што је горе дискутовано, прослеђивање међустања кроз простор токена није ефикасна стратегија.

Размотрили смо два приступа за управљање међустањима кроз окрете:

Трајни систем датотека + експлицитна сериализација/десеријализација: Sandbox-ови могу да изложе трајне системе датотека које модели могу да користе у свим окретима. Модели који желе да сачувају међустање могу да укључе корак сериализације у оквиру генерисаног кода за окрет, заједно са кораком десеријализације у наредном окрету (било за сопствену инспекцију модела или за низводну употребу). Приступ систему датотека омогућава моделима да директно и експлицитно контролишу како се међустање преноси кроз окрете. Такође осигурава могућност праћења наметањем експлицитне идентификације и перзистенције информација које користи модел. Једна мана је кашњење и преоптерећење контекста који настају генерацијом кода за сериализацију/десеријализацију, мада добро дизајниране помоћне функције могу ублажити ово оптерећење.

REPL: Алтернативно, sandbox може да сачува сам рунтајм за извршавање у свим окретима у окружењу у стилу REPL-а. Ово омогућава моделима да одржавају међустање у меморији без потребе да га уопште сериализују, пошто се на променљиве дефинисане или модификоване у претходним окретима може једноставно позвати по имену у наредним окретима. REPL приступ је ефикаснији у погледу токена јер избјегава потребу за генерацијом кода за сериализацију/десеријализацију. Међутим, недостатак експлицитног корака сериализације може штетити низводним перформансама из разлога који су познати свакоме ко је радио са Јупитер свеском од 100 ћелија: како простор назива променљивих постаје закрчен, постаје теже пратити шта је тачно сачувано у свим окретима и зашто.

Тестирали смо оба приступа и открили да иако раде слично при обичној употреби, сериализација и десеријализација засноване на систему датотека пружају бољу поузданост на посебно дугим путањама. Стога усвајамо сериализацију и десеријализацију засновану на систему датотека као наше рјешење. Претпостављамо да захтјев да модели преносе стање декларативно, а не имплицитно, помаже им да ефикасније управљају тим стањем. Ово је привремени налаз и наставићемо да понављамо оба приступа.

Модели

Модели који покрећу агенатска окружења служе као SaC-ова контролна раван: динамички склапају цјевоводе претраге из градивних блокова SDK-а за агентну претрагу како би задовољили потребе сваког задатка, а затим отпремају те цјевоводе као код за извршавање у sandbox-у.

Perplexity запошљава различите моделе у нашим агенатским окружењима, и открили смо да су најновији напредни модели прилично ефикасни у цијелини у општој генерацији кода. Главни изазов је подстицање ефикасне генерације кода посебно за SDK за агентну претрагу. Односно, како можемо натерати моделе да ефикасно уплићу градивне блокове нашег SDK-а у цјевоводе оптимизоване за задатак?

За разлику од стандардне библиотеке језика, мало је вјероватно да ће прилагођени SDK бити представљен у подацима за претходну обуку. Чак и са побољшањима потрошње SDK-а од аутоматског истраживања, многи модели се и даље обучавају за интеракцију са системима претраге кроз позиве функција и директно позивање MCP-а. Мало је вјероватно да ће ови модели стручно користити SDK само са изворним кодом и аутоматски генерисаним документима.

Da bismo riješili ovaj izazov, razvili smo visoko podešene Agent Skills kako bismo naučili modele da efikasno koriste naš SDK. Početne verzije su razvijene u skladu sa Perplexity-jevim dizajnerskim principima za Skills, a zatim optimizovane kroz namjensku autoresearch petlju fokusiranu na iste metrike koje se koriste u optimizaciji SDK-a. Takođe ograničavamo veličinu vještina kako bismo spriječili naduvavanje konteksta, a naše konačne verzije imaju manje od 2000 tokena u svojim korijenskim datotekama SKILL.md.

Оптимизоване вјештине иду даље од навођења доступних градивних блокова SDK-а (нешто што се подједнако лако може добити путем рунтајм рефлексије). Главни дио токена се троши на пружање сажетих, генерализујућих смјерница и примјера са мало примјера за састављање ових блокова у сложене обрасце. Наоружани овим вјештинама, приметимо да модели ефикасно користе SDK за оркестрацију цјевовода претраге који се скалирају на хиљаде дискретних операција.

Код као оркестратор и попуњавач празнина

Комбиновањем ових слојева, SaC мијења однос између модела и система претраге. У системима претраге са фиксним цјевоводом, модел стоји изнад претраге и ступа у интеракцију са њом кроз уски серијски интерфејс позивача. У SaC-у, модел постаје активан учесник у оркестрацији самог процеса претраге. Сви елементи система претраге постају директно програмабилни од стране модела, при чему sandbox и SDK за агентну претрагу обезбеђују неопходне интерфејсе за те елементе.

Али шта је са могућностима које не постоје изворно? Код је моћан медијум за оркестрацију претходно постојећих могућности. Ипак, моћ кода се протеже даље од оркестрације. Такође може да служи као попуњавач празнина за могућности које нису присутне у систему претраге или SDK-у. Агенти имају користи од парсимоније, и било би неефикасно да SDK покрива сваку потенцијалну операцију са намјенском функцијом. Умјесто тога, SDK обезбеђује најфундаменталније примитеве, а модел може да изгради било које додатне компоненте у ходу са кодом.

Размотримо, на примјер, сложени регуларни израз који се не може ефикасно имплементирати преко сопствене синтаксе упита система претраге. Без могућности кодирања, модел би био приморан да генерише своју најбољу апроксимацију, направи упит и изврши филтрирање у простору токена на веома бучном скупу резултата. Са SaC-ом, модел може умјесто тога да генерише програм који прави паралелне SDK позиве да прикупи суперскуп жељеног скупа резултата регуларног израза. Након дедупликације преко SDK-а, модел затим може да напише додатни код да детерминистички сузи резултате на тачан регуларни израз. На овај начин, агенти могу да имплементирају прилагођене могућности претраге без надувавања SDK-а превише нишним потпрограмима.

Студија случаја: Савјетодавна документа добављача за рањивости и изложености (CVE)

Представљамо студију случаја засновану на задатку из стварног свијета у оквиру нашег скупа за тестирање. Овај задатак тражи од агента да идентификује и окарактерише преко 200 CVE-ова високе озбиљности из периода 2023–2025. Сваки запис мора да цитира савјетодавни документ добављача на ког се то односи, наведе производ и верзију исправке и покаже да је верзија исправке повезана са специфичним CVE-ом.

SaC-ов одговор је остварио 100% тачности, при чему је укупна употреба токена опала за 85,1% у односу на основни почетни ниво без SaC-а (са 288,7K токена на 42,9K токена). Тестирани системи који нису из компаније Perplexity, о којима се детаљније расправља у Одељку 4, сви су остварили резултат мањи од 25%.

Представљамо три стилизована блока кода из путање да бисмо илустровали како SaC-ова програмабилност омогућава моделу да имплементира ефикасне стратегије.

python
# Part 1 of 3: fan out over official advisory formats. templates = [ ("Mozilla", 'site:mozilla.org/en-US/security/advisories/mfsa{year} ' '"CVE-{year}-" "Fixed in" "Impact high"'), ("Jenkins", 'site:jenkins.io/security/advisory/{year} ' '"CVE-{year}" "Severity" "High" "Fix"'), ("Chrome", 'site:chromereleases.googleblog.com/{year} ' '"High CVE-{year}" "Stable channel has been updated"'), ("Android", 'source.android.com/docs/security/bulletin/{year}-{month:02d}-01 ' '"High" "CVE-{year}"'), ... ] queries = [ {"vendor": vendor, "query": pattern.format(year=year, month=month)} for year in [2023, 2024, 2025] for vendor, pattern in templates for month in ([1] if "{month" not in pattern else range(1, 13)) ] seed_hits = sdk.search.web_many(queries, limit_per_query=8, concurrency=12) pages = [ {"vendor": q["vendor"], "url": h.url, "text": join_result_fields(h)} for q, hits in zip(queries, seed_hits) for h in hits if official_vendor_advisory(h.url, q["vendor"]) ]

Овај први блок је чиста оркестрација. Генерисани програм почиње директним кодирањем правила класе извора у план упита: само формата савјетодавних докумената у власништву добављача су релевантни. Извори који нису од добављача, укључујући NVD, MITRE, CVE Details, вијести, CERT странице и базе података трећих страна, структурно су ван опсега. Ограничења тачне фразе такође гурају претрагу ка страницама чији индексирани текст већ садржи прецизне детаље о CVE-у потребне низводно.

python
# Part 2 of 3: synthesize refinements for sparse vendor-years. coverage = summarize(pages, by=["vendor", "year", "url_kind"]) prompt = """ Goal: 230+ high or critical CVEs from official vendor advisories. Avoid aggregators, CERTs, news, NVD, MITRE, and CVE databases. Current coverage: {coverage} Suggest more site-scoped exact-phrase queries for sparse vendor-years. Prefer per-advisory pages over archive or month-index pages. Return JSON lines with vendor and query. """.format(coverage=coverage) raw = query_llm(prompt) expanded_queries = [ row for row in parse_jsonl(raw) if official_scope(row["query"]) and mentions_cve_year(row["query"]) ] expanded_hits = sdk.search.web_many( unique(expanded_queries), limit_per_query=8, concurrency=12, )

Други блок користи језички модел као посредни потпрограм за планирање. Код резимира који пар добављач-година производи довољно страница кандидата, тражи циљана пречишћавања и валидира сваки предложени упит прије извршавања. Ово чува корисне обрасце из путање, као што су пробијања тачне фразе са опсегом сајта и прилагодљиво попуњавање уназад, без уграђивања прилагођеног скенера CVE савјетодавних докумената у SDK.

python
# Part 3 of 3: verify CVE-to-version binding. all_hits = dedupe_by_url(flatten(seed_hits) + flatten(expanded_hits)) items = [ {"url": h.url, "vendor_hint": infer_vendor(h.url), "text": join_result_fields(h)} for h in all_hits if official_vendor_advisory(h.url, infer_vendor(h.url)) ] verified = sdk.llm.extract_many( items, instruction=( "Keep only vendor advisories where the page ties a high or critical " "CVE to a specific fixed version, build, patch, or security level." ), schema={ "matches": bool, "cve": str, "vendor": str, "product": str, "fix_version": str, "severity": str, "source_url": str, "evidence": str, "version_bound_to_cve": bool, "confidence": float, }, ) records = [ to_cve_record(x) for x in verified if x.matches and x.version_bound_to_cve if high_or_critical(x.severity) and x.confidence > 0.75 ] records = dedupe_by(records, key="cve")

Завршни блок је верификатор резултата чију је логику агент у потпуности дефинисао кроз генерацију кода. Док потпрограми претраге могу пронаћи вјероватне савјетодавне странице, задатак захтијева строжи однос: савјетодавни документ мора да повеже један CVE са једним погођеним производом и једном верзијом исправке у тексту чији је аутор добављач. Шема чини тај однос експлицитним, тако да низводни код може да уради дедупликацију по CVE-у, одбаци URL-ове агрегатора, одбаци слабе доказе о верзији и настави са попуњавањем уназад док се не постигне доња граница броја записа.

Резултати евалуације

Евалуирамо ефикасност SaC-а на свеобухватном скупу референтних тестова, фокусирајући се и на апсолутне перформансе и на границу цијене и перформанси.

Референтни тестови и системи

Наш скуп референтних тестова обухвата укупно пет референтних тестова, дизајнираних да изврше тест издржљивости токова рада вјештачке интелигенције који зависе од претраге у различитим доменским областима, форматима задатака и нивоима сложености. Користимо четири претходно постојећа референтна теста: DeepSearchQA (DSQA), BrowseComp, Humanity's Last Exam (HLE) и WideSearch. За прва три референтна теста (DSQA, BrowseComp и HLE), извештавамо о тачности као водећој метрици. За WideSearch, извештавамо о F1 скору по реду.

Такође користимо новоразвијени референтни тест WANDR, који се фокусира на тешке задатке „широког истраживања“ који захтијевају пажљиву оркестрацију претраге, рачунања и закључивања модела. WANDR је инспирисан професионалним задацима који захтијевају много знања које Perplexity Computer обрађује за кориснике. Он понавља WideSearch и сличне референтне тестове, али наглашава сложеније задатке и структуре задатака. Објавићемо WANDR референтни тест у наредним недјељама.

Евалуирамо пет система заснованих на агентима. Разматрамо појединачна извршавања умјесто скорова „најбоље од N“ како бисмо изоловали перформансе основне архитектуре умјесто бенефита паралелизације. Конфигурација сваког система је описана у наставку:

Perplexity (SaC): Евалуирамо SaC архитектуру у оквиру продукцијског Agent API-ја компаније Perplexity. GPT 5.5 (високо закључивање) служе као основни модел.

OpenAI: Евалуирамо OpenAI Responses API са омогућеном претрагом (web_search) и Python рунтајмом (code_interpreter). GPT 5.5 (високо закључивање) служи као основни модел.

Anthropic: Procjenjujemo Anthropic Managed Agents sa agent alatima 20260401 i komandama koje su automatski dozvoljene. Opus 4.7 (visoko rasuđivanje) služi kao osnovni model.

Exa: Евалуирамо Exa Agent преко продукцијског API-ја, са напором подешеним на високо.

Parallel: Евалуирамо Parallel Tasks преко продукцијског API-ја, са процесором подешеним на ultra4x.

Компаративне перформансе

Табела 1 извјештава о скоровима референтних тестова за сваки систем. SaC надмашује све остале системе на четири од пет референтних тестова. На преосталом референтном тесту (HLE), SaC је у суштини изједначен за прво мјесто са OpenAI Responses. Слика 2 из Увода визуелизује ове скорове у графичком облику.

Референтни тест

Perplexity (SaC)

OpenAI

Anthropic

Exa

Parallel

DSQA

0.871

0.733

0.815

0.530

0.810

BrowseComp

0.805

0.720

0.598

0.380

0.560

HLE

0.612

0.614

0.566

0.387

0.515

WideSearch

0.651

0.522

0.590

0.471

0.584

WANDR

0.386

0.130

0.152

0.057

0.126

Табела 1 | Скорови референтних тестова за сваки евалуирани систем. Најбољи скор по реду подебљан.

Иако SaC постиже перформансе на нивоу најсавременијих технологија широм скупа референтних тестова, његова предност је посебно изражена на WANDR-у. Слика 5 рашчлањује WANDR скорове, показујући да SaC имплементација компаније Perplexity надмашује следећи најбољи систем за фактор од 2,5×. Упркос овој великој маргини, WANDR остаје незасићен и показао се изазовним чак и за SaC. Вјерујемо да ће сложени, високо хоризонтални токови рада претраге који су потребни за WANDR-ове задатке захтијевати додатни напредак у истраживању и инжењерингу претраге да би се постигле константно високе перформансе.

WANDR скорови у свим евалуираним системима. Perplexity Agent API предњачи у односу на сљедећи најбољи систем за фактор од 2,5×.

Коначно, мјеримо релативне добитке SaC-а у поређењу са традиционалнијим цјевоводом претраге који користи исту инфраструктуру претраге компаније Perplexity. Слика 6 извештава о разлици у скоровима између SaC и не-SaC архитектура за сваки референтни тест. Свуда, SaC пружа значајан подстицај перформансама, са највећим апсолутним добитком на DSQA (+19,77 pp, 29%) и највећим релативним добитком на WANDR (+12,00 pp, 45%).

Perplexity основна линија наспрам SaC скора на сваком референтном тесту, са приказаним апсолутним и релативним делтама.

Граница цијене и перформанси

У пракси, корисници брину о перформансама у односу на цијену. Стога евалуирамо границу цијене и перформанси на DSQA и WideSearch-у. Мјеримо цијену и перформансе SaC-а на ниским, средњим и високим нивоима закључивања модела, заједно са другим системима. Слике 7 и 8 приказују скор референтног теста у односу на цијену по задатку, са обрнутом x-осом тако да су тачке даље удесно јефтиније, а тачке виши представљају боље перформансе.

DSQA скор у односу на цијену по задатку. Испрекидана линија повезује конфигурације закључивања SaC модела.

На DSQA-у, све три SaC поставке леже на горњој десној граници. Поставка ниског закључивања је јефтинија од свих осталих система док остварује боље резултате од двије од њих. Поставка средњег закључивања надмашује све системе који нису SaC за испод 1 долар по задатку. Поставка високог закључивања постиже врхунске перформансе уз конкурентну цијену.

WideSearch скор у односу на цијену по задатку. Испрекидана линија повезује конфигурације закључивања SaC модела.

WideSearch показује границу сличног облика. Као и код DSQA, поставка ниског закључивања постиже конкурентне перформансе уз нижу цијену од свих не-SaC система, док и средње и високо закључивање надмашују не-SaC системе у перформансама задатка.

Ка новој архитектури рачунарства

Search as Code одражава ширу промјену у дизајну софтвера. Деценијама су софтверски системи били организовани око детерминистичких инструкција које су извршавали традиционални рунтајми на CPU-овима. Напредни модели уводе нови облик рачунања: закључивање у простору токена које може и да прати и да генерише инструкције. Најспособнији рачунски системи комбиноваће ова два облика рачунања умјесто да бирају између њих.

Претрага је природно испитно тло за ову хибридну архитектуру. Модели су добро прилагођени одлучивању који су докази потребни и како несигурност треба да се ријеши. Детерминистички рунтајми су добро прилагођени за сечење у бачеве, паралелизам, филтрирање, рангирање и агрегацију. Инфраструктура претраге служе као универзални I/O слој, пружајући рунтајму корисне ручке за информације свијета које могу да подрже хиљаде операција у минуту. Када су ови дијелови интегрисани, резултујући систем је много моћнији и ефикаснији у извршавању задатака у стварном свијету.

Сваки дио ове архитектуре је неопходан да би се откључале ове могућности. Без интелигентних модела, систем не може да закључује о стратегији претраге. Без sandbox-ова, модели су приморани на серијски I/O и неефикасну обраду у простору токена. И без атомизованог система претраге, модел нема шта да оркестрира. SaC ради зато што су закључивање, детерминистичко рачунање и I/O заједнички дизајнирани да нагласе предности сваког слоја.

Овај заједнички дизајн се може отићи још даље кроз развој петљи континуираног побољшања. На примјер, SDK за агентну претрагу и SaC агенатске вјештине би се могли заједнички оптимизовати у заједничкој петљи аутоматског истраживања. Амбициозније, модели се могу обучити да искористе предности примитива претраге ниског нивоа изложених као SDK. Могло би се чак покушати са коэволуцијом дизајна SDK-а током самог процеса обуке модела. Радујемо се наставку агресивнијих стратегија заједничког дизајна у будућем раду.

Изградили смо SaC да бисмо омогућили моделима да контролишу процес претраге, умјесто да само конзумирају његове резултате. Наши резултати доказују моћ ове контроле: SaC унапређује и апсолутне перформансе и границу цијене и перформанси на референтним тестовима агената који захтијевају много знања. Узбуђени смо што доносимо могућности SaC-а нашим корисницима, почињући данас са системима Perplexity Computer и Agent API. Наставићемо да оптимизујемо SaC архитектуру у свим слојевима гомиле како бисмо осигурали да наши корисници (и агенти који их служе) имају најмоћније и најефикасније могуће могућности претраге.

Цитирање

BibTeX
@online{perplexity2026RethinkingSearchAsCodeGeneration,
  author = {{Perplexity} and Denis Bykov and Aleksandr Nikolenko and Artur Zayats and Maksim Gaiduk and Vitalii Polshkov and Akshay Nair and James Liounis and Kirill Priemko and Ryan Buchmayer and Phi Hoang and Jerry Ma},
  title = {{Rethinking search as code generation}},
  date = {2026-06-01},
  url = {https://perplexity.coolkeypoint.com/hub/blog/rethinking-search-as-code-generation}
}