Kako duge agentske radnje ostaju u kontekstnom prozoru
Model može da pročita samo određenu količinu odjednom, to jest svoj kontekstni prozor. Mythexov agent radi dug posao: čita mnogo fajlova, pokreće komande i prosleđuje ograničene zadatke podagentima. Otkrili smo tri načina na koja je dugi rad pucao: podagenti su rasli dok model nije odbio svaki zahtev, podagent je prerano stao jer je mislio da mu je ponestalo mesta, a naš broj tokena je bio veoma pogrešan za ruski, kineski i japanski tekst. Evo šta smo promenili.
Prvo neki pojmovi
- Tokeni su delovi teksta koje model čita. Limiti i troškovi se broje u njima, a ne u karakterima ili rečima.
- Kontekstni prozor je najviše što model može da pročita u jednom zahtevu. Mi takođe postavljamo sopstveni, niži budžet za svaki zahtev, da troškovi i brzina ostanu razumni.
- Rezultati alata su ono što agent dobija nazad od svojih alata: sadržaj fajla koji je čitao, izlaz komande koju je pokrenuo. U dugom radu oni čine najveći deo onoga što se šalje.
- Podagent je pomoćnik koji glavni agent pokreće za samostalan zadatak, na primer „proveri ova poglavlja u odnosu na beleške”. Dobija jedno uputstvo, pa zatim radi kroz mnogo poziva alata sam.
Problem 1: podagenti su rasli dok ih model nije odbio
Pri svakom koraku agent šalje modelu razgovor do tog trenutka. Kada je to postalo preveliko, naš kod ga je skraćivao, ali samo na početku korisničke poruke, da poziv alata i njegov rezultat nikada ne budu razdvojeni. Zadržavao je prvu poruku, dodavao napomenu da je raniji razgovor skraćen i zadržavao najnovije cele krugove koji su stajali.
Podagent ima tačno jednu korisničku poruku: svoje uputstvo. Nije bilo gde da se seče. Zato je slao celu svoju istoriju pri svakom koraku, a ona je rasla, sve dok zahtev nije postao veći od onoga što model uopšte prihvata, otprilike milion tokena. U testu sa 8 takvih podagenata, svih 8 je bilo odbijeno.
Ispravka: prvo obrisati stare rezultate alata
Zahtevi sada staju u budžet u tri koraka, a svaki se proba samo ako prethodni nije bio dovoljan:
- Obrišite najstarije rezultate alata. Njihov sadržaj se zamenjuje kratkom napomenom: rezultat je obrisan da bi razgovor ostao unutar konteksta modela, a agent može ponovo da pokrene alat ako mu zatreba. Fajl pročitan pre sat vremena je obično najveća i najmanje korisna stvar u zahtevu, a fajl je i dalje tu da se ponovo pročita. Najnoviji rezultati ostaju celi.
- Zadržite cele korisničke krugove. Kao i ranije: prva poruka, napomena i najnoviji kompletni krugovi koji stanu.
- Zadržite cele krugove alata. Unutar jedne duge radnje, a to je jedina vrsta koju podagent ima, zadržite prvu poruku, napomenu i najnovije kompletne krugove „pozovi alat, dobij rezultat”.
Ovo utiče samo na to šta se šalje. Sačuvana istorija agenta čuva sve. U istom testu, 0 od 8 je odbijeno i svih 8 je završilo.
Brisanje u serijama, da keširanje i dalje radi
Provajderi modela mogu ponovo da koriste rad na početku zahteva ako je identičan prethodnom, takozvani prefix keš. Da smo pri svakom pozivu brisali još jedan rezultat, početak zahteva bi se menjao pri svakom pozivu i keš nikada ne bi pomogao.
Zato se najstariji rezultati brišu po četiri, a ne po jedan. Obrisani deo tada ostaje isti kroz više poziva. Rezultat koji nije mnogo veći od napomene se ostavlja netaknut, jer bi njegovo brisanje uštedelo gotovo ništa, a i dalje bi menjalo početak zahteva. Koliko ostaje celo određuje veličina, a ne broj: najnoviji rezultati koji stanu u četvrtinu budžeta ostaju, uvek bar jedan. Ranija verzija je zadržavala fiksnih šest celih rezultata, što je bilo dobro za kratak izlaz komandi, ali je kod dugih čitanja fajlova ostavljalo veći deo budžeta starim rezultatima.
Odbijanja sada to kažu
Zahtev koji model odbije kao nevažeći se više ne pokušava ponovo, jer bi slanje istog zahteva dalo isti odgovor. Ako je razgovor predugačak za model, osoba vidi: „Ovaj razgovor je postao predugačak da bi ga model pročitao odjednom. Počnite novi čet za sledeći korak. Sve što je do sada napravljeno ostaje.” To je stvar koju osoba treba da reši, a ne ispad, pa ne šalje alarm nama.
Problem 2: agent je stajao da bi „uštedeo prostor”
Podagent kojem je rečeno da pročita 40 dugih poglavlja stao je posle 2, rekavši da hoće da uštedi prostor. Iskoristio je oko 100.000 tokena od budžeta od 400.000.
Nije mogao da zna da će se stari rezultati sada brisati umesto njega. Zato smo mu to rekli. Uputstva agenta sada kažu da kada razgovor naraste preko onoga što model može da primi, najstariji rezultati alata se brišu, a najnoviji ostaju celi. Zato ne zaustavljajte dug zadatak da biste uštedeli prostor. Nastavite, a ako vam zatreba nešto što je obrisano, ponovo pročitajte fajl.
Ispravka koju model ne vidi nije ispravka sa stanovišta modela. Mehanizam pomaže samo ako mu agent veruje.
Problem 3: brojanje tokena kao da je sve na engleskom
Tokene smo procenjivali bez pokretanja tokenizera, kao broj karaktera podeljen sa četiri. To je razumno pravilo za engleski. Za druga pisma nije: ruski ide oko 2,2 karaktera po tokenu, a kineski ili japanski oko jedan.
Zato je podagent koji je čitao ruska poglavlja slao zahtev od oko 640.000 tokena, dok je naša procena govorila da je ispod budžeta od 400.000. Procena je mogla jednako lako da pošalje zahtev preko tvrdog limita modela.
Procena sada broji po pismu: običan ASCII po četiri karaktera po tokenu, kineski, japanski i korejski po jedan, a sve ostalo, ćirilica, grčki, arapski, slova sa dijakriticima, emoji, po dva. Namerno greši naviše. Na jednom ruskom poglavlju sada procenjuje 43.423 tokena, a izmereno je oko 44.600. Ranije je pokazivala 25.023. Pošto se poruka nikada ne menja kada je napisana, njena procena se računa jednom i pamti, a ne pri svakom koraku.
Šta smo izvukli iz ovoga
- Skraćujte tamo gde je zaista veličina. U radu agenta to su rezultati alata, a ne korisničke poruke.
- Recite agentu za sigurnosne mehanizme koje ima. Inače planira oko ograničenja koja više ne važe.
- „Karakteri ÷ 4” je pretpostavka za engleski. Sve što broji tokene za korisnike na više jezika mora da broji po pismu ili da koristi pravi tokenizer.
- Pazite na keš. Zahtev koji se na početku menja pri svakom pozivu košta više i sporije radi.
Ako ugrađujete AI funkcije u sopstvenu aplikaciju, naši vodiči o tome šta je LLM i kako koristiti LLM API-je pokrivaju kontekstne prozore i tokene od početka. Više o tome kako podagenti rade u Mythexu nalazi se u dokumentaciji o podagentima.