A konténerek túl lassúak az AI-generált kód izolálásához. Nem egy kicsit lassúak, hanem nagyságrendekkel. Másodpercek az indulásig, példányonként több száz megabájt, és ha ezer párhuzamos sandboxra van szüksége, akkor egy negyedéves infrastrukturális projekt néz Önre.
Ez a rövid összefoglalója annak, amiről ez a cikk szól, és ha Ön már ugyanerre a következtetésre jutott, nyugodtan ugorjon a lenti Dynamic Workers szakaszra.
A konténer-probléma
A nem megbízható kód futtatásának szokásos módja egy Docker-konténer izolált fájlrendszerrel és hálózattal. Működik. Egy belső eszközhöz, ahol az ügynök napi 50 kérést kezel, tökéletesen megfelel. Egy ügyfélközpontú termékhez, amelyben több ezer párhuzamos munkamenet generál és futtat kódot, gyorsan összeomlik. Már önmagában az indulási idő tönkreteszi a felhasználói élményt, több ezer konténer Kubernetesen keresztüli vezénylése pedig önmagában is egy projekt.
Ebbe egy ügyfélprojektnél futottunk bele az első negyedévben, amikor egy olyan ügynököt építettünk, amely természetes nyelvű bemenetből TypeScriptet generál, és azonnal futtatja is. A modell volt a könnyebb rész. Hol fut valójában a generált kód? És az, hogy „ugyanazon a szerveren, mint minden más", nem válasz, hanem egy biztonsági incidens, amely csak egy alkalomra vár.
Mit adott ki a Cloudflare
Március 24-én a Cloudflare nyílt bétában kiadta a Dynamic Worker Loadert. Szerintem ez a negyedév legérdekesebb infrastrukturális megjelenése. Az ötlet egyszerű. Konténerek helyett V8-izolátumokat használunk. A V8 hajtja a Chrome-ot és a Node.js-t. Az izolátum egy különálló végrehajtási kontextus ugyanazon a folyamaton belül, saját heappel, saját stackkel és nulla hozzáféréssel a gazdagéphez. Ezredmásodpercek alatt indul.
A számok, amelyeket a Cloudflare közzétett: 100-szor gyorsabb indulás a konténerekhez képest, 10-100-szor kevesebb memória, korlátlan számú párhuzamos sandbox (állításuk szerint másodpercenként több millió kérés), nulla késleltetés, mert az izolátum ugyanazon a gépen fut, mint a szülő Worker.
A Cloudflare benchmarkjait fenntartással kezelem, mert a Cloudflare a Cloudflare-t árulja. De még ezeknek a számoknak a felénél is óriási előrelépés a konténerekhez képest.
A folyamat így néz ki. A fő Workere fogad egy kérést, egy AI-modell legenerál egy TypeScript-függvényt, a Worker meghívja a Dynamic Worker Loadert, az létrehoz egy V8-izolátumot, betölti a kódot, lefuttatja, és visszaadja az eredményt. A válasz után az izolátum eldobásra kerül. Nincs állapot, nincs maradvány, nincs hozzáférés a szülőhöz.
Code Mode
Van egy minta, amelyet a Cloudflare Code Mode-nak nevez, és amelyet igazán érdekesnek tartok. A szokásos tool-calling protokoll helyett (a modell JSON-t generál, a runtime végrehajtja, a modell elemzi az eredményt, meghívja a következő eszközt) az ügynök egyetlen TypeScript-függvényt ír, amely az egész munkafolyamatot összefűzi.
A Cloudflare mérése szerint a tokenfelhasználás 81%-kal csökken a tool callökhöz képest. Ezt magam nem ellenőriztem, de az irányát tekintve logikus. Kevesebb oda-vissza fordulás, kevesebb kontextusablak elhasználva a köztes eredményekre.
Tegyük fel, hogy az ügynök megkapja, hogy „hozz létre egy számlát a Stripe-ban X ügyfél számára az Y tételekkel". Négy különálló tool call helyett egyetlen függvényt ír, amely az egész folyamatot egyetlen menetben elvégzi.
A korlátok
Csak V8. Tehát TypeScript és JavaScript, nem Python, nem Go, nem natív binárisok. Hosszan futó feladatokra sem tervezték. Egy izolátum egy kérést dolgoz fel, majd eldobásra kerül. Az ára 0,002 $ egyedi Workerenként naponta, plusz a szokásos CPU- és hívásdíjak (a béta alatt elengedve).
Az én véleményem
Ha olyan ügynököket épít, amelyek kódot generálnak és futtatnak, az izoláció nem opcionális. A Dynamic Workers az egyik jó válasz. Gyors, olcsó, és jól skálázódik. De nem az egyetlen. Néha továbbra is konténerre van szüksége. Néha elég egy API gateway korlátozás. Attól függ, mit csinál az ügynök, és milyen adatokhoz nyúl.
A nehezebb kérdés, amelyet a Cloudflare nem válaszol meg (és nem is kellene), az az, hogyan alakítja ki a megbízható és a nem megbízható kód közötti határt egy ügynökrendszerben. A sandbox csak a végrehajtási réteg. Az, hogy mi kerül bele, mit hívhat meg, és hogyan validálja a kimenetét. Ez az architekturális kérdés. Ha épp ezen dolgozik, írtunk az ügynök és az automatizálás közötti döntésről és a több modellt használó stratégiákról, amelyek ezt is érintik.
Ha olyan ügynököt épít, amely felhasználó által generált kódot futtat, és szeretne az architektúráról beszélni, vegye fel velünk a kapcsolatot.