Blog

Crash-i nga mungesa e memories që fshihej në një etiketë progresi

Një mbrëmje në fund të shtatorit, agjenti AI në hapësirën e punës së një përdoruesi u prish me një gabim jashtë memorie në mes të një ture. Dyshimet e dukshme — shumë nën-agjentë që punonin njëkohësisht, ose një kontekst që ishte rritur shumë — ishin të gabuara. Shkaku i vërtetë ishte një etiketë statusi: ndërsa modeli transmetonte një komandë të madhe shell disa karaktere në një kohë, ne e ridërgonim gjithë komandën deri atëherë si etiketë progresi në çdo pjesë. Një komandë 124 KB u bë rreth 41,000 ngjarje dhe afërsisht 690 MB vargje të vendosura në radhë.

Si e transmeton agjenti punën

Kur ndërtoni në Mythex, agjenti ekzekutohet brenda sandbox-it privat cloud të projektit tuaj. Ndërsa modeli shkruan, daljet e tij transmetohen përsëri te shfletuesi juaj: teksti shfaqet fjalë për fjalë, dhe kur ekzekuton një mjet — për shembull një komandë shell që shkruan një skedar — shihni një etiketë për të që përditësohet live, kështu e dini çfarë po bën.

Modeli transmeton në copa të vogla. Me modelin që po përdornim, këto copa shpesh ishin vetëm tre karaktere të gjata.

Hipotezat e para ishin të gabuara

Rrëzimi dukej si problem shkallëzimi, ndaj filluam aty.

  • Nën-agjentë paralelë? Tura kishte përdorur vetëm dy, secili me rreth 1.5 MB gjendje. Nuk mjaftonte.
  • Gjurmë të mbajtura në memorie? Gjurmimi ynë mbante një pemë ekzekutimi në memorie, por ajo nuk ishte aspak afër madhësisë së heap-it në momentin e rrëzimit.

Të dyja ishin histori të besueshme, dhe të dyja ishin të lira për t’u besuar. Asnjë nuk riprodhoi rrëzimin. Mësimi që e rimësojmë vazhdimisht: një hipotezë nuk është shkak derisa të riprodhojë dështimin.

Riprodhimi për të vërtetë

Ndërtuam një sandbox të përkohshëm me të njëjtat kufij memorie si prodhimi dhe një model të rremë që transmetonte një skedar të madh në copa realiste prej tre karakteresh. E bëmë edhe lexuesin në anën tjetër të socket-it të ngadaltë, si një rrjet real.

Kjo e riprodhoi. Heap-i u rrit dhe procesi vdiq me të njëjtin gabim.

Mekanizmi ishte i thjeshtë pasi mund ta shihnim. Ndërsa modeli shkruante një komandë të madhe — në këtë rast një heredoc që shkruante një skedar 124 KB — kodi ynë i transmetimit përditësonte etiketën e mjetit në çdo copë. Etiketa nuk ishte tre karakteret e reja; ishte gjithë komanda deri atëherë. Kështu ngjarjet u rritën: 3 karaktere, pastaj 6, pastaj 9, … deri në 124 KB, rreth 41,000 herë. Socket-i nuk mund t’i dërgonte aq shpejt sa prodhoheshin, kështu që u grumbulluan në buffer-in e shkrimit si vargje — rreth 690 MB prej tyre.

Zgjidhja

  • Kufizo etiketën. Një etiketë statusi duhet vetëm të thotë çfarë po ndodh. Tani kufizohet në 200 karaktere, dhe e kufizojmë sa shpesh rikontrollojmë komandën e pjesshme.
  • Ndalo bashkimin kuadratik. Bashkimi i copave të transmetuara me përplasje vargjesh të përsëritura është O(n²) për dalje të mëdha. Kaluam në një qasje me copa që shton në kohë lineare.

Pastaj kërkuam çdo gjë tjetër që mund të rritej pa kufi me një përmbytje daljesh, dhe e kufizuam:

  • Dalja live e komandës që shfaqet në bisedë grupohet dhe mbahet vetëm në 8,000 karakteret e fundit.
  • Rreshtat individualë të ngjarjeve kufizohen në 4 MB.
  • Buffer-i i riluajtjes që përdor një shfletues për t’u rikthyer pas rilidhjes kufizohet në 8 MB për projekt.
  • Checkpoint-et e vjetra pastrohen ndërsa avancon tura, duke mbajtur gjendjen më të re dhe pikat që u duhen turave të mëparshme.

Testimi i përmbytjeve pa mashtruar veten

Dy gjëra e bënë këtë më të vështirë për t’u testuar sesa duhej:

  1. Modelet e vërtetë nuk bashkëpunojnë. Kërkojini një modeli të shtypë një skedar gjigant dhe zakonisht do të refuzojë, do të përmbledhë ose do ta shkruajë më me arsye. Për të testuar përmbytje ju duhet një model i skriptuar që bën pikërisht atë që i thoni, duke kaluar nëpër kodin real të agjentit.
  2. Skriptet duhet të sillen si modele. Modeli ynë i parë i skriptuar ripërdorte të njëjtin ID përgjigjeje në çdo përgjigje, kështu që framework-u i agjentit e trajtonte çdo përgjigje si zëvendësim të së fundit dhe i mbyllte turat herët. Dukej si një gabim përditësimi i UI-së. Nuk ishte — ishte harness-i i testimit që na gënjente. Duhej gjithashtu të zbatonim në skript kufirin real të kontekstit të modelit, përndryshe numrat e memorisë ishin joreal.

Çfarë nxorëm nga kjo

  • UI-të e transmetimit e shumëzojnë gabimet e vogla. Çdo gjë që dërgohet "për çdo copë" dërgohet dhjetëra mijëra herë. Dërgoni vetëm ndryshimet, ose kufizoni payload-in.
  • Kufizoni çdo buffer që kalon një kufi të ngadaltë. Socket-et, regjistrat e riluajtjes dhe checkpoint-et kanë nevojë për tavan.
  • Riprodhoni para se të rregulloni. Dy shpjegimet tona të para dukeshin të sakta dhe ishin të gabuara.

Nëse keni parë kohët e fundit një skedar shumë të gjatë që shfaqet në bisedën e Mythex pa e ngadalësuar agjentin, kjo është pjesërisht arsyeja.

Mythex · Pricing · Ndërtoni çdo gjë me AI · Shablone faqesh dhe aplikacionesh · Mythex në krahasim · Fjalori i ndërtimit të aplikacioneve me AI · Mjete falas për ndërtimin e aplikacioneve me AI · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)