ChatGPT негізіндегі браузеріміз Atlas-тың артындағы жаңа архитектура — OWL-ды қалай жасадық
Вебті жылдамырақ әрі ақылдырақ пайдалануға мүмкіндік беретін жаңа процесс архитектурамыздың ішкі көрінісі.
Ken Rockot, Technical Staff мүшесі, және Ben Goodger, ChatGPT Atlas инженерия бөлімінің басшысы
Өткен аптада біз ChatGPT Atlas-ты іске қостық — ChatGPT жаныңызда отырып, вебті шолудың жаңа тәсілі. Толыққанды веб-браузер болумен қатар, Atlas болашаққа көз жүгіртеді: интернеттің кез келген жерінде өзіңізбен бірге ChatGPT‑ті алып жүріп, сұрақ қойып, ұсыныс алып және тапсырмаларды сіз үшін орындата алатын әлем. Бұл жазбада біз өнімнің ең күрделі инженерлік қырларының бірін талдаймыз: ChatGPT‑ті қолданған сайын пайдалырақ бола түсетін браузерге қалай айналдырғанымызды.
ChatGPT‑ті веб үшін шынайы екінші пилот ету браузердің бүкіл архитектурасын қайта ойлауды талап етті: Atlas-ты Chromium runtime-ынан бөлу қажет болды. Бұл бізге өнімдік мақсаттарымызды орындауға мүмкіндік беретін Chromium-ды интеграциялаудың жаңа тәсілін жасауды білдірді: лезде іске қосылу, көбірек қойынды ашылғанда да жоғары жауап беру жылдамдығы және агенттік қолдану сценарийлеріне мықты негіз құру.

Chromium табиғи құрылыс бөлігі болды. Ол сенімді қауіпсіздік моделін, дәлелденген жоғары өнімділікті және теңдессіз веб-үйлесімділікті ұсынатын заманауи веб-қозғалтқыш береді. Оған қоса, оны үздіксіз жетілдіріп отыратын жаһандық қауымдастық дамытады. Бұл — заманауи үстелдік веб-браузерлер үшін кең таралған таңдау.
Біздің дарынды дизайн командамыздың пайдаланушы тәжірибесіне қатысты биік мақсаттары болды, соның ішінде Agent mode сияқты функциялар үшін бай анимациялар мен визуал әсерлер бар. Бұл инженерлік командамыздан UI үшін ең заманауи нативті фреймворктерді (SwiftUI, AppKit және Metal) пайдалануды талап етті, ашық бастапқы кодты Chromium UX-ін жай ғана қайта қаптаудың орнына. Нәтижесінде Atlas-тың UI-ы — бүкіл қолданба UX-інің толық қайта жасалған нұсқасы.
Бізде іске қосылу уақытын қысқарту және өнімділікті төмендетпей жүздеген қойындыны қолдау сияқты басқа да өнімдік мақсаттар болды. Бұл мақсаттарға Chromium-ның әдепкі күйімен жету қиын еді, өйткені ол жүктелу тізбегі, ағындар моделі және қойынды модельдері сияқты көптеген егжей-тегжей бойынша өз ұстанымына ие. Біз бұл жерде елеулі өзгерістер енгізуді ойладық, бірақ жаңа нұсқаларды тез интеграциялау үшін Chromium-ға қарсы патчтар жиынтығымызды нысаналы күйде сақтағымыз келді. Дамыту жылдамдығын барынша арттыру үшін Chromium runtime-ын интеграциялау мен басқарудың басқа жолын табуымыз керек болды.
Біздің техникалық инвестициямыздың лакмус сынағы оның тек тезірек эксперимент жасауға, итерациялауға және жаңа мүмкіндіктерді жеткізуге мүмкіндік беруі ғана емес еді — ол сондай-ақ OpenAI инженерлік мәдениетінің негізгі бөлігін сақтауға жағдай жасауы керек болды: алғашқы күннің өзінде жеткізу. Әрбір жаңа инженер бірінші күнінің түстен кейінгі бөлігінде шағын өзгеріс енгізіп, оны merge жасайды. Chromium-ды жүктеп алып, жинауға бірнеше сағат кетсе де, мұның мүмкін болуын қамтамасыз етуіміз керек еді.
Бұл қиындықтарға берген жауабымыз — OWL: OpenAI’s Web Layer деп атайтын жаңа архитектуралық қабат құру болды. OWL — Chromium-ды біздің интеграциялау тәсіліміз, оның мәні Chromium-ның браузер процесін негізгі Atlas қолданба процесінің сыртында іске қосу.
Мұны былай елестетіңіз: Chromium қойындыларды бөлек процестерге көшіру арқылы браузерлерді түбегейлі өзгертті. Біз бұл идеяны одан әрі дамытып, Chromium-ның өзін негізгі қолданба процесінен шығарып, оқшауланған қызмет қабатына көшіреміз. Бұл өзгеріс бірқатар артықшылық ашады:
- Қарапайым, заманауи қолданба: Atlas дерлік толықтай SwiftUI мен AppKit-те құрылған. Бір тіл, бір технологиялық стек, бір таза код базасы.
- Тезірек іске қосылу: Chromium фондық режимде асинхронды түрде жүктеледі. Atlas күтпейді — пиксельдер экранда дерлік лезде пайда болады.
- Тежелу мен істен шығудан оқшаулау: Chromium — қуатты әрі күрделі веб-қозғалтқыш. Егер оның негізгі ағыны тұрып қалса, Atlas тоқтап қалмайды. Егер ол істен шықса, Atlas жұмысын жалғастыра береді.
- Merge кезіндегі қиындық аз: Chromium-ның ашық бастапқы кодты UI бөлігінің көп бөлігіне сүйенбейтіндіктен, upstream Chromium-пен салыстырғандағы diff-іміз әлдеқайда шағын және оны қолдау оңай.
- Жылдамырақ итерация: Инженерлердің көбі Chromium-ды жергілікті ортада мүлде құрастырмайды. OWL ішкі түрде алдын ала жиналған бинарлық файл ретінде жеткізіледі, сондықтан Atlas құрастыруы сағаттар емес, минуттар алады.
Командамыздағы инженерлердің көбі Chromium-ды бастапқы кодтан тұрақты түрде жинамайтындықтан, әзірлеу әлдеқайда жылдам жүреді — тіпті жаңа команда мүшелері де алғашқы түстен кейінінде қарапайым өзгерістерді merge жасай алады.
Жоғары деңгейде қарасақ, Atlas браузері — OWL Client, ал Chromium-ның браузер процесі — OWL Host. Олар IPC арқылы, нақтырақ айтқанда Mojo(жаңа терезеде ашылады), яғни Chromium-ның өз хабар алмасу жүйесі арқылы байланысады. Біз Mojo үшін Swift-те (тіпті TypeScript-те де) арнайы bindings жаздық, соның арқасында Swift қолданбамыз host жағындағы интерфейстерді тікелей шақыра алады.
OWL client кітапханасы хосттың қызметтік қабаты ұсынатын бірнеше негізгі ұғымды абстракциялайтын қарапайым ашық Swift API-ын ұсынады:
- Session: Хостты жаһандық деңгейде баптау және басқару
- Profile: Белгілі бір пайдаланушы профилі үшін браузер күйін басқару
- WebView: Жеке веб-контентті басқару және ендіру (мысалы, көрсету, енгізу, навигация, масштабтау және т.б.)
- WebContentRenderer: Енгізу оқиғаларын Chromium-ның рендеринг конвейеріне жіберу және рендерерден кері байланыс алу
- LayerHost/Client: UI мен Chromium арасында композиция ақпаратымен алмасу
Сонымен қатар бетбелгілер, жүктеулер, кеңейтімдер және автотолтыру сияқты жоғары деңгейлі функцияларды басқаруға арналған көптеген қызмет соңғы нүктелері бар.
Client қолданбасында ортақ, бір-бірін өзара алмастыратын көрсету кеңістігін бөлісетін WebView-лер ортақ композициялық контейнерге кезекпен салынып, алынып отырады. Мысалы, браузер терезесінде жиі бір ортақ контейнер көрініп тұрады, ал қойынды жолағынан қойынды таңдалғанда сол қойындының WebView-і контейнерге ауыстырылады. Chromium жағында бұл контейнер ақырында CALayer-мен қамтамасыз етілетін gfx::AcceleratedWidget-ке сәйкес келеді. Біз сол қабаттың context ID-ін client-ке ашып береміз, ал онда NSView оны жеке CALayerHost API-ы арқылы ендіреді.
<select> ашылмалы тізімдері немесе түстерді таңдау құралдары сияқты, Chromium бөлек popup widget-терде рендерлейтін арнайы жағдайлар да осы тәсілді қолданады. Оларда content::WebContents болмайды, бірақ өз gfx::AcceleratedWidget-і бар content::RenderWidgetHostView болады, сондықтан дәл сол делегатталған рендеринг моделі қолданылады.
OWL ішкі түрде көрініс геометриясын Chromium жағымен синхрондап ұстайды, сондықтан GPU композиторы соған сай жаңартылып, әрдайым дұрыс өлшем мен құрылғы масштабына ие қабат мазмұнын жасай алады.
Біз бұл тәсілді Chromium-ның өзінің нативті Views UI элементтерін Atlas-қа таңдап проекциялау үшін де қайта қолданамыз (бұл рұқсат сұрау терезелері сияқты функцияларды SwiftUI-де нөлден бастап баламасын жасамай-ақ тез іске қосуға да пайдалы). Бұл тәсіл macOS-тегі орнатылатын веб-қолданбаларға арналған Chromium-ның қолданыстағы инфрақұрылымына көп сүйенеді.
Chromium UI платформалық оқиғаларды (мысалы, macOS NSEvent-терін) рендерерлерге жібермес бұрын Blink-тің WebInputEvent моделіне түрлендіреді. Бірақ OWL Chromium-ды жасырын процесте іске қосатындықтан, бұл түрлендіруді Swift client кітапханасының ішінде өзіміз жасаймыз да, алдын ала түрлендірілген оқиғаларды Chromium-ға жібереміз.
Осыдан кейін олар веб-контент үшін шынайы енгізу оқиғалары әдетте өтетін сол өмірлік циклмен жүреді. Мұның құрамына бет оқиғаны өңдемегенін көрсеткен кезде оқиғалардың client-ке қайта қайтарылуы да кіреді. Мұндайда біз NSEvent-ті қайта синтездеп, қолданбаның қалған бөлігіне енгізуді өңдеуге мүмкіндік береміз.
Atlas-тың агенттік шолу мүмкіндігі рендерингке, енгізу оқиғаларын жіберуге және деректерді сақтауға қатысты тәсілдерімізге бірегей қиындықтар туғызады.
Біздің компьютерді пайдалану моделіміз кіріс ретінде экранның бір ғана кескінін күтеді. Бірақ <select> ашылмалы тізімдері сияқты кейбір UI элементтері қойынды шекарасынан тыс, бөлек терезелерде рендерленеді. Agent mode-та модель толық контексті бір кадрда көруі үшін біз сол popup-тарды дұрыс координаттармен негізгі бет кескініне қайта композициялаймыз.
Енгізу үшін де дәл сол қағиданы қолданамыз: агент жасаған оқиғалар артықшылықты браузер қабаты арқылы ешқашан өтпей, тікелей рендерерге бағытталады. Бұл автоматтандырылған басқару кезінде де sandbox шекарасын сақтайды. Мысалы, мұндай оқиғалар браузерге көрсетіліп тұрған веб-контентке қатысы жоқ әрекеттерді жасататын пернетақта жарлықтарын синтездеуін қаламаймыз.
Агенттік шолу сондай-ақ уақытша «жүйеге кірмеген» контексте де жұмыс істей алады. Пайдаланушының бар Incognito профилін ортақ пайдаланудың орнына, күй ағып кетпеуі үшін біз Chromium-ның StoragePartition инфрақұрылымын пайдаланып, жадтағы оқшауланған қоймаларды іске қосамыз. Әр агент сессиясы жаңадан басталады, ал аяқталғанда барлық cookie-файлдар мен сайт деректері жойылады. Сіз «жүйеге кірмеген» бірнеше агент сессиясын іске қоса аласыз — әрқайсысы өз браузер қойындысында және бір-бірінен толық оқшауланған.
Мұның ешқайсысы жаһандық Chromium қауымдастығы мен олардың заманауи вебке негіз қалаған таңғаларлық еңбегінсіз мүмкін болмас еді. OWL сол негізге жаңа тәсілмен сүйенеді: қозғалтқышты қолданбадан ажыратады, әлемдік деңгейдегі веб-платформаны заманауи нативті фреймворктермен біріктіреді және жылдамырақ, икемдірек архитектураны ашады.
Браузердің Chromium-ды қалай ұстайтынын қайта ойлау арқылы біз тәжірибенің жаңа түрлеріне орын ашып жатырмыз: тегісірек іске қосылу, бай UI, ОЖ-нің қалған бөлігімен тығызырақ интеграция және идеялар жылдамдығымен қозғалатын әзірлеу циклі. Егер бұл сізге қызық сынақ болып көрінсе, Atlas-та Software Engineer, Atlas, Software Engineer, iOS және тағы басқа рөлдеріне ашылған вакансияларымызды қарап шығыңыз.
Atlas-ты мына жерден қолданып көріңіз: chatgpt.com/atlas(жаңа терезеде ашылады).
Алғыс
Осы жазбаға үлес қосқан Darin Fisher мен Marie Shin-ге, сондай-ақ Atlas-ты жасаған бүкіл OpenAI командасына ерекше алғыс айтамыз.


