Kuinka rakensimme ChatGPT‑pohjaisen Atlas-selaimemme uuden OWL-arkkitehtuurin
Katsaus uuteen prosessiarkkitehtuuriimme, jokatarjoaa nopeamman ja fiksumman tavan käyttää verkkoa.
– Ken Rockot, teknisen henkilöstön jäsen ja Ben Goodger, suunnittelupäällikkö, ChatGPT Atlas
Viime viikolla julkaisimme ChatGPT Atlasin, joka on uusi tapa selata verkkoa ChatGPT:n avulla. Sen lisäksi, että Atlas on täydellinen verkkoselain, se tarjoaa kurkistuksen tulevaisuuteen: maailmaan, jossa voit käyttää ChatGPT:tä internetissä esittämään kysymyksiä, tekemään ehdotuksia ja suorittamaan tehtäviä puolestasi. Tässä artikkelissa puramme yhden tuotteen monimutkaisimmista teknisistä näkökohdista: kuinka teimme ChatGPT:stä selaimen, josta tulee sitä hyödyllisempi, mitä enemmän sitä käyttää.
ChatGPT:n tekeminen todelliseksi apuriksi verkossa tarkoitti koko selainarkkitehtuurin kuvittelemista uudelleen eli Atlasin erottamista Chromium-ajoympäristöstä. Se edellytti uuden tavan kehittämistä Chromiumin integrointiin, jonka avulla voimme saavuttaa tuotetavoitteemme: välittömän käynnistyksen, vastauskyvyn jopa useampien välilehtien avaamisen yhteydessä ja vahvan perustan luomisen agenttipohjaisille käyttötapauksille.

Chromium oli luonnollinen rakennusharkko. Se tarjoaa huippuluokan selainmoottorin, jossa on vankka tietoturvamalli, vakiintuneet suorituskykytunnisteet ja verraton yhteensopivuus verkkoon. Lisäksi sen on kehittänyt maailmanlaajuinen yhteisö, joka kehittää sitä jatkuvasti. Se on yleinen nykyaikaisen työpöytäselaimen vakiovalinta.
Lahjakkaalla suunnittelutiimillämme oli kunnianhimoisia tavoitteita käyttökokemukselle, mukaan lukien rikkaat animaatiot ja visuaaliset tehosteet ominaisuuksille, kuten agenttitilalle. Se vaati suunnittelutiimiämme hyödyntämään käyttöliittymässä nykyaikaisimpia alkuperäisiä kehyksiä (SwiftUI, AppKit ja Metal) sen sijaan, että avoimen lähdekoodin Chromium-käyttöliittymää olisi vain uudistettu. Sen seurauksena Atlasin käyttöliittymä on koko sovelluksen käyttökokemuksen kattava uusi versio.
Meillä oli myös muita tuotetavoitteita, kuten nopeat käynnistysajat ja satojen välilehtien tukeminen heikentämättä suorituskykyä. Näiden tavoitteiden saavuttaminen Chromiumilla suoraan pakkauksesta oli haastavaa, joka on kärkevää monien yksityiskohtien, kuten käynnistysjärjestyksen, säikeiden mallin ja välilehtien mallien suhteen. Harkitsimme merkittävien muutosten tekemistä siihen, mutta halusimme pitää Chromiumiin suunnatut korjauspäivitykset kohdistettuina, jotta voisimme integroida uudet versiot nopeasti. Meidän piti keksiä erilainen tapa integroida ja ohjata Chromiumin ajoympäristöä, jotta kehitysnopeutemme kiihtyisi mahdollisimman paljon.
Teknisen investointimme koetinkivi ei ollut ainoastaan se, että se mahdollistaisi uusien ominaisuuksien nopeamman testaamisen, iteroinnin ja toimituksen, vaan se myös antaisi meille mahdollisuuden säilyttää osan keskeistä OpenAI:n suunnittelukulttuuria: toimituksen heti ensimmäisenä päivänä. Jokainen uusi insinööri tekee ja yhdistää pienen muutoksen ensimmäisen työpäivänsä iltapäivällä. Meidän piti varmistaa, että se oli mahdollista, vaikka Chromiumin tarkastaminen ja rakentaminen voi viedä tuntikausia.
Vastauksemme näihin haasteisiin oli rakentaa uusi arkkitehtoninen kerros, jolle annoimme nimeksi OWL: OpenAI’s Web Layer. OWL on Chromium-integraatiomme, jossa Chromiumin selainprosessi suoritetaan Atlas-sovellusprosessin ulkopuolella.
Ajattele sitä näin: Chromium mullisti selaimet siirtämällä välilehdet erillisiin prosesseihin. Viemme samaa ideaa eteenpäin siirtämällä itse Chromiumin pois pääsovellusprosessista erilliseen palvelukerrokseen. Tämä muutos tuo mukanaan kokonaisen sarjan etuja:
- Yksinkertaisempi, moderni sovellus: Atlas on rakennettu lähes kokonaan SwiftUI:lla ja AppKitillä. Yksi kieli, yksi teknologiapino, yksi puhdas koodikanta.
- Nopeampi käynnistys: Chromium käynnistyy asynkronisesti taustalla. Atlas ei odottele – pikselit ilmestyvät näytölle lähes välittömästi.
- Eristäminen jumiutumiselta ja kaatumiselta: Chromium on tehokas ja monimutkainen selainmoottori. Jos sen pääsäie jumiutuu, Atlas ei jumiudu. Jos se kaatuu, Atlas pysyy pystyssä.
- Vähemmän yhdistämisongelmia: Koska emme käytä yhtä paljon Chromiumin avoimen lähdekoodin käyttöliittymää, eromme Chromiumin aiempaan versioon on paljon pienempi ja helpompi ylläpitää.
- Nopeampi iteraatio: Useimpien insinöörien ei koskaan tarvitse rakentaa Chromiumia paikallisesti. OWL toimitetaan sisäisesti valmiiksi koottuna binääritiedostona, joten Atlasin koonti kestää minuutteja, ei tunteja.
Koska useimmat tiimimme insinöörit eivät säännöllisesti rakenna Chromiumia lähdekoodista, kehitys voi edetä paljon nopeammin – jopa tiimin uudet jäsenet voivat yhdistää yksinkertaisia muutoksia ensimmäisenä iltapäivänään.
Ylemmällä tasolla Atlas-selain on OWL Client ja Chromium-selainprosessi on OWL Host. Ne kommunikoivat IPC:n kautta, tarkemmin Chromiumin oman viestinvälitysjärjestelmän kautta, joka on Mojo(avautuu uudessa ikkunassa). Kirjoitimme Mojolle mukautettuja Swift- (ja jopa TypeScript-) binding-käskyjä, jotta Swift-sovelluksemme voi kutsua suoraan isäntäpuolen rajapintoja.
OWL-asiakaskirjasto tarjoaa yksinkertaisen julkisen Swift-rajapinnan, joka tiivistää useita isännän palvelukerroksen paljastamia keskeisiä käsitteitä:
- Istunto: Määritä ja hallitse isäntäkonetta globaalisti
- Profiili: Hallitse tietyn käyttäjäprofiilin selaimen tilaa
- WebView: Hallitse ja upota yksittäisiä verkkosisältöjä (esim. renderöinti, syöttö, navigointi, zoomaus jne.)
- WebContentRenderer: Lähetä syötetapahtumia Chromiumin renderöintiputkeen ja vastaanota palautetta renderöijältä
- LayerHost/Client: Vaihda määritystietoja käyttöliittymän ja Chromiumin välillä
Tarjolla on myös laaja valikoima palvelupäätepisteitä korkean tason ominaisuuksien, kuten kirjanmerkkien, latausten, laajennusten ja automaattisen täytön hallintaan.
Asiakassovelluksessa toisensa poissulkevan esitystilan jakavat WebView't vaihdetaan jaettuun yhdistelmäsäiliöön ja sieltä pois. Esimerkiksi selainikkunassa on usein näkyvissä yksi jaettu säilö ja välilehden valitseminen välilehtirivillä vaihtaa kyseisen välilehden WebView'n säilöön. Chromiumin puolella tämä säilö vastaa gfx::AcceleratedWidget-elementtiä, jota tukee lopulta CALayer-elementti. Paljastamme kyseisen kerroksen kontekstitunnuksen asiakkaalle, johon NSView upottaa sen yksityisen CALayerHost-rajapinnan avulla.
Erikoistapauksissa, kuten -pudotusvalikoissa tai värivalitsimissa, jotka Chromium renderöi erillisissä ponnahdusikkunoissa, käytetään samaa lähestymistapaa. Niillä ei ole content::WebContents-elementtiä, mutta niillä on content::RenderWidgetHostView-elementti omalla gfx::AcceleratedWidget-elementillään, joten sama delegoitu renderöintimalli pätee.OWL pitää näkymägeometrian sisäisesti synkronoituna Chromium-puolen kanssa, joten GPU-koostajaa voidaan päivittää vastaavasti ja se voi aina tuottaa oikean kokoisia ja laitemittakaavan tasosisältöjä.Käytämme tätä tekniikkaa myös Chromiumin oman alkuperäisen Views-käyttöliittymän elementtien valikoivaan projisointiin Atlasiin (se on hyödyllistä myös ominaisuuksien, kuten lupakehotteiden, nopeaan käynnistämiseen ilman, että korvaavia asetuksia tarvitsee rakentaa tyhjästä SwiftUI:ssa). Tämä tekniikka lainaa vahvasti Chromiumin olemassa olevaa infrastruktuuria macOS:ään asennettaville verkkosovelluksille.Syötetapahtumat: Murtaminen ja välitysChromium-käyttöliittymä muuntaa alustan tapahtumat (kuten macOS:n NSEvents-tapahtumat) Blinkin WebInputEvent-malliksi ennen niiden välittämistä renderöijille. Koska OWL suorittaa Chromiumia piilotetussa prosessissa, teemme kuitenkin kyseisen käännöksen itse Swift-asiakaskirjastossa ja välitämme jo käännetyt tapahtumat Chromiumiin.Siitä eteenpäin ne seuraavat samaa elinkaarta kuin todelliset syötetapahtumat normaalisti verkkosisällölle. Se sisältää tapahtumien palauttamisen asiakkaalle aina, kun sivu ilmoittaa, ettei se käsitellyt tapahtumaa. Kun niin tapahtuu, syntetisoimme NSEventin uudelleen ja annamme sovelluksen muille osille mahdollisuuden käsitellä syötettä.Agenttitila: Erityiset tapauksetAtlasin agenttipohjainen selaustoiminto asettaa ainutlaatuisia haasteita lähestymistavoillemme renderöintiin, syötetapahtumien välitykseen ja datan tallennukseen.Tietokoneen käyttömallimme odottaa syötteeksi yhtä kuvaa näytöstä. Jotkin käyttöliittymäelementit, kuten -pudotusvalikot näkyvät kuitenkin välilehden rajojen ulkopuolella erillisissä ikkunoissa. Agenttitilassa yhdistämme nuo ponnahdusikkunat takaisin pääsivun kuvaan oikeissa koordinaateissa, jotta malli näkee koko kontekstin yhdessä kehyksessä.
Syötteen osalta käytämme samaa periaatetta: agentin luomat tapahtumat reititetään suoraan renderöintiin, eikä koskaan etuoikeutetun selainkerroksen kautta. Se säilyttää hiekkalaatikon rajat myös automaattisen ohjauksen alaisena. Emme esimerkiksi halua sen tapahtumaluokan syntetisoivan pikanäppäimiä, jotka saavat selaimen tekemään asioita, jotka eivät liity näytettävään verkkosisältöön.
Agentin selailu voi toimia myös lyhytaikaisessa uloskirjautuneena-kontekstissa. Sen sijaan, että jakaisimme käyttäjän olemassa olevan incognito-profiilin, joka voisi paljastaa vuodon, käytämme Chromiumin StoragePartition-infrastruktuuria erillisten muistissa olevien tallennustilojen luomiseen. Jokainen agentti-istunto alkaa alusta, ja sen päätyttyä kaikki evästeet ja sivuston data poistetaan. Voit suorittaa useita uloskirjautuneita agentti-istuntoja, jokainen omalla selainvälilehdellään ja jokainen täysin erillään muista.
Mikään tästä ei olisi mahdollista ilman maailmanlaajuista Chromium-yhteisöä ja heidän uskomatonta työtään perustuksen rakentamisessa nykyaikaiselle verkkoselaimelle. OWL rakentuu tälle perustukselle uudella tavalla: irrottamalla hakumoottorin sovelluksesta, yhdistämällä maailmanluokan verkkoalustan moderneihin alkuperäisiin kehyksiin ja avaamalla nopeamman ja joustavamman arkkitehtuurin.
Ajattelemalla uudelleen, miten selain pitää Chromiumia, luomme tilaa uudenlaisille kokemuksille: sujuvammalle käynnistykselle, rikkaammalle käyttöliittymälle, tiiviimmälle integraatiolle muun käyttöjärjestelmän kanssa ja kehityssilmukalle, joka etenee ideoiden vauhdilla. Jos tämä kuulostaa sinusta haasteelta, tutustu avoimiin työpaikkoihimme Atlasilla Atlas-ohjelmistokehittäjänä, iOS-ohjelmistokehittäjänä ja moniin muihin.
Kokeile Atlasta osoitteessa chatgpt.com/atlas(avautuu uudessa ikkunassa).
Kiitokset
Erityiskiitokset ansaitsevat Darin Fisher ja Marie Shin, jotka osallistuivat tähän julkaisuun, sekä koko OpenAI-tiimi, joka rakensi Atlasin.


