Promišljanje pretraživanja kao generiranja koda
Razvoj pretraživanja s monolitnih usluga na programabilne primitive za eru okvira agenata.
Pretraživanje je temeljna primitivna funkcija za AI sustave. Vodeći modeli napredovali su po mogućnostima iz mjeseca u mjesec, ali im je i dalje potreban pristup svježem, točnom i dobro kuriranom znanju iz šireg svijeta. Pretraživanje je primarni način na koji AI sustavi dolaze do tog znanja i stoga predstavlja temeljnu komponentu svakog proizvoda koji treba donositi zaključke, poduzimati radnje i obavljati zadatke u stvarnom svijetu.
Vjerujemo da su tradicionalni cjevovodi pretraživanja sve zastarjeliji u eri agenata. Tradicionalno pretraživanje odgovara na upite, ali današnji agenti ispunjavaju zadatke koji mogu poprimiti bezbroj oblika. Ovi zadaci zahtijevaju od agenata da definiraju strategije pronalaženja specifične za zadatak izravno unutar svojih okvira. Unutar sustava Perplexity Computer vidjeli smo da pojedinačni zadaci pokreću stotine ili čak tisuće operacija pronalaženja unutar nekoliko minuta: tijek rada koji je nemoguć za ljude, ali apsolutno prirodan za agente.
U ovom svijetu, sama pretraga mora postati agentska, pri čemu su njezini građevni blokovi dostupni izravno kao SDK-ovi unutar okvira agenta. Predstavljamo Search as Code (SaC) kao novu referentnu arhitekturu pretraživanja za Perplexity.
Uvod
Infrastruktura pretraživanja za Perplexity opslužuje tisuće upita svake sekunde u našim aplikacijama i API platformi. U rujnu 2025. objavili smo prvi arhitektonski pregled naših sustava za pretraživanje. Stalne inovacije unutar ovih sustava podržale su lansiranje novih ponuda kao što su Search API, Agent API i Computer, s petljama samousavršavanja koje optimiziraju infrastrukturu pretraživanja kako bi sa svakim danom još bolje služila korisnicima.
Tradicionalno su AI sustavi pretraživanje tretirali kao monolit: AI model izdaje upit, tražilica pokreće svoj unaprijed definirani cjevovod, a model konzumira rezultate kao kontekst. Većim dijelom to je funkcioniralo sasvim dobro za potrebe ranih AI korisnika. S obzirom na relativnu jednostavnost njihovih zahtjeva, nije bilo razloga za brigu o tome kako je točno cjevovod pretraživanja dizajniran ili je li arhitektura cjevovoda optimalna za zadani zadatak. Pretpostavljalo se da su zadane postavke dovoljno dobre, kao i zadana sučelja (pozivanje funkcija i MCP-ovi).
Ipak, danas ovaj pristup postaje sve zastarjeliji sa svakim proteklim mjesecem. Korisnici zahtijevaju puno više od jednokratne analize od umjetne inteligencije. Očekuju da agenti dovrše zadatke od početka do kraja tijekom nekoliko sati ili čak dana. Ovi zadaci mogu biti složeni, otvoreni i visoko promjenjivi u svojim potrebama za informacijama, a monolitne arhitekture pucaju pod težinom tih zahtjeva.
Ključno usko grlo u konačnici je kontrola. Vodeći modeli već su prilično dobri u rasuđivanju nad fiksnim kontekstom. Međutim, najmoćniji AI sustavi zahtijevat će sposobnost upravljanja načinom na koji se taj kontekst dohvaća, obrađuje, agregira i prikazuje modelu.
Tradicionalni sustavi pretraživanja nisu dizajnirani imajući na umu ovaj stupanj upravljivosti. Uostalom, od ljudskih se korisnika ne može očekivati da vrše finu kontrolu nad unutarnjim dijelovima cjevovoda pretraživanja, čak i kada bi im to bilo ponuđeno. Rani AI modeli mogu kontrolirati pretraživanje samo kroz linearnu putanju poziva funkcija i MCP-ova. Ali današnji vodeći modeli, vođeni okvirima agenata sposobnima za rad s kodom, mogu vršiti finu kontrolu nad bilo kojim računalnim primitivima koji se mogu zamisliti putem računalnog koda. Naš zadatak postaje osigurati prave primitive.
Kako bismo zadovoljili tu potrebu, uvodimo novu arhitekturu pretraživanja u svim našim proizvodima: Search as Code (SaC). Ova nova arhitektura omogućuje modelima da dosegnu u sam pretraživački sloj umjesto da samo koriste njegove konačne izlaze. Ključna je ideja jednostavna: komponente pretraživačkog sloja izlažemo kao primitive unutar SDK-a. Za svaki zahtjev koji treba pretraživanje, model te primitive po potrebi sastavlja u dohvatni cjevovod prilagođen upravo tom konkretnom zahtjevu.
Sastavljanje ovog cjevovoda vrši se generiranjem koda i izvršavanjem unutar sigurnog sandboxed okruženja. Za razliku od drugih pristupa pretraživanju vođenih generiranjem koda, mi jednostavno ne stavljamo tradicionalni API za pretraživanje unutar ljuske ili jezičnog izvođenja. Umjesto toga, pomno smo osmislili Agentic Search SDK koji izlaže pojedinačne građevne blokove pretraživanja na najatomskijoj mogućoj razini.
Naoružan ovim građevnim blokovima, SaC daje modelima izravnu kontrolu nad svakim pojedinačnim korakom pretraživanja: pronalaženjem, rangiranjem, filtriranjem, širenjem, ispisom i više. Također daje modelu učinkovit pristup međustanjima kao što su liste kandidata i signali rangiranja. Zajedno, ove dvije poluge kontrole i čitljivosti omogućuju agentima da dizajniraju prilagođene cjevovode pretraživanja koji obuhvaćaju tisuće operacija pronalaženja, optimiziraju te cjevovode u hodu i konzumiraju samo najkorisnije informacije kao kontekst modela.
Ovaj članak opisuje motivaciju, dizajn i implementaciju SaC-a, uz empirijske rezultate o postojećim i novim mjerilima. SaC uspostavlja novu granicu cijene i performansi za agentsko pretraživanje, i s uzbuđenjem ga dijelimo s našim korisnicima i široj AI zajednici.
Rigidnost tradicionalnog pretraživanja
Prve svjetske tražilice izgrađene su za ljudske korisnike. Ti su korisnici očekivali predvidljivo iskustvo, koje se obično sastojalo od fiksnog broja dokumenata rangiranih po važnosti. Korisnici nisu željeli mikroupravljati procesom pretraživanja; željeli su unijeti upit i pronaći koristan rezultat.
Kao rezultat toga, tražilice namijenjene ljudima konvergirale su prema zajedničkoj monolitnoj arhitekturi, usmjerenoj na stvaranje stranica s rezultatima pretraživanja prilagođenih ljudima (SERP) koje sadrže prvih n pogodaka za ulazni upit. Ovaj obrazac pokreće desetljeća napretka u pretraživanju za potrošače. Brz je, poznat i vrlo učinkovit za surfanje ljudi.
Zatim su došli jezični modeli (LLM), a AI sustavi su također postali korisnici pretraživanja. Perplexity je bio pionir u ovoj promjeni lansiranjem našeg stroja za odgovore 2022. godine. Od tada su se naši napori u inženjeringu pretraživanja usredotočili na to kako optimizirati vrijednost rezultata pretraživanja za AI modele. Kako bismo izgradili najtočniji i najpouzdaniji AI na svijetu, morali smo projektirati sustav pretraživanja usredotočen na to da svaki token bude informacijski što gušći. Rezultirajuće inovacije u dohvaćanju poddokumenata, učinkovitosti konteksta, semantičkom razumijevanju i drugim ključnim područjima dovele su do dramatičnih poboljšanja u sposobnosti AI sustava da dohvaćaju informacije i djeluju na temelju njih.
Međutim, čak su i sustavi optimizirani za AI uglavnom naslijedili isti temeljni ugovor kao i tradicionalne tražilice: prihvati upit, pokreni unaprijed definirani cjevovod pretraživanja, vrati u potpunosti obrađen skup rezultata. Za jednostavne zahtjeve ovaj pristup funkcionira dobro. Ali za složenije zahtjeve, ovo postaje sve veće usko grlo koje narušava performanse, latenciju i trošak.
Načini neuspjeha proizašli iz rigidnosti
Tradicionalni cjevovodi pretraživanja dizajnirani su oko jedne točke kontrole: parametara upita. Tražilica posjeduje ostatak cjevovoda u skladu sa svojom unaprijed definiranom logikom, a se model joj se mora prilagoditi. Za model je sve što se nalazi nizvodno od parametara upita rigidno – oblik stvarnog izračuna izvan je kontrole modela.
Ovo je razumna granica kada je potrošač čovjek koji pregledava poveznice. Loša je granica kada je potrošač AI model koji pokušava riješiti zadatke intenzivne znanjem u zatvorenoj petlji. Po našem iskustvu, ova rigidnost stvara tri ponavljajuća načina neuspjeha:
Grubi kontekst. AI modeli su osjetljivi na kvalitetu i kompaktnost konteksta. I kvaliteta i kompaktnost uvelike ovise o upitu, a monolitni cjevovodi pretraživanja nisu dizajnirani za optimalan rad u svim upitima. Na primjer, ako modelu treba jedan, vrlo kirurški dio informacija, ali ima pristup samo krajnjoj točki pretraživanja od kraja do kraja koja daje prednost prisjećanju, korištenje te krajnje točke uvest će veliku količinu irelevantnih informacija u kontekst modela. S druge strane, ako modelu treba mnogo dijelova informacija od kojih svaki zahtijeva različite strategije pretraživanja, možda će biti prisiljen serijski pozivati isti podoptimalni cjevovod za sve njih, što rezultira rastućim troškovima i bučnim kontekstom.
Neuspjeh u iskorištavanju domenskog znanja. U mnogim slučajevima model može imati domensko znanje (iz svog treninga, vještine agenta, memorije ili ranijih tokena u LLM putanji) koje bi trebalo voditi strategiju pretraživanja. Međutim, kruto sučelje za pretraživanje sprječava model da iskoristi to znanje. Na primjer, model može shvatiti za određeni zahtjev da bi trebao spojiti leksičke i semantičke signale na određeni način, dati prednost određenim izvorima ili agregirati rezultate prema određenom ključu. Osim ako se ti uvidi ne mogu implementirati kroz parametre upita, model zapravo ne može djelovati na njih.
Neučinkovit tijek kontrole i zagađenje konteksta. Mnogi tijekovi rada pretraživanja nisu prirodno serijski. Možda će im trebati širenje (fan-out) preko varijanti upita, paralelno dohvaćanje, uklanjanje duplikata i druge operacije koje zahtijevaju nelinearni i asinkroni tijek kontrole. Prisiljavanje ovih koraka kroz ponovljene okrete modela dodaje latenciju i otežava optimizaciju tijeka rada. Također zagađuje kontekst modela bučnim međustanjem koje možda neće biti korisno za zaključivanje modela, što rezultira lošijim performansama i češćim sabijanjima.
Malo se toga moglo učiniti u vezi s tim izazovima tijekom pozivanja funkcija & MCP era AI. Kada svaka operacija pretraživanja zahtijeva vlastito povratno putovanje do zaključivanja LLM-a, programeri prirodno radije obave što više posla u tom povratnom putovanju. To znači cjevovode pretraživanja od kraja do kraja koji vraćaju u potpunosti obrađene skupove rezultata za izravnu potrošnju od strane modela.
Kao rezultat toga, većina sustava za pretraživanje usmjerenih na AI i danas radi pod ovim monolitnim ugovorom. Međutim, s kontinuiranim rastom inteligencije modela i zahtjeva korisnika, nedostaci tog ugovora postaju izraženiji. Današnji najnapredniji AI sustavi, izgrađeni na vrhovima okvira koji su prvenstveno usmjereni na kod, mogu sastaviti tijekove rada specifične za zadatak koji izvršavaju tisuće radnji svake minute. Sustavi pretraživanja tek trebaju u potpunosti ostvariti ovaj potencijal.
Dugo smo sumnjali da je prava granica za pretraživanje izvorno prilagođeno umjetnoj inteligenciji niže u stog. Modeli ne bi trebali samo pozivati tražilicu. Trebali bi biti u mogućnosti orkestrirati pojedinačne dijelove stoga pretraživanja kako to specifičan zadatak zahtijeva. To zahtijeva temeljno drugačiju arhitekturu.
Dizajniranje programabilne arhitekture pretraživanja
Sljedeća generacija arhitektura pretraživanja ovisit će o temeljnom načelu: pretraživanje bi trebalo biti izvorno programabilno od strane AI agenata. Agent ne smije biti ograničen na skup unaprijed određenih cjevovoda pretraživanja. Umjesto toga, agent mora biti u stanju konstruirati cjevovod koji specifičan zadatak zahtijeva, koristeći složive građevne blokove dizajnirane na različitim razinama apstrakcije.
Naša nova arhitektura Search as Code (SaC) utjelovljuje ovo načelo. U SaC-u se niti jedna operacija pronalaženja ne šalje putem pozivanja funkcije ili MCP sučelja. Umjesto toga, sve se operacije orkestriraju putem Python koda koji generira model. Za najjednostavnije potrebe pretraživanja, ovaj se kod može sastojati od nekoliko zahtjeva prema krajnjoj točki pretraživanja visoke razine. Ali za složene zadatke, kod može biti složen koliko je potrebno, uključujući uvjetno izvršavanje, asinkronost, paralelizam i pozive širokom rasponu primitivnih funkcija niske razine.
SaC uključuje tri čvrsto povezana sloja:
Modeli služe kao ravnina kontrole. Oni razmatraju direktivu korisnika (ili roditeljskog agenta), rastavljaju direktivu na zadatke, odlučuju koji su cjevovodi pronalaženja i obrade potrebni za svaki zadatak i generiraju kod za implementaciju tih cjevovoda.
Računalna sandboxed okruženja pružaju determinističko računalno okruženje kroz sigurno vrijeme izvođenja koda. Oni pružaju platno za modele za implementaciju tijeka kontrole, grupnog procesiranja (batching), ponovnih pokušaja, filtriranja, spajanja, agregacije i drugih determinističkih operacija.
Naš Agentic Search SDK izlaže infrastrukturu pretraživanja za Perplexity kao složive primitive. Pruža građevne blokove od operacija pronalaženja niske razine do semantičke analize visoke razine. SDK je ugrađen u vremena izvođenja sandboxed okruženja, omogućujući modelima da orkestriraju do tisuće operacija unutar jednog okreta zaključivanja. U nastavku raspravljamo o našim odlukama dizajna za svaki sloj.
Agentic Search SDK
Agentic Search SDK definira građevne blokove za programabilno pretraživanje. Važno je napomenuti da naš SDK nije već postojeći API za pretraživanje upakiran kao biblioteka. Tijekom proteklih nekoliko mjeseci naš inženjerski tim je rearhitektonirao naš stog pretraživanja u modularne, složive primitive. Izgradili smo Agentic Search SDK kako bismo omogućili izravan pristup tim primitivima, čineći mnogo moćnije platno na kojem model može orkestrirati cjevovode pronalaženja specifične za zadatak.
Cjevovodi pretraživanja visoke razine, od kraja do kraja, još uvijek su dostupni unutar SDK-a, ali više nisu jedina opcija. Umjesto toga, oni služe kao oblik skraćenice za uobičajene uzorke pretraživanja. Model ih može slobodno koristiti ili zaobići kako zadatak zahtijeva.
Izbor vremena izvođenja: Razmatrali smo Python, Rust, TypeScript i Bash kao vrijeme izvođenja SDK-a. Sumnjali smo da bi Python bio najprirodniji izbor s obzirom na njegovu sveprisutnost i ekosustav biblioteka za obradu podataka. Interno testiranje je to potvrdilo, a verzija SDK-a koja se danas uvodi temelji se na Pythonu. Očekujemo da ćemo povremeno ponovno procjenjivati izbor vremena izvođenja kako bismo osigurali da nastavi pružati najbolje iskustvo agenta.
Kontinuirano poboljšanje putem samostalnog istraživanja (autoresearch): Također smo optimizirali iskoristivost SDK-a za vodeće jezične modele kroz iterativnu petlju samostalnog istraživanja. Ova petlja, koja neprekidno radi tjednima, predlaže i potvrđuje poboljšanja SDK-a u odnosu na metrike uključujući latenciju, kvalitetu generiranja koda i ukupnu izvedbu zadatka. Petlja samostalnog istraživanja već je napravila brojne promjene i na strukturi i na estetici SDK-a, uz značajne dobitke u svim dimenzijama. Planiramo dodatno precizirati SDK putem samostalnog istraživanja kako se budu pojavljivali novi vodeći modeli i komponente pretraživanja.
Sandboxed okruženja
Sandboxed okruženja pružaju sigurna okruženja za definiranje i pokretanje SaC cjevovoda. Oni izvršavaju kod generiran od strane modela, omogućujući pristup Agentic Search SDK-u radi olakšavanja interakcije s pojedinačnim primitivima pretraživanja.
Uložili smo značajna sredstva u optimizaciju i ojačavanje naših sandboxed okruženja, a njihov cjelokupni dizajnerski sustav zaslužuje poseban članak. Ovdje se usredotočujemo na razmatranje dizajna koje je najrelevantnije za SaC: upravljanje međustanjima.
SaC omogućuje agentima da orkestriraju složene cjevovode unutar jednog okreta zaključivanja. Međutim, određena međustanja je potrebno prenijeti kroz okrete. Na primjer, model možda želi dohvatiti neke dokumente u okretu 1, pregledati poduzorak tih dokumenata u okretu 2 kako bi odlučio što učiniti sljedeće, a zatim razviti nizvodni cjevovod pretraživanja kako bi dodatno istražio te dokumente od okreta 3 nadalje. Kao što je gore raspravljeno, prenošenje međustanja kroz prostor tokena nije učinkovita strategija.
Razmotrili smo dva pristupa za upravljanje međustanjima kroz okrete:
Perzistentni datotečni sustav + eksplicitna serijalizacija/deserijalizacija (serde): Sandboxed okruženja mogu izložiti perzistentne datotečne sustave koje modeli mogu koristiti kroz okrete. Modeli koji žele sačuvati međustanje mogu uključiti korak serijalizacije unutar generiranog koda za okret, zajedno s korakom deserijalizacije unutar naknadnog okreta (bilo za vlastiti pregled modela ili za daljnju upotrebu). Pristup datotečnog sustava omogućuje modelima da izravno i eksplicitno kontroliraju kako se međustanje prenosi kroz okrete. Također osigurava sljedivost nametanjem eksplicitne identifikacije i trajnosti informacija koje koristi model. Jedna mana je latencija & trošak konteksta koji nastaje generiranjem serde koda, iako dobro dizajnirane pomoćne funkcije mogu ublažiti ovu režiju.
REPL: Alternativno, sandboxed okruženje može sačuvati samo vrijeme izvođenja izvršavanja kroz okrete u okruženju u stilu REPL-a. To omogućuje modelima da održavaju međustanje u memoriji bez potrebe za njegovom serijalizacijom, budući da se na varijable definirane ili izmijenjene u prethodnim okretima jednostavno može pozvati po imenu u kasnijim okretima. REPL pristup je učinkovitiji u pogledu tokena jer izbjegava potrebu za generiranjem serde koda. Međutim, nedostatak eksplicitnog koraka serijalizacije može naštetiti performansama niza iz razloga poznatih svima koji su radili s Jupyter bilježnicom od 100 ćelija: kako prostor imena varijabli postaje pretrpan, teže je pratiti što je točno sačuvano kroz okrete i zašto.
Testirali smo oba pristupa i otkrili da iako rade slično pri običnoj upotrebi, serde temeljen na datotečnom sustavu pruža bolju pouzdanost na posebno dugim putanjama. Stoga usvajamo serde temeljeno na datotečnom sustavu kao naše rješenje. Pretpostavljamo da zahtijevanje od modela da prenose stanje deklarativno, a ne implicitno, pomaže im da učinkovitije upravljaju tim stanjem. Ovo je privremeni nalaz i nastavit ćemo iterirati na oba pristupa.
Modeli
Modeli koji pokreću okvire agenata služe kao SaC-ova ravnina kontrole: dinamički sastavljaju cjevovode pretraživanja iz građevnih blokova Agentic Search SDK-a kako bi zadovoljili potrebe svakog zadatka, a zatim šalju te cjevovode kao kod za izvršavanje u sandboxed okruženju.
Perplexity koristi različite modele unutar naših okvira agenata i otkrili smo da su najnoviji vodeći modeli prilično učinkoviti u generiranju koda opće namjene. Glavni je izazov potaknuti učinkovito generiranje koda posebno za Agentic Search SDK. Odnosno, kako možemo natjerati modele da učinkovito isprepliću građevne blokove našeg SDK-a u cjevovode optimizirane za zadatke?
Za razliku od standardne biblioteke nekog jezika, malo je vjerojatno da će prilagođeni SDK biti predstavljen u podacima za pretreniranje. Čak i s poboljšanjima iskoristivosti SDK-a iz samostalnog istraživanja, mnogi su modeli i dalje obučeni za interakciju sa sustavima pretraživanja putem poziva funkcija i izravnog MCP pozivanja. Malo je vjerojatno da će ti modeli stručno baratati SDK-om samo uz izvorni kod i automatski generiranu dokumentaciju.
Kako bismo riješili ovaj izazov, razvili smo visoko podešene vještine agenata (Agent Skills) kako bismo naučili modele da učinkovito koriste naš SDK. Početne verzije razvijene su u skladu s Perplexityjevim dizajnerskim načelima za vještine, a zatim optimizirane kroz namjensku petlju samostalnog istraživanja usredotočenu na iste metrike korištene u optimizaciji SDK-a. Također ograničavamo veličinu vještina kako bismo se zaštitili od prenatrpanosti konteksta, a naše konačne verzije imaju manje od 2000 tokena u svojim korijenskim datotekama SKILL.md.
Optimizirane vještine idu dalje od nabrajanja dostupnih građevnih blokova SDK-a (nečega što se jednako lako može dobiti putem refleksije vremena izvođenja). Većina tokena troši se na pružanje sažetih, generaliziranih smjernica i primjera s malo primjera (few-shot) za sastavljanje tih blokova u složene uzorke. Naoružani ovim vještinama, primjećujemo da modeli učinkovito koriste SDK za orkestriranje cjevovoda pretraživanja koji se skaliraju na tisuće diskretnih operacija.
Kod kao orkestrator i popunjač praznina
Kombiniranjem ovih slojeva, SaC mijenja odnos između modela i stoga pretraživanja. U sustavima pretraživanja s fiksnim cjevovodom, model se nalazi iznad pretraživanja i komunicira s njim kroz usko sučelje serijskog pozivatelja. U SaC-u model postaje aktivni sudionik u orkestraciji samog procesa pretraživanja. Svi elementi stoga pretraživanja postaju izravno programabilni od strane modela, pri čemu sandboxed okruženje i Agentic Search SDK pružaju potrebna sučelja za te elemente.
Ali što je s mogućnostima koje ne postoje izvorno? Kod je moćan medij za orkestraciju postojećih mogućnosti. Ipak, snaga koda nadilazi orkestraciju. Može poslužiti i kao popunjač praznina za mogućnosti koje nisu prisutne u stogu pretraživanja ili SDK-u. Agentima koristi parsimonija, i bilo bi neučinkovito da SDK pokriva svaku potencijalnu operaciju s namjenskom funkcijom. Umjesto toga, SDK pruža najtemeljnije primitive, a model može izgraditi bilo koje dodatne komponente u hodu s kodom.
Razmotrimo, na primjer, složeni regularni izraz koji se ne može učinkovito implementirati putem vlastite sintakse upita sustava pretraživanja. Bez mogućnosti kodiranja, model bi bio prisiljen generirati svoju najbolju aproksimaciju, uputiti upit i izvršiti filtriranje u prostoru tokena na vrlo bučnom skupu rezultata. S SaC-om, model umjesto toga može generirati program koji upućuje paralelne SDK pozive kako bi prikupio superskup skupa rezultata željenog regularnog izraza. Nakon uklanjanja duplikata putem SDK-a, model zatim može pisati dodatni kod kako bi deterministički suzio rezultate na točan regularni izraz. Na taj način agenti mogu implementirati prilagođene mogućnosti pretraživanja bez preopterećenja SDK-a pretjerano nišnim potprogramima.
Studija slučaja: CVE savjetnici dobavljača
Predstavljamo studiju slučaja temeljenu na zadatku iz stvarnog svijeta unutar našeg paketa za testiranje. Ovaj zadatak traži od agenta da identificira i okarakterizira preko 200 ranjivosti visoke ozbiljnosti (CVE) iz razdoblja 2023.–2025. Svaki zapis mora citirati savjetnik samog pogođenog dobavljača, navesti proizvod i verziju popravka te pokazati da je verzija popravka povezana s određenim CVE-om.
SaC-ov odgovor ostvario je 100% točnosti, uz ukupnu potrošnju tokena koja je pala za 85,1% u odnosu na osnovnu liniju bez SaC-a (s 288,7K tokena na 42,9K tokena). Testirani sustavi koji nisu iz Perplexityja, o kojima se detaljnije raspravlja u Odjeljku 4, svi su postigli manje od 25%.
Predstavljamo tri stilizirana bloka koda iz putanje kako bismo ilustrirali kako SaC-ova programabilnost omogućuje modelu primjenu učinkovitih strategija.
# 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. Generirani program počinje izravnim kodiranjem pravila klase izvora u plan upita: samo formati savjetodavnih dokumenta u vlasništvu dobavljača su relevantni. Izvori koji nisu u vlasništvu dobavljača, uključujući NVD, MITRE, CVE Details, vijesti, CERT stranice i baze podataka trećih strana, strukturno su izvan opsega. Ograničenja točne fraze također potiču pretraživanje prema stranicama čiji indeksirani tekst već sadrži precizne CVE detalje potrebne kasnije.
# 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 sažima koji parovi dobavljač-godina proizvode dovoljno stranica kandidata, traži ciljana poboljšanja i provjerava valjanost svakog predloženog upita prije izvršavanja. Ovo čuva korisne uzorke iz putanje, kao što su precizne frazne sonde s opsegom na web-mjestu i prilagodljivo popunjavanje, bez ugrađivanja namjenskog CVE-savjetodavnog puzala (crawler) u SDK.
# 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 provjeravatelj rezultata čiju logiku u potpunosti definira agent putem generiranja koda. Dok potprogrami pretraživanja mogu pronaći uvjerljive stranice savjetnika, zadatak zahtijeva strožu vezu: savjetnik mora povezati jedan CVE s jednim pogođenim proizvodom i jednom verzijom popravka u tekstu koji je napisao dobavljač. Shema tu vezu čini eksplicitnom, tako da nizvodni kod može ukloniti duplikate po CVE-u, odbaciti agregator URL-ove, odbaciti slabe dokaze o verziji i nastaviti s popunjavanjem sve dok se ne ispuni minimalni prag broja zapisa.
Rezultati procjene
Procjenjujemo učinkovitost SaC-a na sveobuhvatnom paketu mjerila, fokusirajući se i na apsolutne performanse i na granicu cijene i performansi.
Mjerila i sustavi
Naš paket mjerila obuhvaća ukupno pet mjerila, dizajniranih za stresno testiranje AI tijekova rada ovisnih o pretraživanju u rasponu domena, formata zadataka i razina složenosti. Koristimo četiri postojeća mjerila: DeepSearchQA (DSQA), BrowseComp, Humanity's Last Exam (HLE) i WideSearch. Za prva tri mjerila (DSQA, BrowseComp i HLE) izvještavamo o točnosti kao vodećoj metrici. Za WideSearch izvještavamo o F1 rezultatu po retku.
Također koristimo novo razvijeno WANDR mjerilo, koje se fokusira na teške „široke istraživačke” zadatke koji zahtijevaju pomnu orkestraciju pretraživanja, računanja i zaključivanja modela. WANDR je inspiriran profesionalnim zadacima intenzivnim znanjem koje Perplexity Computer rješava za korisnike. Ponavlja WideSearch i slična mjerila, ali naglašava složenije zadatke i strukture zadataka. Objavit ćemo WANDR mjerilo u nadolazećim tjednima.
Procjenjujemo pet sustava temeljenih na agentima. Razmatramo pojedinačna pokretanja umjesto rezultata „najbolji od N” kako bismo izolirali performanse temeljne arhitekture, a ne prednosti paralelizacije. Konfiguracija svakog sustava opisana je u nastavku:
Perplexity (SaC): Procjenjujemo SaC arhitekturu unutar Perplexityjeve produkcijske Agent API platforme. GPT 5.5 (visoko zaključivanje) služi kao temeljni model.
OpenAI: Procjenjujemo OpenAI Responses API s omogućenim pretraživanjem (web_search) i Python vremenom izvođenja (code_interpreter). GPT 5.5 (visoko zaključivanje) služi kao temeljni model.
Anthropic: Procjenjujemo Anthropic Managed Agents s agentskim skupom alata 20260401 i automatski dopuštenim naredbama. Opus 4.7 (visoko zaključivanje) služi kao temeljni model.
Exa: Procjenjujemo Exa Agent putem produkcijskog API-ja, s naporom postavljenim na visoko.
Parallel: Procjenjujemo Parallel Tasks putem produkcijskog API-ja, s procesorom postavljenim na ultra4x.
Usporedne performanse
Tablica 1 prikazuje rezultate mjerila za svaki sustav. SaC nadmašuje sve ostale sustave na četiri od pet mjerila. Na preostalom mjerilu (HLE), SaC je u osnovi izjednačen za prvo mjesto s OpenAI Responses. Slika 2 iz Uvoda vizualizira ove rezultate u grafičkom obliku.
Mjerilo | 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 |
Tablica 1 | Rezultati mjerila za svaki ocijenjeni sustav. Najbolji rezultat po retku u podebljanom slovu.
Iako SaC postiže vrhunske performanse u cijelom paketu mjerila, njegova je prednost posebno izražena na WANDR-u. Slika 5 rastavlja WANDR rezultate, pokazujući da Perplexityjeva SaC implementacija nadmašuje sljedeći najbolji sustav za faktor od 2,5×. Unatoč ovoj velikoj razlici, WANDR ostaje nezasićen i pokazuje se izazovnim čak i za SaC. Vjerujemo da će složeni, vrlo horizontalni tijekovi rada pretraživanja koje zahtijevaju WANDR-ovi zadaci zahtijevati dodatni napredak u istraživanju i inženjeringu pretraživanja kako bi se postigle dosljedno visoke performanse.
Konačno, mjerimo relativne dobitke SaC-a u odnosu na tradicionalniji cjevovod pretraživanja koji koristi istu Perplexityjevu infrastrukturu pretraživanja. Slika 6 izvještava o razlici u rezultatima između SaC i ne-SaC arhitektura na svakom mjerilu. U cijelom opsegu, SaC pruža značajno povećanje performansi, s najvećim apsolutnim dobitkom na DSQA (+19.77 pp, 29%) i najvećim relativnim dobitkom na WANDR-u (+12.00 pp, 45%).
Granica cijene i performansi
U praksi je korisnicima stalo do performansi u odnosu na cijenu. Stoga procjenjujemo granicu cijene i performansi na DSQA i WideSearchu. Mjerimo cijenu i performanse SaC-a na niskoj, srednjoj i visokoj razini zaključivanja modela, uz ostale sustave. Slike 7 i 8 crtaju rezultat mjerila u odnosu na cijenu po zadatku, s obrnutom x-osi tako da su točke koje su više u desno jeftinije, a točke više predstavljaju bolje performanse.
Na DSQA, sve tri SaC postavke leže na gornjoj desnoj granici. Postavka niskog zaključivanja je jeftinija od svih ostalih sustava dok radi bolje od njih dva. Postavka srednjeg zaključivanja nadmašuje sve ne-SaC sustave uz cijenu manju od 1 USD po zadatku. Postavka visokog zaključivanja postiže vrhunske performanse uz konkurentnu cijenu.
WideSearch pokazuje slično oblikovanu granicu. Kao i kod DSQA, postavka niskog zaključivanja postiže konkurentne performanse uz nižu cijenu od svih ne-SaC sustava, dok i srednje i visoko zaključivanje nadmašuju ne-SaC sustave u performansama zadatka.
Prema novoj arhitekturi računalstva
Search as Code odražava širu promjenu u dizajnu softvera. Desetljećima su softverski sustavi bili organizirani oko determinističkih instrukcija koje su izvršavala tradicionalna vremena izvođenja na CPU-ovima. Vodeći modeli uvode novi oblik računanja: zaključivanje u prostoru tokena koje može i slijediti i generirati instrukcije. Najsposobniji računalni sustavi kombinirat će ova dva oblika računanja umjesto da biraju između njih.
Pretraživanje je prirodno tlo za dokazivanje ove hibridne arhitekture. Modeli su prikladni za odlučivanje koji su dokazi potrebni i kako treba riješiti nesigurnost. Deterministička vremena izvođenja pogodna su za grupnu obradu, paralelizam, filtriranje, rangiranje i agregaciju. Infrastruktura pretraživanja služi kao univerzalni I/O sloj, pružajući vremenu izvođenja korisne ručke u svjetske informacije koje mogu izdržati tisuće operacija u minuti. Kada su ti dijelovi integrirani, rezultirajući sustav je mnogo snažniji i učinkovitiji u ispunjavanju zadataka u stvarnom svijetu.
Svaki je dio ove arhitekture neophodan za otključavanje tih mogućnosti. Bez inteligentnih modela sustav ne može rasuđivati o strategiji pretraživanja. Bez sandboxed okruženja modeli su prisiljeni na serijski I/O i neučinkovitu obradu u prostoru tokena. A bez atomiziranog stoga pretraživanja model nema što orkestrirati. SaC funkcionira jer su zaključivanje, determinističko računanje i I/O zajednički dizajnirani da naglase snagu svakog sloja.
Ovaj zajednički dizajn može se ići još dalje kroz razvoj petlji kontinuiranog poboljšanja. Na primjer, Agentic Search SDK i SaC vještine agenata mogle bi se zajednički optimizirati u zajedničkoj petlji samostalnog istraživanja. Ambicioznije, modeli se mogu obučiti da iskoriste primitive pretraživanja niske razine izložene kao SDK. Moglo bi se čak pokušati koevoluirati dizajn SDK-a tijekom samog procesa obuke modela. Radujemo se provođenju agresivnijih strategija zajedničkog dizajna u budućem radu.
Izgradili smo SaC kako bismo omogućili modelima da kontroliraju proces pretraživanja, umjesto da samo konzumiraju njegove rezultate. Naši rezultati dokazuju snagu ove kontrole: SaC pomiče i apsolutne performanse i granicu cijene i performansi na mjerilima agenata intenzivnim znanjem. Uzbuđeni smo što donosimo mogućnosti SaC-a našim korisnicima, počevši od danas s Perplexity Computer i Agent API-jem. Nastavit ćemo optimizirati SaC arhitekturu kroz sve slojeve stoga kako bismo osigurali da naši korisnici (i agenti koji im služe) imaju najmoćnije i najučinkovitije moguće mogućnosti pretraživanja.
Citiranje
@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}
}