Avatud lähtekoodiga spetsifikatsioon Codexi orkestreerimiseks: Symphony
Autorid Alex Kotliarskyi, Victor Zhu ja Zach Brock
Kuus kuud tagasi, kui töötasime ettevõttesisese tootlikkuse tööriista kallal, tegi meie tiim toona vastuolulise otsuse: ehitame oma varamu ilma ühegi inimese kirjutatud koodireata. Iga rida meie projektivaramus pidi olema Codexi genereeritud.
Et see toimiks, kujundasime oma arendustöövoo nullist ümber. Ehitasime agendisõbraliku varamu, investeerisime tugevalt automatiseeritud testidesse ja kaitsemeetmetesse ning kohtlesime Codexit täisväärtusliku tiimikaaslasena. Dokumenteerisime selle teekonna oma eelmises blogipostituses rakmestikuinseneeriast.
Ja see töötas, kuid siis jõudsime järgmise pudelikaelani: kontekstivahetus.
Selle uue probleemi lahendamiseks ehitasime süsteemi nimega Symphony. Symphony(avaneb uues aknas) on agentide orkestreerija, mis muudab projektihaldustahvli, näiteks Lineari, kodeerimisagentide juhtimistasandiks. Iga avatud ülesanne saab agendi, agendid töötavad pidevalt ja inimesed vaatavad tulemused üle.
See postitus selgitab, kuidas lõime Symphony – mille tulemusel kasvas mõnes tiimis liidetud pull request’ide arv 500% – ja kuidas kasutada seda oma probleemijälgija muutmiseks alati töötavaks agentide orkestreerijaks.
Interaktiivsete kodeerimisagentide lagi
Isegi kui neid on üha lihtsam kasutada, on kodeerimisagendid – olgu neile ligipääs veebirakenduste või CLI kaudu – endiselt interaktiivsed tööriistad.
Kuna agentse töö maht OpenAI-s kasvas, avastasime uut tüüpi koormuse. Iga insener avas mõned Codexi seansid, määras ülesandeid, vaatas väljundi üle, suunas agenti ja kordas seda. Praktikas suutis enamik inimesi mugavalt hallata korraga kolme kuni viit seanssi, enne kui kontekstivahetus muutus valusaks. Sealt edasi tootlikkus langes. Unustasime, milline seanss mida teeb, hüppasime terminalide vahel, et agente taas õigele rajale suunata, ja silusime pikalt kestvaid ülesandeid, mis poole peal toppama jäid.
Agendid olid kiired, kuid meil oli süsteemne pudelikael: inimeste tähelepanu. Olime sisuliselt ehitanud väga võimekate nooreminseneride tiimi ja määranud siis oma iniminsenerid neid mikrotasandil juhtima. See ei olnud skaleeritav.
Vaateviisi muutus
Mõistsime, et optimeerime valet asja. Olime oma süsteemi seadnud kodeerimisseansside ja liidetud PR-ide ümber, kuigi PR-id ja seansid on tegelikult vaid vahend eesmärgi saavutamiseks. Tarkvara töövood on suuresti korraldatud väljundite ümber: probleemid, ülesanded, piletid, verstapostid.
Nii küsisime endalt, mis juhtuks, kui lõpetaksime agentide otsese juhendamise ja laseksime neil selle asemel meie ülesandejälgijast tööd võtta.
Sellest ideest sai Symphony – kirjalik spetsifikatsioon, mis toimib järelevaatajana agentse töö orkestreerimisel.
Meie probleemijälgija muutmine agentide orkestreerijaks
Symphony algas lihtsast kontseptsioonist: iga avatud ülesande peaks võtma agent ja selle lõpule viima. Selle asemel et hallata Codexi seansse mitmel vahekaardil, muutsime oma probleemijälgija juhtimistasandiks
.
Selles seadistuses vastab iga avatud Lineari probleem eraldi agendi tööjaamale. Symphony jälgib pidevalt tööde tahvlit ja tagab, et iga aktiivse ülesande jaoks töötab tsüklis agent kuni selle valmimiseni. Kui agent jookseb kokku või jääb toppama, käivitab Symphony selle uuesti. Kui ilmub uus töö, võtab Symphony selle üles ja hakkab tööd korraldama.
Ehitasime oma töövoo piletite olekute põhjal, kasutades ülesandehaldurit Lineari olekumasinana.
Praktikas lahutab Symphony töö seanssidest ja pull request’idest. Mõnest probleemist sünnib mitu PR-i eri varamutes; teised on puhtalt uurimine või analüüs, mis ei puuduta koodibaasi üldse.
Kui töö on sel viisil abstraheeritud, võivad piletid tähistada palju suuremaid tööühikuid.
Kasutame Symphonyt regulaarselt keerukate funktsioonide ja taristurännete orkestreerimiseks. Näiteks võime esitada ülesande, milles palume agendil analüüsida koodibaasi, Slacki või Notioni ja koostada teostusplaani. Kui oleme plaaniga rahul, genereerib agent ülesandepuu, jagades töö etappideks ja määratledes ülesannetevahelised sõltuvused.
Agendid alustavad tööd ainult ülesannetega, mis pole blokeeritud, seega kulgeb täitmine selle DAG-i (täitmissammude jada) puhul loomulikult ja optimaalselt paralleelselt. Allolevas näites märkisime Reacti uuenduse blokeerituks kuni Vite’ile üleminekuni. Nagu oodata võis, alustasid agendid Reacti uuendamist alles pärast seda, kui Vite’ile üleminek oli lõppenud.
Agendid saavad ka ise tööd luua. Rakendamise või ülevaatuse käigus märkavad nad sageli täiustusi, mis jäävad käesoleva ülesande ulatusest välja: jõudlusprobleem, refaktoreerimisvõimalus või parem arhitektuur. Kui see juhtub, esitavad nad lihtsalt uue probleemi, mida saame hiljem hinnata ja ajastada – paljud neist järelülesannetest võtavad samuti agendid üle. Kuigi me seda protsessi jälgime, püsivad agendid organiseerituna ja hoiavad töö edasi liikumas.
Selline tööviis vähendab drastiliselt ebamäärase töö käivitamise kognitiivset kulu. Kui agent teeb midagi valesti, on ka see kasulik info ja meie kulu on peaaegu null. Saame väga odavalt esitada pileteid, et agent läheks prototüüpima ja uurima, ning visata ära kõik uurimised, mis meile ei meeldi.
Kuna orkestreerija töötab arendusboksides ega maga kunagi, saame lisada ülesandeid ükskõik kust ja olla kindlad, et agent võtab need üles. Näiteks tegi üks meie tiimi insener oma telefonis Lineari rakendusest kolm olulist muudatust hubasest onnist kehva wifi ühendusega.
Sellise tööviisi tõttu rohkem uurimistööd
Symphonyga töötamise mõju vaadeldes oli kõige ilmsem muutus väljundis. Mõnes OpenAI tiimis nägime esimese kolme nädala jooksul liidetud PR-ide arvu kasvu 6 korda. Väljaspool OpenAI-d tõi Lineari asutaja Karri Saarinen Symphony avaldamise järel esile loodud tööjaamade arvu hüppelise kasvu(avaneb uues aknas). Sügavam nihe seisneb aga selles, kuidas tiimid tööst mõtlevad.
Kui meie insenerid ei kuluta enam aega Codexi seansside juhendamisele, muutub koodimuudatuste majandus täielikult. Iga muudatuse tajutav kulu langeb, sest me ei investeeri enam inimtööd teostuse enda juhtimisse.
See muutis meie käitumist. Spekulatiivsete ülesannete käivitamine Symphonys on muutunud triviaalseks. Proovi ideed, uuri refaktoreerimist, testi hüpoteesi ja jäta alles ainult tulemused, mis tunduvad paljulubavad.
See laiendab ka seda, kes saab tööd algatada. Meie tootejuht ja disainer saavad nüüd esitada funktsioonipäringuid otse Symphonysse. Nad ei pea varamut välja checkout’ima ega Codexi seanssi haldama. Nad kirjeldavad funktsiooni ja saavad vastu ülevaatepaketi, mis sisaldab videot sellest, kuidas funktsioon päris tootes töötab.
Symphony paistab silma ka suurtes monovarades (nagu see, mis meil OpenAI-s on), kus PR-i viimase miili läbimine on aeglane ja habras. Süsteem jälgib CI-d, rebase’ib vajadusel, lahendab konflikte, proovib ebastabiilseid kontrolle uuesti ja üldiselt saadab muudatusi läbi toru. Selleks ajaks, kui pilet jõuab olekusse Merging, on meil suur kindlus, et muudatus jõuab peaharusse ilma inimese lapsehoidmiseta.
Edasiminek toob kaasa uusi, teistsuguseid probleeme
Sellel tasemel tegutsemisega kaasnevad kompromissid. Kui liikusime agentide interaktiivselt suunamiselt neile piletitasemel töö määramiseni, kaotasime võimaluse neid pidevalt lennult nügida ja vajaduse korral kurssi korrigeerida. Mõnikord tootis agent midagi, mis läks täiesti märgist mööda. See oli kasulik – need ebaõnnestumised paljastasid süsteemi lüngad ja aitasid meil seda vastupidavamaks muuta.
Selle asemel et tulemust käsitsi lappida, lisasime kaitsemeetmeid ja oskusi, et agendid saaksid järgmisel korral edukad olla. Aja jooksul viis see meid selleni, et lisasime oma rakmestikule uusi võimekusi, nagu end-to-end testide käitamine, rakenduse juhtimine Chrome DevToolsi kaudu ja QA smoke-testide haldamine. Parandasime märkimisväärselt oma dokumentatsiooni ja täpsustasime, milline hea tulemus välja näeb.
Kõik ülesanded ei sobi Symphony stiilis tööks. Mõned probleemid nõuavad endiselt insenere, kes töötavad otse interaktiivsete Codexi seanssidega, eriti ebamäärased probleemid või töö, mis nõuab tugevat otsustusvõimet ja asjatundlikkust. Praktikas on need tavaliselt kõige huvitavamad ja nauditavamad ülesanded, millele meie insenerid aega kulutavad.
Erinevus seisneb selles, et Symphony saab hakkama suurema osa rutiinsest teostustööst. See laseb inseneridel keskenduda korraga ühele raskele probleemile, selle asemel et pidevalt väiksemate ülesannete vahel konteksti vahetada.
Õppisime ka seda, et agentide käsitlemine jäikade sõlmpunktidena olekumasinas ei toimi hästi. Mudelid muutuvad targemaks ja suudavad lahendada suuremaid probleeme, kui kast, kuhu püüame neid suruda. Näiteks varastes versioonides olid kõik GitHubi integratsioonid osa välisest rakmestikust – näiteks eeldati varastes versioonides, et Codex teeb ainult koodimuudatusi, samal ajal kui ülejäänud protsess (muudatuste esitamine, testide käivitamine) oli määratud koodis. Meie varased agentse töö versioonid palusid Codexil ainult ülesande rakendada. See lähenemine osutus liiga piiravaks. Codex on täiesti võimeline looma mitu PR-i, samuti lugema ülevaatetagasisidet ja sellega tegelema. Nii et andsime talle tööriistad – gh CLI, oskused CI logide lugemiseks jne – ja nüüd saame paluda Codexil teha rohkemat, näiteks sulgeda vanu PR-e või koostada aruandeid lõpetatud versus hüljatud töö kohta. Seda tüüpi ülesanded jäid algsest funktsiooni rakendamise kastist kaugele välja.
Nii liikusime lõpuks agentidele rangete üleminekute asemel eesmärkide andmise suunas, umbes nagu hea juht annaks eesmärgi oma tiimi otsealluvusele. Mudelite jõud tuleb nende võimest arutleda, seega anna neile tööriistad ja kontekst ning lase neil tegutseda.
Symphony kasutamine Symphony ehitamiseks
Kui avad Symphony varamu, märkad esimesena seda, et tehniliselt on Symphony lihtsalt SPEC.md fail – probleemi ja kavandatud lahenduse definitsioon. Selle asemel et ehitada keerukas järelevalvesüsteem, määratlesime probleemi ja kavandatud lahendused, andes agentidele kõrgtaseme suunamise.
Viiterakendus on kirjutatud Elixiris – sest kui kood on sisuliselt tasuta, saad lõpuks valida keeli nende tugevuste järgi, nagu Elixiri samaaegsus – kuid põhituuma idee saab väljendada lihtsas Markdowni dokumendis. Soovitame suunata oma lemmik kodeerimisagendi spetsifikatsiooni juurde ja lasta tal rakendada oma versioon.
Symphony esimene versioon oli lihtsalt Codexi seanss, mis jooksis tmuxis, päris Lineari ja käivitas uute ülesannete jaoks alamagente. See töötas, kuid ei olnud eriti töökindel. Teine versioon elas meie peamises projektivaramus, mis oli ehitatud agente silmas pidades. Olime juba loonud agentide rakmestiku, et anda agentidele oskused ja kontekst selles varamus kvaliteetse töö tegemiseks, nii et Symphony lihtsalt ühendab selle kõik.
Kui põhifunktsionaalsus oli olemas, kasutasime Symphonyd Symphony ehitamiseks.
Kui demonstreerisime süsteemi ettevõttesiseselt ülesandeid haldamas ja selle proof-of-work-videot lisamas, oli reaktsioon ülivõrdes positiivne: meie Symphony projekti kanal kasvas ning tiimid üle organisatsiooni hakkasid seda loomulikult kasutama. Ettevõttesisene product-market fit on OpenAI-s väliselt lansseerimise eeltingimus. Selle põhjal, kuidas seda OpenAI-s kasutati, sai selgeks, et peaksime Symphonyt jagama ka väljaspool ettevõtte seinu.
Nii eraldasime idee iseseisvaks SPEC.md-ks ja palusime Codexil selle rakendada. Viiterakenduse jaoks valisime Elixiri, suhteliselt nišikeele, millel on suurepärased primitiivid samaaegsete protsesside orkestreerimiseks ja järelevalveks. Codex ehitas Elixiri rakenduse ühe korraga ning sealt edasi iteratsioonisime nii spetsifikatsiooni kui ka teostuse kallal. Spetsifikatsiooni lihvimiseks palusime Codexil selle isegi mitmes teises keeles rakendada – TypeScript, Go, Rust, Java, Python – ja kasutada tulemusi mitmetimõistetavuste tuvastamiseks ning süsteemi lihtsustamiseks. See õnnestus igas keeles.
Codexit ehitades eemaldasime palju juhuslikku keerukust, näiteks sõltuvused konkreetsetest varamutest või Linear MCP-st. Symphony ei sõltu enam meie sisemistest varamutest ega töövoogudest. Põhiline lähenemine muutus lihtsaks:
Iga avatud ülesande jaoks taga, et oma tööjaamas töötaks agent.
Lisaks aktiivse töö aitamisele on arendustöövoog nüüd midagi, mida agendid teavad ja järgivad. Arendustöövoog – tööta probleemi kallal, checkout’i varamu, märgi see pooleliolevaks, et tootejuht teaks, et sellega tegeletakse, lisa PR, vii see olekusse Review, lisa videod jne – on nüüd talletatud lihtsasse WORKFLOW.md faili. Kõik see oli protsess, mida inimesed järgisid, kuid seda ei olnud kunagi dokumenteeritud. Selle asemel et toetuda sellele vaikimisi sammude kogumile, dokumenteerime selle nüüd ja Symphony tagab, et agendid seda järgivad. See võimaldab meil ehitada agente, kes töötavad meie kõrval. Kui otsustame, et agendid peaksid valminud tööle lisama ka enesereflektsiooni, lisame selle WORKFLOW.md-sse ja Symphony juhendab agente selle sammuni.
Saime kasutada Codexit ka app server mode’is(avaneb uues aknas), mis on Codexi sisseehitatud peata režiim. See režiim võimaldas meil Codexit käitada ja sellega programmiliselt suhelda hästi dokumenteeritud JSON-RPC API kaudu, näiteks lõime alustamiseks või käikudele reageerimiseks. See on palju mugavam ja skaleeruvam viis kui püüda Codexiga suhelda CLI või elavate tmux seansside kaudu.
Codex App Server sobis meie kasutusjuhtumiks ideaalselt: kasutame ära Codexi pakutavat rakmestikku, samal ajal kui meil on olemas nupud ja haagid, mille külge haakuda. Näiteks selleks, et vältida Lineari juurdepääsutokeni avaldamist alamagentidele, kasutame dünaamilisi tööriistakutseid(avaneb uues aknas), et paljastada toores linear_graphql funktsioon, mis täidab suvalisi päringuid Lineari vastu, ilma MCP-le tuginemata või juurdepääsutokenit konteineritele avaldamata.
Mis edasi
Symphony on teadlikult minimaalne orkestreerimiskiht. Teeme selle avatud lähtekoodiga kättesaadavaks, et näidata Codex App Serveri võimsust koos erinevate töövootööriistadega, näiteks Lineariga. Seetõttu ei plaani me Symphonyt eraldiseisva tootena hooldada. Mõtle sellest kui viiterakendusest. Sarnaselt sellele, kuidas paljud arendajad suunasid oma kodeerimisagendid rakmestikuinseneeria postituse juurde, et oma varamuid karkassina üles ehitada, loodame, et suunad oma lemmik kodeerimisagendi Symphony spetsifikatsiooni(avaneb uues aknas) ja varamu(avaneb uues aknas) juurde, et ehitada oma keskkondadele kohandatud versioonid.
Jõud tuleb Codexist ja selle rakendusserverist. Symphony oli viis ühendada Codex ja Linear, kaks asja, mida me juba kasutasime, et lahendada töö juhtimise probleem. Kui kodeerimisagendid muutuvad arutlemises ja juhiste järgimises paremaks, kahtlustame, et pudelikael teistes ettevõtetes nihkub samuti koodi kirjutamiselt agentse töö juhtimisele. Põnev osa on see, et nende kodeerimisagentide süsteemidega eksperimenteerimise barjäär on nüüd üllatavalt madal. Sa võid lihtsalt Codexiga asju ehitada.
Kogukonna tunnustused
Meil on väga hea meel näha, et inseneeriakogukond kasutab Symphonyt väljalaskest möödunud nädalatel, kogudes 23. aprilli seisuga üle 15 tuhande GitHubi tähe(avaneb uues aknas).