Blog

Dolge agentove poteze znotraj kontekstnega okna

Model lahko naenkrat prebere le toliko — to je njegovo kontekstno okno. Agent v Mythexu opravlja dolga dela: bere veliko datotek, zaganja ukaze in predaja omejena opravila podagentom. Ugotovili smo tri načine, kako je dolgo delo odpovedalo: podagenti so rasli, dokler jih model ni zavrnil vseh, podagent se je zaustavil prezgodaj, ker je mislil, da mu zmanjkuje prostora, naše štetje žetonov pa je bilo za ruščino, kitajščino in japonščino močno napačno. Tukaj je, kaj smo spremenili.

Nekaj pojmov najprej

  • Žetoni so kosi, ki jih model bere. Omejitve in stroški se štejejo v njih, ne v znakih ali besedah.
  • Kontekstno okno je največ, kar lahko model prebere v eni zahtevi. Poleg tega za vsako zahtevo nastavimo svoj nižji proračun, da stroški in hitrost ostanejo smiselni.
  • Rezultati orodij so tisto, kar agent dobi nazaj od svojih orodij: vsebina datoteke, ki jo je prebral, izhod ukaza, ki ga je zagnal. Pri dolgem delu so to večina tega, kar se pošlje.
  • Podagent je pomočnik, ki ga glavni agent zažene za samostojno nalogo, na primer »preveri ta poglavja glede na zapiske«. Dobi eno navodilo in nato sam dela skozi številne klice orodij.

Težava 1: podagenti so rasli, dokler jih model ni zavrnil

Agent ob vsakem koraku pošlje modelu pogovor do tistega trenutka. Ko je postal prevelik, ga je naša koda skrajšala — vendar le na začetku sporočila uporabnika, tako da klic orodja in njegov rezultat nikoli nista bila ločena. Ohranila je prvo sporočilo, dodala opombo, da je bil prejšnji pogovor skrajšan, in obdržala najnovejše cele poteze, ki so se prilegale.

Podagent ima natanko eno sporočilo uporabnika: svoje navodilo. Tam ni bilo kje rezati. Zato je pri vsakem koraku poslal celotno zgodovino, ki je rasla, dokler zahtevek ni bil večji od milijona žetonov, kolikor model sploh sprejme. V testu z 8 takimi podagenti so bili vsi 8 zavrnjeni.

Rešitev: najprej počisti stare rezultate orodij

Zdaj zahtevke v proračun spravimo v treh korakih, vsakega poskusimo samo, če prejšnji ni zadostoval:

  1. Počisti najstarejše rezultate orodij. Njihova vsebina se nadomesti s kratko opombo: rezultat je bil počiščen, da pogovor ostane znotraj kontekstnega okna modela, agent pa lahko orodje znova zažene, če ga potrebuje. Datoteka, ki je bila prebrana pred uro, je običajno največja in najmanj koristna stvar v zahtevku, datoteka pa je še vedno na voljo za ponovno branje. Najnovejši rezultati ostanejo celi.
  2. Ohrani cele poteze uporabnika. Kot prej: prvo sporočilo, opomba in najnovejše cele poteze, ki se prilegajo.
  3. Ohrani cele kroge orodij. Znotraj ene dolge poteze — edine vrste, ki jo ima podagent — ohrani prvo sporočilo, opombo in najnovejše cele kroge »zaženi orodje, dobi rezultat«.

To vpliva samo na to, kaj se pošlje. Agentova shranjena zgodovina ohrani vse. V istem testu jih je bilo 0 od 8 zavrnjenih in vseh 8 je končalo.

Brisanje v serijah, da predpomnjenje deluje

Ponudniki modelov lahko ponovno uporabijo delo na začetku zahtevka, če je ta enak zadnjemu — predpomnilnik predpone (prefix cache). Če bi pri vsakem klicu počistili še en rezultat, bi se začetek zahtevka pri vsakem klicu spremenil in predpomnilnik nikoli ne bi pomagal.

Zato najstarejše rezultate brišemo po štiri naenkrat, ne po enega. Očiščeni del tako ostane enak čez več klicev. Rezultat, ki ni veliko večji od opombe, pustimo pri miru: brisanje bi prihranilo skoraj nič, začetek zahtevka pa bi vseeno spremenilo. Koliko ostane celega, določi velikost, ne število: najnovejši rezultati, ki se prilegajo četrtini proračuna, ostanejo, vedno vsaj eden. Prejšnja različica je ohranjala fiksnih šest celih, kar je bilo prav za kratek izhod ukazov, pri dolgih branjih datotek pa je pustilo večino proračuna starim rezultatom.

Zavrnitve zdaj to povedo

Zahtevek, ki ga model zavrne kot neveljavnega, se ne pošilja več znova; ponovno pošiljanje istega zahtevka da enak odgovor. Če je pogovor za model prevelik, oseba vidi: »Ta pogovor je za model prevelik, da bi ga prebral naenkrat. Za naslednji korak začnite nov klepet — vse, kar je bilo doslej zgrajeno, ostane.« To je stvar, ki jo mora oseba urediti sama, ne izpad, zato ne sproži opozorila pri nas.

Težava 2: agent se je ustavil, da »prihrani prostor«

Podagent, ki je dobil nalogo prebrati 40 dolgih poglavij, se je ustavil po dveh, češ da želi prihraniti prostor. Porabil je približno 100.000 žetonov od proračuna 400.000.

Ni mogel vedeti, da bodo stari rezultati zdaj zanj počiščeni. Zato smo mu to povedali. Navodila agenta zdaj pravijo: ko pogovor preraste to, kar model lahko sprejme, se najstarejši rezultati orodij počistijo, najnovejši pa ostanejo cel — zato dolge naloge ne ustavljajte, da bi prihranili prostor; nadaljujte in datoteko po potrebi preberite znova.

Popravek, ki ga model ne vidi, z modelove perspektive ni popravek. Mehanizem pomaga le, če mu agent zaupa.

Težava 3: štetje žetonov, kot da je vse v angleščini

Žetone smo ocenjevali brez tokenizerja, kot znake deljene s štirimi. To je razumno pravilo za angleščino. Za druge pisave ne velja: ruščina je približno 2,2 znaka na žeton, kitajščina ali japonščina pa približno en znak.

Podagent, ki je bral ruska poglavja, je tako poslal zahtevek z okoli 640.000 žetoni, medtem ko je naša ocena rekla, da je pod proračunom 400.000. Ocena bi lahko prav tako potisnila zahtevek čez trdo mejo modela.

Ocena zdaj šteje po pisavi: navaden ASCII po štiri znake na žeton, kitajska, japonska in korejska pisava po en znak, vse drugo — cirilica, grščina, arabščina, naglašene črke, emotikoni — po dva. Namenjena je temu, da pogosteje precenjuje. Pri enem ruskem poglavju zdaj ocenimo 43.423 žetonov proti približno 44.600 izmerjenim; prej je bilo 25.023. Ker se sporočilo, ko je enkrat napisano, nikoli ne spremeni, se njegova ocena izračuna enkrat in shrani, namesto da bi se računala pri vsakem koraku.

Kaj smo iz tega vzeli

  • Skrajšajte tam, kjer je dejanska velikost. Pri delu agenta so to rezultati orodij, ne sporočila uporabnikov.
  • Povejte agentu o njegovih varnostnih mrežah. Sicer načrtuje okoli omejitev, ki več ne veljajo.
  • »Znaki ÷ 4« je predpostavka za angleščino. Vse, kar šteje žetone za večjezične uporabnike, mora šteti po pisavi ali uporabiti pravi tokenizer.
  • Pazite na predpomnilnik. Zahtevek, ki se pri vsakem klicu na začetku spremeni, stane več in deluje počasneje.

Če gradite AI funkcije v svoji aplikaciji, naša vodnika o tem, kaj je LLM in kako uporabljati LLM API-je od začetka pokrivata kontekstna okna in žetone. Več o tem, kako podagenti delujejo v Mythexu, je v dokumentaciji o podagentih.

Mythex · Pricing · Zgradite karkoli z AI · Predloge za spletna mesta in aplikacije · Mythex v primerjavi · Slovar pojmov gradnje aplikacij z AI · Brezplačna orodja za gradnjo aplikacij z 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 Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)