Адпрацоўка агентаў AWS AI у масштабе: токены, вітраты, ліміты і автономнае кераванне.
Підрахунок токенів, назіранне за вітратамі, відновленне парадыгм у межах кантэксту і надзвычайна автономна праца для агентаў AWS, кожна з якіх пояснюецца за дапамогою патэранаў, вядомых разрабоцам размяшчаных рашэнняў на JavaScript.
Агент, якій наданы часны межы таякі підтвержэння, все шчэ мусіць перэжыты свой першы місяць увэртання. Тыя, ў якіх умовах гэта відбуваўся, зазвычай не ёсць прыглягаючым: як ві рахуеце токены, як стэжыце за вітратамі, ў што ператвараецеся кантэкстныя вікна, і чы будаўсья дзеўскі автономны цыкл як справжній механізм працы. Якшчы вы прышлі з спецыявзеным JavaScript на AWS, кожы з цых элементаў відпавае чамусь, які ужо знаеце, і гэты падхед вікорыствае тыя ж працы.
Токенацыя — гэта рэвязь серызацыя
Веб-дзеўскі дзеўскі аплікейцыя серызацыя даных перад тым, як воні падаюць у мерэжу, за дапамагайчы JSON.stringify або protobuf. Мова модэль робіе тое ж самое для тэксту: першыя чысьто роздзяліваець на токены, якія ёсу фрагменты словацькіх слоў, а не церамі чысьто словацькія.
"Enterprise agents scale."
→ ["Enterprise", " agents", " scale", "."] (≈4 tokens, illustrative)
Прычыны, чаму інжынеру важна гэта тэма, можна звярнуць да трох прычын.
- Токены — гэта тое, за што вас рахуюць, і ў ягоў можна пораўняцца з GB-секундамі у Lambda. І вхідны, і выходны даныя коштаюць грошы, а так як цены Bedrock разлічаюцца за мадэлямі, колькасць токенаў безпасэчна вплывае на суму рахунку AWS.
- Токены таксама вялічыню пакета дадзеных, як і ліміт тэла запіту, напрыклад
express.json({ limit: '5mb' }). У гэтым случае ліміт — гэта вікна кантэксту, якое у сучасных мадэлях можа складаць сотні тысяў токенаў і продовжвае раставаць, таму трэба выявіць рэальны ліміт для вашай мадэлі, а не прыпускаты. - Токанізацыя не ўсюды аднаковая для разных мов. Тэкст на ненямецкіх мовах часта выкарыстоўвае больш токенаў на слова, і гэта мае значэнне для продуктав, якія працуюць у калькі рэгіонаў.
У Node.js підрахунак токенаў прытымкі перад адправкай падобны да вімеравання пакета дадзеных пры вызове fetch:
// Node.js: counting tokens before sending a request
// (conceptually like calculating payload size before a fetch call)
import { encoding_for_model } from "tiktoken";
const enc = encoding_for_model("gpt-4o");
const tokens = enc.encode(userPrompt);
console.log(`Payload size: ${tokens.length} tokens`); // like Content-Length
enc.free();
У Bedrock можна прыскнуць апраноўкі трэціх сторон для токенавання. API CountTokens підрахоўвае колькасць токенаў з баку сервера для падтрымваных модэляў Claude, выкарыстоўвае тую ж структуру паведамлення, што і API Converse, і дазволяе прадзейсніць пачатковую перапактовку колькасці токенаў у запіце без неабходнасці плаці за апрацоўку:
# Python (boto3): pre-flight token count via Bedrock, no separate tokenizer library needed
response = bedrock_runtime.count_tokens(
modelId="anthropic.claude-3-5-sonnet-20241022-v2:0",
input={"converse": {"messages": [{"role": "user", "content": [{"text": userPrompt}]}]}}
)
print(f"Input tokens: {response['inputTokens']}")
Урок: підраховваюце колькасць токенаў так, як підраховваеце размах HTTP-пакета, да адправкі, а не пасля таго, як вам вырахавалі кашты або адмовілі.
Назіранне за выкарыстаннем токенаў, як у CloudWatch для вырахунку каштоў LLM
У паканянай частцы была рассказана пра адзін запіт. У сумарным відображэнні паказваецца, сколькі токенаў выкарыстаў кожны агент, за кожнага тэнанта і за кожны дзень, і вы хочаце цэ гледзець раней, чым зробіць фінансы. Ніхто не запускае Express API на AWS без панелей керування і аўтаматычных апавешчэнняў, і назіранне за токанамі заслуговае на такое ж ставленне.
Ключоўыя показнікі для агента:
- Колькасць токенаў на запіт, як размах вхіднага пакета.
- Колькасць токенаў на завершэнне запіта, як размах адпаведзі.
- Аб’ём токенаў за сесію, які ёсць вялічынай памяці сесіі.
- Кашты на агента, корыстувальніка або тэнанта — тае ж вімірванне, якое вы бы выкарыстоўвалі для выкарыстання базы дадзеных па тэнантах у мульты-тэнантных SaaS-сервісах.
Конкрэтныя крокі на AWS:
- Адправляйце спецыяльныя метрыкі CloudWatch для паведамленняў пра запытанні, рэзультатах і вартасці ў долерах (
prompt_tokens,completion_tokens,cost_usd), пазначыўшы іх назвай агента і корыстнікам. - Увялічце кэшаванне паведамленняў пра запытанні. Bedrock можа перадаўна вжываць дугія, стабільныя прыметнікі, такія як сістэмныя запытанні, апісанні інструментаў і прыклады, з значным зніжэнням вартасці і меншымі затрымкамі. Перш заўсёды размешчайце незменны кантэнт, інакш вы будэтэ плаціць пূрную вартасць за ідэнтычныя токены ў кожным вызыве.
- Створыце алармы CloudWatch, якія паведамляюць пра перасягнуць ліміту ўлічбы за дзень праз SNS, так сама як і алармы білінгу AWS.
- Запішыце кожны вызов агента у S3 за дапамою Kinesis Firehose або безпосерэдніх запісаў, каб заставіць летак аўдыту. SOC 2 і корпаратыўныя кліянты будуць гэта выкарыстоўваць.
- Можна вырахаваць апрыксіматыўную цэну як і для Lambda: дадзіце токены запуску і завершэння, палічыце іх на цэну модэлю, а пасля дадзіце расходы на вычысленне і інфраструктуру за кожную сесію.
Калі вы не можэце сказаць, сколькі коштаў агент X ў паўтароўчык паўтароўчык за воскрэсенье, раздзеліўшы расходы па кліентах, значыць вы гатовы толькі для дэманстрацыі, а не для рэальнай експлуатацыі, і гэтыя становішчы дужа розныя.
Памылкі з лімітамі кантэксту: цыркуіт-брэйкер плюс пагінацыя
Кожна вікно кантэксту мае свой ліміт. Дзялонныя размовы, вельмі большыя выходы інструментаў і перадмерныя фрагменты даных могу яго перасіць. Гэта тое самае, што 413 Payload Too Large у свеце агентаў, толькі горша, бо гэта можа выйсці на паважныя наследкі ў багатыходовых задачах.
Стратэгіі вяснавання выходзяць працоўна з інжынерыі бэкенду:
- Падсумовванне і стысненне. Перыядычна стысняйце старыя кантэкстныя даныя, як у разе ротацыі логаў.
- Слайдуючая вікно або обрыв. Адкідаюце старэйшыя кантэкстныя даныя, як гэта робіцца пад час працы з вялікім рэзультатам запіту, калі не завантажаецца ўсё.
- Пераказванне на апарат для пошуку. Зберагаюце матэрыял па за межамі запіту і завантажваеце яго на выкал, па прынцыпу ледзьве завантажвання.
- Раздзелэнне на падагентаў. Дзельце вялікую задачу на меншыя задачы з чыстымі кантэкстамі, як ператварэнне монолітычнай задачы на чэргу меншых задач.
У кодзе таксама існуе патэрн перэхвата і складчання, супадзячы з перэхватам тайма-ауту базы дадзенаў:
# Conceptual: catching a context-limit error, like catching a DB timeout
try:
result = agent.run(task, conversation_history)
except AgentError as err:
if err.code == "context_length_exceeded":
# Keep the system prompt intact — compact the *conversation*, never the identity.
# Summarizing everything (including system instructions) is how agents quietly
# "forget" their role mid-task, the same way you'd never let a cache-eviction
# policy drop your app's config alongside its session data.
compacted = summarize(conversation_history, preserve="system_prompt")
result = agent.run(task, compacted)
else:
raise # don't swallow unrelated errors
Памылкі, вызваныя лімітамі кантэкста, ўскладнення і не ўзначальныя явышчы. Яе трэба спрыяваць так жа, як і лімітамі частоты запытоў і таймаутам: павторныя спробы з адкладаннем, контрольныя пункты, якія зберагаюцца ў DynamoDB, і плавнае скасаванне дзействаў. Пусты catch, які прыхватвае ўсе памылкі, ніколі не ёсць прыйнятным.
Автонамныя рабочыя працэсы як машыны станоў
Автонамны агент не дзейнае адразу. Ён плануе, дзейнае, спазірае і продовжае цыкл, пакуль не будзе досягнута мета. Кожны, хто стварыў машыну станоў XState, схему Redux saga або поток AWS Step Functions для багатыядэрнай процедуры платэжа, вядомы ўжо такі фармат. Цэў — знакомы цыкл у стылі ReAct: планаванне, дзеянне, спазіранне і ацэнка, з можлівасцю завершэння дзеянаў або перадачы задачы чалавеку, і яго трэба праектаваць як надзеяны механізм рабочых процэсаў.
- Ідэмпатныя крокі. Павторны запуск крока не павінен два разы сцягваць плату у кліента або надсылаць дублікат пісьма.
while(true), пры якой вікорыстоўваецца крэдытная картка.Чэкпоінт — гэта проста ўсё той жа запіс аб заданні, якое можна пракрычаць знову, у DynamoDB; Step Functions чытае яго пад час перзапуску, каб продакаваць працу з апошнего правільнага крока:
{
"pk": "session#8f2c1a",
"sk": "checkpoint#2026-08-23T10:15:00Z",
"step": "plan",
"hop_count": 2,
"cost_so_far_usd": 0.014,
"state": { "goal": "resolve billing dispute", "last_action": "lookup_charge" },
"ttl": 1788084900
}
Не стварайце автаномію як while-цыкл, адзёрваны пры вызове LLM. Стварайце стойкі, спостэрагаемы, можлівы да адзначэння становы машыну, якая і ёсць справжнім рашэнням. Step Functions чырпаецца для гэтых патрабоў, калі хочаце готоваг рашэння.
Што ўжо вышэй за ўсё гэта — гэта тэсты. Правілы захавання, якасць выкарыстоўвання дадзеных і ўсе інша таксама патрабуюць тэстаў на рэгрэсію, як і код прыемліка. Комплект тэстаў перадае фіксаваны набор вхідных дадзеных агенту і оцэнюе выходныя рэзультаты па адносу да апэктываўанага поведзення, тады змена запіту чы модэлю не можа таямніча паспрабаваць пагаршыць працу прыемліка. Ragas оцэнюе показнікі, спецыфічныя для выкарыстоўвання дадзеных, такія як аддакладнасць і рэлевантнасць у кантэксце, тады як Promptfoo і Braintrust абрабоцваюць шырэйшыя тэсты запітаў і выходных рэзультатаў. Праеўрабайце ваш выбор у CI так, як вы бы праеўрабоўвалі pytest, такім чынам, неудачны тэст заблокуе развяртанне, і нікому не патрабуецца ручна пераглядаць выходныя рэзультаты.
Спісак пераконтроўкі гатовнасці да вырабніцтва
- Кожны агент мае адную апрацоўваную адпаведальнасць і чыста абмежаныя правыя доступу IAM.
- Перадачы дадзенняў адбываюцца праз структураваны канал (SQS або EventBridge) і захішчаны ад цыклів.
- Нормы для вхідных і выходных дадзенняў ёсць окрэмымі, можна ўзаўме з’еднвацьі і маюць свае версіі.
- Якасць адзысквання дадзенняў мае свае показнікі тачнасці і включнасці, і яе не атрыбутуецца як „АІ памыляецца“.
- Усе крытычна важлівыя элементы праходзяць пераконтроўкі на наявнасць галюцынацый: перакананне ў правдзівасці, ацэнка доверы або перагляд чалавекам.
- Іспользаванне токенаў вімерваецца да пачатку вызову, а не толькі пасля яго.
- Панелі керування CloudWatch паказваюць вітраты па кожнаму корыстніку і агенту, з апавешчэннямі пра перапыл бюджэту SNS.
- Існуе чыткая страцэгія вярнення да нормальнага стану у разе бягаў, вызваных обмежэннямі кантэксту: стысненне, адсечка або пераказванне.
Што гэта дае ў суме
Кожныя канцэпцыі агента маюць свой аналаг у свеце фуль-стак, які вам вядомы. Агенты — гэта мікросервісы з можласцю прымэчання, а перадачы даных — гэта стойкія, працоўна відстэйбалізаваныя маршруты з лімітам па кроках. Механізмы контролю — гэта шаровыя мідлвэры, а выкарыстоўванне даных — гэта розумнейшы шар запітоў, а галюцынаціі ловяцца за дапамогою базавання на рэальных даных і перакранчвання, а не проста праграмаваным спосабам. Токены служаюць як показнік розмеру пакета даных, так і як елемент для аплатаў. Монітарынг вітрачанняў — гэта аналаг CloudWatch для выкарыстоўвання модэляў. Полная вікна кантэксту — гэта прыцэпны бяг, які вымагае плану вяснавання, а автонамія — гэта стойкі машынны стан, які нічога не спадзяецца з простым цыклам while.
Агенты для корпатываных працоўнікаў рэдка калі збываюцца ў працоўнай асяроддзя праз тое, што модэль недастаткова розумны. Яны збываюцца таму, што команды ігнаруюць асновныя прынцыпы распраўленых сістэм, якіх ніколі не ігнаравалі бы для звычайнага API: верыфікацыю, можлівасць абзору стану, павторныя спробы, ідэмпатэнтнасць, стабільнасць і павольную пераходнае станы. Калі вы ужо запускалі стойкую JavaScript-аплікацыю на AWS, у вас ужо ёсць неабходныя інстынкты. Заставало толькі направіць гэтыя інстынкты на незнаёмую, непрадвідвачальную залежнасць, якая адпавядае за дапамою рэчэнняў.