Долги агентски кругови во рамките на контекстниот прозорец
Моделот може да прочита само толку многу одеднаш — неговиот контекстен прозорец. Агентот на Mythex извршува долга работа: чита многу датотеки, извршува команди и им дава ограничени задачи на под-агенти. Нашедовме три начини на кои долгата работа се расипуваше: под-агентите растеа додека моделот не ги одбиваше сите барања, под-агент застана предвремено затоа што мислеше дека нема повеќе простор, и нашето броење токени беше сериозно погрешно за руски, кинески и јапонски текст. Еве што променивме.
Неколку поими прво
- Токените се делови што моделот ги чита. Лимитите и трошоците се броат во нив, а не во знаци или зборови.
- Контекстниот прозорец е најмногу што моделот може да прочита во едно барање. Ние исто така поставуваме сопствен помал буџет за секое барање, така што трошоците и брзината остануваат разумни.
- Резултатите од алатките се она што агентот го добива назад од своите алатки: содржината на датотека што ја прочитал, излезот на команда што ја извршил. Во долга работа, тие се поголемиот дел од испратеното.
- Под-агент е помошник што главниот агент го започнува за самостојна задача, на пример „провери ги овие поглавја наспрема белешките“. Добива една инструкција, па потоа работи низ многу повици на алатки сам.
Проблем 1: под-агентите растеа додека моделот не ги одбиваше
Секој чекор, агентот го испраќа разговорот до тој момент до моделот. Кога тој ќе стане преголем, нашиот код го скратуваше — но само на почетокот на корисничка порака, така што повик на алатка и неговиот резултат никогаш не се раздвојуваа. Ја задржуваше првата порака, додаваше забелешка дека претходниот разговор е скратен и ги задржуваше најновите цели кругови што се вклопуваат.
Под-агентот има точно една корисничка порака: неговата инструкција. Немаше каде да се сече. Па ја испраќаше целата своја историја на секој чекор, растејќи секој пат, додека барањето не стана поголемо од она што моделот воопшто го прифаќа — околу милион токени. Во тест со 8 такви под-агенти, сите 8 беа одбиени.
Поправката: прво исчисти стари резултати од алатки
Барањата сега се вклопуваат во буџетот во три чекора, секој се пробува само ако претходниот не бил доволен:
- Исчисти ги најстарите резултати од алатки. Нивната содржина се заменува со кратка забелешка: резултатот е исчистен за да разговорот остане во контекстот на моделот, а агентот може повторно да ја изврши алатката ако му треба. Датотека прочитана пред еден час обично е најголемата и најмалку корисната работа во барањето, а датотеката сè уште е таму за повторно читање. Најновите резултати остануваат цели.
- Задржи цели кориснички кругови. Како и порано: првата порака, забелешка и најновите цели кругови што се вклопуваат.
- Задржи цели кругови со алатки. Во еден долг круг — единствениот вид што го има под-агент — задржи ја првата порака, забелешка и најновите цели рунди од „повикај алатка, добиј резултат“.
Ова само ја обликува испратената содржина. Зачуваната историја на агентот ги задржува сите работи. Во истиот тест, 0 од 8 беа одбиени и сите 8 завршија.
Чистење во серии, за кешот да продолжи да работи
Давателите на модели можат повторно да го искористат почетокот на барањето ако е идентичен со претходното — префикс кеш. Ако исчистиме уште еден резултат на секој повик, почетокот на барањето ќе се менува на секој повик и кешот никогаш нема да помогне.
Затоа најстарите резултати се чистат по четири, а не по еден. Исчистениот дел тогаш останува ист во неколку повици. Резултат што не е многу поголем од забелешката се оставаат на мира: негово чистење би заштедило речиси ништо и сепак би го променило почетокот на барањето. Колку останува цело се одлучува по големина, не по број: најновите резултати што се вклопуваат во четвртина од буџетот остануваат, и секогаш најмалку еден. Порана верзија задржуваше фиксни шест цели, што беше точно за кратки излези од команди, но со долги читања на датотеки оставаше најголемиот дел од буџетот на стари резултати.
Одбиените барања сега се кажуваат
Барање што моделот го отфрла како неважечко повеќе не се повторува; испраќањето на истото барање повторно добива истиот одговор. Ако разговорот е предолг за моделот, луѓето гледаат: „Овој разговор стана предолг за моделот да го прочита одеднаш. Започнете нов разговор за следниот чекор — сè изградено досега останува.“ Тоа е нешто што корисникот може да го реши, а не прекин на услугата, па не ни испраќа известување.
Проблем 2: агентот застануваше да „заштеди простор“
Под-агент замолен да прочита 40 долги поглавја застана по 2, велејќи дека сака да заштеди простор. Беше потрошил околу 100.000 токени од буџет од 400.000.
Немаше начин да знае дека стари резултати сега ќе бидат исчистени за него. Затоа му го кажавме. Инструкциите на агентот сега велат дека кога разговорот расте над она што моделот може да го прими, најстарите резултати од алатки се чистат, а најновите остануваат цели — па не застанувајте долга задача за да заштедите простор; продолжете и повторно прочитајте датотека ако ви треба она што било исчистено.
Поправка што моделот не може да ја види не е поправка од гледна точка на моделот. Механизмот помага само ако агентот му верува.
Проблем 3: броење токени како да е сè на англиски
Токените ги проценувавме без токенизатор, како знаци поделени со четири. Тоа е разумно правило за англиски. Не е за другите писма: рускиот текст е околу 2,2 знаци по токен, а кинескиот или јапонскиот околу еден.
Така, под-агент што читаше руски поглавја испрати барање од околу 640.000 токени, додека нашата проценка рече дека е под буџетот од 400.000. Проценката лесно можеше да стави барање над тврдиот лимит на моделот.
Проценката сега брои по писмо: обичен ASCII по четири знаци по токен, кинески, јапонски и корејски по еден, а сè друго — кирилица, грчки, арапски, акцентирани букви, емоџи — по два. Намерно е да грешиме наголемо. На едно руско поглавје сега проценува 43.423 токени наспрема околу 44.600 измерени; порано рече 25.023. Бидејќи пораката никогаш не се менува откако ќе биде напишана, нејзината проценка се пресметува еднаш и се памети, наместо на секој чекор.
Што научивме
- Скратувајте таму каде што навистина е големината. Во работата на агентот, тоа се резултатите од алатки, а не корисничките пораки.
- Кажете му на агентот за неговите сопствени безбедносни мрежи. Инаку планира околу лимити што веќе не важат.
- „Знаци ÷ 4“ е англиска претпоставка. Секој што брои токени за повеќејазични корисници мора да брои по писмо или да користи вистински токенизатор.
- Пазете на кешот. Барање што се менува на почетокот при секој повик чини повеќе и работи побавно.
Ако градите AI функции во сопствена апликација, нашите водичи за што е LLM и како да користите LLM API-и ги покриваат контекстните прозорци и токените од самиот почеток. Повеќе за тоа како работат под-агентите во Mythex е во документацијата за под-агенти.