Promena razmišljanja o pretrazi kao generisanju koda

Evolucija pretrage od monolitnih servisa do programabilnih primitiva za eru agentskih okvira.

AutoriPerplexity Research

Pretraga je osnovna komponenta za AI sisteme. Modeli najnovije generacije iz meseca u mesec postaju sposobniji, ali im je i dalje potreban pristup svežem, tačnom i dobro kuriranom znanju iz šireg sveta. Pretraga je primarni način na koji AI sistemi dolaze do tog znanja, i stoga predstavlja temeljnu komponentu svakog proizvoda koji treba da donosi zaključke, preduzima radnje i obavlja poslove u stvarnom svetu.

Verujemo da su tradicionalni cevovodi pretrage sve zastareliji u eri agenata. Tradicionalna pretraga odgovara na upite, ali današnji agenti obavljaju zadatke koji mogu imati bezbroj oblika. Ovi zadaci zahtevaju od agenata da definišu strategije preuzimanja specifične za zadatak direktno unutar svojih okvira. Unutar sistema Perplexity Computer, videli smo kako pojedinačni zadaci pokreću stotine ili čak hiljade operacija preuzimanja u roku od nekoliko minuta: radni tok koji je nemoguć za ljude, ali apsolutno prirodan za agente.

U ovom svetu, sama pretraga mora postati agentska, pri čemu su njeni gradivni blokovi dostupni direktno kao SDK-ovi unutar okvira agenta. Predstavljamo Search as Code (SaC) kao Perplexity-jevu novu referentnu arhitekturu pretrage.

Uvod

Perplexity-jev stek pretrage opslužuje hiljade upita svake sekunde u našim aplikacijama i API platformi. U septembru 2025. godine objavili smo prvi arhitektonski pregled naših sistema pretrage. Konstantne inovacije unutar ovih sistema podržale su lansiranje novih ponuda kao što su Search API, Agent API i Computer, dok petlje samousavršavanja optimizuju stek pretrage kako bi sa svakim danom što bolje služio korisnicima.

Tradicionalno, AI sistemi su pretragu tretirali kao monolit: AI model izdaje upit, mašina za pretragu pokreće svoj unapred definisani cevovod, a model koristi rezultate kao kontekst. U najvećoj meri, ovo je dobro funkcionisalo da zadovolji potrebe ranih korisnika veštačke inteligencije. S obzirom na relativnu jednostavnost njihovih zahteva, nije bilo razloga za brigu o tome kako je tačno projektovan cevovod pretrage, niti o tome da li je arhitektura cevovoda optimalna za dati zadatak. Podrazumevalo se da su podrazumevane postavke dovoljne, kao i podrazumevane interfejsi (pozivanje funkcija i MCP-jevi).

Tradicionalne arhitekture pretrage izlažu jedan fiksni sistem koji modeli pozivaju serijski, dok Search as Code izlaže atomizovane primitive pretrage koje agenti komponuju kroz generisani kod.

Ipak, danas ovaj pristup postaje sve zastareliji sa svakim mesecom koji prolazi. Korisnici zahtevaju mnogo više od analize u jednom koraku od veštačke inteligencije. Oni očekuju da agenti izvršavaju zadatke od početka do kraja tokom sati ili čak dana. Ovi zadaci mogu biti složeni, otvoreni i visoko promenljivi u pogledu svojih potreba za informacijama, a monolitne arhitekture pucaju pod teretom ovih zahteva.

Ključno usko grlo je u krajnjoj liniji pitanje kontrole. Modeli najnovije generacije su već prilično dobri u razmišljanju nad fiksnim kontekstom. Međutim, najmoćniji AI sistemi zahtevaće sposobnost upravljanja načinom na koji se taj kontekst preuzima, obrađuje, agregira i isporučuje modelu.

Tradicionalni sistemi pretrage nisu dizajnirani sa ovim stepenom kontrole na umu. Na kraju krajeva, od ljudskih korisnika se ne može očekivati da vrše finu kontrolu nad unutrašnjostima cevovoda pretrage čak i kada bi im to bilo ponuđeno. Rani AI modeli mogu da kontrolišu pretragu samo kroz linearnu putanju poziva funkcija i MCP-jeva. Ali današnji modeli najnovije generacije, vođeni agentskim okvirom sposobnim za kodiranje, mogu da vrše finu kontrolu nad bilo kojim računskim primitivima koji se mogu zamisliti pomoću računarskog koda. Naš zadatak je da obezbedimo prave primitive.

Da bismo zadovoljili ovu potrebu, uvodimo novu arhitekturu pretrage širom naših proizvoda: Search as Code (SaC). Ova nova arhitektura osnažuje modele da dopru do samog sloja pretrage, umesto da samo koriste njegove konačne izlazne rezultate. Osnovna ideja je jednostavna: komponente sloja pretrage izlažemo kao primitive unutar SDK-a. Za svaki zahtev koji zahteva pretragu, model po potrebi sklapa ove primitive u pipeline za pronalaženje informacija prilagođen tom konkretnom zahtevu.

Sklapanje ovog cevovoda vrši se kroz generisanje i izvršavanje koda unutar bezbednog okruženja (sandbox). Za razliku od drugih pristupa pretrazi vođenih generisanjem koda, mi ne stavljamo jednostavno tradicionalni API za pretragu unutar ljuske ili jezičkog okruženja za izvršavanje. Umesto toga, pažljivo smo konstruisali Agentic Search SDK koji izlaže pojedinačne gradivne blokove pretrage na najatomskijem mogućem nivou.

Search as Code (SaC) pomera granice performansi agentske pretrage kroz raznovrstan skup referentnih testova (benchmarks).

Naoružan ovim gradivnim blokovima, SaC daje modelima direktnu kontrolu nad svakim pojedinačnim korakom pretrage: preuzimanjem, rangiranjem, filtriranjem, širenjem (fanouts), renderovanjem i još mnogo toga. Takođe daje modelu efikasan pristup međustanju kao što su liste kandidata i signali rangiranja. Zajedno, ove dve poluge kontrole i čitkosti omogućavaju agentima da dizajniraju prilagođene cevovode pretrage koji obuhvataju hiljade operacija preuzimanja, optimizuju te cevovode u toku izvršavanja i troše samo najkorisnije informacije kao kontekst modela.

Ovaj članak opisuje motivaciju, dizajn i implementaciju SaC-a, zajedno sa empirijskim rezultatima na postojećim i novim referentnim testovima. SaC uspostavlja novu granicu troškova i performansi za agentsku pretragu, i uzbuđeni smo što je delimo sa našim korisnicima i širom AI zajednicom.

Rigidnost tradicionalne pretrage

Prvi svetski pretraživači napravljeni su za ljudske korisnike. Ovi korisnici su počeli da očekuju predvidljivo iskustvo, koje se obično sastoji od fiksnog broja dokumenata rangiranih po relevantnosti. Korisnici nisu želeli da mikromenadžerišu proces pretrage; želeli su da unesu upit i pronađu koristan rezultat.

Kao rezultat toga, pretraživači namenjeni ljudima konvergirali su ka zajedničkoj monolitnoj arhitekturi, usmerenoj ka proizvođenju stranica sa rezultatima pretraživača (SERP) pogodnih za ljude koje sadrže prvih n pogodaka za uneti upit. Ovaj obrazac pokreće decenije napretka u pretrazi za potrošače. Brz je, poznat i visoko efikasan za ljudsko pregledanje.

Zatim su došli jezički modeli (LLM), i AI sistemi su takođe postali potrošači pretrage. Perplexity je bio pionir u ovoj promeni pokretanjem našeg mašinskog motora za odgovore 2022. godine. Od tada su se naši napori u inženjeringu pretrage fokusirali na to kako da optimizujemo vrednost rezultata pretrage za AI modele. Da bismo izgradili najtačniji i najpouzdaniji AI na svetu, morali smo da konstruišemo sistem pretrage fokusiran na to da svaki token bude što je moguće gušći u informacijama. Rezultujuće inovacije u preuzimanju poddokumenata (sub-document retrieval), efikasnosti konteksta, semantičkom razumevanju i drugim ključnim oblastima dovele su do dramatičnih poboljšanja sposobnosti AI sistema da preuzimaju informacije i postupaju po njima.

Međutim, čak su i sistemi optimizovani za AI uglavnom nasledili isti fundamentalni ugovor kao i tradicionalni pretraživači: prihvati upit, pokreni unapred definisani cevovod pretrage, vrši u potpunosti obrađen skup rezultata. Za jednostavne zahteve, ovaj pristup dobro funkcionisari. Ali za složenije zahteve, ovo postaje sve veće ograničavajuće usko grlo koje narušava performanse, kašnjenje i cenu.

Tradicionalni sistemi pretrage primoravaju agentske radne tokove da sekvenciraju pretragu kroz obrte vidljive modelu. Modeli moraju više puta da pozivaju iste cevovode pretrage preko različitih parametara upita i uvode sve rezultate u kontekst modela.

Modi otkazivanja usled rigidnosti

Tradicionalni cevovodi pretrage su dizajnirani oko jedne tačke kontrole: parametara upita. Mašina za pretragu poseduje ostatak cevovoda u skladu sa svojom unapred definisanom logikom, i model mora da se prilagodi tome. Za model, sve što je nizvodno od parametara upita je rigidno — oblik stvarnog izračunavanja je van kontrole modela.

Ovo je razumna granica kada je potrošač čovek koji pregleda linkove. To je loša granica kada je potrošač AI model koji pokušava da reši zadatke koji zahtevaju mnogo znanja u zatvorenoj petlji. Po našem iskustvu, ova rigidnost stvara tri ponavljajuća moda otkaza:

Grubi kontekst. AI modeli su osetljivi na kvalitet i kompaktnost konteksta. I kvalitet i kompaktnost snažno zavise od upita, a monolitni cevovodi pretrage nisu dizajnirani da rade optimalno za sve upite. Na primer, ako je modelu potreban jedan, visoko hirurški deo informacije, ali ima pristup samo krajnjoj tački pretrage (endpoint) koja daje prioritet opozivu (recall), korišćenje te krajnje tačke uneće veliku količinu irelevantnih informacija u kontekst modela. Sa druge strane, ako je modelu potrebno mnogo delova informacija od kojih svaki zahteva različite strategije pretrage, može biti primoran da serijski poziva isti podoptimalan cevovod za sve njih, što rezultira vrtoglavim troškovima i bučnim kontekstom.

Neuspeh u iskorišćavanju domenskog znanja. U mnogim slučajevima, model može imati domensko znanje (iz svog treninga, agentske veštine (Agent Skill), memorije ili ranijih tokena u LLM putanji) koje bi trebalo da vodi strategiju pretrage. Međutim, rigidan interfejs pretrage sprečava model da iskoristi to znanje. Na primer, model može da shvati za određeni zahtev da treba da kombinuje leksičke i semantičke signale na određeni način, da da prioritet određenim izvorima ili da agregira rezultate po određenom ključu. Osim ako se ti uvidi ne mogu implementirati kroz parametre upita, model zapravo ne može da deluje u skladu sa njima.

Neefikasan kontrolni tok i zagađenje konteksta. Mnogi radni tokovi pretrage nisu prirodno serijski. Možda će im trebati širenje (fan-out) preko varijanti upita, paralelno preuzimanje, deduplikacija i druge operacije koje zahtevaju nelinearan i asinhroni kontrolni tok. Primoravanje ovih koraka kroz ponovljene obrte modela dodaje kašnjenje i otežava optimizaciju radnog toka. Takođe zagađuje kontekst modela bučnim međustanjem koje možda nije korisno za rezonovanje modela, što rezultira slabijim performansama i češćim kompresijama.

Malo šta se moglo učiniti povodom ovih izazova tokom era pozivanja funkcija i MCP-jeva u veštačkoj inteligenciji. Kada svaka operacija pretrage zahteva sopstveno povratno putovanje do LLM inferencije, programeri prirodno više vole da završe što više posla na tom povratnom putu. To znači da se cevovodi pretrage od početka do kraja vraćaju u potpunosti obrađene skupove rezultata za direktnu potrošnju od strane modela.

Kao rezultat toga, većina sistema pretrage okrenutih AI-ju danas i dalje radi po ovom monolitnom ugovoru. Međutim, sa kontinuiranim rastom inteligencije modela i zahteva korisnika, nedostaci tog ugovora postaju izraženiji. Današnji najnapredniji AI sistemi, izgrađeni na vrhu okvira koji stavljaju kod na prvo mesto (code-first), mogu da komponuju radne tokove specifične za zadatak koji izvršavaju hiljade radnji svakog minuta. Sistemi pretrage tek treba u potpunosti da ostvare ovaj potencijal.

Dugo smo sumnjali da je prava granica za pretragu izvornu za AI niže u steku. Modeli ne bi trebalo samo da pozivaju pretraživač. Trebalo bi da budu u mogućnosti da orkestriraju pojedinačne delove steka pretrage kako to specifičan zadatak zahteva. To zahteva suštinski drugačiju arhitekturu.

Dizajniranje programabilne arhitekture pretrage

Sledeća generacija arhitektura pretrage zavisiće od osnovnog principa: pretraga treba da bude nativno programabilna od strane AI agenata. Agent ne sme biti ograničen na skup unapred određenih cevovoda pretrage. Umesto toga, agent mora biti u stanju da konstruiše cevovod koji specifičan zadatak zahteva, koristeći složive gradivne blokove dizajnirane na različitim nivoima apstrakcije.

Naša nova Search as Code (SaC) arhitektura utelovljuje ovaj princip. U SaC-u, nijedna operacija preuzimanja se ne šalje preko poziva funkcije ili MCP interfejsa. Umesto toga, sve operacije se orkestriraju preko Python koda koji generiše model. Za najjednostavnije potrebe pretrage, ovaj kod se može sastojati od pregršt zahteva prema krajnjoj tački pretrage visokog nivoa. Ali za složene zadatke, kod može biti zamršen koliko god je potrebno, uključujući uslovno izvršavanje, asinhronost, paralelizam i pozive širokom spektru primitiva niskog nivoa.

Arhitektura Search as Code (SaC) oslanja se na stek koji se sastoji od modela, računskih okruženja (sandboxes) i Agentic Search SDK-a koji se nalazi na vrhu Perplexity-jeve infrastrukture za pretragu.

SaC uključuje tri čvrsto spregnuta sloja:

Modeli služe kao ravan kontrole (control plane). Oni razmišljaju o direktivi korisnika (ili roditeljskog agenta), razlažu direktivu na zadatke, odlučuju koji su cevovodi preuzimanja i obrade potrebni za svaki zadatak i generišu kod za primenu tih cevovoda.

Računska okruženja (sandboxes) obezbeđuju determinističko računanje kroz bezbedno okruženje za izvršavanje koda. Ona pružaju platno za modele da primene kontrolni tok, grupisanje u pakete (batching), ponovne pokušaje, filtriranje, spajanje (joining), agregaciju i druge determinističke operacije.

Naš Agentic Search SDK izlaže Perplexity-jev stek pretrage kao složive primitive. Pruža gradivne blokove od operacija preuzimanja niskog nivoa do semantičkog parsiranja visokog nivoa. SDK je ugrađen u okruženja za izvršavanje računskih okruženja, omogućavajući modelima da orkestriraju do hiljade operacija unutar jednog okreta inferencije. U nastavku diskutujemo o našim dizajnerskim odlukama za svaki sloj.

Agentic Search SDK

Agentic Search SDK definiše gradivne blokove za programabilnu pretragu. Važno je napomenuti da naš SDK nije unapred postojeći API za pretragu upakovan kao biblioteka. Tokom proteklih nekoliko meseci, naš inženjerski tim je rearhitektonirao naš stek pretrage u modularne, složive primitive. Izgradili smo Agentic Search SDK da obezbedimo direktan pristup ovim primitivima, čineći mnogo moćnije platno na kojem model može da orkestrira cevovode preuzimanja specifične za zadatak.

Cevovodi pretrage visokog nivoa od početka do kraja su i dalje dostupni unutar SDK-a, ali više nisu jedina opcija. Umesto toga, oni služe kao oblik skraćenice za uobičajene obrasce pretrage. Model je slobodan da ih koristi ili zaobiđe kako zadatak zahteva.

Izbor okruženja za izvršavanje (runtime): Razmatrali smo Python, Rust, TypeScript i Bash kao SDK okruženje za izvršavanje. Sumnjali smo da bi Python bio najprirodniji izbor s obzirom na njegovu sveprisutnost i ekosistem biblioteka za obradu podataka. Interno testiranje je potvrdilo da je to slučaj, a verzija SDK-a koja se danas uvodi zasnovana je na Python-u. Očekujemo da ćemo periodično reevaluirati izbor okruženja za izvršavanje kako bismo osigurali da i dalje pruža najbolje iskustvo za agente.

Kontinualno poboljšanje putem autorepretrage (autoresearch): Takođe smo optimizovali potrošnju SDK-a za jezičke modele najnovije generacije (frontier LLMs) kroz iterativnu petlju autorepretrage. Ova petlja, koja radi kontinuirano nedeljama, predlaže i validira poboljšanja SDK-a u odnosu na metrike uključujući kašnjenje, kvalitet generisanja koda i ukupne performanse zadatka. Petlja autorepretrage je već napravila brojne promene i u strukturi i u estetici SDK-a, uz značajne dobitke u svim dimenzijama. Planiramo da dodatno preciziramo SDK putem autorepretrage kako se budu pojavljivali novi modeli najnovije generacije i komponente pretrage.

Računska okruženja (Sandboxes)

Računska okruženja obezbeđuju bezbedna okruženja za definisanje i pokretanje SaC cevovoda. Ona izvršavaju kod generisan od strane modela, obezbeđujući pristup Agentic Search SDK-u radi olakšavanja interakcije sa individualnim primitivima pretrage.

Napravili smo značajna ulaganja u optimizaciju i ojačavanje naših računskih okruženja, i njihov sveobuhvatni dizajn sistema zaslužuje poseban članak. Ovde se fokusiramo na dizajnersko razmatranje koje je najrelevantnije za SaC: upravljanje međustanjima.

SaC osnažuje agente da orkestriraju složene cevovode unutar jednog okreta inferencije. Međutim, određena međustanja moraju da se prenesu kroz obrte. Na primer, model možda želi da dođe do nekih dokumenata u 1. obrtu, pregleda poduzorak tih dokumenata u 2. obrtu kako bi odlučio šta dalje da radi, a zatim razvije nizvodni cevovod pretrage kako bi dodatno istražio te dokumente od 3. okreta pa nadalje. Kao što je gore diskutovano, prosljeđivanje međustanja kroz prostor tokena nije efikasna strategija.

Razmotrili smo dva pristupa za upravljanje međustanjima kroz obrte:

Perzistentni sistem datoteka + eksplicitna serijalizacija/deserijalizacija (serde): Računska okruženja mogu da izlože perzistentne sisteme datoteka koje modeli mogu da koriste kroz obrte. Modeli koji žele da sačuvaju međustanje mogu da uključe korak serijalizacije unutar generisanog koda za obrt, zajedno sa korakom deserijalizacije unutar naknadnog okreta (bilo za sopstvenu inspekciju modela ili za nizvodnu upotrebu). Pristup sistemu datoteka omogućava modelima da direktno i eksplicitno kontrolišu kako se međustanje prenosi kroz obrte. Takođe osigurava sledljivost primoravanjem eksplicitne identifikacije i perzistencije informacija koje koristi model. Jedna loša strana je kašnjenje i opterećenje konteksta koje nastaje usled generisanja serde koda, mada dobro dizajnirane uslužne funkcije mogu ublažiti ovo opterećenje.

REPL: Alternativno, računsko okruženje može da sačuva samo okruženje za izvršavanje kroz obrte u okruženju u stilu REPL-a. Ovo omogućava modelima da održavaju međustanje u memoriji bez ikakve potrebe za njegovom serijalizacijom, pošto se promenljive definisane ili izmenjene u prethodnim obrtima mogu jednostavno referencirati po imenu u naknadnim obrtima. REPL pristup je efikasniji u pogledu tokena jer izbegava potrebu za generisanjem serde koda. Međutim, nedostatak eksplicitnog koraka serijalizacije može narušiti nizvodne performanse iz razloga poznatih svakome ko je radio sa Jupyter sveskom (notebook) od 100 ćelija: kako imenovni prostor promenljivih postaje pretrpan, postaje teže pratiti šta je tačno sačuvano kroz obrte i zašto.

Testirali smo oba pristupa i otkrili da iako rade slično u uobičajenoj upotrebi, serde zasnovan na sistemu datoteka obezbeđuje bolju pouzdanost na posebno dugim putanjama. Stoga usvajamo serde zasnovan na sistemu datoteka kao naše rešenje. Pretpostavljamo da zahtevanje od modela da prenose stanje deklarativno, a ne implicitno, pomaže im da efikasnije upravljaju tim stanjem. Ovo je preliminarni nalaz i nastavićemo da iteriramo na oba pristupa.

Modeli

Modeli koji pokreću okvire agenata služe kao SaC-ova ravan kontrole: dinamički sklapajući cevovode pretrage iz gradivnih blokova Agentic Search SDK-a kako bi zadovoljili potrebe svakog zadatka, a zatim šaljući te cevovode kao kod za izvršavanje u računskom okruženju.

Perplexity koristi različite modele unutar naših okvira agenata, i otkrili smo da su najnoviji modeli najnovije generacije prilično efikasni u celini u generisanju koda opšte namene. Glavni izazov je podsticanje efikasnog generisanja koda specifično za Agentic Search SDK. Odnosno, kako možemo naterati modele da efikasno isprepliću gradivne blokove našeg SDK-a u cevovode optimizovane za zadatke?

Za razliku od standardne biblioteke nekog jezika, malo je verovatno da će prilagođeni SDK biti predstavljen u podacima za pretreniranje. Čak i sa poboljšanjima potrošnje SDK-a iz autorepretrage, mnogi modeli su i dalje trenirani da komuniciraju sa sistemima pretrage kroz pozive funkcija i direktno MCP invokaciju. Malo je verovatno da će ovi modeli stručno baratati SDK-om samo sa izvornim kodom i automatski generisanim dokumentima.

Da bismo rešili ovaj izazov, razvili smo visoko podešene agentske veštine (Agent Skills) kako bismo naučili modele da efikasno koriste naš SDK. Inicijalne verzije su razvijene u skladu sa Perplexity-jevim principima dizajna za veštine, a zatim optimizovane kroz namensku petlju autorepretrage fokusiranu na iste metrike koje se koriste u optimizaciji SDK-a. Takođe ograničavamo veličinu veštine kako bismo se zaštitili od nadimanja konteksta, a naše konačne verzije imaju manje od 2000 tokena u svojim korenskim SKILL.md datotekama.

Optimizovane veštine idu dalje od navođenja dostupnih gradivnih blokova SDK-a (nečega što se jednako lako može dobiti putem refleksije tokom izvršavanja). Većina tokena se troši na obezbeđivanje sažetog, uopštivog uputstva i primera sa malo primera (few-shot) za sastavljanje ovih blokova u složene obrasce. Naoružani ovim veštinama, primećujemo da modeli efikasno koriste SDK za orkestriranje cevovoda pretrage koji se skaliraju na hiljade diskretnih operacija.

Kod kao orkestrator i popunjavač praznina

Kombinovanjem ovih slojeva, SaC menja odnos između modela i steka pretrage. U sistemima pretrage sa fiksnim cevovodom, model se nalazi iznad pretrage i komunicira sa njom kroz uski serijski pozivni interfejs. U SaC-u, model postaje aktivni učesnik u orkestriranju samog procesa pretrage. Svi elementi steka pretrage postaju direktno programabilni od strane modela, pri čemu računsko okruženje i Agentic Search SDK obezbeđuju neophodne interfejse ka tim elementima.

Ali šta je sa sposobnostima koje ne postoje nativno? Kod je moćan medijum za orkestriranje postojećih sposobnosti. Ipak, moć koda prevazilazi orkestraciju. On takođe može poslužiti kao popunjavač praznina za sposobnosti koje nisu prisutne u steku pretrage ili SDK-u. Agentima je potrebna parsimonija, i bilo bi neefikasno da SDK pokriva svaku potencijalnu operaciju sa namenskom funkcijom. Umesto toga, SDK obezbeđuje najfundamentalnije primitive, a model može izgraditi bilo koje dodatne komponente u hodu sa kodom.

Razmotrimo, na primer, složeni regularni izraz (regex) koji nije efikasno primenjiv preko sopstvene sintakse upita sistema pretrage. Bez mogućnosti kodiranja, model bi bio primoran da generiše svoju najbolju aproksimaciju, postavi upit i izvrši filtriranje u prostoru tokena na vrlo bučnom skupu rezultata. Sa SaC-om, model umesto toga može da generiše program koji pravi paralelne SDK pozive da prikupi nadskup skupa rezultata željenog regularnog izraza. Nakon deduplikacije putem SDK-a, model može zatim da napiše dodatni kod da deterministički suzi rezultate na tačan regularni izraz. Na ovaj način, agenti mogu da implementiraju prilagođene sposobnosti pretrage bez pretrpavanja SDK-a previše nišnim potprogramima.

Studija slučaja: CVE savetodavna obaveštenja dobavljača

Predstavljamo studiju slučaja zasnovanu na zadatku iz stvarnog sveta unutar našeg paketa za testiranje. Ovaj zadatak traži od agenta da identifikuje i okarakteriše preko 200 CVE-ova visoke ozbiljnosti iz perioda 2023–2025. Svaki zapis mora da citira sopstveno savetodavno obaveštenje pogođenog dobavljača, imenuje proizvod i verziju ispravke i pokaže da je verzija ispravke povezana sa određenim CVE-om.

SaC-ov odgovor je postigao 100% tačnosti, uz ukupnu potrošnju tokena koja je opala za 85,1% u odnosu na ne-SaC osnovnu vrednost (sa 288,7K tokena na 42,9K tokena). Testirani sistemi koji nisu iz Perplexity-ja, o kojima se detaljnije govori u Odeljku 4, postigli su manje od 25%.

Predstavljamo tri stilizovana bloka koda iz putanje da bismo ilustrovali kako SaC-ova programabilnost omogućava modelu da primeni efikasne strategije.

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"]) ]

Ovaj prvi blok je čista orkestracija. Generisani program počinje kodiranjem pravila klase izvora direktno u plan upita: relevantni su samo formati savetodavnih obaveštenja čiji je vlasnik dobavljač. Izvori koji nisu od dobavljača, uključujući NVD, MITRE, CVE Details, vesti, CERT stranice i baze podataka trećih strana, strukturno su van opsega. Ograničenja tačne fraze takođe guraju pretragu ka stranicama čiji indeksirani tekst već sadrži precizne CVE detalje potrebne nizvodno.

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, )

Drugi blok koristi LLM kao međupotprogram za planiranje. Kod rezimira koji parovi dobavljač-godina proizvode dovoljno stranica kandidata, traži ciljana preciziranja i validira svaki predloženi upit pre izvršavanja. Ovo čuva korisne obrasce sa putanje, kao što su sonde tačne fraze opsega sajta i adaptivno popunjavanje, bez hardkodovanja prilagođenog CVE-savetodavnog sakupljača (crawler) u 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")

Konačni blok je verifikator rezultata čiju logiku u potpunosti definiše agent putem generisanja koda. Dok potprogrami pretrage mogu pronaći plauzibilne savetodavne stranice, zadatak zahteva strožu relaciju: savetodavno obaveštenje mora da poveže jedan CVE sa jednim pogođenim proizvodom i jednom verzijom ispravke u tekstu koji je napisao dobavljač. Šema čini tu relaciju eksplicitnom, tako da nizvodni kod može da izvrši deduplikaciju po CVE-u, odbaci agregator URL-ove, odbaci dokaze o slabim verzijama i nastavi popunjavanje sve dok se ne ispuni donja granica broja zapisa.

Rezultati evaluacije

Evaluiramo efikasnost SaC-a na sveobuhvatnom paketu referentnih testova, fokusirajući se i na apsolutne performanse i na granicu troškova i performansi.

Referentni testovi i sistemi

Naš paket referentnih testova obuhvata ukupno pet referentnih testova, dizajniranih da testiraju pod stresom AI radne tokove zavisne od pretrage u opsegu domena, formata zadataka i nivoa složenosti. Koristimo četiri postojeća referentna testa: DeepSearchQA (DSQA), BrowseComp, Humanity's Last Exam (HLE) i WideSearch. Za prva tri referentna testa (DSQA, BrowseComp i HLE), izveštavamo o tačnosti kao vodećoj metrici. Za WideSearch izveštavamo o F1 meri po redu.

Takođe koristimo novo razvijeni WANDR referentni test, koji se fokusira na teške „široke istraživačke“ zadatke koji zahtevaju pažljivu orkestraciju pretrage, računanja i rezonovanja modela. WANDR je inspirisan profesionalnim zadacima koji zahtevaju mnogo znanja i koje Perplexity Computer obavlja za korisnike. On iterira na WideSearch-u i sličnim referentnim testovima, ali naglašava složenije zadatke i strukture zadataka. Objavićemo WANDR referentni test u predstojećim nedeljama.

Evaluiramo pet sistema zasnovanih na agentima. Razmatramo pojedinačna pokretanja umesto „best-of-N“ rezultata kako bismo izolovali performanse osnovne arhitekture umesto prednosti paralelizacije. Konfiguracija svakog sistema je opisana u nastavku:

Perplexity (SaC): Evaluiramo SaC arhitekturu unutar Perplexity-jevog produkcionog Agent API-ja. GPT 5.5 (visoko rezonovanje) služi kao osnovni model.

OpenAI: Evaluiramo OpenAI Responses API sa omogućenom pretragom (web_search) i Python okruženjem za izvršavanje (code_interpreter). GPT 5.5 (visoko rezonovanje) služi kao osnovni model.

Anthropic: Evaluiramo Anthropic Managed Agents sa skupom alata za agente 20260401 i automatski dozvoljenim komandama. Opus 4.7 (visoko rezonovanje) služi kao osnovni model.

Exa: Evaluiramo Exa Agent preko produkcionog API-ja, sa naporom postavljenim na visoko.

Parallel: Evaluiramo Parallel Tasks preko produkcionog API-ja, sa procesorom postavljenim na ultra4x.

Uporedne performanse

Tabela 1 izveštava o rezultatima referentnih testova za svaki sistem. SaC nadmašuje sve druge sisteme na četiri od pet referentnih testova. Na preostalom referentnom testu (HLE), SaC je u suštini izjednačen za prvo mesto sa OpenAI Responses. Slika 2 iz Uvoda vizuelizuje ove rezultate u grafičkom obliku.

Referentni test

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

Tabela 1 | Rezultati referentnih testova za svaki evaluirani sistem. Najbolji rezultat po redu je u podebljanim slovima.

Iako SaC postiže performanse na nivou savremenih dostignuća (state-of-the-art) širom paketa referentnih testova, njegova prednost je posebno izražena na WANDR-u. Slika 5 razlaže WANDR rezultate, pokazujući da Perplexity-jeva SaC implementacija nadmašuje sistem koji je sledeći najbolji za faktor od 2,5×. Uprkos ovoj velikoj margini, WANDR ostaje nezasićen i pokazujese izazovnim čak i za SaC. Verujemo da će složeni, visoko horizontalni radni tokovi pretrage koje zahtevaju WANDR-ovi zadaci zahtevati dodatni napredak u istraživanju i inženjeringu pretrage kako bi se postigle dosledno visoke performanse.

WANDR rezultati širom evaluiranih sistema. Perplexity Agent API vodi u odnosu na sledeći najbolji sistem za faktor od 2,5×.

Konačno, merimo relativne dobitke SaC-a u odnosu na tradicionalniji cevovod pretrage koji koristi istu Perplexity infrastrukturu za pretragu. Slika 6 izveštava o razlici u rezultatima između SaC i ne-SaC arhitektura širom svakog referentnog testa. U celini, SaC obezbeđuje značajan podsticaj u performansama, sa najvećim apsolutnim dobitkom na DSQA (+19,77 pp, 29%) i najvećim relativnim dobitkom na WANDR-u (+12,00 pp, 45%).

Perplexity osnovna vrednost u odnosu na SaC rezultat na svakom referentnom testu, sa anotomiranim apsolutnim i relativnim deltama.

Granica troškova i performansi

U praksi, korisnici brinu o performansama u odnosu na cenu. Stoga evaluiramo granicu troškova i performansi na DSQA i WideSearch-u. Merimo cenu i performanse SaC-a na niskom, srednjem i visokom nivou rezonovanja modela, uz druge sisteme. Slike 7 i 8 crtaju rezultat referentnog testa u odnosu na cenu po zadatku, sa obrnutom x-osom tako da su tačke koje su dalje desno jeftinije, a tačke više predstavljaju bolje performanse.

DSQA rezultat u odnosu na cenu po zadatku. Isprekidana linija povezuje konfiguracije rezonovanja SaC modela.

Na DSQA, sva tri SaC podešavanja leže na gornjoj desnoj granici. Podešavanje niskog rezonovanja je jeftinije od svih drugih sistema dok radi bolje od dva od njih. Podešavanje srednjeg rezonovanja nadmašuje sve sisteme koji nisu SaC za manje od 1 USD po zadatku. Podešavanje visokog rezonovanja postiže vrhunske performanse uz konkurentnu cenu.

WideSearch rezultat u odnosu na cenu po zadatku. Isprekidana linija povezuje konfiguracije rezonovanja SaC modela.

WideSearch pokazuje slično oblikovanu granicu. Kao i kod DSQA, podešavanje niskog rezonovanja postiže konkurentne performanse uz nižu cenu od svih sistema koji nisu SaC, dok i srednje i visoko rezonovanje nadmašuju sisteme koji nisu SaC u performansama zadataka.

Ka novoj arhitekturi računarstva

Search as Code odražava širu promenu u dizajnu softvera. Decenijama su softverski sistemi bili organizovani oko determinističkih instrukcija koje su izvršavala tradicionalna okruženja za izvršavanje na CPU-ovima. Modeli najnovije generacije uvode novi oblik računanja: rezonovanje u prostoru tokena koje može i da prati i da generiše instrukcije. Najsposobniji računski sistemi kombinuće ova dva oblika računanja umesto da biraju između njih.

Pretraga je prirodno polje za dokazivanje ove hibridne arhitekture. Modeli su pogodni za odlučivanje koji su dokazi potrebni i kako treba rešiti nesigurnost. Deterministička okruženja za izvršavanje su pogodna za grupisanje u pakete, paralelizam, filtriranje, rangiranje i agregaciju. Infrastruktura pretrage služi kao univerzalni I/O sloj, obezbeđujući okruženju za izvršavanje korisne ručke u informacije sveta koje mogu da podrže hiljade operacija u minuti. Kada su ovi delovi integrisani, rezultujući sistem je mnogo moćniji i efikasniji u obavljanju zadataka u stvarnom svetu.

Svaki deo ove arhitekture je neophodan da bi se otključale ove sposobnosti. Bez inteligentnih modela, sistem ne može da rezonuje o strategiji pretrage. Bez računskih okruženja, modeli su primorani na serijski I/O i neefikasnu obradu u prostoru tokena. I bez atomizovanog steka pretrage, model nema šta da orkestrira. SaC radi zato što su rezonovanje, determinističko računanje i I/O zajednički dizajnirani da istaknu snagu svakog sloja.

Ovaj zajednički dizajn (codesign) se može poneti još dalje kroz razvoj petlji kontiniualnog poboljšanja. Na primer, Agentic Search SDK i SaC Agent Skills mogu biti zajednički optimizovani u zajedničkoj petlji autorepretrage. Ambicioznije, modeli se mogu trenirati da iskoriste primitive pretrage niskog nivoa izložene kao SDK. Može se čak pokušati sa koevolucijom dizajna SDK-a tokom samog procesa treniranja modela. Radujemo se nastavljanju agresivnijih strategija zajedničkog dizajna u budućem radu.

Izgradili smo SaC da omogućimo modelima da kontrolišu proces pretrage, umesto da samo troše njegove rezultate. Naši rezultati dokazuju moć ove kontrole: SaC unapređuje i apsolutne performanse i granicu troškova i performansi na agentskim referentnim testovima koji zahtevaju mnogo znanja. Uzbuđeni smo što donosimo sposobnosti SaC-a našim korisnicima, počevši od danas sa Perplexity Computer-om i Agent API-jem. Nastavićemo da optimizujemo SaC arhitekturu širom svih slojeva steka kako bismo osigurali da naši korisnici (i agenti koji im služe) imaju najmoćnije i najefikasnije moguće sposobnosti pretrage.

Citiranje

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}
}