Меншыя колькісці токенав не значыць дешавей: чаму агенты для програмавання витрачаюць час, а не токены
Складзенне выходных даных інструмента можа падысціць косць цэлага заведама па програмаванні. Даклэў жа трэба вылічваць косць за адна завершаная задача, зберагаць варыянты вярнення да пачатковага стану і ствараць інструменты для агентаў.
З тэх пачэй, калі агенты для кодавання сталі популярныя, разработчыкі зосерадзіліся на аднай величыні – токенах. Скількіх токенаў створыла модель, скількіх вернуў інструмент, які ўжо ўсякі контекст, скількіх токенаў спаліў агент? Гэтыя меркі здаюцца логічнымі. Менш токенаў апошнія маюць значыць меньшыя витраты.
Аналіз GitHub агента Copilot для кодавання паказвае, чаму гэта припущэння ўразламнае. Адсеччы частку тексту з адказу інструмента можна зробіць усю задачу дорожэй, якщо ў адсечаным тексте была важліва інфармацыя. Тады агент зноў запускае команды, шукае первісны адказ, витрачае дадатковы час на рашэння і переносіць большы контекст у всі наступныя крокі.
Таму самая дешавая взаімадзея не ўсега тая, якая мае меньшы колькісць токенаў. Насамперад важна, каб програмнае заведанне было завершана з мінімумам змарнаваных зусіль, і гэта зміняе спосаб ацэнкі карыстнасці агента.
Пастка локальной оптымізацыі
Якісь агенты працують?
npm test
Ён выдрукуе 50 000 токенаў. Гэта выглядае нерацыональна, таму вы пішаеце кэшэўны клас, які зменшывае колькасць выходных дадзеных да 2 000. На паперы гэта ўспех: 48 000 токенаў зменшыліся.
А тепер заўважкім, што гэтыя 2 000 токенаў не ўключаюць таго, што патрэбна агенту. Ён адпавядае чымса падобным да гэтага:
I need more information about the failing test.
Тады ён зноў выканае команду, шукае захаваны выходны результат, ачынае файл журналу або пробуюць болей спецыфічную команду. Працэс стае такім:
Original command
↓
Compressed output
↓
Missing information
↓
Agent searches again
↓
Command runs again
↓
More context
↓
More reasoning
Якісна адаптація стала дешевшаю, тодколи завдання паліцеювалося. GitHub стикнулася з цим під час тестування способів скорочення вихідних даних Copilot. У одному з експериментів використовувалося інструмент під назвою RTK для скорочення об'євування, а також часто перезапускалися команди, коли необхівні деталі були важливими. Результатом стало більше спроб та, в середньому, більше tokenів та повільніше завершення. Згодом це здається очевидним, але коли оптимізуєш неправильну кількість, це легко пропустити.
Судьте завдання, а не виклик
Агент існує для виконання програмного завдання, а не для мінімізації вартості одного запиту API. Розрив між цимицелями більший, ніж здається. Порівняйте два агенти. Агент A:
Task
↓
8 tool calls
↓
100K tokens
↓
Completed in 4 minutes
і Агент Б:
Task
↓
15 tool calls
↓
80K tokens
↓
Completed in 9 minutes
Якщо сяглядаць толькі на токены, B выграе. Але калі мова праходзіць пра адміністрацыю інжынернай організацыі, адказ стае болей неясным. Проект, завершаны раней, верагацыйна, выкарыстоўваў менш практык, могаў выкарыстоўваць меншы ресурс вычысленняў, могаў стварыць кращы патч і зменшыць час чакання разработнікаў. Якщо каму-то патрэбна была дапамога для B ўшысткі пяць хвілін, рэальная цена B ўсё больша зрасла.
Самэ гэтая прычына, чаму GitHub стверджвае, што колькасць токенаў за адну взаімадзею мало сказываецца на эфектывасці агента. Неабходна оптымізаваць рэзультат усьго заведання.
Модэль костаў «з начала да канца»
Апытныя інжынеры ведаюць гэта з іншых заданняў. Якщо час выкарыстання запыту да базы дадзеных зменіцца з 200 мс на 100 мс, гэта выглядае як чыстая перадача. Але якшо новы запыт змусі іншую службу выконаць ўсьмо тры дадатковыя запыты, система в цэлым можа стаць медленней. Неабходна налаштаваць систему, а не адзін конкрэтны процес.
Агенты таксама павінны следаваць гэтам правілу. Корыстная ментальная модель аб’ёмных костаў:
Total agent cost =
model inference
+ tool execution
+ retries
+ repeated work
+ context growth
+ developer waiting
+ infrastructure
І абрант, які частаяя з’являецца:
smaller response
+
missing context
=
more recovery work
Таму, што інжыярнае айтэксае AI стаўаць все больш садзылкамі для інжыярнае айтэксае систем. Неўсе выхадны даны стлікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны можаць мяць рознароковую інфармацыяцыю. Выхадны даны зялікавацягузкія, таму неўсе выхадны даны мож
Command output
│
▼
┌──────────────────────┐
│ What kind of output? │
└──────────┬───────────┘
│
┌─────┼─────┐
│ │ │
▼ ▼ ▼
Source Search Noise
output results logs
│ │ │
▼ ▼ ▼
Keep Reorganize Compress
all without selectively
losing
content
Это лепшае за простае рашэнне:
if output.length > X:
truncate()
Простая правіла оптымаізуе цячыну. Выбарочная правіла оптымаізуе спроможнасць агента працаваць даўжэй.
Што вучыць git diff
Уявіце агента, які вырэшыў пяць файлоў і тепер запускаецца:
git diff
Рэзультат выходу ў вялікай меры. Наўіны прыстрой для стыснення мог бы сказаць, што ён вялік, і стыснуць яго. Але разлік можа мець самэ тое, што неабходна агенту, каб ацэніць, чыя ў яго змяны правільныя. GitHub паведамляе, што раннія версіі яго прыстрою для стыснення дзеясно стыскалі git diff, а тэсты паказалі, што агенты зноў ачынялі первісны выход, каб павернуць інфармацыю. Таму гэты фільтр быў адмовлены.
Это чырвоны урок для AI: нельзя называць ўсё, што вялікае, беспарадным. Дзеясно вялікія рэзультаты ўтвараюць цэнны контэкст, а дзеясно маленькія — не маюць жадной цяні. Колькасць токенаў не можа іх адзін ад другога адразніць.
Проектаванне савых інструментаў
Якщо вы ствараеце агента для програмавання, вы моглі б напісаць так:
const result = await exec(command);
след за тым — жорганы:
return result.stdout.slice(0, 5000);
Це выглядае розумнаюча, але тычымо прыяжлівае, што першыя 5 000 симвалаў маюць усё, што патрэбна агенту. Болей розумны дизайн спачатку класіфікуе выходны матэрыял. Пачніце так сама:
const result = await exec(command);
Потым выберыце тип выходных дадзенняў:
const outputType = classifyOutput(result);switch (outputType) {
case "source":
return result.stdout; case "search":
return reorganize(result.stdout); case "repetitive-log":
return compress(result.stdout); default:
return result.stdout;
}
Нават гэта патрабуее шлях для атрымання, каб агент могаў вернуць асловны варыянт:
return {
summary,
compressedOutput,
fullOutputAvailable: true
};
Агент атрымлее кампактны вывар, і на самай працэ нічога не зникло. Для автонамных систем такія працэўная структура ўзяцца набагато кращая.
Компрэсія павінна адкладаць, а не выдалваць
Компрэсія не павінна означаць выдалванне інформацыі. Яна павінна означаць адкладанне ў часе пакуль яна не будзе патрэбная. Пораўняйце гэтыя два падходы. Некалькісная компрэсія выглядае так:
Original output
↓
Throw away 90%
↓
Agent cannot recover it
Лепшая стысненне заставляе шлях назад застацься відкрытым:
Original output
↓
Create useful summary
↓
Agent continues
↓
Needs more detail?
↓
Retrieve original
Это большэйшае падобнае да там, як працюе кэшаванне ў звычным програмнаму забезпечэнні. Агенту не патрэбна вся інфармацыя адразу, але ён не должен втрачаць доступ да чаго-небудзь важлівага. Падход, які викорыстоўвае GitHub, дазволяе быстра вярнуцца да роботы пасля таго, як данні былі стиснуты.
Інодзе больш контексту — гэта эконамія
Гэта здаецца працоўна. Разработчыкі гады працавалі над скорачэннем кантэксту. Але больш контексту можа запобiec большай кількасці роботы. Спадзяймося, агент побачыць стиснутыя данні пра аберэнні:
Test failed:
Expected 401
Received 500
Пэлкі вывадзець могаў таксаме паказаць:
Database connection refused
JWT middleware initialized correctly
Request reached /api/auth/login
PostgreSQL timeout after 5 seconds
У складзенай версіі агенту паведамляецца, што ўсё зламалася. У повнай версіі піскаецца, што прычыной, верагацейна, не ў логіцы аутэнтыкацыі, а ў з’яносе з базай дадзеных. Другая версія коштуе больш токенав і можа заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды заўсёды
Run command
↓
Read partial output
↓
Run another command
↓
Search same file
↓
Run original command again
↓
Read more output
↓
Change code
↓
Run test
↓
Go back to original command
Це выглядае як плутанне, і інодзе так і ёсць. Але інодзе сама інфраструктура проста не дае модэлю достатнью колькасць інфармацыі, і агент компенсуе непূраную інтэрфейсную сістэму. Якщо агент продовжае прасіць пра тое ж самае, прычына можа крычаць у дизайне інструмента, а не ў самай модэлі.
Дизайн інструмента — гэта UX для модэляў
Разрабоцкія команды зазвычай ацэнююць API за вхіднымі даннымі, выходнымі данымі, часам адпаведзьбы, памылкамі і механізмамі аутэнтыкацыі. Для інструментаў AI трэба ўзяць у расчытанне ўсё жоўсткай пытанні: як гэты выходны результат вплывае на наступную адпаведзьбу модэля? Возьмім два прыклады. API A:
{
"status": "failed"
}
і API B:
{
"status": "failed",
"error": "PostgreSQL connection timeout",
"service": "auth-api",
"retryable": true,
"attempt": 2,
"duration_ms": 5040
}
B мае більше можлівостей, протэк яго можна знизіць загальну вартасць системы, таму што агент можа правільна прымкнуць на месцы. Мета — не стварыць найменшы можлівы JSON, а даць інформацыю, якая дапаможае агенту прымкнуць правільна ў наступны раз.
Налаштаванне всіго циклу
GitHub не розглядае гэта як проблему компресіі. У його описе перерахованы кілька змян у форматаванні: залишаць корисны контэкст, усунуць повтарення, адмініструвацыю форматування, якае не дапамагае виконанню завдання, скорачыць інструкціі без змяны їх функцый, а таксама уникнуць непатрэбных крокаў для виконання фонавых задач. Кожна змяну спачатку пераценілі поза мережай на тестовых базах дадзеных, а пасля — прабавілі ў контрольованых онлайн-експерыментах першы чым выкласты.
Гэта і є інжынерыя каркаса для агентоў. Пытанне перайшла з таго, як зробіць адпаведзь мякшай, на тое, як дапамогчы агенту завершыць роботу з мінімумам непатрэбных дзействаў, і гэта значна краща задача.
Магчымасць для агентаў
Гэта зменяе тое, што вы стежыце за ў рэальных умовах. Для звычных служб вы б стежылі:
Latency
Error rate
CPU
Memory
Throughput
Для агентаваў: дадзець больш:
Task completion rate
Tool-call count
Retry rate
Repeated-command rate
Context growth
Model escalation rate
Time to completion
Cost per completed task
Human intervention rate
Большая частка з тых показнікав — це метрыкі рабочага прытоку, а не метрыкі токенав. Токены ўсё ж маюць значэнне, але воні вплываюць на эканоміку, а не вяскавляюць эфектыўнасць.
Кошт за адну успешную задачу
Найпростейшыя змены, якія можна застосавіць, — це перыякшыць або завернуць ведэнне статыстыкі па гэтым пункту:
cost per request
і заместа таго стежыце за гэтым:
cost per successfully completed task
Жылыя нявяркія не равны. Разглядзіце агента з такымиясифры:
Agent A
$0.20/task
70% success rate
Параўняўчы з гэтым:
Agent B
$0.35/task
95% success rate
Адзін з найдешавейшых варыянтав не павінен быть і найдешавейшай системай. Нормалізавайце яго:
Effective cost
= inference cost / successful tasks
Для А:
$0.20 / 0.70
≈ $0.286
Для B:
$0.35 / 0.95
≈ $0.368
Парадоксальна ситуацыя выступае ў гэтым простым критэрыі — A выграе. Але якщо A трэбуе значна большага нагляду з боку разработчыка, эканамічныя аспекты зноў змінююцца, і самэ гэта прычына, чаму командам у канцы канцоў патрабуецца шырэйшая дэфініцыя косту задання.
Тая ж ідея прымае значэнне пад час выбору модэляў
Гэта адносіцца да пераходу да механізмаў керавання модэлямі. Прыкладная версія доследжэння GitHub HydraFusion вучыцца вважаць процесы кодавання проблемамі оптымізацыі, выбіраючы для кожнага задання або адзін модэль, або пераход на моцнейшыя модэлі, або другі модэль, які выступае як незалежны крітык. Адпаведныя тэсты пад контрольванымі умовамі, як сообщаецца, паказалі значныя заощаджэння, пры чым якасць у дзеярых тэстах была роўная або вышэй за базовы стандарт Opus 5, які ўжо быў выкарыстоўваны.
Спынімся на выніках. Розумны агент не проста спытаецца, які модэль ў меру дешавы. Ён спытаецца, які процес завершыць задання з наіменшымі втратамі. Такі процес можа аб’еднаваць:
Cheap model
+
Good context
+
Efficient tools
+
Verification
і пазьрозбірнае:
Expensive model
+
Poor context
+
Repeated tool calls
Інтэлігэнція больш не жыве толькі ў модэлі. Яна распрастраняецца па всій системе.
Якща вы ствараеце продукты на базе AI
Хочацца спачатку оптымізаваць тыя показнікі, якія ўсі бачаюць: меньшая колькасць токэнаў, меньшыя запиты, корачэ выходны тэкст, дышэўшыя модэлі. Не належыць налагоджваць толькі іх. Неабходна аналізаваць усю рабочую практыку:
User request
↓
Model inference
↓
Tool call
↓
Tool response
↓
Model reasoning
↓
Another tool call
↓
Verification
↓
Final result
Звярожыце кожны этап, а потым запытайцеся, дзе агент выканае непатрэбную работу. Можа, інструмент базы дадзеных вяртае занадта мало контексту, а інструмент пошуку — занадта многа нерелевантных матэрыялаў. Можа, агент без патрэбы перапрыямляе, а ваша прыказка вымушвае зайвую планаванне. Можа, сильнейшы модель бы рашыў проблему за палову колькасці прабаў, а дышэўшы модель будзе дастаткова для першай спробы. Гэта проблемы інжынерыі програмнага забэжчэння.
Будучыня — не меншы кантэйнеры
Існуе спакуса сконцэнтраваць усю проблему з костамі на:
tokens ↓
cost ↓
Рэальныя адносіны выглядаюць больш што так:
Useful context
↓
Better decisions
↓
Fewer retries
↓
Fewer unnecessary tool calls
↓
Shorter task duration
↓
Lower total cost
Інодзе шлях да нижэйшых костаў пачынаецца з таго, што да модэлю даёма больш мяркаваў. Гэта тое, што выглядае працоўна, і самэ гэта прычына, чаму інжынерыя ІІ ператвараецца на дысцыпліну систем, а не на простыя вправы з напісання запытанняў.
Ацэнка завершанай работы
Калі вы ацэнюеце агента, не спытвайце толькі, сколькі токэнаў ён выкорыстаў. Спытвайце, сколькі корыстнага програмнага забава ён стварыў, і сколькі часу ён змарыў, прыходзячы да гэтага рэзультата. Гэта значыць трэба стежыць за правільнасцю, часам адпаведзення, колькістю вызоў інструментаў, праказамі, розмерам контэкста, костам аналізу, участю чалавека і успешным завершэнням.
Переможчик у системі кодування не обов’язково дасть найменшу кількість токенів. Очікуйте, що це буде та конфігурація, яка перетворює кожен токен, виклик інструменту та вибір моделі на реальний прогрес. Нещодавні інженерні рішення GitHub показують напрямок: оптимізуйте всю задачу, зберігайте інформацію, необхідну агенту, та припиняйте роботу лише тоді, коли знаєте, що це не допомагає. Мета — не змусити агентів робити менше, а зменшити їхні втрати.