Držanje dugih poteza agenta unutar kontekstnog prozora
Model može pročitati samo određenu količinu odjednom — svoj kontekstni prozor. Agent u Mythexu radi dug posao: čita mnogo datoteka, pokreće komande i predaje ograničene zadatke pod-agentima. Našli smo tri načina na koja je dugi rad pucao: pod-agenti su narastali dok model nije odbijao svaki zahtjev, pod-agent se zaustavljao ranije jer je mislio da mu je ponestalo prostora, a naš brojač tokena bio je ozbiljno pogrešan za ruski, kineski i japanski tekst. Evo šta smo promijenili.
Prvo nekoliko pojmova
- Tokeni su dijelovi koje model čita. Ograničenja i troškovi se računaju 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, da troškovi i brzina ostanu razumni.
- Rezultati alata su ono što agent dobija nazad od svojih alata: sadržaj datoteke koju je pročitao, izlaz komande 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, na primjer „provjeri ova poglavlja u odnosu na bilješke”. Dobija jednu uputu, pa radi kroz mnogo poziva alata sam.
Problem 1: pod-agenti su narastali dok ih model nije odbio
Svaki korak, agent šalje modelu razgovor do tada. Kada je to postalo preveliko, naš kod ga je skraćivao — ali samo na početku korisničke poruke, tako da poziv alata i njegov rezultat nikada nisu bili razdvojeni. Zadržavao je prvu poruku, dodao napomenu da je ranija konverzacija skraćena, i zadržavao najnovije cijele poteze koji su stali.
Pod-agent ima tačno jednu korisničku poruku: svoju uputu. Nije bilo gdje sjeći. Zato je na svakom koraku slao cijelu svoju historiju, koja je rasla svaki put, sve dok zahtjev nije postao veći od onoga što model uopšte prihvata — oko milion tokena. U testu sa 8 takvih pod-agenata, svih 8 je bilo odbijeno.
Popravka: prvo obriši stare rezultate alata
Zahtjevi se sada uklapaju u budžet u tri koraka, a svaki se pokušava samo ako prethodni nije bio dovoljan:
- Obriši najstarije rezultate alata. Njihov sadržaj zamjenjuje kratka napomena: rezultat je obrisan kako bi razgovor ostao unutar konteksta modela, a agent može ponovo pokrenuti alat ako mu treba. Datoteka pročitana prije sat vremena obično je najveća i najmanje korisna stvar u zahtjevu, a datoteka je i dalje tu da se ponovo pročita. Najnoviji rezultati ostaju cijeli.
- Zadrži cijele korisničke poteze. Kao i ranije: prva poruka, napomena i najnoviji cijeli potezi koji stanu.
- Zadrži cijele runde alata. Unutar jednog dugog poteza — jedine vrste koju pod-agent ima — zadrži prvu poruku, napomenu i najnovije cijele runde „pozovi alat, dobij rezultat”.
Ovo samo oblikuje ono što se šalje. Sačuvana historija agenta zadržava sve. U istom testu 0 od 8 je bilo odbijeno, a svih 8 je završilo.
Brisanje u serijama, da keširanje ostane aktivno
Davaoci modela mogu ponovo koristiti rad na početku zahtjeva ako je identičan prethodnom — prefiks keš. Kada bismo na svakom pozivu obrisali još jedan rezultat, početak zahtjeva bi se mijenjao svaki put i keš nikada ne bi pomogao.
Zato se najstariji rezultati brišu po četiri odjednom, a ne jedan po jedan. Obrisani dio tada ostaje isti kroz više poziva. Rezultat koji nije mnogo veći od napomene ostaje netaknut: njegovo brisanje bi uštedjelo gotovo ništa, a i dalje bi mijenjalo početak zahtjeva. Koliko ostaje cijelo odlučuje veličina, a ne broj: najnoviji rezultati koji stanu u četvrtinu budžeta ostaju, a uvijek bar jedan. Ranija verzija je zadržavala fiksnih šest cijelih, što je bilo dobro za kratak izlaz komandi, ali je kod dugog čitanja datoteka ostavljalo veći dio budžeta starim rezultatima.
Odbijanja sada to kažu
Zahtjev koji model odbije kao nevažeći više se ne pokušava ponovo; slanje istog zahtjeva ponovo dobija isti odgovor. Ako je razgovor predugačak za model, osoba vidi: „Ovaj razgovor je postao predug da bi ga model pročitao odjednom. Pokrenite novi chat za sljedeći korak — sve što je do sada napravljeno ostaje.” To je stvar za osobu da riješi, a ne prekid usluge, pa nas ne budi.
Problem 2: agent se zaustavljao da „uštedi prostor”
Pod-agent kojeg smo zamolili da pročita 40 dugih poglavlja zaustavio se nakon 2, rekavši da želi uštedjeti prostor. Bio je potrošio oko 100.000 tokena od budžeta od 400.000.
Nije imao način da zna da će mu stari rezultati sada biti obrisani. Zato smo mu to rekli. Uputstva agenta sada kažu da kada razgovor naraste iznad onoga što model može da primi, najstariji rezultati alata se brišu, a najnoviji ostaju cijeli — zato ne zaustavljajte dug zadatak da biste uštedjeli prostor; nastavite, i ponovo pročitajte datoteku ako vam treba ono što je obrisano.
Popravka koju model ne može vidjeti nije popravka sa stanoviš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 sa četiri. To je razumno pravilo za engleski. Za druga pisma nije: ruski ima oko 2,2 znaka po tokenu, a kineski ili japanski oko jedan.
Tako je pod-agent koji je čitao ruska poglavlja poslao zahtjev od oko 640.000 tokena, dok je naša procjena govorila da je ispod budžeta od 400.000. Procjena je jednako lako mogla staviti zahtjev iznad tvrdog ograničenja modela.
Procjena sada broji po pismu: običan ASCII po četiri znaka po tokenu, kineski, japanski i korejski po jedan, a sve ostalo — ćirilica, grčki, arapski, slova s dijakritikom, emoji — po dva. Namijenjena je da greši na višu stranu. Za jedno rusko poglavlje sada procjenjuje 43.423 tokena, naspram oko 44.600 izmjerenih; ranije je govorila 25.023. Pošto se poruka nikada ne mijenja nakon što je napisana, njena procjena se računa jednom i pamti, umjesto na svakom koraku.
Šta smo izvukli iz ovoga
- Skraćujte tamo gdje je zaista veličina. U radu agenta 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 važe.
- „Znakovi ÷ 4” je pretpostavka za engleski. Sve što broji tokene za korisnike na više jezika mora brojati po pismu ili koristiti pravi tokenizer.
- Pazite na keš. Zahtjev koji se mijenja na početku svakog poziva košta više i sporije radi.
Ako u svoju aplikaciju ugrađujete AI funkcije, naši vodiči o šta je LLM i kako koristiti LLM API-je pokrivaju kontekstne prozore i tokene od početka. Više o tome kako rade pod-agenti u Mythexu nalazi se u dokumentaciji o pod-agentima.