Галоўная / Артыкулы

Адпрацоўка агентаў AWS AI у масштабе: токены, вітраты, ліміты і автономнае кераванне.

Підрахунок токенів, назіранне за вітратамі, відновленне парадыгм у межах кантэксту і надзвычайна автономна праца для агентаў AWS, кожна з якіх пояснюецца за дапамогою патэранаў, вядомых разрабоцам размяшчаных рашэнняў на JavaScript.

Выдавец: REACTAPP.TOP8 хв чытання1929 слоў

Крыніцы: 🏗️ Building Production-Ready Enterprise AI Agents on AWS — Part 3: Tokenization, Monitoring, Context Limits & Autonomous Workflows

Агент, якій наданы часны межы таякі підтвержэння, все шчэ мусіць перэжыты свой першы місяць увэртання. Тыя, ў якіх умовах гэта відбуваўся, зазвычай не ёсць прыглягаючым: як ві рахуеце токены, як стэжыце за вітратамі, ў што ператвараецеся кантэкстныя вікна, і чы будаўсья дзеўскі автономны цыкл як справжній механізм працы. Якшчы вы прышлі з спецыявзеным 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-сервісах.
  • Затрымкі паведамленняў агента на рэвалюціях p95 і p99, якія павінны адпавядаць вашым звычайным SLO. Ясна прызначыце SLO і перайдзіце на кэшаваны або метод з найкрашчымі усіляваннямі, калі ўсё гэта опаснае.
  • Што стосуецца вітрачання рэсурсаў, то гэта колькасць токенаў за хвіліну, што парадна да обмежэння колькасці запытанняў за секунду.
  • Конкрэтныя крокі на AWS:

    • Адправляйце спецыяльныя метрыкі CloudWatch для паведамленняў пра запытанні, рэзультатах і вартасці ў долерах (prompt_tokens, completion_tokens, cost_usd), пазначыўшы іх назвай агента і корыстнікам.
    • Увялічце кэшаванне паведамленняў пра запытанні. Bedrock можа перадаўна вжываць дугія, стабільныя прыметнікі, такія як сістэмныя запытанні, апісанні інструментаў і прыклады, з значным зніжэнням вартасці і меншымі затрымкамі. Перш заўсёды размешчайце незменны кантэнт, інакш вы будэтэ плаціць пূрную вартасць за ідэнтычныя токены ў кожным вызыве.
    • Створыце алармы CloudWatch, якія паведамляюць пра перасягнуць ліміту ўлічбы за дзень праз SNS, так сама як і алармы білінгу AWS.
    • Запішыце кожны вызов агента у S3 за дапамою Kinesis Firehose або безпосерэдніх запісаў, каб заставіць летак аўдыту. SOC 2 і корпаратыўныя кліянты будуць гэта выкарыстоўваць.
    • Можна вырахаваць апрыксіматыўную цэну як і для Lambda: дадзіце токены запуску і завершэння, палічыце іх на цэну модэлю, а пасля дадзіце расходы на вычысленне і інфраструктуру за кожную сесію.

    Калі вы не можэце сказаць, сколькі коштаў агент X ў паўтароўчык паўтароўчык за воскрэсенье, раздзеліўшы расходы па кліентах, значыць вы гатовы толькі для дэманстрацыі, а не для рэальнай експлуатацыі, і гэтыя становішчы дужа розныя.

    Памылкі з лімітамі кантэксту: цыркуіт-брэйкер плюс пагінацыя

    Кожна вікно кантэксту мае свой ліміт. Дзялонныя размовы, вельмі большыя выходы інструментаў і перадмерныя фрагменты даных могу яго перасіць. Гэта тое самае, што 413 Payload Too Large у свеце агентаў, толькі горша, бо гэта можа выйсці на паважныя наследкі ў багатыходовых задачах.

    Стратэгіі вяснавання выходзяць працоўна з інжынерыі бэкенду:

    1. Падсумовванне і стысненне. Перыядычна стысняйце старыя кантэкстныя даныя, як у разе ротацыі логаў.
    2. Слайдуючая вікно або обрыв. Адкідаюце старэйшыя кантэкстныя даныя, як гэта робіцца пад час працы з вялікім рэзультатам запіту, калі не завантажаецца ўсё.
    3. Пераказванне на апарат для пошуку. Зберагаюце матэрыял па за межамі запіту і завантажваеце яго на выкал, па прынцыпу ледзьве завантажвання.
    4. Раздзелэнне на падагентаў. Дзельце вялікую задачу на меншыя задачы з чыстымі кантэкстамі, як ператварэнне монолітычнай задачы на чэргу меншых задач.
  • Адэкватна дэградацыя. Калі немагчыма вярнуць стан задачы ў момент експлуатацыі, неабходна адбыцца паўтарны запуск з структураваным, можна-праўернутым пунктом перапытку, а не проста безжывная галюцінacja.
  • У кодзе таксама існуе патэрн перэхвата і складчання, супадзячы з перэхватам тайма-ауту базы дадзенаў:

    # 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, каб у разе збою падчас выканання задачы працэс могў быць продактываў, і транзакцыя не будзе загублена. Дадаце TTL у DynamoDB для элементаў сесіі, каб застарэлыя дыялогі сама выгоралі, як і у разе заканчэння тэрміну дзейнасці ключа сесіі у Redis.
  • Модэлі для адзейнае працы. Калі галоўная модэль, напрыклад Claude на Bedrock, перастае працаваць чы ў яе зменшуецца працэсавая моц, сістэма з абрывам цепей павінна перэйсці на запасную модэль, такую як Amazon Nova, і не паказваць корыстніку адказ пра абэрасію. Гэта тая ж ідэя, як у HTTP-кліента, які перэходзіць на запасны рэгіон.
  • Кантроль модэляў. Работа з заменай модэля павінна адбывацца як і будзь-яе запусканне ў прымэтнай сістэме: спачатку тэставаць новую модэль на частыне трафіку, апрацоўваць згоду на ўжыцце і застаўляць можлівасць вярнуцца да пакойной версіі. Фраза „Мы проста зменілі модэль“ не павінна абыцца няапраўнанай зменай.
  • Ключ для абрыву працы. Павінна існаваць можлівасць, як ручная, так і автаматычная (па досягненні певных крэтарыў), ўзняць на паузу весь флот агентоў заодно, напрыклад па прымусе фігуры-флага для зупінкі неконтрольаванага выпуску.
  • Чэкпоінт — гэта проста ўсё той жа запіс аб заданні, якое можна пракрычаць знову, у 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.
    • Існуе чыткая страцэгія вярнення да нормальнага стану у разе бягаў, вызваных обмежэннямі кантэксту: стысненне, адсечка або пераказванне.
  • Аўтонамныя цыклы маюць строгія ліміты па колькасці ітэрацый, прыгэлага часу і вітрачаных рэсурсоў.
  • Незворачныя дзеянні, такія як варыцыі грошаў, адправка электранаказаў і выдаленне дадзэнняў, трэбуюць пашырэнняя людзкага затверджэння.
  • Рашэнні агентаў цалкам фіксуюцца ў S3 чыста CloudWatch для адпаведнасці правілам.
  • Автаматызаваныя пераканальнія працуюць у CI прытаму, калі выконваюцца будзь-яя змены ў запытах чыста мадэлях; гэты крок ніколі не прыпускаецца для коду аплікацый.
  • Этап прабаваў працаваў у умовах хаосу з сімуляванымі перыядамі завершэння працы мадэляў, паспаленымі рэзультатамі запытаў чыста цыкламі перадачы дадзэнняў, таму шляхі вярнення да нормальнага стану апрацоўваныя ўсё раней, чым ад прадукцыі будзе залежаць.
  • Што гэта дае ў суме

    Кожныя канцэпцыі агента маюць свой аналаг у свеце фуль-стак, які вам вядомы. Агенты — гэта мікросервісы з можласцю прымэчання, а перадачы даных — гэта стойкія, працоўна відстэйбалізаваныя маршруты з лімітам па кроках. Механізмы контролю — гэта шаровыя мідлвэры, а выкарыстоўванне даных — гэта розумнейшы шар запітоў, а галюцынаціі ловяцца за дапамогою базавання на рэальных даных і перакранчвання, а не проста праграмаваным спосабам. Токены служаюць як показнік розмеру пакета даных, так і як елемент для аплатаў. Монітарынг вітрачанняў — гэта аналаг CloudWatch для выкарыстоўвання модэляў. Полная вікна кантэксту — гэта прыцэпны бяг, які вымагае плану вяснавання, а автонамія — гэта стойкі машынны стан, які нічога не спадзяецца з простым цыклам while.

    Агенты для корпатываных працоўнікаў рэдка калі збываюцца ў працоўнай асяроддзя праз тое, што модэль недастаткова розумны. Яны збываюцца таму, што команды ігнаруюць асновныя прынцыпы распраўленых сістэм, якіх ніколі не ігнаравалі бы для звычайнага API: верыфікацыю, можлівасць абзору стану, павторныя спробы, ідэмпатэнтнасць, стабільнасць і павольную пераходнае станы. Калі вы ужо запускалі стойкую JavaScript-аплікацыю на AWS, у вас ужо ёсць неабходныя інстынкты. Заставало толькі направіць гэтыя інстынкты на незнаёмую, непрадвідвачальную залежнасць, якая адпавядае за дапамою рэчэнняў.