Ilgi agento darbai telpa į konteksto langą
Modelis gali perskaityti tik tiek vienu metu – tai jo konteksto langas. Mythex agentas atlieka ilgus darbus: skaito daugybę failų, vykdo komandas, perduoda apibrėžtas užduotis sub-agentams. Pastebėjome tris būdus, kaip ilgi darbai nutrūkdavo: sub-agentai augo tol, kol modelis atmesdavo kiekvieną užklausą; sub-agentas sustodavo anksti, nes manė, kad vietos nebeliko; o mūsų žetonų skaičiavimas rusų, kinų ir japonų tekstui buvo labai netikslus. Štai ką pakeitėme.
Keletas terminų
- Žetonai (tokens) – dalys, kurias modelis skaito. Ribos ir kainos skaičiuojamos žetonais, o ne simboliais ar žodžiais.
- Konteksto langas – daugiausia, ką modelis gali perskaityti vienoje užklausoje. Mes taip pat nustatome savo, žemesnį biudžetą kiekvienai užklausai, kad kainos ir greitis išliktų priimtini.
- Įrankių rezultatai – tai, ką agentas gauna atgal iš savo įrankių: failo turinys, komandos išvestis. Ilguose darbuose būtent jie sudaro didžiąją dalį siunčiamo turinio.
- Sub-agentas – pagalbininkas, kurį pagrindinis agentas paleidžia savarankiškai užbaigtai užduočiai, pavyzdžiui, „patikrink šiuos skyrius pagal užrašus“. Jis gauna vieną nurodymą, tada savarankiškai atlieka daug įrankių iškvietimų.
1 problema: sub-agentai augo tol, kol modelis juos atmetė
Kiekviename žingsnyje agentas siunčia modeliui iki šiol vykusį pokalbį. Kai jis tapdavo per didelis, mūsų kodas jį apkarpydavo – bet tik vartotojo žinutės pradžioje, kad įrankio iškvietimas ir jo rezultatas niekada nebūtų atskirti. Jis išlaikydavo pirmą žinutę, pridėdavo pastabą, kad ankstesnis pokalbis apkarpytas, ir išlaikydavo naujausius pilnus ėjimus, kurie tilpo.
Sub-agentas turi tik vieną vartotojo žinutę – jo nurodymą. Nebuvo kur pjauti. Todėl kiekviename žingsnyje jis siuntė visą savo istoriją, kuri augo, kol užklausa tapdavo didesnė, nei modelis apskritai priima – apie milijoną žetonų. Bandyme su 8 tokiais sub-agentais visi 8 buvo atmesti.
Pataisymas: pirma išvalyti senus įrankių rezultatus
Dabar užklausos telpa į biudžetą trimis žingsniais, kiekvieną bandant tik tada, jei ankstesnis nepakako:
- Išvalykite seniausius įrankių rezultatus. Jų turinys pakeičiamas trumpa pastaba: rezultatas išvalytas, kad pokalbis tilptų į modelio kontekstą, o agentas gali paleisti įrankį iš naujo, jei reikia. Failas, perskaitytas prieš valandą, dažniausiai yra didžiausias ir mažiausiai naudingas dalykas užklausoje, o pats failas vis dar yra ir jį galima perskaityti iš naujo. Naujausi rezultatai lieka pilni.
- Išlaikykite pilnus vartotojo ėjimus. Kaip ir anksčiau: pirmoji žinutė, pastaba ir naujausi pilni ėjimai, kurie telpa.
- Išlaikykite pilnus įrankių ratus. Viename ilgame ėjime – vienintelis sub-agento atvejis – išlaikykite pirmą žinutę, pastabą ir naujausius pilnus ratus „iškviesti įrankį, gauti rezultatą“.
Tai keičia tik tai, kas siunčiama. Agento išsaugota istorija išlieka pilna. Tame pačiame bandyme atmesta 0 iš 8, ir visi 8 baigė darbą.
Valymas partijomis, kad veiktų talpykla
Modelių tiekėjai gali pakartotinai naudoti darbą užklausos pradžioje, jei ji identiška paskutinei – tai prefiksų talpykla. Jei kiekvieno iškvietimo metu išvalytume dar vieną rezultatą, užklausos pradžia keistųsi kiekvieną kartą ir talpykla niekada nepadėtų.
Todėl seniausi rezultatai valomi po keturis, o ne po vieną. Išvalyta dalis tada kelis iškvietimus išlieka ta pati. Rezultatas, nedaug didesnis už pastabą, paliekamas nepaliestas: jo išvalymas sutaupytų beveik nieko, bet vis tiek pakeistų užklausos pradžią. Kiek lieka pilnų, nustatoma pagal dydį, o ne skaičių: išlaikomi naujausi rezultatai, kurie telpa į ketvirtadalį biudžeto, ir visada bent vienas. Ankstesnė versija išlaikydavo fiksuotus šešis pilnus rezultatus – tai tiko trumpiems komandų išvedimams, bet su ilgais failų skaitymais didžiąją biudžeto dalį palikdavo seniems rezultatams.
Atmetimai dabar sakomi aiškiai
Užklausa, kurią modelis atmeta kaip netinkamą, daugiau nebekartojama – tos pačios užklausos pakartojimas duotų tą patį atsakymą. Jei pokalbis per ilgas modeliui, asmuo mato: „Šis pokalbis tapo per ilgas, kad modelis galėtų perskaityti vienu kartu. Pradėkite naują pokalbį kitam žingsniui – viskas, kas jau sukurta, išlieka.“ Tai asmens sprendimas, o ne gedimas, todėl tai nepažymi budėjimo pranešimo mums.
2 problema: agentas sustojo „taupyti vietą“
Sub-agentas, paprašytas perskaityti 40 ilgų skyrių, sustojo po 2, sakydamas, kad nori taupyti vietą. Jis buvo panaudojęs apie 100 000 žetonų iš 400 000 žetonų biudžeto.
Jis negalėjo žinoti, kad seni rezultatai jam dabar bus išvalomi. Todėl apie tai pasakėme. Agento nurodymuose dabar parašyta: kai pokalbis auga virš to, ką modelis gali priimti, seniausi įrankių rezultatai išvalomi, o naujausi lieka pilni – todėl nesustokite ilgos užduoties taupydami vietą; tęskite, o jei reikia išvalytos informacijos, perskaitykite failą iš naujo.
Pataisymas, kurio modelis nemato, nėra pataisymas modelio akimis. Mechanizmas padeda tik tada, kai agentas jam pasitiki.
3 problema: žetonų skaičiavimas taip, lyg viskas būtų anglų kalba
Žetonus įvertinome neleidžiant tokenizatoriaus, kaip simbolių skaičių, padalintą iš keturių. Tai protinga taisyklė anglų kalbai, bet ne kitoms rašto sistemoms: rusiškas tekstas turi apie 2,2 simbolio vienam žetonui, o kinų ar japonų – apie vieną.
Todėl sub-agentas, skaitantis rusiškus skyrius, siuntė apie 640 000 žetonų užklausą, o mūsų įvertinimas sakė, kad ji mažesnė nei 400 000 biudžetas. Įvertinimas taip pat galėjo nustumti užklausą per modelio griežtą ribą.
Dabar įvertinimas skaičiuoja pagal rašto sistemą: paprastas ASCII po keturis simbolius žetonui, kinų, japonų ir korėjiečių – po vieną, o viskas kita – kirilica, graikiška, arabiška, su diakritiniais ženklais, emoji – po du. Jis skirtas klysti į didesnę pusę. Vieno rusiško skyriaus atveju dabar įvertinama 43 423 žetonai, o išmatuota apie 44 600; anksčiau buvo sakoma 25 023. Kadangi parašyta žinutė niekada nesikeičia, jos įvertinimas apskaičiuojamas vieną kartą ir įsimenamas, o ne kiekviename žingsnyje.
Ką iš to pasiėmėme
- Karpykite ten, kur iš tikrųjų yra dydis. Agento darbe tai yra įrankių rezultatai, o ne vartotojo žinutės.
- Pasakykite agentui apie jo saugiklius. Kitaip jis planuos aplink ribas, kurių nebėra.
- „Simboliai ÷ 4“ yra anglų kalbos prielaida. Viskas, kas skaičiuoja žetonus daugiakalbiams vartotojams, turi skaičiuoti pagal rašto sistemą arba naudoti tikrą tokenizatorių.
- Saugokite talpyklą. Užklausa, kuri kiekvieno iškvietimo metu keičiasi pradžioje, kainuoja daugiau ir veikia lėčiau.
Jei kuriate DI funkcijas į savo programą, mūsų vadovai kas yra LLM ir kaip naudoti LLM API nuo pat pradžių aptaria konteksto langus ir žetonus. Daugiau apie tai, kaip sub-agentai veikia Mythex, rasite sub-agentų dokumentacijoje.