Kaip „OpenAI“ naudoja „Codex“
„Codex“ kasdien naudoja daugelis „OpenAI“ techninių komandų: Saugumo, Produktų inžinerijos, Išorinės sąsajos, API, Infrastruktūros bei Našumo inžinerijos. Komandos jį naudoja įvairioms inžinerijos užduotims paspartinti: nuo sudėtingų sistemų perpratimo ir didelių kodų bazių pertvarkymo iki naujų funkcijų išleidimo ir incidentų sprendimo, kai spaudžia griežti terminai.
Remdamiesi pokalbiais su „OpenAI“ inžinieriais ir vidiniais naudojimo duomenimis, sudarėme naudojimo atvejų bei gerosios praktikos pavyzdžių sąrašą, kuris puikiai iliustruoja, kaip „Codex“ padeda mūsų komandoms dirbti greičiau, gerinti kokybę ir valdyti sudėtingus didelio masto procesus.
„Codex“ padeda mūsų komandoms greitai perprasti nepažįstamas kodo bazės dalis įvedant naujus darbuotojus, derinant klaidas ar tiriant incidentus.
Dažnai inžinieriai naudoja „Codex“ norėdami rasti pagrindinę funkcijos logiką, nustatyti paslaugų ar modulių ryšius ir atsekti duomenų srautą sistemoje. Modelis taip pat išryškina architektūros šablonus arba trūkstamas dokumentacijos dalis – tam kitu atveju prireiktų daug rankinio darbo.
Kai tenka reaguoti į incidentus, „Codex“ padeda inžinieriams greitai įsigilinti į naujas sritis – išryškina komponentų sąveikas arba atseka, kaip klaidų būsenos plinta sistemose.
Mūsų komandų patirtis
„Ištaisęs klaidą, naudoju klausimų režimą (angl. „Ask mode“), norėdamas pažiūrėti, kur dar kodo bazėje gali pasikartoti tokia pati problema.“
„Where is the authentication logic implemented in this repo?“ (Kurioje šios saugyklos vietoje realizuota tapatybės nustatymo logika?)
„Summarize how requests flow through this service from entrypoint to response.“ (Apibendrink, kaip per šią paslaugą keliauja užklausos – nuo įvesties taško iki atsako.)
„Which modules interact with [insert module name] and how are failures handled?“ (Kokie moduliai sąveikauja su [įveskite modulio pavadinimą] ir kaip apdorojamos klaidos?)
Inžinieriai dažnai naudoja „Codex“ keisdami kelis failus ar paketus vienu metu. Pavyzdžiui, kai inžinieriai atnaujina API, keičia šablono diegimo būdą arba pereina prie naujos priklausomybės, „Codex“ leidžia lengvai ir nuosekliai pritaikyti pakeitimus.
Tai ypač naudinga, kai tą patį atnaujinimą reikia pritaikyti dešimtims failų arba kai atnaujinimui būtina suprasti struktūrą ir priklausomybes, kurių neįmanoma lengvai aptikti naudojant reguliariuosius reiškinius (angl. „regular expressions“, regex) ar įprastą paieškos ir keitimo funkciją.
Inžinieriai juo taip pat naudojasi tvarkydami kodą – skaido per didelius modulius, senus šablonus keičia moderniais arba paruošia kodą taip, kad jį būtų lengviau testuoti.
Mūsų komandų patirtis
„Codex“ visas senąsias „getUserById()“ funkcijas pakeitė pagal naująjį paslaugos šabloną ir sukūrė išsiuntimo užklausą. Tai, kas būtų užtrukę kelias valandas, jis atliko per kelias minutes.“
„Split this file into separate modules by concern and generate tests for each one.“ (Padalyk šį failą į atskirus modulius pagal atsakomybes ir kiekvienam sugeneruok testus.)
„Convert all callback-based database access to async/await.“ (Pakeisk visą atgalinėmis iškvietomis grįstą duomenų bazės prieigą į „async/await“.)
„Codex“ padeda nustatyti ir pašalinti našumo kliūtis.
Derindami sistemas ar didindami jų patikimumą, inžinieriai paveda „Codex“ išanalizuoti lėtus ar daug atminties reikalaujančius kodo kelius (pvz., neefektyvius ciklus, perteklines operacijas ar daug resursų reikalaujančias užklausas) ir pasiūlyti optimizuotas alternatyvas. Tai dažnai padeda gerokai padidinti sistemų efektyvumą bei patikimumą.
„Codex“ taip pat padeda palaikyti kodo kokybę – jis aptinka vis dar aktyviai naudojamus rizikingus ar pasenusius šablonus. Mūsų komandos kliaujasi šiuo modeliu siekdamos sumažinti ilgalaikę techninę skolą ir iš anksto užkirsti kelią regresijoms.
Mūsų komandų patirtis
„Naudoju „Codex“ siekdamas aptikti pasikartojančius, daug resursų reikalaujančius duomenų bazės iškvietimus. Jis puikiai išryškina kritinius kelius ir sugeneruoja masines užklausas, kurias vėliau galiu koreguoti.“
„Optimize this loop for memory efficiency and explain why your version is faster.“ (Optimizuok šį ciklą, kad jis efektyviau naudotų atmintį, ir paaiškink, kodėl tavo versija greitesnė.)
„Find repeated expensive operations in this request handler and suggest caching opportunities.“ (Rask pasikartojančias, daug resursų reikalaujančias operacijas šiame užklausų doroklyje ir pasiūlyk talpyklos naudojimo galimybes.)
„Suggest a faster way to batch DB queries in this function.“ (Pasiūlyk greitesnį būdą, kaip šioje funkcijoje grupuoti duomenų bazės užklausas.)
„Codex“ padeda inžinieriams greičiau rašyti testus – ypač ten, kur aprėptis maža arba jos išvis nėra.
Taisydami klaidas arba pertvarkydami kodą, inžinieriai dažnai prašo „Codex“ pasiūlyti testų, apimančių ribinius atvejus arba galimus klaidų scenarijus. Naujam kodui modelis gali sugeneruoti vieneto arba integravimo testus, atsižvelgdamas į funkcijos parašą ir susijusią logiką.
„Codex“ ypač praverčia nustatant ribines sąlygas, pavyzdžiui, tuščias įvestis, maksimalų ilgį ar neįprastas, bet galiojančias būsenas, kurių atliekant pradinius testus dažnai nepastebima.
Mūsų komandų patirtis
„Nakčiai nukreipiu „Codex“ į modulius, kurių testavimo aprėptis maža, o atsibudęs randu paruoštas vienetų testų išsiuntimo užklausas.“
„Write unit tests for this function, including edge cases and failure paths.“ (Parašyk šios funkcijos vieneto testus, įskaitant ribinius atvejus ir klaidų scenarijus.)
„Generate a property-based test for this sorting utility.“ (Sugeneruok savybėmis grįstą testą šiai rikiavimo priemonei.)
„Extend this test file to cover missing scenarios around null inputs and invalid states.“ (Išplėsk šį testų failą, kad jis apimtų trūkstamus scenarijus dėl „null“ įvesčių ir netinkamų būsenų.)
„Codex“ padeda komandoms paspartinti tiek kūrimo ciklo pradžią, tiek pabaigą.
Pradėdami kurti naują funkciją, inžinieriai jį naudoja pradinei kodo bazei formuoti – sugeneruoja aplankus, modulius ir API ruošinius, kad būtų galima greitai gauti veikiantį kodą ir nereikėtų visko konfigūruoti rankomis.
Artėjant projektų išleidimui, „Codex“ padeda laikytis griežtų terminų – jis perima smulkesnes, bet būtinas užduotis: nustato klaidų prioritetus, užpildo paskutines spragas ir generuoja diegimo scenarijus, telemetrijos gaudykles bei konfigūracijos failus.
Modelis taip pat padeda atsiliepimus apie produktą paversti pradiniu kodu. Inžinieriai dažnai įklijuoja naudotojo užklausą ar specifikaciją, o „Codex“ sugeneruoja juodraštį, kurį vėliau galima patobulinti.
„Visą dieną praleidau susitikimuose, bet vis tiek sujungiau 4 išsiuntimo užklausas, nes „Codex“ dirbo fone.“
„Scaffold a new API route for POST /events with basic validation and logging.“ (Sukurk pradinę naujo API maršruto struktūrą POST /events užklausoms su baziniu tikrinimu ir žurnalizavimu.)
„Generate a telemetry hook for tracking success/failure of the new onboarding flow, using this template [insert example of your telemetry code].“ (Sugeneruok telemetrijos gaudyklę, skirtą naujos įvedimo eigos sėkmei ar nesėkmei sekti, naudodamas šį šabloną [įterpkite telemetrijos kodo pavyzdį].)
„Create a stub implementation based on this spec: [insert spec or product feedback].“ (Sukurk pradinę realizacijos struktūrą pagal šią specifikaciją: [įterpkite specifikaciją arba atsiliepimus apie produktą].)
„Codex“ padeda mūsų inžinieriams išlikti produktyviems, net kai jų dienotvarkė suskaidyta ir kupina trikdžių.Modelis padeda užfiksuoti nebaigtus darbus, paversti užrašus veikiančiais prototipais ar parengti tiriamąsias užduotis, prie kurių bus galima sugrįžti vėliau. Dėl to lengviau sustabdyti ir atnaujinti darbą neprarandant konteksto – ypač budint ar dalyvaujant daugybėje susitikimų.
„Jei pastebiu nedidelę klaidą, užuot keitęs atšakas, pavedu šią užduotį „Codex“, o jo išsiuntimo užklausą peržiūriu atsiradus laiko.“
„Codex“ praverčia atliekant atvirus tyrimus – pavyzdžiui, kai reikia rasti alternatyvių sprendimų arba patvirtinti dizaino pasirinkimus. Galite teikti užklausas dėl skirtingų problemos sprendimo būdų, tyrinėti nepažįstamus šablonus arba atidžiai patikrinti prielaidas. Tai padeda išryškinti kompromisus, išplėsti dizaino alternatyvas ir priimti tikslesnius realizacijos sprendimus.
Modelis taip pat padeda aptikti susijusias klaidas. Nurodžius konkrečią problemą ar nebenaudojamą metodą, „Codex“ gali rasti panašius šablonus kitose kodo vietose – tai padeda lengviau aptikti regresijas arba užbaigti kodo tvarkymo darbus.
„Codex“ padeda man išspręsti šaltojo paleidimo problemą – įklijuoju specifikaciją ir dokumentaciją, o jis sukuria pradinę kodo struktūrą arba parodo, ką pamiršau.“
„How would this work if the system were event-driven instead of request/response?“ (Kaip tai veiktų, jei sistema būtų grįsta įvykiais, o ne užklausomis ir atsakais?)
„Find all modules that manually build SQL strings instead of using our query builder.“ (Rask visus modulius, kurie rankiniu būdu formuoja SQL eilutes, užuot naudoję mūsų užklausų konstruktorių.)
„Rewrite this in a more functional style, avoid mutation and side effects.“ (Perrašyk tai funkcionalesniu stiliumi, venk mutacijų ir šalutinio poveikio.)
„Codex“ geriausiai veikia, kai modeliui pateikiama struktūra ir kontekstas bei suteikiama galimybė kartoti ir tobulinti procesą. Štai keletas įpročių, kuriuos ugdosi „OpenAI“ komandos, siekdamos, kad kasdieniame darbe šis modelis nuolat būtų naudingas.
Atlikdami didelius pakeitimus, pirmiausia klausimų režimu (angl. „Ask mode“) paprašykite „Codex“ sukurti realizacijos planą – perjungus kodo režimą (angl. „Code mode“), šis planas taps įvestimi tolesnėms užklausoms. Šis dviejų žingsnių procesas užtikrina faktinį „Codex“ pagrindimą ir padeda išvengti klaidų išvestyse. „Codex“ geriausiai tinka tiksliai apibrėžtoms užduotims, kurias atlikti jums ar komandos nariui prireiktų maždaug valandos, arba kurioms reikia parašyti kelis šimtus kodo eilučių. Modeliams tobulėjant, jų atliekamų užduočių apimtis didės.
Nustačius paleidimo scenarijų, aplinkos kintamuosius ir prieigą prie interneto, „Codex“ klaidų skaičius gerokai sumažėja. Vykdydami užduotis, stebėkite kūrimo klaidas, kurias galima ištaisyti pakoregavus „Codex“ aplinkos konfigūraciją. Nors tam gali prireikti kelių bandymų, ilgainiui efektyvumas smarkiai padidės.
„Codex“ pateikia geresnius atsakymus, kai užklausos atspindi tai, kaip apibūdintumėte pakeitimą išsiuntimo užklausoje (angl. „Pull request“, PR) ar ataskaitoje. Tai reiškia, kad prireikus būtina įtraukti failų kelius, komponentų pavadinimus, skirtumus (angl. „diffs“) ir dokumentacijos fragmentus. Geresnių rezultatų pasiekiama formuojant užklausas pagal tokius šablonus kaip „Įdiek tai taip, kaip [X modulyje]“.
Kurkite užduotis šalutinėms idėjoms, daliniam darbui ar nedideliems pataisymams fiksuoti. Nereikia stengtis vienu ypu sugeneruoti visos išsiuntimo užklausos. „Codex“ puikiai veikia kaip paruošiamoji aplinka, prie kurios galima sugrįžti vėl galint tam skirti visą dėmesį.
Tvarkykite AGENTS.md failą, kad „Codex“ jūsų saugykloje efektyviau apdorotų užklausas. Paprastai tokiuose failuose pateikiamos pavadinimų suteikimo taisyklės, verslo logika, žinomi ypatumai ar priklausomybės, kurių „Codex“ negali suprasti vien iš kodo. Daugiau informacijos apie AGENTS.md failo struktūrą rasite dokumentacijoje.
Naudodamiesi šia funkcija galite vienu metu sugeneruoti kelis atsakymus vienai užduočiai, kad galėtumėte greitai išnagrinėti kelis sprendimo būdus ir pasirinkti geriausią. Jei užduotys sudėtingesnės, galite peržiūrėti kelias iteracijas ir sujungti skirtingų atsakymų dalis, kad gautumėte geresnį rezultatą.
Nors „Codex“ vis dar išankstinės tyrimų versijos stadijoje, jis jau daro realų poveikį mūsų kūrimo procesams – padeda mums dirbti greičiau, rašyti geresnį kodą ir imtis užduočių, kurios kitu atveju niekada nebūtų tapusios prioritetu.
Mus džiugina ateities perspektyvos – kadangi mūsų modeliai tobulėja, o „Codex“ vis giliau integruojamas į mūsų darbo eigą, tikimės atrasti dar veiksmingesnių būdų, kaip jį panaudoti kuriant programinę įrangą. Savo atradimais dalysimės ir toliau.


