Dugi agentski koraci unutar kontekstnog prozora
Model može pročitati samo ograničenu količinu odjednom, tj. svoj kontekstni prozor. Mythexov agent radi dugi posao: čita mnogo datoteka, pokreće naredbe i predaje ograničene zadatke pod-agentima. Pronašli smo tri načina na koja je dugi rad pucao: pod-agenti su rasli dok model nije odbio svaki zahtjev, pod-agent se zaustavio rano jer je mislio da mu je ponestalo mjesta, a naš brojač tokena bio je jako krivo za ruski, kineski i japanski tekst. Evo što smo promijenili.
Prvo nekoliko pojmova
- Tokeni su komadići koje model čita. Ograničenja i troškovi broje se u njima, a ne u znakovima ili riječima.
- Kontekstni prozor je najviše što model može pročitati u jednom zahtjevu. Mi također postavljamo vlastiti niži budžet za svaki zahtjev, kako troškovi i brzina ostali razumni.
- Rezultati alata su ono što agent dobije natrag od svojih alata: sadržaj datoteke koju je čitao, ispis naredbe koju je pokrenuo. U dugom radu oni čine većinu onoga što se šalje.
- Pod-agent je pomoćnik koji glavni agent pokrene za samostalan zadatak, npr. „provjeri ova poglavlja prema bilješkama”. Dobije jednu uputu, pa radi kroz mnogo poziva alata sam.
Problem 1: pod-agenti su rasli dok ih model nije odbio
Svaki korak agent šalje modelu razgovor do tada. Kad je to postalo preveliko, naš kod ga je skratio, ali samo na početku korisničke poruke, da se poziv alata i njegov rezultat nikad ne razdvoje. Zadržao je prvu poruku, dodao bilješku da je ranija konverzacija skraćena i zadržao najnovije cijele korake koji su stali.
Pod-agent ima točno jednu korisničku poruku: svoju uputu. Nije bilo gdje rezati. Zato je svaki korak slao cijelu svoju povijest, rastući svaki put, dok zahtjev nije bio veći od onoga što model uopće prihvaća, oko milijun tokena. U testu s 8 takvih pod-agenata, svih 8 je bilo odbijeno.
Popravak: prvo očisti stare rezultate alata
Zahtjevi se sada uklapaju u budžet u tri koraka, a svaki se isprobava samo ako prethodni nije bio dovoljan:
- Očisti najstarije rezultate alata. Njihov sadržaj zamjenjuje se kratkom bilješkom: rezultat je očišćen da razgovor ostane unutar konteksta modela, a agent može ponovno pokrenuti alat ako treba. Datoteka pročitana prije sat vremena obično je najveća i najmanje korisna stvar u zahtjevu, a sama datoteka je i dalje tu da se ponovno pročita. Najnoviji rezultati ostaju cijeli.
- Zadrži cijele korisničke korake. Kao i prije: prva poruka, bilješka i najnoviji cijeli koraci koji stanu.
- Zadrži cijele runde alata. Unutar jednog dugog koraka, što je jedina vrsta koju pod-agent ima, zadrži prvu poruku, bilješku i najnovije cijele runde „pozovi alat, dobij rezultat”.
Ovo samo oblikuje ono što se šalje. Spremljena povijest agenta zadržava sve. U istom testu 0 od 8 je odbijeno, a svih 8 je završilo.
Čišćenje u serijama, da predmemorija i dalje radi
Davatelji modela mogu ponovno koristiti početak zahtjeva ako je identičan prethodnom: prefix predmemorija. Kad bismo svaki poziv čistili po još jedan rezultat, početak zahtjeva mijenjao bi se pri svakom pozivu i predmemorija nikad ne bi pomogla.
Zato se najstariji rezultati čiste po četiri, a ne po jedan. Očišćeni dio tada ostaje isti kroz nekoliko poziva. Rezultat koji nije mnogo veći od bilješke ostavlja se na miru: čišćenjem bi se uštedjelo gotovo ništa, a početak zahtjeva bi se ipak promijenio. Koliko ostaje cijelo odlučuje veličina, a ne broj: najnoviji rezultati koji stanu u četvrtinu budžeta ostaju, i uvijek barem jedan. Ranija verzija je zadržavala fiksno šest cijelih rezultata, što je bilo dobro za kratak ispis naredbi, ali kod dugih čitanja datoteka ostavljalo je većinu budžeta starim rezultatima.
Odbijanja sada to kažu
Zahtjev koji model odbije kao nevaljan više se ne pokušava ponovno; slanje istog zahtjeva dobiva isti odgovor. Ako je razgovor predugačak za model, osoba vidi: „Ovaj razgovor je postao predug da ga model pročita odjednom. Započnite novi chat za sljedeći korak. Sve što je dosad izgrađeno ostaje.” To je stvar koju osoba treba riješiti, a ne ispad, pa ne šalje alarm nama.
Problem 2: agent se zaustavljao da „uštedi mjesto”
Pod-agent kojem je zadano čitanje 40 dugih poglavlja zaustavio se nakon 2, rekavši da želi uštedjeti mjesto. Potrošio je oko 100.000 tokena od budžeta od 400.000.
Nije mogao znati da će mu stari rezultati sada biti očišćeni. Zato smo mu to rekli. Upute agenta sada kažu da kad razgovor naraste preko onoga što model može primiti, najstariji rezultati alata se čiste, a najnoviji ostaju cijeli. Zato ne prekidajte dugi zadatak da biste uštedjeli mjesto: nastavite, i ponovno pročitajte datoteku ako trebate ono što je očišćeno.
Popravak koji model ne vidi nije popravak s gledišta modela. Mehanizam pomaže samo ako mu agent vjeruje.
Problem 3: brojanje tokena kao da je sve na engleskom
Tokene smo procjenjivali bez pokretanja tokenizera, kao broj znakova podijeljen s četiri. To je razumno pravilo za engleski, ali ne i za druga pisma: ruski ima oko 2,2 znaka po tokenu, a kineski ili japanski oko jedan.
Pod-agent koji je čitao ruska poglavlja tako je poslao zahtjev od oko 640.000 tokena, dok je naša procjena pokazivala ispod budžeta od 400.000. Procjena je mogla isto tako lako gurnuti zahtjev preko tvrde granice modela.
Procjena sada broji po pismu: običan ASCII po četiri znaka po tokenu, kineski, japanski i korejski po jedan, a sve ostalo, tj. ćirilica, grčki, arapski, slova s dijakriticima i emoji, po dva. Namjerno griješi naviše. Na jednom ruskom poglavlju sada procjenjuje 43.423 tokena, a izmjereno je oko 44.600; prije je pokazivala 25.023. Budući da se poruka nakon pisanja nikad ne mijenja, njena se procjena izračuna jednom i zapamti, a ne pri svakom koraku.
Što smo iz toga izvukli
- Skraćujte tamo gdje je zapravo veličina. U agentskom radu to su rezultati alata, a ne korisničke poruke.
- Recite agentu za njegove sigurnosne mreže. Inače planira oko ograničenja koja više ne vrijede.
- „Znakovi ÷ 4” je pretpostavka za engleski. Sve što broji tokene za višejezične korisnike mora brojati po pismu ili koristiti pravi tokenizer.
- Pazite na predmemoriju. Zahtjev koji se na početku mijenja pri svakom pozivu skuplji je i sporiji.
Ako u svoju aplikaciju ugrađujete AI značajke, naši vodiči o što je LLM i kako koristiti LLM API-je pokrivaju kontekstne prozore i tokene od početka. Više o tome kako pod-agenti rade u Mythexu nalazi se u dokumentaciji za pod-agente.