Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Экономика агентов

Назначение

Почему модель с ценой токена в десять раз ниже может сделать агента дороже для каждой завершенной задачи?

Команда, которая считает стоимость агента так же, как стоимость чат-сервиса, умножает токены на тариф провайдера и удивляется счету. Агент покупает не токены, а готовые задачи. Каждая готовая задача несет на себе все ходы, повторно отправленный контекст, секунды работы песочницы, прогоны тестов, повторные попытки и проверку человеком, которые понадобились, чтобы один результат прошел верификацию, плюс стоимость каждой попытки, которая так и не прошла. Более дешевая модель, которая чаще ошибается, умножает все эти слагаемые; более быстрая модель почти не меняет траекторию, время которой уходит на тесты и ожидание инструментов; а дерево делегирования без зарезервированных бюджетов может потратить деньги, которые никакой откат не вернет. Поэтому экономика решает, какую модель вызвать, что кешировать, сколько рассуждений оплатить, когда эскалировать, сколько мощности держать в резерве и стоит ли задаче вообще агент; каждое из этих решений оценивается по стоимости и времени на принятую задачу. Горизонт определяет, сколько ходов оплачивается, состояние определяет, сколько контекста повторно отправляется на каждом из них, а полномочия определяют, какую проверку и одобрение должен пройти каждый результат, поэтому цена принятой задачи — это цена закрытия всех трех экспозиций.

Цели обучения

  • Рассчитать стоимость на принятую задачу по стоимости всей траектории и доле принятия и объяснить, почему цена за токен вводит в заблуждение.
  • Оценить, как попадания в кеш префикса, сжатие и бюджеты на рассуждения или повторные попытки меняют денежную стоимость многоходовой траектории.
  • Диагностировать критический путь траектории по ее трассе и решить, когда окупается более быстрый вывод, включая спекулятивное декодирование.
  • Спроектировать каскад моделей, управляемый верификатором, и вычислить его ожидаемую стоимость, хвостовую задержку и штраф за ложное принятие.
  • Оценить мощность для траекторий по закону Литтла и лимитам провайдера и найти точку безубыточности между выделенным обслуживанием и API с оплатой за токен.
  • Спроектировать иерархические резервирования бюджета и ограничения скорости расходов, которые ограничивают деньги во всем дереве делегирования.
  • Определить, оправдывает ли задача фиксированный рабочий процесс, ограниченный цикл агента или несколько агентов, оценив каждый вариант по цене за принятую задачу.

Стоимость на принятую задачу

Ниже половины принятия стоимость неудачных попыток перекрывает любую скидку на токены.

Команда платформы заменяет передовую модель, на которой работает агент для исправления ошибок, на модель, токены которой стоят в десять раз дешевле. В следующем месяце счет за исправленные ошибки растет. В журналах обслуживания ничего не объясняет этого, потому что журналы считают токены, а токены никогда не были тем, что покупал агент. Чат-сервис выставляет счет за вызов, поэтому его стоимость равна токенам, умноженным на цену. Агент выполняет траекторию, а организация платит за траекторию, результат которой прошел верификацию. Полезный выход траекторий («Эффективность на микроуровне и на макроуровне») уже учитывает только ресурсы, потраченные на проверенные траектории, а раздел «Многоуровневый контракт оценки» определил принятую задачу, которую создает верификация. Этот раздел назначает цену каждой принятой задаче и показывает, какие части системы эта цена на самом деле покупает.

Где уходят деньги агентной задачи: слева — иллюстративный состав стоимости всей траектории, в котором токены модели (вход и выход) составляют меньше половины счета, а хостинг песочницы, плата за инструменты, проверка и амортизированная эскалация к человеку занимают остальное. Справа — эффективная стоимость на принятую задачу как функция успешности одного шага для задачи из восьми шагов: дешевая модель при умеренной точности шага стоит за принятую задачу дороже, чем передовая модель при высокой точности шага.

На левой панели рисунка «Где уходят деньги агентной задачи» разложена одна иллюстративная задача. Модельные токены, разделенные на повторно отправленный вход и сгенерированный выход, составляют меньше половины счета. Остальное оплачивает песочницу, в которой выполняются команды агента, инструменты, которые он вызывает, тесты, проверяющие результат, и долю проверки человеком, которую запускают неудачные попытки. По траектории из ходов стоимость всей траектории одной попытки равна

где оплачивает контекст, отправленный на ходу (системный промпт, определения инструментов, историю диалога до этого момента и самый новый результат инструмента), оплачивает токены, которые генерирует модель, включая токены рассуждений и аргументы вызовов инструментов, покрывает плату внешних сервисов, покрывает изолированную среду, которая выполняет команды агента, покрывает тесты и проверки, которые решают о принятии, а покрывает проверку, когда среда выполнения эскалирует задачу. Входной член уравнения стоимости попытки растет с каждым ходом, потому что модель ничего не хранит между вызовами и каждый ход заново отправляет более длинный контекст («Задержка обслуживания на ускорителе»). Этот рост объясняет, почему следующий раздел рассматривает кеширование как первый рычаг.

Одна попытка — это еще не одна принятая задача. Правая панель рисунка «Где уходят деньги агентной задачи» показывает почему. Если каждый из восьми шагов задачи успешен независимо с вероятностью , вся задача успешна с вероятностью , а каждая неудачная попытка оплачивается полностью до того, как ее отбросят. Полезный выход траекторий и принятая задача (принцип «Полезный выход траекторий и принятая задача») называет то, что парк должен минимизировать: эффективную стоимость на принятую задачу. Если парк делает попыток и из них принято, то

где — доля принятия, — средняя стоимость попытки, которая проходит проверку, а — средняя стоимость попытки, которая не проходит и отбрасывается. Отношение шансов показывает, сколько неудачных попыток приходится на каждую принятую задачу. Оно мало вблизи и неограниченно растет при уменьшении ; это и есть крутой левый край графика на полях.

Стоимость всей траектории

Стоимость всей траектории — это все, что потрачено на токены модели, инструменты, песочницы, проверку и проверку человеком по всем попыткам, деленное на число попыток, результаты которых приняты: .

  1. Значение: это величина, которую решения о выборе модели, кешировании, маршрутизации и мощности должны снижать, и она может расти, даже когда цены на токены падают.
  2. Отличие: оплата за токен взимает плату за то, что генерирует модель, независимо от успеха задачи; стоимость всей траектории относит каждую неудачную попытку и все немодельные слагаемые на принятые задачи.
  3. Типичная ошибка: бюджетирование агента по прайсу провайдера, которое игнорирует немодельные слагаемые и отношение шансов , умножающее неудачные попытки.

Ловушка цены токена в автоматическом исправлении ошибок

Задача: Агент исправления ошибок может работать на передовой модели или на недорогой модели, у которой входные токены дешевле в 10 раз. Иллюстративная нагрузка в таблице «Иллюстративная нагрузка исправления ошибок» повторяет каждую заявку, пока попытка не пройдет регрессионные тесты. Какая модель дешевле за принятое исправление?

ПараметрПередовая модельНедорогая модель
Цена входа / выхода за 10^6^ токенов$3 / $15$0,30 / $1,20
Ходов на попытку47
Входных / выходных токенов на ход16 000 / 80028 000 / 1 200
Доля принятия 0,750,25
Песочница и инструменты на ход$0,03$0,03
Проверка на попытку$0,05$0,05
Разбор человеком на неудачную попытку$10$10

Иллюстративная нагрузка исправления ошибок: сценарные цены, длины траекторий и доли принятия для передовой и недорогой моделей.

Расчет: Только по токенам одна попытка стоит $0,240 на передовой модели и $0,069 на недорогой, что выглядит в 3,5 раза дешевле. Недорогая модель делает больше ходов, а каждый ход оплачивает песочницу, поэтому с учетом хостинга и проверки попытки стоят $0,410 и $0,329, то есть разрыв всего 20 процентов. Деление на долю принятия («эффективная стоимость» при ) дает $0,55 за принятое исправление для передовой модели и $1,32 для недорогой, которая несет 3 неудачные попытки на успех против 0,33. Когда каждая неудачная попытка еще и стоит $10 работы инженера на разбор, получаются $3,88 и $31,32.

Системный вывод: Недорогая модель обходится в 2,4 раза дороже за принятое исправление без разбора и в 8,1 раза дороже с ним. Скидка на токены была реальной, но ее многократно съели ходы, время песочницы и неудачные попытки.

Отчетность следует из того же учета. Агент, которого оценивают только по доле успешных решений, скрывает, чего стоил успех, а агент, которого оценивают только по стоимости, скрывает, что он не довел дело до конца. Результат считается полным, когда он сообщает долю принятия с доверительным интервалом («Статистическая строгость оценки») и стоимость на принятую задачу по тем же прогонам. Тогда проекты можно разместить на плоскости «стоимость–точность», и проект, который одновременно дешевле и точнее другого, доминирует над ним. Бенчмарки исправления проблем на уровне репозиториев (Jimenez et al., 2024) делают это конкретным: у каждого исправленного дефекта есть проверяемый результат теста и измеримый счет. Сравнение проектов проводится при равном бюджете («Разделение скрытого потенциала и надежности»), потому что проект, которому разрешено тратить больше, может купить успех одними деньгами. В этой главе каждый рычаг оценивается по обратной величине , то есть по числу принятых задач на доллар.

Учет по всей траектории также показывает, куда нажимать в первую очередь. В большинстве траекторий агента самый большой член по токенам — не то, что пишет модель, а то, что среда выполнения повторно отправляет ей на каждом ходе.

Кеширование и бюджеты на рассуждения

К тридцатому ходу агент для программирования отправляет модели контекст в десятки тысяч токенов, почти все из которых он уже отправил на двадцать девятом ходу. Оплачивать это повторение полной ценой — правило по умолчанию, и его можно избежать. Раздел «Задержка обслуживания на ускорителе» подсчитал токены, которые траектория повторно отправляет («повторная отправка траектории»), и ввел кеширование префикса, которое переиспользует состояние внимания для префикса промпта, уже обработанного сервисом. Инженерия контекста устроила контекст так, чтобы префикс оставался стабильным («Подготовка следующего вызова»), а раздел «Кеширование префиксов между ходами» показал, как система обслуживания разделяет это состояние. Оба опираются на факт, что состояние внимания есть функция точного префикса из токенов (принцип «Состояние внимания выводится из префикса токенов»). Этот раздел оценивает результат в долларах, а затем оценивает другой бюджет, которым среда выполнения управляет на каждом вызове: сколько рассуждений и сколько попыток покупать.

Чего стоит попадание в кеш

Провайдеры, которые поддерживают кеширование промптов, выставляют счет за входные токены, прочитанные из закешированного префикса, по доле от обычной цены входа, а только за токены после префикса — по полной цене. При журнале только с добавлением ход продолжает ход , поэтому при идеальном переиспользовании каждый ход платит полную цену только за то, что он добавил. Ту же траекторию, которую раздел «Задержка обслуживания на ускорителе» посчитал в токенах, теперь можно оценить в деньгах.

Оценка траектории из тридцати ходов с кешем и без него

Задача: Агент для программирования из раздела «Задержка обслуживания на ускорителе» делает 30 ходов. Первый промпт содержит 8 000 токенов, каждый ход добавляет 1 500 токенов и выдает 200 выходных токенов. Вход стоит $3, а выход $15 за миллион токенов; закешированный вход оплачивается по 10 процентам от цены входа. Во что обходится траектория с кешированием префикса и без него?

Расчет: Траектория отправляет всего 892 500 входных токенов, которые при полной цене стоят $2,68. При журнале только с добавлением полной ценой оплачиваются только первый промпт и добавленные токены каждого хода, всего 51 500, а остальное — чтения из кеша, так что вход падает до $0,41. Выход стоит $0,09 в любом случае. Траектория стоит $2,77 без кеша и $0,50 с ним.

Системный вывод: Кеширование префикса делает ту же траекторию в 5,6 раза дешевле и не меняет ни модели, ни ответа. Оно также хрупко. Временная метка в начале системного промпта, переставленный список инструментов или правка раннего сообщения возвращают каждый ход к чтению по полной цене.

Правила раскладки из раздела «Подготовка следующего вызова» существуют, чтобы защищать эту экономию, а долю попаданий в кеш стоит держать на панели обвязки рядом со стоимостью на принятую задачу. Две оговорки делают оценку честной. Некоторые провайдеры берут надбавку за запись префикса в кеш и через несколько минут бездействия удаляют закешированные префиксы, поэтому траектория, которая приостанавливается на долгом ожидании инструмента или одобрении («Шлюзы одобрения»), может вернуться к холодному кешу. Взгляд со стороны обслуживания на то же решение — сохранять ли состояние внимания в памяти на время ожидания — относится к разделу «Удержание, вытеснение, пересчет или выгрузка».

Цена сжатия

Сжатие («Сжатие контекста») уменьшает контекст, когда он становится слишком длинным, обычно заменяя старые ходы сводкой. На кешированной траектории у сжатия есть цена, которую легко пропустить. Сводка — это новый текст, поэтому ход после сжатия читает весь свой контекст по полной цене, а сама сводка стоит вызова модели. В траектории из примера допустим, что среда выполнения сжимает контекст на ходу 16, когда он содержит 30 500 токенов, до 12 000 токенов, а вызов сводки выдает 1 500 токенов. Без сжатия оставшиеся 15 ходов стоят $0,245 за вход. С ним они стоят $0,190 плюс $0,036 за сводку, всего $0,226. Сжатие окупает свой промах кеша и вызов сводки только примерно через 11 ходов.

Из этого следуют два вывода. Сжатие на раннем этапе длинной траектории экономит деньги, а сжатие ближе к концу стоит денег, поэтому среда выполнения, которая сжимает по фиксированному расписанию, по крайней мере должна сравнивать ожидаемый оставшийся горизонт с точкой безубыточности. Чаще решение вообще не о деньгах. Сжатие оправдано окном контекста и качеством решений по мере того, как контекст заполняется устаревшим материалом («Инвалидация контекста»), а денежный учет лишь показывает, чего стоит это качество.

Бюджеты на рассуждения и повторные попытки

Другой бюджет на вызов, который задает среда выполнения, — сколько обдумывания покупать. Интерфейс вызова открывает бюджет токенов рассуждений («Контракт вызова»), а токены рассуждений оплачиваются как выходные токены, дорогой вид, и генерируются последовательно, поэтому больший бюджет поднимает и цену, и задержку каждого вызова, который его использует. Раздел «Три оси распределения вычислений» определил, когда больше обдумывания повышает обоснованность решения. Экономический вопрос здесь уже. Для задачи с защищенным верификатором среда выполнения может купить лучший ответ одним дорогим вызовом или несколько попыток более дешевым, и у этих двух вариантов разные стоимости на принятую задачу.

С верификатором, которому среда выполнения доверяет, повторные попытки могут остановиться на первом принятом результате. Если каждая попытка дешевой конфигурации успешна с вероятностью при стоимости , а попытки независимы, то ожидаемая стоимость на принятую задачу при последовательном повторе равна , сколько бы повторов ни разрешалось, потому что каждый разрешенный повтор используется, только если предыдущий провалился. Предел повторов меняет покрытие, , но не стоимость на принятую задачу. Запуск попыток параллельно покупает скорость вместо экономии: стоимость на задачу и на принятую задачу. Pass@ как потолок отбора («Отбор кандидатов») — это член покрытия в обоих случаях.

Возьмем иллюстративную дешевую конфигурацию, которая успешна с вероятностью 0,30 при $0,10 за попытку, и более сильную (большую модель или больший бюджет рассуждений), которая успешна с вероятностью 0,70 при $0,40. При пределе в 5 попыток последовательный повтор дешевой конфигурации покрывает 83 процента задач, в среднем использует 2,8 попытки и стоит $0,33 за принятую задачу. Более сильная конфигурация стоит $0,57 за принятую задачу при одной попытке. Запуск 5 дешевых попыток параллельно самый быстрый и самый дорогой: $0,60. Дешевая конфигурация выигрывает по стоимости и проигрывает по задержке и покрытию, более сильная выигрывает по задержке, а параллельный вариант оправдан, только когда дедлайн за него платит.

Сравнение опирается на два условия, которые решают, выполняется ли оно на практике. Верификатор должен быть надежным, потому что повторные попытки против верификатора, который иногда принимает неверный ответ, превращают повторы в ложные принятия (принцип «Асимметрия верификации»). Попытки также должны проваливаться независимо, а на практике это редко так. Попытки одной и той же модели на одной и той же задаче разделяют ее слепые пятна, поэтому покрытие выходит на плато заметно ниже , а разрыв между pass@ и надежностью по повторным прогонам («Разделение скрытого потенциала и надежности») — это измеренная форма такой корреляции. Правила остановки для отдельной задачи из раздела «Критерии остановки поиска» затем ограничивают, сколько бюджета может съесть безнадежная задача.

Кеширование снижает стоимость каждого хода, а бюджет на рассуждения и повторы определяет, сколько ходов и попыток покупается. Ни одно из них не говорит, сколько длится задача. Траектория может быть дешевой и при этом слишком медленной, чтобы быть полезной, а у времени свой учет.

Задержка критического пути

Выполнение тестов в песочнице доминирует по реальному времени, ограничивая то, что может дать более быстрый вывод.

Агент для программирования тратит 420 секунд на починку падающего теста, и модель тратит 84 из этих секунд на генерацию токенов. Команда платформы переводит его на уровень обслуживания, который генерирует токены в 4 раза быстрее. Следующий прогон занимает 357 секунд, то есть улучшение на 15 процентов за большие вложения, потому что остальные 336 секунд приходятся на запуск контейнера, выполнение тестов, синхронизацию файлов и загрузку пакетов, и ни одно из них не стало быстрее. Тождество длительности из раздела «Учет длительности траектории» уже делит каждый ход на время модели, инструментов, ожидания и среды выполнения и ограничивает выигрыш от более быстрой модели законом Амдала. Этот раздел превращает эту границу в диагностику. Трасса определяет критический путь, среда выполнения сокращает то, что на нем лежит, а более быстрый вывод стоит покупать, только когда на пути именно модель.

Где один ход агента тратит время: сверху — иллюстративный ход, разложенный на спаны трассы: чтение контекста, генерация выхода, проверка средой выполнения, выполнение инструмента в песочнице и сетевое ожидание. Снизу — кривые ускорения по закону Амдала при ускорении модели против ускорения инструментов и ожиданий; кривая модели выходит на предел, заданный немодельной долей, тогда как умеренное ускорение среды его превосходит.

Ход из рисунка «Где один ход агента тратит время» занимает 4,25 с, из которых две фазы модели, чтение контекста и генерация выхода, занимают 1,5 с, или 35,3 процента. Никакое ускорение модели не сделает этот ход быстрее, чем в 1,55 раза. Модель, которая быстрее в 2 раза, дает ускорение в 1,21 раза. Ускорение инструментов и ожиданий в 2,5 раза за счет прогретых пулов песочниц, кешированных сборок и выбора тестов дает 1,63 раза, что больше, чем дала бы мгновенная модель. Поэтому то, куда вкладываться, решает измерение, а не мнение, и измерением служит трасса.

Критические пути по трассам

Трасса траектории («Распределенная трассировка траекторий») записывает каждый вызов модели, вызов инструмента, операцию песочницы и ожидание как спан с временем начала, длительностью и родителем. Настоящие траектории ветвятся, повторяются и запускают инструменты параллельно, поэтому спаны образуют ориентированный ациклический граф, в котором ребро означает, что не могло начаться раньше, чем закончился . Это граф задач из раздела «Топологии координации» на более мелком уровне отдельных вызовов, и, как там, время траектории равно длине ее самого длинного пути:

где — множество путей от истока до стока, а — длительность спана . Спан вне критического пути имеет запас, и его сокращение не меняет ничего, что видит пользователь. Спаны, которые важны, различаются тем, что их ограничивает и что их сокращает, как обобщает таблица «Типы спанов траектории».

СпанЧто задает длительностьЧто ее сокращает
Модель, чтение входаДлина контекста, промахи кеша префикса, очередьРаскладка, устойчивая к кешу, меньший контекст, меньше очередей
Модель, генерацияВыходные токены и токены рассужденийБолее короткие выходы, меньший бюджет рассуждений, спекулятивное декодирование
Песочница и инструментыРазмер сборки, размер набора тестов, холодные стартыПрогретые пулы, снимки, кеши сборок, выбор тестов, параллельные вызовы инструментов
Сеть и сервисыСетевые обращения, размер полезной нагрузки, ограничение провайдераКеширование ответов, предварительная выборка, запас по лимиту запросов
Среда выполненияРазбор, проверка, журналирование, снимкиПотоковые парсеры, инкрементальные снимки

Типы спанов траектории: что ограничивает каждый вид спана на критическом пути агента и какие приемы его сокращают.

Таблица «Иллюстративная трасса» показывает иллюстративную трассу трехходовой траектории починки с длительностями того рода, которые собирает обвязка.

СпанДлительность (с)
Инициализация среды выполнения0,12
Создание песочницы14,80
Ход 1, чтение контекста1,20
Ход 1, генерация8,40
Инструмент: статус репозитория0,08
Ход 2, чтение контекста1,85
Ход 2, генерация11,20
Инструмент: запуск набора тестов245,60
Ход 3, чтение контекста2,10
Ход 3, генерация4,50
Экспорт снимка песочницы22,55
Все спаны модели29,25
Траектория312,40

Иллюстративная трасса: длительности спанов для трехходовой траектории починки; спаны модели просуммированы отдельно.

Все шесть спанов модели вместе занимают 9,4 процента траектории. Запуск тестов занимает 78,6 процента, а создание и экспорт песочницы занимают еще около 12 процентов. Мгновенная модель сделала бы эту траекторию не более чем в 1,10 раза быстрее. Команда, которая читает эту трассу, работает над выбором тестов и снимками песочницы, а не над выводом.

Сокращение критического пути

Когда трасса называет критический путь (уравнение критического пути), три приема сокращают его, не меняя того, что видит модель. Первый — параллельный запуск независимых вызовов инструментов. Когда модель запрашивает несколько чтений за один ход, как позволяет интерфейс вызова («Контракт вызова»), среда выполнения может выполнить их одновременно, и ход ждет только самого медленного, , а не их суммы.

Второй — начинать работу, пока модель еще генерирует. Вызовы инструментов приходят в потоковом ответе, и имя инструмента и первые аргументы известны еще до того, как вызов завершен, поэтому среда выполнения может взять песочницу из прогретого пула или получить целевой файл, пока остальная часть вызова еще передается. Эта работа спекулятивна и должна быть отброшена, если завершенный вызов не пройдет проверку, поэтому безопасна она только для подготовки без побочных эффектов.

Третий — раньше завершать запуски инструментов. Набор тестов выдает результаты потоком, и первого упавшего утверждения часто достаточно для следующего решения модели. Среда выполнения, которая передает сбои по мере их возникновения и останавливает оставшиеся тесты, превращает минутный запуск в секунды на пути с ошибкой, ценой менее полного наблюдения.

Когда окупается спекулятивное декодирование

Когда трасса показывает генерацию на критическом пути, как это бывает с длинными патчами и длинными планами, более быстрая генерация становится стоящей покупкой, а стандартный способ ее купить — спекулятивное декодирование. Маленькая черновая модель предлагает несколько токенов, целевая модель проверяет их все за один проход и сохраняет префикс, с которым согласна («Авторегрессионная генерация»). Поскольку генерация одного потока ограничена пропускной способностью памяти, а не арифметикой (принцип «Задержка, ограниченная выводом»), проверка нескольких токенов стоит примерно столько же времени, сколько генерация одного, а правило принятия делает распределение выходных токенов в точности таким же, как у целевой модели (Leviathan et al., 2023; Chen et al., 2023). Первый факт выводится в приложении «Почему выход стоит дороже входа», а правило принятия, стоящее за вторым, — в приложении «Механика цикла декодирования». Инженера агентов интересует лишь, когда этот прием окупается.

Если черновая модель предлагает токенов за раунд, один черновой токен стоит долю от шага целевой модели, а целевая модель принимает в среднем черновых токенов за раунд, то каждый раунд продвигает токенов за время шагов целевой модели. Значит, ускорение равно

и прием окупается, только когда . Принятие зависит от того, насколько предсказуем выход. Структурированный вывод и каркас кода предсказуемы, и черновая модель совпадает с целевой на большинстве токенов. Открытое планирование и сэмплирование с высокой температурой не предсказуемы, и работа черновика пропадает впустую. В таблице «Спекулятивное декодирование по рабочим нагрузкам агента» уравнение ускорения вычислено для иллюстративных долей принятия по рабочим нагрузкам агентов.

Рабочая нагрузка агентаПредсказуемость выходаПринятых токенов за раунд ( 5)Ускорение
Структурированный вывод (JSON, YAML)Очень высокая4,43,86×
Правки кода и каркасВысокая3,63,29×
Диагностика по трассам ошибокСредняя2,52,50×
Алгоритмическое планированиеНизкая1,41,71×
Открытые задачи, высокая температураОчень низкая0,61,14×

Спекулятивное декодирование по рабочим нагрузкам агента: иллюстративное число принятых черновых токенов за раунд и получаемое ускорение, когда один черновой токен стоит 0,08 шага целевой модели; спекуляция окупается, когда за раунд принимается больше 0,4 черновых токенов.

Два условия вне таблицы решают, включать ли спекуляцию. Первое — критический путь. Ускоритель генерации в 3,29 раза, примененный к траектории, доля модели в которой меньше десятой части, меняет ее длительность на несколько процентов, поэтому спекуляцию стоит применять к вызовам, критичным по задержке и отмеченным трассой на пути, а не везде. Второе — нагрузка. Спекуляция тратит дополнительную арифметику, чтобы сэкономить время одного потока, и это бесплатно, только пока система обслуживания простаивает. При плотной пакетной обработке арифметика уже не простаивает, черновая модель занимает память, которая иначе хранила бы состояние внимания других траекторий, и спекуляция может снизить пропускную способность всего парка. Поэтому системы обслуживания включают ее, когда очереди короткие, а запрос критичен по задержке, и отключают, когда пакет полон. То же правило относится ко всем ускорениям в этом разделе: они окупаются только на критическом пути и только пока их ресурсы свободны.

Стоимость и время на принятую задачу

Прежде чем маршрутизировать вызовы между моделями, проверьте учет, который уже сделан:

  • Неудачные попытки: при доле принятия сколько неудачных попыток несет каждая принятая задача и почему это делает десятикратную скидку на токены плохим предиктором стоимости?
  • Раскладка кеша: какое одно изменение системного промпта возвращает каждый ход закешированной траектории к чтению по полной цене?
  • Сжатие: почему сжатие контекста ближе к концу траектории может повысить ее стоимость, даже если оно снижает число токенов?
  • Критический путь: трасса показывает, что спаны модели занимают одну десятую траектории. Что максимум может дать любое ускорение модели и где команде смотреть вместо этого?

Анализ критического пути говорит, когда более быстрые вызовы важны. Для многих вызовов, которые не лежат на критическом пути, и для многих, которым вообще не нужна самая способная модель, большая экономия достигается тем, что дорогой вызов не делается вовсе.

Каскады моделей и маршрутизация

Каскад, управляемый верификатором, решает большинство задач на небольших моделях и снижает ожидаемую стоимость на порядок.

Агент, который отправляет каждый вызов в самую способную модель, платит цены передовой модели за то, чтобы отформатировать JSON, извлечь путь к файлу из трассы стека или подытожить журнал. Агент, который отправляет каждый вызов в маленькую модель, экономит на этих вызовах, но проваливается на тех, которые требуют планирования или диагностики, а каждая неудача стоит полной попытки. Большинство ходов траектории требует гораздо меньше, чем лучшая модель, а несколько требуют всей ее мощности. Каскад моделей использует этот разброс. Он сначала пробует более дешевую модель и эскалирует, только когда проверка говорит, что результат недостаточно хорош (Chen et al., 2023). Именно проверка делает каскад безопасным, а верификаторы из раздела «Верификация процесса» — это то, чем среда выполнения и должна проверять.

Уровни и маршруты

Рабочая среда выполнения обычно имеет три вида вызываемых объектов; их сводка приведена в таблице «Уровни каскада». Детерминированный код и маленькие модели обрабатывают преобразования с малой неоднозначностью. Универсальные модели среднего размера обрабатывают рутинные вызовы инструментов и локальные правки. Передовые модели обрабатывают планирование, диагностику по многим файлам и восстановление после провала более низких уровней.

УровеньТипичный вызываемый объектТипичная роль агентаШлюз, решающий об эскалации
1: Детерминированный и маленькийПарсеры, регулярные выражения, небольшие языковые моделиИзвлечение аргументов, починка схемы, разбор журналов, фильтрация командПроверки схемы и синтаксиса
2: Универсальный среднего размераМодели с инструктивной настройкой среднего размераПравки одного файла, рутинные вызовы инструментов, суммаризацияПроверки типов, сборки, быстрые модульные тесты
3: ПередовойСамая способная из доступных моделейПланирование, диагностика по нескольким файлам, восстановление после провала нижнего уровняПолный регрессионный набор, одобрение при необходимости

Уровни каскада: вызываемые объекты, роли и шлюзы эскалации трехуровневого каскада моделей.

Среда выполнения может выбрать уровень двумя способами. Статическая маршрутизация классифицирует каждый вызов до того, как он сделан, по описанию задачи или признакам вызова, и отправляет его на один уровень. Она почти не добавляет задержки и проваливается предсказуемо. Запрос, который выглядит простым («исправь упавшее утверждение в тесте на блокировки»), может потребовать проследить гонку по многим файлам, и маршрутизатор, который судит по запросу, отправит его в модель, которая ходит по кругу, пока не закончится бюджет. Маршрутизация с эскалацией пробует самый дешевый правдоподобный уровень и поднимается выше, только когда выход этого уровня не проходит проверку. Она оплачивает неудачные попытки, зато ее решения опираются на свидетельство о выходе, а не на догадку о входе.

Обученные маршрутизаторы занимают промежуточное место между этими двумя. Журналы самой обвязки («Распределенная трассировка траекторий») фиксируют, выход какого уровня прошел проверку на каком виде вызова, а это именно та размеченная выборка, которая нужна маршрутизатору; классификатор, обученный на ней, предсказывает, вероятно ли пройдет дешевый уровень. Ошибки маршрутизатора имеют несимметричную цену. Неверная маршрутизация вниз стоит одной неудачной дешевой попытки плюс эскалации. Неверная маршрутизация вверх стоит разницы в цене между уровнями. Порог стоит задавать по этим двум ценам, а его прогнозы все равно подаются на шлюз эскалации, поэтому маршрутизатор, который ошибается, стоит денег, но не правильности.

Каскад моделей, управляемый верификатором: задачи поступают на уровень маленьких моделей, выход которого должен пройти шлюз схемы и синтаксиса. Провалы эскалируются вместе с диагностикой верификатора на универсальный уровень, закрытый сборкой и быстрыми тестами, а оставшиеся провалы эскалируются на передовой уровень, закрытый полным регрессионным набором. В этом иллюстративном примере 60 процентов задач завершаются на уровне 1, а 28 процентов на уровне 2, поэтому ожидаемая стоимость составляет 0,0084 доллара за задачу против 0,0600 доллара при отправке каждой задачи передовой модели, а средняя задержка равна 1,32 с.

Ожидаемая стоимость и задержка каскада

На рисунке «Каскад моделей, управляемый верификатором» каждая задача попадает на уровень 1. Ее кандидатный выход удерживается в буфере ожидающих предложений среды выполнения и проверяется шлюзом схемы и синтаксиса. Если он проходит, задача завершается. Если нет, среда выполнения эскалирует задачу на уровень 2 вместе с диагностикой верификатора, и только задачи, которые также проваливают шлюз сборки и тестов уровня 2, доходят до уровня 3. Пусть — стоимость вызова на уровне , причем , а и — вероятности того, что задача провалила уровень 1 и провалила оба нижних уровня. Ожидаемая стоимость на задачу равна

и каскад выгоднее отправки всего на уровень 3, когда

Правая часть неравенства «жизнеспособности каскада» — это стоимость передового вызова, которой удается избежать на задачах, которые решают нижние уровни. Поскольку вызовы передовой модели обычно стоят на один-два порядка дороже вызовов маленькой модели, неравенство выполняется, даже когда нижние уровни решают скромную долю задач.

Задержка для задач, которые эскалируются, движется в обратную сторону. При задержках уровней и задержках шлюзов задача, которая доходит до верха, платит за каждый уровень по пути,

тогда как ожидаемая задержка равна

так что каскад обычно снижает среднюю задержку, но всегда повышает хвост, верхняя граница которого задана уравнением «худшей задержки каскада».

Стоимость и задержка трехуровневого каскада

Задача: Флот для программирования обслуживает 100 000 небольших задач правки в день. Вызовы уровней стоят $0,0004, $0,0020 и $0,0600 и занимают 250, 800 и 4 500 мс. Шлюзы уровней 1 и 2 занимают 50 и 400 мс. Уровень 1 проваливается с вероятностью 0,40, а уровень 2 проваливает 0,30 того, что получает. Стоит ли флоту использовать каскад и во что он обходится по задержке?

Расчет: Доля 0,12 задач доходит до уровня 3. По уравнению «стоимости каскада» ожидаемая стоимость на задачу составляет $0,0084, что на 86 процентов ниже $0,0600 при работе только с передовой моделью, а дневные расходы падают с $6 000 до $840. По уравнению «ожидаемой задержки каскада» средняя задержка составляет 1,32 с, что в 3,4 раза быстрее 4,5 с у передовой модели. Задача, которая эскалируется через все уровни, занимает 6 с, то есть на 33 процента дольше прямого вызова передовой модели.

Системный вывод: Каскад дешевле и быстрее в среднем и медленнее в хвосте. Приемлем ли такой компромисс, зависит от того, лежат ли эскалированные задачи на критическом пути, ограниченном сроком.

Штраф за ложное принятие и дисциплина эскалации

Уравнение «Стоимость каскада» предполагает, что шлюзы никогда не принимают неверный выход. Но принимают. Шлюз, который проверяет синтаксис, пропускает патч, который корректно разбирается, но удаляет проверку полномочий, и каскад останавливается на уровне 2 с нарушенным инвариантом в рабочем пространстве. Если — частота, с которой шлюз принимает неверный выход, а — стоимость того, чтобы позже найти и откатить его, то эффективная стоимость равна

и поскольку восстановление может включать откат («Шаблон саги траектории») или проверку человеком, небольшое в уравнении «стоимости утечки каскада» может стереть экономию каскада. Поэтому шлюз должен проверять свойство, которое важно; для кода это значит запускать тесты, а не только линтер. По асимметрии верификации (принцип «Асимметрия верификации») обученный судья может ранжировать кандидатов или решать, какой уровень пробовать, но шлюз, который пропускает выход дальше, должен быть проверкой, у которой ошибки известны и малы.

Второй провал — самонанесенный. Среда выполнения, которая эскалирует, дописывая неудачную попытку, ее трассу стека и исходный промпт к контексту следующего уровня, платит за повторную отправку длинного неверного ответа и подталкивает более сильную модель строить на нем. Эскалация должна передавать задачу и диагностику верификатора, а не неудачный выход, как это делает следующий диспетчер.

def dispatch_with_escalation(task, tiers, sandbox):
    feedback = []
    for tier in tiers:
        # промпт содержит только задачу и последнюю диагностику верификатора
        prompt = build_prompt(task, verifier_feedback=feedback)
        candidate = tier.generate(prompt, max_tokens=tier.token_limit)

        # кандидат остается ожидающим, пока внешняя проверка его не примет
        result = sandbox.run_verifier(candidate)
        if result.passed:
            sandbox.commit(candidate)
            return StepResult(status="ACCEPTED", tier=tier.name, output=candidate)

        # отбрасываем неудачный выход и сохраняем короткую детерминированную диагностику
        feedback = [f"tier {tier.name} failed: {result.diagnostic}"]
    return StepResult(status="ESCALATION_EXHAUSTED", tier=None, output=None)

Сама эскалация нуждается в правиле остановки. Переход с уровня на уровень стоит и повышает вероятность принятия на . Если — то, что стоит принятая задача, эскалация окупается, только когда

иначе среда выполнения должна остановиться и сообщить об ограниченном провале. Уравнение «Правило эскалации» — это версия для каскада правил остановки из раздела «Критерии остановки поиска», и оно не дает дешевой задаче эскалироваться в дорогую.

Каскады и кеширование снижают стоимость каждого вызова траектории. Но парку также нужно место, где эти вызовы выполнять, а мощность, которая нужна парку агентов, — не та мощность, которая нужна системе обслуживания запросов.

Мощность для траекторий

Команда планирует свою платформу агентов так же, как планировала чат-сервис: по частоте вызовов модели и их времени обслуживания. И обнаруживает, что ей одновременно не хватает ресурсов и они простаивают. Вызовы ставятся в очередь за лимитом провайдера, в то время как выделенные узлы, которые она зарезервировала, пустуют наполовину, а траектории, которые держат песочницы и закешированный контекст по двадцать минут, вытесняют новые. Единица, которая удерживает ресурсы, — это траектория, а не вызов (принцип «Мощность на уровне времени жизни траектории и планирование с учетом хвоста»). Этот раздел измеряет мощность в этой единице, а затем решает, откуда она должна браться.

Конкурентность траекторий

Вызов модели длится секунды. Траектория длится минуты, большую часть которых она ждет инструменты, и все это время она удерживает песочницу, слот в среде выполнения и часто закешированное состояние внимания на узле обслуживания. Закон Литтла, который раздел «Аналитические формулировки емкости» применяет к траекториям, находящимся на одном узле обслуживания, дает число активных траекторий по всему парку:

где — частота запуска траекторий, а — их средняя продолжительность жизни. Если определять размер песочниц, рабочих среды выполнения и памяти кеша по частоте вызовов и их длительности, а не по уравнению «конкурентности траекторий», то конкурентность занижается в число раз, равное отношению времени жизни траектории к длительности вызова, а это два-три порядка величины. Что траектория удерживает, пока ждет, — это проектное решение. Раздел «Удержание, вытеснение, пересчет или выгрузка» решает, остается ли ее состояние внимания в памяти, вытесняется и пересчитывается или выгружается во время ожидания инструмента, а «Очереди для траекторий» (приложение) выводит, как ожидания инструментов раздувают конкурентность.

Из того, как траектории подают вызовы, следуют два вывода. Вызовы приходят коррелированными пачками, когда траектория распараллеливает вызовы инструментов или когда координатор запускает подагентов, а их время обслуживания колеблется от нескольких токенов до тысяч. Задержка в очереди растет вместе с этой изменчивостью и резко возрастает по мере того, как загрузка приближается к насыщению. Приближение Кингмана для одной очереди (приложение «Очереди для траекторий») дает числа для обоих эффектов. При пачкообразном потоке прибытий () и длинах генерации с фактор изменчивости равен 3, а пул обслуживания при загрузке 70 процентов заставляет средний вызов ждать примерно 7 средних времен обслуживания, а при загрузке 90 процентов — примерно 27. Поэтому мощность закладывают так, чтобы работать ниже колена кривой загрузки. Хвостовые задержки также накапливаются вдоль траектории; это последовательный аналог отстающих при ветвлении из раздела «Каскады отмены». Траектория из 30 последовательных вызовов, каждый из которых с вероятностью 0,01 попадает в задержку на уровне 99-го перцентиля, с вероятностью 0,26 встречает хотя бы одну такую задержку, поэтому парк, рассчитанный на хорошую среднюю задержку, все равно регулярно дает медленные траектории (Dean and Barroso, 2013).

Лимиты провайдера

Для команды, которая вызывает размещенную модель, первый предел мощности, с которым она сталкивается, обычно не аппаратный, а квота провайдера, выраженная в токенах в минуту и запросах в минуту. Квота ограничивает скорость, с которой могут выполняться траектории, а не число открытых траекторий. Каждой траектории для завершения нужно фиксированное число токенов, поэтому в установившемся режиме спрос на токены равен частоте траекторий, умноженной на токены на траекторию, каковы бы ни были времена жизни траекторий. Пусть траектории стартуют по 1 в минуту, и каждая делает 60 вызовов по 30 000 входных токенов, то есть 1 800 000 токенов на траекторию. При лимите 2 000 000 токенов в минуту спрос использует 90 процентов квоты, а парк может выдержать не более 1,11 траектории в минуту. При времени жизни 20 минут закон Литтла дает 20 траекторий в полете, каждая из которых подает около 3 вызовов в минуту.

Работа так близко к квоте имеет то же следствие, что и работа сервера близко к насыщению. Ограниченные вызовы повторяются после задержки, траектории живут дольше, дольше держат песочницы и кеш, и их сроки сдвигаются. Применимы три рычага. Кеширование префикса снижает счет, а то, снижает ли оно также использование относительно квоты, зависит от того, как провайдер учитывает закешированные токены; план мощности должен это проверить, а не предполагать. Короткие и надежные траектории тратят меньше токенов на принятую задачу, что при фиксированной квоте поднимает частоту принятых задач так же прямо, как более высокая квота. Пакетные конечные точки со скидкой, которые возвращают результаты в течение часов, подходят для работы с одним вызовом, например для офлайн-оценки, оценки траекторий и курирования, но не для многоходового цикла, в котором каждый ход должен ждать предыдущего.

Приоритетные полосы

Интерактивные траектории, где человек ждет результата, и пакетные траектории, например ночная сортировка заявок или прогоны оценки, используют одни и те же модели и квоту, но их сроки сильно различаются. Смешанные в одну очередь «кто первый, тот и обслужен», пачка длинных пакетных генераций задерживает каждый короткий интерактивный вызов, стоящий за ней. Среда выполнения разделяет их на полосы с разными приоритетами и дает интерактивной полосе контроль допуска и зарезервированный запас. Внутри системы обслуживания планировщик, который не может знать, сколько будет длиться генерация, все же может понижать в приоритете вызовы, превысившие квант токенов, перенося их в очередь низшего приоритета, так что короткие вызовы никогда не ждут длинных (принцип «Мощность на уровне времени жизни траектории и планирование с учетом хвоста»). Пакетная работа затем заполняет мощность, которую интерактивная работа оставляет простаивающей, а это важнее всего для решения, которым завершается этот раздел: владеть ли этой мощностью.

Динамика очередей

Поскольку платформы агентов не могут отделить планирование ускорителей от стохастической природы поведения агентов, для расчета флота нужны модели теории очередей, которые учитывают крайнюю изменчивость. Стандартный вводный системный анализ часто опирается на формулировки или , которые предполагают пуассоновские потоки прибытий (экспоненциальные интервалы между прибытиями) и экспоненциально распределенные времена обслуживания без памяти. В производственных парках агентов оба допущения заведомо неверны.

Поток вызовов модели, порождаемый автономными агентами, структурно пачкообразный. Когда оркестратор запускает параллельные подагенты проверки или когда агент выполняет многошаговый цикл планирования, запросы приходят в систему обслуживания плотно коррелированными пачками, а не некоррелированными пуассоновскими потоками. Квадрат коэффициента вариации интервалов между прибытиями, определенный как , регулярно превышает единицу ().

Одновременно распределение времен обслуживания модели резко неэкспоненциально. Парк агентов обрабатывает бимодальную смесь нагрузок: легкие быстрые пробы классификации, проверки схем JSON и однотокенные решения о маршрутизации инструментов, которые занимают десятки миллисекунд (), соседствуют с тяжелыми генерациями рассуждений на тысячи токенов и сложным синтезом кода, которые длятся несколько секунд (). Такой бимодальный разброс дает квадрат коэффициента вариации времени обслуживания, заметно больший единицы ().

Чтобы оценить ожидаемое время ожидания в очередях с произвольными распределениями прибытий и обслуживания, не прибегая сразу к покадровому дискретно-событийному моделированию, системные инженеры опираются на приближение Кингмана для тяжелого трафика в очереди («уравнение Кингмана»):

где — загрузка сервера, а — средняя скорость обслуживания. Формула Кингмана раскладывает среднее время ожидания в очереди на три явных мультипликативных компонента:

  1. Фактор изменчивости : Этот член напрямую масштабирует задержку совокупной дисперсией процессов прибытия и обслуживания. В идеализированной системе , где , этот фактор равен 1. В парке агентов, где коррелированные пачки и бимодальные длины генерации дают и , фактор изменчивости составляет . Система испытывает усиление средней задержки в очереди в 4,5 раза только из-за дисперсии нагрузки при неизменных пропускной способности железа и средних частотах прибытий.
  2. Фактор загрузки : Этот гиперболический штраф задает нелинейную асимптоту при приближении загрузки сервера к насыщению. Когда растет с до , множитель скачком идет с до , то есть почти в четыре раза.
  3. Базовый масштаб обслуживания : Невзвешенная средняя длительность обработки самой модели.

Как писали Джеффри Дин и Луис Андре Барросо в The Datacenter as a Computer, для распределенных систем определяет воспринимаемую пользователем производительность хвостовая задержка, а не средняя. В траектории агента из последовательных вызовов модели вероятность завершиться, не попав в задержку очереди на уровне 99-го перцентиля, убывает как .

В корпоративном парке, работающем на параллельных экземплярах ускорителя, модель одного сервера переходит в совокупную многосерверную систему . Используя приближение Аллена–Каннина, время ожидания в многосерверной очереди масштабируется пропорционально вероятности ожидания Эрланга C, («уравнение Аллена–Каннина»):

Хотя объединение ускорителей в единый кластер обслуживания дает выгоду статистического мультиплексирования, которая сглаживает средние времена ожидания по сравнению с изолированными одиночными серверами, оно усиливает рост хвостовой задержки в многоходовых траекториях. Если рабочий процесс агента требует последовательных вызовов модели для завершения сквозной задачи, а среда выполнения работает при агрессивной аппаратной загрузке , то вероятность того, что траектория встретит экстремальную хвостовую задержку () хотя бы на одном ходу критического пути, равна:

Более четверти всех выполненных траекторий агентов получат экстремальную хвостовую задержку. Поскольку траектория агента выполняется синхронно по последовательным ходам, одна хвостовая задержка на ходу 7 каскадно переходит в общее время до завершения и часто приводит к тому, что оркестратор-хост нарушает свой глобальный целевой уровень обслуживания (SLO).

Размер очереди при тяжелохвостом трафике

Инфраструктурная команда эксплуатирует кластер вывода, выделенный под промежуточные циклы рассуждений агентов. Кластер обрабатывает совокупную частоту прибытий , распределенную по пулу рабочих ускорителей. Профилирование показывает, что среднее время обслуживания модели равно (), но нагрузка демонстрирует крайнюю бимодальность: 80 процентов запросов — быстрые оценки схем JSON (), а 20 процентов — расширенные генерации цепочки рассуждений (). Эмпирические измерения дают коэффициент вариации прибытий и коэффициент вариации обслуживания .

Инженерный руководитель предлагает выделить рабочих узла, чтобы работать при средней загрузке . Вычислите ожидаемое время ожидания в очереди при этой конфигурации по приближению Аллена–Каннина и сравните его с альтернативным планом выделить рабочих ().

Шаг 1: вычислите масштабирующий фактор изменчивости.

Шаг 2: вычислите вероятность ожидания Эрланга C для при . Для очереди с предлагаемой нагрузкой :

Шаг 3: вычислите для . При рабочих среднее время ожидания в очереди () превышает среднее время выполнения самого запроса () больше чем в 2,3 раза.

Шаг 4: оцените перераспределение до при . Для с вероятность ожидания резко падает до .

Вывод: Добавление одного узла ускорителя (расширение железа на ) снижает среднее время ожидания в очереди с до , то есть задержка падает более чем на . В средах обслуживания агентов с тяжелым хвостом работа ниже колена кривой загрузки () обязательна, чтобы поглощать дисперсию и защищать критические пути многоходовых траекторий.

Многоуровневая очередь с обратной связью для рабочих нагрузок агента

Когда кластер обслуживания агентов ставит все запросы в неразличимую очередь «первым пришел — первым обслужен» (FCFS), он сталкивается с классической патологией, которую называют блокировкой головы очереди (head-of-line blocking). Огромный многошаговый вызов генерации кода, которому нужно 4 096 выходных токенов, на несколько секунд занимает слоты непрерывного пакетирования ускорителя. Если интерактивный пользователь или критичный к задержке надзорный агент отправляет запрос маршрутизации на 10 токенов за этим большим заданием, короткий запрос ждет, пока отработает длинная фаза декодирования. Эта деградация нарушает главную цель планирования в вычислительных системах: минимизировать среднее время отклика, ставя короткие задания вперед (Shortest Job First), без предварительного знания точных длительностей выполнения.

Поскольку хост-среда не может предсказать точную длину авторегрессионной генерации до вывода, она не может реализовать чистое планирование по кратчайшему времени обработки (SPT). Вместо этого кластер должен применять адаптивную дисциплину многоуровневой очереди с обратной связью (MLFQ), приспособленную к механике памяти и вычислений генерации токенов («Архитектура обслуживания MLFQ и иерархия памяти KV-кеша»).

Архитектура обслуживания MLFQ и иерархия памяти KV-кеша: левый планировщик разделяет интерактивные пробы, многоходовые циклы рассуждений и фоновые пакетные траектории по дискретным очередям приоритета () с квантами в токенах () и предотвращением голодания (). Правая панель показывает соответствующую физическую иерархию памяти: PagedAttention динамически распределяет блоки HBM между активными слотами пакета, перенося вытесненные страницы в оперативную память хоста DDR5 через асинхронный DMA и в хранилище NVMe по экономическому порогу вытеснения .

Как показано в системной схеме «Архитектура обслуживания MLFQ и иерархия памяти KV-кеша», архитектура разделена на активный планировщик приоритетов слева и физическую иерархию памяти справа. В плоскости планирования все входящие задания агентов попадают в с начальным неприостановимым квантом . Короткие пробы семантического классификатора и решения о диспетчеризации инструментов завершаются в пределах этого кванта и покидают систему с задержкой в очереди менее миллисекунды. Задания, которым нужно длительное обдумывание, исчерпывают и понижаются в (, круговое планирование), а длинные проходы генерации кода и рефакторинга репозитория понижаются в (, пакетирование FCFS). Голодание фоновых заданий предотвращается дугой повышения приоритета, которая каждые атомарно возвращает все ожидающие запросы из и в .

Одновременно правая панель рисунка «Архитектура обслуживания MLFQ и иерархия памяти KV-кеша» показывает, как планировщик взаимодействует с управлением памятью PagedAttention на физических уровнях аппаратуры. Когда запрос из или уступает слот непрерывного пакетирования при вытеснении, его блоки KV-кеша в HBM ускорителя защищаются периодом отсрочки , чтобы предотвратить трешинг. При устойчивом давлении на память менеджер памяти включает каналы DMA PCIe Gen5 и переносит неактивные страницы в оперативную память хоста DDR5 (передача до в обе стороны). Если время простоя превышает экономический порог безубыточности вытеснения (), страницы переливаются на локальное хранилище NVMe (), что обеспечивает высокую резидентность в HBM для критичных к задержке вызовов без потери дорогостоящего состояния предзаполнения.

Агентно-ориентированный MLFQ разделяет емкость ускорителя на различные уровни приоритета, управляя вытеснением, сборкой пакета и владением памятью:

  1. Очередь приоритета 0 (, интерактивные вызовы и пробы): Все вновь поступающие вызовы модели попадают в . Этот уровень получает наивысший приоритет диспетчеризации и строго ограниченный квант генерации токенов (например, ). В попадают интерактивные запросы пользователей, быстрые пробы семантического классификатора, решения о маршрутизации вызовов инструментов и проверки защитных ограничений безопасности. Если вызов завершает генерацию в пределах токенов (выдает токен EOS или последовательность диспетчеризации инструмента), он немедленно покидает систему, получая минимальное время ожидания в очереди и почти нулевую хвостовую задержку.
  2. Очередь приоритета 1 (, многоходовые рассуждения): Если вызов исчерпывает квант , не завершившись, планировщик приостанавливает его прямой проход на границе токена, понижает задачу в и переключает контекст ее выполнения. работает с большим квантом (например, ) и промежуточным приоритетом диспетчеризации. Он обслуживает обычные ходы обдумывания агента, стандартные правки кода и многопредложные шаги рассуждений.
  3. Очередь приоритета 2 (, долгосрочные пакетные траектории): Задачи, которые превышают токенов, понижаются в , самую низкоприоритетную фоновую очередь. работает с расширенными квантами токенов () или без ограничений, доводя задачу до конца. Этот уровень обрабатывает асинхронные фоновые задачи: обширные проходы рефакторинга по всему репозиторию, генерацию синтетических наборов тестов, офлайн-конвейеры эмбеддингов и некритичные проходы верификации. Вызовы в явно вытесняемы: если в или наступает всплеск поступлений, активные запросы уступают слоты непрерывного пакетирования. Эксплуатационные параметры этих уровней сведены в таблице «Конфигурация уровней приоритета MLFQ».
Уровень очередиПриоритетКвант токенов ()Целевая нагрузкаПолитика вытеснения
Наивысший64 токенаИнтерактивный интерфейс, защитные ограничения, пробы маршрутизации вызовов инструментовНеприостановимый в пределах кванта
Средний512 токеновСтандартные циклы рассуждений, генерация кода в одном файлеВытесняется
Низший4 096+ токеновРефакторинг репозитория, генерация тестов, пакетная оценкаВытесняется /; подлежит выгрузке на хост

Конфигурация уровней приоритета MLFQ: приоритеты очередей, выделение квантов токенов, профили целевых нагрузок и политики вытеснения.

Чтобы сохранять архитектурную устойчивость, MLFQ агентов должен решать две критические системные задачи: голодание и перетасовку памяти KV-кеша.

Если высокоприоритетный интерактивный трафик в и насыщает кластер, длительные пакетные траектории в будут голодать бесконечно. Чтобы обеспечить инварианты продвижения, планировщик реализует периодическое повышение приоритета. Через регулярные интервалы (например, каждые 60 секунд) все необслуженные задачи всех уровней приоритета возвращаются в с обнулением счетчиков израсходованного кванта, так что фоновые траектории периодически продвигаются («Дисциплина многоуровневой очереди с обратной связью»).

Дисциплина многоуровневой очереди с обратной связью

Планировщик кластера разбивает задания вывода агентов на приоритетные уровни выполнения с детерминированными правилами перехода:

  1. Распределение при входе: Все входящие вызовы попадают в очередь наивысшего приоритета с начальным квантом токена.
  2. Понижение при исчерпании кванта: Если поток выполнения исчерпывает назначенный квант, не завершив работу и не запросив ожидание ввода-вывода, он понижается: а именно переход () и ().
  3. Выход при завершении: Вызов, который закончил декодирование или отдал управление инструменту в пределах своего кванта , немедленно покидает очередь планирования и возвращает результаты.
  4. Периодическое повышение приоритета: Чтобы устранить голодание длинных задач в , каждые секунд все активные задачи в и атомарно повышаются обратно в со сброшенными квантами.
  5. Ступенчатое удержание памяти: Вытесненные задачи сохраняют физические выделения HBM в течение периода отсрочки ; длительное давление на память переносит блоки в память хоста через PagedAttention.

Вторая задача касается управления физической памятью при вытеснении. Когда задание вытесняется, чтобы освободить тензорные ядра для входящего всплеска , выгрузка накопленного KV-кеша на 4 000 токенов в оперативную память CPU расходует ценную полосу межсоединения. Если вытесненную задачу принимают обратно через миллисекунды, перенос этих физических страниц назад в HBM вызывает сильный трешинг PCIe/NVLink. MLFQ смягчает это ступенчатыми порогами вытеснения: вытесненные задачи сохраняют свои физические страницы HBM в приостановленном состоянии в течение периода отсрочки . Только если давление на память сохраняется и исчерпывает пул свободных кадров HBM, менеджер памяти PagedAttention запускает асинхронный перенос страниц в оперативную память DDR5 хоста. Сравнительные компромиссы между классическими и адаптивными дисциплинами очередей рассмотрены в таблице «Сравнительный анализ дисциплин планирования кластера для вывода агентов».

Дисциплина планированияСреднее ожидание ()Хвостовая задержка ()Риск голоданияНакладные расходы на вытеснениеЭффективность памяти (KV-кеш)
First-Come-First-Served (FCFS)ВысокоеСерьезная (блокировка головы очереди)НетНулевыеНизкая (простои из-за закрепленной памяти)
Shortest Processing Time (SPT)ОптимальноеНизкая для коротких заданий; высокая для длинныхСерьезный для крупных задачНулевые (требуется оракул)Высокая (быстрое освобождение заданий)
Multi-Level Feedback Queue (MLFQ)Близко к оптимальномуНизкая на ; ограничена на Ограничен через Низкие или умеренные (границы квантов)Высокая (миграция памяти по уровням)

Сравнительный анализ дисциплин планирования кластера для вывода агентов: средние времена ожидания, границы хвостовой задержки, риски голодания, накладные расходы на вытеснение и характеристики удержания памяти.

Выделенная мощность против API с оплатой за токен

Команда может платить за вызовы модели за токен или зарезервировать выделенную мощность обслуживания и запускать модели сама. Оплата за токен превращает каждую стоимость в переменную и передает очереди, ограничения скорости и взаимное влияние арендаторов провайдеру. Выделенная мощность стоит одинаково в час, занята она или простаивает, зато она снимает квоту, фиксирует хвост и позволяет подбирать такие решения обслуживания, как спекуляция и политика кеша, под рабочую нагрузку. Что дешевле, зависит от того, насколько загружена была бы выделенная мощность.

Пусть — почасовая стоимость выделенного узла, включая амортизированное железо или аренду, электричество и эксплуатацию, а узел поддерживает выходных токенов в секунду на трассах нагрузки. Если нагрузка отправляет входных токенов на каждый выходной токен, а API берет и за токен, то час работы полностью загруженного узла стоил бы

по ценам API. Узел, занятый долю времени, делает работы по ценам API, поэтому выделенная мощность дешевле, когда превышает точку безубыточности загрузки, то есть , деленное на «значение узла»:

Входной член требует внимания. У агентных нагрузок большое , потому что каждый ход заново отправляет свой контекст, а скидка API на закешированный вход снижает эффективный , что повышает и делает выделенную мощность труднее оправдать. Сравнение должно использовать ту цену закешированного входа, которую нагрузка на самом деле платит, а не прайсовую цену.

Точка безубыточности для выделенной мощности обслуживания

Задача: Флот агентов программной инженерии посылает 5 входных токенов на каждый выходной токен. API берет $3 за миллион входных и $15 за миллион выходных токенов. Зарезервированный узел стоит $28 в час и поддерживает 1 200 выходных токенов в секунду на трассах флота. Нагрузка флота занимала бы выделенные узлы в 0,52 времени. Стоит ли флоту резервировать мощность?

Расчет: Каждый выходной токен и его входы стоят $30 за миллион по ценам API, поэтому полностью загруженный узел делает работы по ценам API на $129,60 в час, и по «уравнению точки безубыточности» точка безубыточности загрузки равна 0,22. При прогнозируемой загрузке узел делает работы на $67,39 в час за свои $28, экономя $39,39 в час, то есть 58 процентов счета API.

Системный вывод: Нагрузки агентов, тяжелые по токенам, достигают безубыточности при низкой загрузке, но только при прайсовой цене входа. Скидка на закешированный вход уменьшает счет API за ту же работу, и точку безубыточности нужно пересчитать с ней, прежде чем резервировать мощность.

Большинство флотов в итоге используют оба варианта, как показывает таблица «Гибридное обеспечение мощностью». Выделенный пул рассчитан на базовую нагрузку и держится ниже колена кривой загрузки; интерактивные траектории получают на нем приоритет, пакетные траектории заполняют его простаивающие часы, а всплески сверх него переливаются на API с оплатой за токен.

Уровень обеспеченияИсточник мощностиРассчитан наМодель стоимостиНагрузка
Выделенный пулЗарезервированные узлы обслуживанияБазовую нагрузку, ниже коленаФиксированная в часСначала интерактивная полоса; пакетные траектории заполняют простой
API с оплатой за токенРазмещенные конечные точки моделейВсплески выше базовой нагрузкиЗа токенПереполнение и модели, которых нет в парке

Гибридное обеспечение мощностью: выделенный пул для базовой нагрузки с переливом за токен для всплесков.

Мощность для траекторий

Прежде чем управлять расходами, проверьте модель мощности:

  • Конкурентность: траектории стартуют по две в минуту и живут пятнадцать минут. Сколько их в полете и почему расчет по вызовам в секунду это пропускает?
  • Квоты: почему квота в токенах в минуту ограничивает скорость траекторий, а не их число, и что повышает принятые задачи в час при фиксированной квоте?
  • Полосы: почему пакетные траектории должны делить выделенную мощность с интерактивными, а не работать на отдельном пуле?
  • Безубыточность: как скидка на закешированный вход меняет загрузку, при которой выделенная мощность окупается?

Мощность ограничивает то, как быстро флот может тратить деньги, но не то, сколько он может потратить. Траектория, застрявшая в цикле, или дерево подагентов, которые продолжают делегировать, потратят любую выделенную им мощность, и среде выполнения нужны ограничения на сами деньги.

Управление расходами

Бюджет обвязки из раздела «Бюджеты и потолки» останавливает разгон цикла одной траектории («Неконтролируемый цикл и бюджет, который его останавливает»). Делегирование открывает провал, который не видит ни один бюджет одной траектории. Координатор с двумя долларами в остатке запускает двух подагентов. Каждый читает общий остаток, видит два доллара свободными и начинает вызов, который стоит почти два доллара. Обе проверки проходят, оба вызова выполняются, и вместе они тратят почти вдвое больше того, что было у родителя. Запись в песочнице можно откатить, а деньги, потраченные на токены и плату за инструменты, нельзя, поэтому расход — единственный ресурс, который агент тратит и который никакой механизм восстановления не возвращает. Здесь напрямую применимо замыкание инвариантов («Принцип замыкания инвариантов»). Модели нельзя доверять учет собственных расходов или то, что она заметит, когда ей пора остановиться, поэтому граница должна исходить от проверки, которую среда выполнения делает перед каждой диспетчеризацией. Этот раздел распространяет денежный бюджет из раздела «Бюджеты и потолки» на множество агентов, которые тратят одновременно из одного выделения, и добавляет ограничение на скорость расходов.

Инвариант расходов

Пусть — то, что задача потратила к шагу . Каждая тарифицируемая операция добавляет положительную сумму, поэтому только растет. Среда выполнения также знает, что она уже зарезервировала, но еще не оплатила. Вызов модели в полете будет стоить не больше, чем его максимальное число выходных токенов, умноженное на цену выхода, плюс его вход, а у вызова инструмента есть известная плата. Пусть — сумма этих резервирований. Среда выполнения поддерживает

для бюджета задачи на каждом шаге. Перед диспетчеризацией операции она резервирует стоимость операции в худшем случае; если резервирование нарушило бы неравенство, операция не отправляется, а вместо этого возвращается типизированное наблюдение «бюджет превышен», управляющее действие из раздела «Управляющие действия». Когда операция завершается, резервирование заменяется фактической стоимостью, а разница высвобождается. Если использовать в качестве резервирования поле максимального числа выходных токенов вызова («Контракт вызова»), граница сохраняется, даже когда вызов доходит до своего предела.

Иерархические резервирования бюджета

При одном агенте «инвариант расходов» — это просто счетчик. Когда есть координатор и подагенты («Компромисс делегирования»), несколько агентов тратят одновременно, и общий остаток порождает гонку, с которой начался этот раздел. Монотонное делегирование (принцип «Монотонное делегирование») дает правило, которое устраняет гонку: любой бюджет, полученный потомком, удерживается от родителя, пока потомок его не вернет. Раздел «Ослабленное делегирование полномочий» применил это правило к полномочиям. Здесь оно становится реестром резервирования бюджета, который прослеживается на одном делегировании на рисунке «Иерархические резервирования бюджета».

Иерархические резервирования бюджета: корневая задача с бюджетом 10,00 доллара резервирует 2,00 и 4,00 доллара для двух подагентов, которые тратят только из своих резервов. По завершении их расходы (0,50 и 3,10 доллара) фиксируются в корне, а неизрасходованные остатки (1,50 и 0,90 доллара) возвращаются, так что у корня остается 4,00 доллара израсходованных и 6,00 доллара свободных. На каждом шаге бюджет равен израсходованному плюс зарезервированному плюс свободному.

Каждый узел в дереве делегирования ведет реестр своего бюджета , зафиксированных расходов , зарезервированной суммы и свободного остатка , при соблюдении

Зафиксированные расходы только растут. Зарезервированные деньги покрывают вызовы в полете и бюджеты потомков и не могут быть повторно обещаны. Новую операцию может финансировать только свободная сумма. Таблица «Переходы реестра бюджета» задает четыре перехода, каждый из которых сохраняет уравнение «сохранения реестра».

ТранзакцияПредусловиеРеестр родителяРеестр потомка
Порождение потомка, ,
Диспетчеризация вызовабез изменений,
Расчет по вызовуфактическая стоимость известнабез изменений, ,
Завершение потомкапотомок остановлен по любой причине, , закрыт

Переходы реестра бюджета: предусловия и обновления при порождении потомка, диспетчеризации и расчете вызова и закрытии потомка.

Потомок видит только свой реестр и не может тратить свободный остаток родителя; внук, в свою очередь, финансируется из свободного остатка своего родителя. Поскольку каждое резервирование вычитается до траты, а расходы каждого потомка ограничены его резервом, никакая последовательность порождений и вызовов не может потратить больше корневого бюджета, как бы глубоко или параллельно ни было дерево. Потомок, который зацикливается, исчерпывает свой резерв и останавливается, а его братья и родитель не затронуты. Реестр также отвечает на вопрос, который операторы задают о каждом флоте: кто потратил деньги. При одном корне на арендатора или на заявку атрибуция стоимости — это чтение корневых реестров.

Реестр бюджета через неуспешного подагента

Задача: Оператор выделяет $5 на задачу починки. Координатор планирует один вызов передовой модели с 8 000 входными и 1 200 выходными токенами, затем делегирует анализ трассы с резервом $1,20 и прогон фаззинга с $2,50. Агент трассы находит дефект за $0,38. Агент фаззинга натыкается на таймаут песочницы, повторяет попытки в цикле и останавливается детектором прогресса («Семантические сторожевые таймеры»), израсходовав $0,85. Что хранит корневой реестр в конце?

Расчет: Планирование фиксирует $0,042, оставляя $4,958 свободными. Делегирование резервирует $3,70, оставляя $1,258 свободными для собственных вызовов координатора. Когда оба потомка останавливаются, их расходы фиксируются в корне, а неизрасходованные резервы, $0,82 и $1,65, возвращаются в его свободный остаток. Корень заканчивает с $1,272 израсходованными, без резервов и с $3,728 свободными.

Системный вывод: Зацикленный потомок никогда не мог бы потратить больше своего резерва, что бы он ни делал, а координатор сохраняет достаточно средств, чтобы попробовать другой подход. Границу задал реестр, а не поведение потомка.

Инварианты учета реестра

Каждый узел в дереве делегирования агентов ведет независимый, изолированный контекст реестра, заданный четверкой:

Смысл этих полей описывает различные физические и финансовые состояния капитала:

  1. Выделенный бюджет (): Общая верхняя граница капитала, предоставленного узлу его непосредственным родителем. Это значение постоянно на протяжении жизни узла .
  2. Зафиксированные расходы (): Безвозвратно списанный капитал за завершенные проходы вывода, выполненные инструменты и завершенные дочерние процессы. Зафиксированные расходы растут монотонно.
  3. Эскроу-резерв (): Капитал, отложенный под агентов-потомков в полете или под ожидающие асинхронные вызовы инструментов. Капитал в эскроу не может быть обещан новым операциям.
  4. Свободный капитал (): Незафиксированный и незарезервированный остаток, сразу доступный для диспетчеризации новых операций.

Эти переменные подчиняются строгому инварианту сохранения:

Многоскоростные автоматические выключатели

Хотя статический совокупный потолок расходов гарантирует, что агент не превысит абсолютный денежный бюджет, статические лимиты представляют собой опасно грубый механизм управления. Если автономный агент с потолком попадет в патологический цикл генерации кода, который сжигает в минуту, статический лимит позволит системе работать без контроля пять полных минут, порождая сотни бесполезных файлов и перетасовывая песочницы выполнения, прежде чем она остановится.

Автоматические выключатели инструментов из раздела «Автоматические выключатели инструментов» уже позволяют среде выполнения отсечь отказавшую зависимость без участия модели. Здесь тот же трехпозиционный выключатель следит за другими сигналами: скоростью денежного расхода и затуханием эпистемической полезности, а не таймаутами сокетов и долей ошибок.

Аналогия с автоматическим выключателем В электрических сетях автоматический выключатель срабатывает, когда потребляемый ток () опасно возрастает, предотвращая пожар. В агентных системах выключатель срабатывает, когда скорость денежного расхода () выходит за безопасные пределы.

Агентный автоматический выключатель действует как динамический надзиратель, обернутый вокруг конвейера диспетчеризации модели. Он непрерывно переходит между тремя рабочими состояниями:

  1. CLOSED (номинальный режим): Операции диспетчеризуются в обычном режиме. Понесенные расходы и изменения состояния записываются в скользящее окно.
  2. OPEN (сработал): Выключатель обнаружил нарушение инварианта. Все последующие запросы вывода, диспетчеризации инструментов и инициализации дочерних агентов немедленно завершаются с ошибкой (fail-fast). Активная траектория приостанавливается, и среда выполнения запускает автоматический откат или эскалацию к оператору-человеку.
  3. HALF-OPEN (канареечная проверка): После интервала охлаждения или восстановления контрольной точки среды среда выполнения пропускает одну ограниченную канареечную проверку (например, недорогой проход рефлексии или один детерминированный модульный тест), чтобы выяснить, восстановил ли агент связность. Если проверка проваливается, выключатель немедленно возвращается в OPEN. Переходы состояний и инварианты, управляющие этим контуром, формализованы в таблице «Конечный автомат автоматического выключателя».
Текущее состояниеТриггер перехода / условиеЦелевое состояниеЗащита инварианта и эксплуатационная семантикаДействие системы по восстановлению
CLOSED (Nominal)Всплеск скорости (), затухание полезности () или нарушение инвариантаOPENНемедленная ловушка fail-fast; останавливает вывод и диспетчеризацию инструментовПриостанавливает траекторию, отменяет ожидающие задания потомков, записывает тревогу
OPEN (Tripped)Истек интервал охлаждения () или завершен откат к контрольной точкеHALF-OPENРазрешает изолированную одношаговую канареечную оценкуВыдает ограниченную интроспекцию или изолированный модульный тест
HALF-OPEN (Canary)Канареечная проверка провалилась или повторно вызвала нарушение инвариантаOPENВводит экспоненциальное охлаждение с откатом ()Передает оператору-человеку или завершает траекторию
HALF-OPEN (Canary)Канареечная проверка прошла, проверка состояния успешнаCLOSEDСбрасывает счетчик последовательных сбоев и снимает удержание эскроуВосстанавливает обычный многоходовой конвейер диспетчеризации модели

Конечный автомат автоматического выключателя: конечный автомат агентного автоматического выключателя и семантика переходов.

Чтобы обеспечить всестороннюю эшелонированную защиту, среда выполнения-хост реализует три различных, независимых триггера автоматического выключателя.

Ограничение финансовой скорости

Выключатель финансовой скорости отслеживает мгновенную первую производную расходов по времени: . В дискретной среде выполнения она вычисляется по скользящему окну назад длительностью (например, 60 секунд):

Если превышает разрешенный порог скорости расхода (например, ), автоматический выключатель немедленно переходит в OPEN. Всплески скорости обычно означают, что агент породил широкое ветвление некоординированных подагентов, вошел в неограниченный цикл опроса внешних API или запустил авторегрессионный цикл, который насыщает локальные движки предзаполнения GPU избыточными окнами контекста.

Совокупные потолки траектории

Совокупный выключатель обеспечивает жесткое граничное условие . В отличие от выключателя скорости, который срабатывает по скоростям, совокупный выключатель ограничивает общий объем. Это последняя страховка от траекторий с низкой скоростью и высокой настойчивостью, которые делают минимальный прогресс в течение часов выполнения. При срабатывании среда выполнения сохраняет текущее состояние песочницы, выгружает диагностическую трассу выполнения и переводит агента в спокойное состояние, ожидающее одобрения человеком на расширение бюджета.

Предельное затухание эпистемической полезности

Самый тонкий и разрушительный режим отказа в автономных системах — эпистемический цикл: агент остается далеко в пределах своего лимита финансовой скорости и израсходовал лишь долю общего бюджета, но он перестал делать заметный прогресс к завершению задачи. Агент генерирует код, запускает модульный тест, наблюдает ошибку утверждения, меняет несвязанный комментарий или имя переменной, запускает тест снова и повторяет цикл бесконечно.

Чтобы выявить эту патологию, среда выполнения оценивает предельную эпистемическую полезность траектории. Пусть — наблюдаемое состояние среды на ходу (например, дерево каталогов исходного кода, векторы диагностики компилятора и результаты выполнения тестов). Определим метрику прогресса , которая измеряет объективную близость к инвариантам цели:

где — нормированные доменные веса. Предельная полезность на окне оценки из ходов определяется как:

Если среда выполнения видит, что за последовательных ходов совокупные расходы заметно выросли (), а предельная метрика прогресса осталась на месте или снизилась:

выключатель затухания эпистемической полезности переходит в OPEN. Среда выполнения останавливает цикл, диагностируя, что модель исчерпала способность к рассуждению для текущего состояния среды и что продолжение выполнения лишь сожжет финансовый капитал, не повысив вероятность достижения цели. Отслеживаемые метрики, математические условия срабатывания и смягчаемые режимы отказа трех автоматических выключателей сведены в таблице «Условия срабатывания многоскоростных автоматических выключателей и смягчение режимов отказа».

Автоматический выключательОтслеживаемая метрикаМатематическое условие срабатыванияОсновной смягчаемый режим отказа
Ограничитель скоростиСкорость расхода Взрывное ветвление параллельных потомков; неограниченные циклы опроса API
Совокупный потолокСовокупная экспозицияДлительное ползучее исчерпание; незаконные превышения бюджета проекта
Затухание эпистемической полезностиПредельная полезность при Беспорядочные циклы повторов; косметическая перетасовка кода; ловушки циклических рассуждений

Условия срабатывания многоскоростных автоматических выключателей и смягчение режимов отказа: отслеживаемые метрики, математические условия срабатывания и основные режимы отказа для финансовой безопасности агентов.

Когда расходы математически ограничены монотонными реестрами, иерархическим эскроу и многоскоростными автоматическими выключателями, инженер систем может безопасно развернуть автономных агентов в производственной среде. Однако соблюдение границ расходов решает лишь негативную задачу эксплуатации флота: предотвращение экономической катастрофы. Позитивная инженерная задача остается: при заданной производственной задаче с известными ограничениями по задержке, бюджету и точности как архитектору определить, решать ее детерминированным скриптом компилятора, одним вызовом модели со структурированным выводом, последовательной цепочкой специализированных моделей или полностью динамической мультиагентной системой? Синтез этих эксплуатационных переменных в принципиальную рубрику выбора — тема следующего раздела.

Оценка выбора архитектуры

Команда, у которой работает агент, склонна направлять его на каждую задачу. Раздел «Матрица архитектурных решений» дал решение о том, нужен ли задаче вообще цикл, управляемый моделью. Имея стоимость на принятую задачу, задержку критического пути и риск расходов, это решение теперь можно оценить, и цена часто его и определяет. Агентность — самый дорогой и наименее предсказуемый способ выполнить задачу, и покупать ее стоит только там, где более дешевые способы не срабатывают.

Спектр с ценами

Таблица «Спектр архитектур с ценами» размещает четыре проекта на спектре, из которого выбирают четыре вопроса раздела «Матрица архитектурных решений»: детерминированный код, один вызов модели внутри фиксированного рабочего процесса, ограниченный цикл агента и несколько агентов над одной задачей. Столбцы задержки и стоимости дают порядки величин, а не измерения. Каждый шаг вправо покупает гибкость и платит стоимостью, задержкой, дисперсией и замыканием, которое должна обеспечить среда выполнения.

ИзмерениеДетерминированный кодОдин вызов моделиОграниченный цикл агентаНесколько агентов
Поток управленияФиксирован в кодеФиксированный конвейер, один шаг моделиУправляется моделью в пределах лимита ходовГраф задач с типизированными передачами
ЗадержкаМикросекунды — миллисекундыСотни миллисекунд — секундыСекунды — минутыМинуты — часы
Стоимость на задачуПренебрежимо малаФиксирована за вызов, до доллараСумма по ходам, до доллараДоллары — десятки долларов
Переносимое состояниеПеременные программы и таблицыНичего, кроме запросаКонтекст, рабочее пространство, запись траекторииРазделенные контексты и рабочие пространства
Восстановление после сбоевИсключения и повторыПовторный разбор, резервная модельПовтор с обратной связью, откат, компенсацияПерепланирование у координатора, эскалация к человеку
Основание верификацииМодульные тесты и типыПроверки схемыТесты и проверки в песочницеШлюз инвариантов на каждый коммит, сквозные тесты, проверка человеком

Спектр архитектур с ценами: поток управления, порядки величин задержки и стоимости, переносимое состояние, восстановление и верификация для четырех проектов.

Рисунок «Многомерные компромиссы по спектру архитектурной автономии и матрица выбора систем» показывает эти многомерные компромиссы по спектру архитектурной автономии.

Многомерные компромиссы по спектру архитектурной автономии и матрица выбора систем: шестимерная оценка систем, сравнивающая Software 1.0 (детерминированный процедурный код), Software 2.0 (прямой одношаговый вывод модели), ограниченные агентные рабочие процессы (, ) и автономные мультиагентные флоты. Расширение автономии монотонно повышает гибкость ценой операционного детерминизма, скорости выполнения, финансовой предсказуемости, простоты верификации и безопасности радиуса поражения. Сопровождающая матрица выбора систем задает четкие границы решений на основе эпистемической неоднозначности, изменяемости состояния, допустимой задержки и проверяемой истины.

Четыре вопроса с ценами

Горизонт, состояние и полномочия задают замыкание, которое должна оплатить каждая задача.

Четыре вопроса раздела «Матрица архитектурных решений» размещают задачу по трем экспозициям H·S·A («Экспозиции H·S·A») и по уровням свидетельств замыкания («Уровни свидетельств замыкания»), которые среда выполнения может для нее собрать. У каждого из них есть цена, которую эта глава теперь может назвать.

Горизонт оценивается во времени и в отношении шансов. Каждый ход добавляет время критического пути и повторно отправленный контекст, и задача с дедлайном в секунду-две не может позволить себе цикл, каждый ход которого занимает секунды. Более длинные горизонты также усиливают провал на каждом шаге, поэтому задача, естественная длина которой — много ходов, нуждается либо в высокой успешности на каждом шаге, либо в проверенных промежуточных вехах, чтобы держать малым.

Состояние оценивается в контексте. Преобразование из входа в выход без состояния, которое нужно переносить, — это один вызов, и обернуть его в цикл значит добавить повторно отправленный контекст и режимы отказа без добавленной ценности. Задача, которая должна наблюдать и менять рабочее пространство, платит за рост контекста из раздела «Кеширование и бюджеты на рассуждения» на каждом ходу, и раскладка кеша и политика сжатия определяют, сколько именно.

Полномочия оцениваются в одобрениях и в стоимости ошибок. Задача, эффекты которой остаются в одноразовой песочнице (), может выполняться как ограниченный цикл. Задача, эффекты которой компенсируемы (), тоже может, при условии что каждое действие с истекшим таймаутом урегулировано до повтора (принцип «Урегулирование до повтора»), и она платит за механизмы компенсации. Задача с необратимыми эффектами () платит за шлюз одобрения («Шлюзы одобрения») на каждом таком действии, и ее член перестает быть редким.

Свидетельства замыкания оцениваются в верификации, и это вопрос, который чаще всего решает дело. Если существует быстрая и надежная проверка, например набор тестов или компилятор, дешевая модель может итерироваться против нее, и стоимость на принятую задачу падает с каждой попыткой, которую проверка отфильтровывает. Если такой проверки нет, большее число ходов и агентов не сходится к корректности; они добавляют стоимость, а результат все равно требует проверки человеком. Такие задачи относятся к одному вызову с проверкой, стоимость которого определяется .

Где цикл окупается

Сравнение, которое чаще всего имеет значение, — между одним сильным вызовом и ограниченным циклом вокруг более дешевой модели. Для цикла не более ходов против верификатора с условной вероятностью успеха на ходу при условии предыдущих провалов вероятность получить принятый результат равна

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

Оценка трех проектов для обновления зависимостей

Задача: Команда обрабатывает 10 000 заявок по рекомендациям безопасности в месяц, каждая из которых требует обновления зависимости, правок устаревших вызовов и успешного прогона сборки и тестов. Заявка, которую не закрыла автоматизация, стоит $35 на ручное исправление. Переписыватель по правилам стоит $0,001 за заявку и успешен с вероятностью 0,32. Один вызов передовой модели, который предлагает дифф, стоит $0,045 и успешен с вероятностью 0,68. Ограниченный цикл вокруг более дешевой модели стоит $0,006 за ход плюс $0,002 за прогон тестов, выполняется не более трех ходов и на каждом ходу успешен с вероятностями 0,55, 0,42 и 0,30 при условии предыдущих провалов. Какой проект стоит меньше всего за заявку?

Расчет: По «уравнению успеха цикла» цикл успешен с вероятностью 0,82 за 1,71 хода в среднем, при вычислительной стоимости $0,014 и примерно 12,3 с на заявку. С учетом обработки провалов человеком заявка стоит $23,80 с переписывателем, $11,24 с одним вызовом и $6,41 с циклом, или $238 010, $112 450 и $64 082 в месяц.

Системный вывод: Цикл стоит на 43 процента меньше одного вызова и на 73 процента меньше переписывателя, хотя его вычисления дешевле вызова лишь на центы. Его преимущество — набор тестов. Дешевая модель, которая видит падающую сборку и пробует снова, превращает дешевые попытки в принятые исправления. Без такой проверки цикл было бы не на что опереться.

Несколько агентов следуют той же логике еще на шаг дальше. Мультиагентный проект оправдывает себя, только если он побеждает одного агента с тем же общим бюджетом по стоимости на принятую задачу, времени или принятию, не проигрывая по остальным (принцип «Трехосевая граница оценки мультиагентных систем»), и платит налог на координацию (принцип «Налог на координацию») независимо от того, побеждает он или нет. Автономия должна расти лишь до тех пор, пока отдача от принятых задач превышает добавленную стоимость ходов, проверки, координации и управления, а учет этой главы показывает, как это проверить.

Синтез экономики обслуживания

Администратор кластера, который независимо оптимизирует обслуживание моделей, выполнение инструментов и политики планирования, неизбежно обнаруживает, что локальные эффективности складываются в катастрофические неэффективности на уровне флота. Ускорение ядра авторегрессионного декодирования с помощью специализированного ядра flash-attention или спекулятивной верификации снижает задержку декодирования, ограниченную GPU, в 2,5 раза, однако общее время траектории по реальному времени падает меньше чем на , если среда выполнения агента тратит своего критического пути в простое на синхронной перезаписи образа контейнера и внешних RPC к песочнице. Так же развертывание агрессивных каскадов моделей, которые направляют запросы к моделям менее чем с миллиардом параметров, сокращает номинальные комиссии за вывод токенов, но если низкая способность у дешевой модели следовать инструкциям вызывает повторные попытки по синтаксису и откаты траекторий, совокупная стоимость на принятую задачу резко растет.

Экономическая жизнеспособность в автономных флотах агентов — не внутреннее свойство нижележащих весов нейросети или ядер вывода, а эмерджентное свойство замкнутой системы управления, которая определяет их вызов. Максимизация экономической отдачи системы требует объединить учет стоимости всей траектории, декомпозицию задержки критического пути, спекулятивное ускорение, многоуровневую маршрутизацию моделей и планирование кластера на основе теории очередей в единую самобалансирующуюся эксплуатационную среду выполнения. Когда эти подсистемы работают изолированно, они порождают рассогласования: планировщики заполняют память GPU траекториями с длинным контекстом, которые морят голодом интерактивные запросы, а каскады маршрутизации направляют сложные задачи рассуждений моделям малой мощности, которые тратят непропорционально большие бюджеты инструментов и верификации, прежде чем провалиться.

Многоуровневый экономический контур управления

Чтобы предотвратить эти режимы отказа, производственная платформа агентов должна строить управление как пятиступенчатый конвейерный замкнутый контур обратной связи («Архитектура замкнутого контура управления экономикой флота»). Каждая ступень обеспечивает формальный системный контракт, превращая непривилегированное намерение пользователя в проверенные внешние изменения состояния, одновременно активно минимизируя потребление ресурсов.

Архитектура замкнутого контура управления экономикой флота: пятиступенчатый конвейерный движок обслуживания, объединяющий профилирование нагрузки и резервирование эскроу при допуске, планирование кластера MLFQ (), многоуровневые каскады маршрутизации моделей (60 процентов запросов завершаются на малой языковой модели (SLM) со стоимостью 0,0004 доллара, 28 процентов на универсальной модели со стоимостью 0,0024 доллара, 12 процентов эскалируются на передовую модель), ускорение спекулятивным декодированием () и иерархический учет бюджетного реестра при нулевых неявных полномочиях. Телеметрия от проверенных завершений задач поступает во внешнюю шину обратной связи «полезный выход на доллар», которая динамически перенастраивает эскроу допуска, кванты очередей и пороги уверенности каскада.

Как видно по сквозному конвейеру на рисунке «Архитектура замкнутого контура управления экономикой флота», входящий запрос проходит пять скоординированных системных барьеров, прежде чем зафиксировать изменения во внешней среде. На ступени 1 (профилировщик нагрузки и эскроу) входной маршрутизатор разбирает семантику промпта, устанавливает сроки SLA и выделяет начальный финансовый конверт эскроу (). На ступени 2 (планировщик кластера MLFQ) запросы попадают в очередь приоритета при целевых значениях загрузки кластера, безопасных по Кингману (), отделяя интерактивные пробы от пакетных траекторий с помощью квантов токенов () и предотвращая голодание периодическими повышениями приоритета ().

На ступени 3 (каскад маршрутизации по уровням) ход выполнения пытается разрешить задачу на самом дешевом подходящем уровне: синтаксических ходов успешно завершаются на уровне SLM (), разрешаются на универсальной модели среднего уровня (), и только эскалируются на передовую модель, так что ожидаемая стоимость хода составляет . На ступени 4 (механизм спекулятивного декодирования) тяжелые вызовы передовой модели ускоряются непосредственно на тензорных ядрах GPU с помощью согласованной черновой модели, которая спекулятивно генерирует токенов за прямой проход (), что сжимает задержку декодирования на критическом пути. Наконец, на ступени 5 (иерархический реестр и верификатор) модель не имеет неявных полномочий, и каждое предлагаемое действие выполняется в изолированной песочнице; только когда детерминированные механические верификаторы подтверждают корректность, транзакция фиксируется и неизрасходованный эскроу возвращается арендатору. Весь конвейер заключен в глобальную петлю обратной связи, которая непрерывно оптимизирует полезный выход на доллар (), динамически подстраивая пороги маршрутизации и кванты очередей по данным о дефектах в реальном времени.

Первая ступень этого движка — профилировщик нагрузки. Когда запрос задачи поступает на вход платформы, профилировщик проверяет полезную нагрузку промпта, указанный пользователем срок, исторические характеристики траекторий запрашивающего арендатора и требования к возможностям инструментов. Вместо того чтобы считать все запросы однородными последовательностями токенов, профилировщик разбивает входящий трафик на различные профили выполнения: короткие ограниченные интерактивные запросы, детерминированные многоходовые рабочие процессы и неограниченные исследовательские траектории агентов. Извлекая структурные инварианты, например то, требует ли запрос выполнения произвольного кода или только извлечения структурированных данных, профилировщик вычисляет начальный вектор резервирования ресурсов, включающий границы памяти, лимиты скорости инструментов и начальный финансовый эскроу.

Вторая ступень — планировщик кластера MLFQ. Планировщик предотвращает катастрофическую блокировку головы очереди, которая возникает, когда долгоживущие стохастические траектории агентов делят физические очереди вычислений с одноходовыми интерактивными запросами. Входящие задачи попадают в очередь наивысшего приоритета (), которая предоставляет немедленный небольшой квант вычислений, оптимизированный под время до первого токена (TTFT) и быстрое первоначальное планирование. Если задача исчерпывает квант, не завершившись и не перейдя в состояние внешнего ожидания, планировщик понижает ее в пакетные очереди с низшим приоритетом и высокой пропускной способностью (). Такое разделение гарантирует, что длительные траектории работают на кластерах, настроенных под высокую плотность непрерывного пакетирования и пропускную способность, а чувствительные к задержке ходы пользователя — на недозагруженных узлах с малой задержкой.

Третья ступень — каскад маршрутизации по уровням, который воплощает принципы, изложенные в FrugalGPT (Chen et al., 2023). Когда запланированный ход агента требует нейросетевого вывода, среда выполнения не использует по умолчанию самую способную передовую модель. Вместо этого она направляет контекст легковесной малой языковой модели (SLM), настроенной на создание промежуточных черновиков, вызовов инструментов с проверенной схемой или кандидатных проверок. Выход SLM проходит через непривилегированный валидатор выхода. Если SLM генерирует неверную схему инструмента, демонстрирует низкую уверенность логитов на критических токенах или сигнализирует о неспособности разрешить граф зависимостей промпта, каскад эскалирует вызов на модель рассуждений среднего или передового уровня. Разрешая на самом низком уровне подавляющее большинство шагов синтаксического форматирования, маршрутизации инструментов и суммаризации статуса, каскад сохраняет дорогую мощность передовой модели для сложного планирования и восстановления после ошибок.

Четвертая ступень — механизм спекулятивного декодирования, встроенный непосредственно в физический кластер вывода. Когда эскалированная задача должна выполняться на массивной целевой модели (), среда выполнения связывает целевую модель с согласованной черновой моделью (). Черновая модель спекулятивно выдает кандидатных токенов по критическому пути, где действует закон Амдала. Целевая модель оценивает эти токенов за один параллельный прямой проход (GEMM), принимая префиксы, которые совпадают с ее собственным распределением вероятностей, и возвращаясь к собственному распределению при первом отказе. Поскольку спекулятивное декодирование гарантирует математическую эквивалентность выборке напрямую из , среда выполнения резко ускоряет авторегрессионную генерацию, не вводя стохастического дрейфа и не снижая успешность решения задач.

Пятая ступень — иерархический реестр бюджета и эскроу инвариантов. Каждое последующее выполнение — будь то спекулятивный прямой проход, проверка маршрутизации SLM, запуск компилятора в контейнере или вызов внешнего SaaS API — должно быть авторизовано по строго монотонному реестру бюджета. Когда подагенты порождаются для решения подзадач, родительский агент делит свой собственный эскроу ресурсов, делегируя детям более мелкие невозобновляемые выделения. Если подагент входит в повторяющийся цикл повторов или не продвигает состояние в пределах выделенного бюджета, реестр срабатывает как жесткий автоматический выключатель. Измененное состояние агента удерживается в эскроу; только когда внешний детерминированный набор тестов проходит, среда выполнения фиксирует изменение в авторитетном производственном хранилище. Контракты, механизмы, цели оптимизации и режимы отказа по этим пяти ступеням сведены в «Механике и интерфейсах контура управления экономикой флота».

Ступень контураКонтракт входаОсновной механизмЦель оптимизацииСмягчаемые режимы отказа
1. Профилировщик нагрузкиИсходная задача и исторические метаданныеСтатический анализ контекста и зависимостейКлассификация SLA; размер эскроуИзбыточное выделение; голодание песочниц
2. Планировщик MLFQКласс профилировщика и квант ходаДинамическое понижение квантовP99 TTFT интерактивных запросов; пропускная способность кластераБлокировка головы очереди; исчерпание KV-кеша
3. Каскад маршрутизацииПроверенный контекст и уровень намеренияПоэтапная эскалация возможностей (SLM передовая)Стоимость промежуточного шага ()Перегрузка передовой модели
4. Спекулятивное декодированиеАктивный поток токенов и черновая модельПараллельная проверка черновых токеновЗадержка между токенами декодирования ()Недоиспользование пропускной способности памяти и вычислений
5. Иерархический реестрВыделенный эскроу и диффы выполненияМонотонный учет и автоматические выключателиФинансово ограниченная ошибка задачиБесконечные циклы; исчерпание бюджета

Механика и интерфейсы контура управления экономикой флота: контракты входа, основные механизмы, цели оптимизации и режимы отказа по пяти ступеням контура управления.

Полезный выход на доллар: единая цель

Оптимизация флота агентов требует метрики, которая связывает эффективность железа с полезностью для предприятия. Традиционные метрики инфраструктуры машинного обучения, такие как токены в секунду, эффективность FLOP или загрузка GPU, в агентных системах активно вводят в заблуждение. Кластер, который выполняет неограниченного агента в бесконечном цикле, может достигать загрузки FLOP модели (MFU) и генерировать десятки тысяч токенов в секунду, не производя при этом никакой функциональной ценности. И наоборот, метрика инфраструктуры, основанная только на сырой стоимости за миллион токенов, вознаграждает выбор дешевых, деградировавших моделей, которые не могут решить задачу пользователя.

В масштабе флота цель по принятым задачам из раздела «Стоимость на принятую задачу» выглядит как полезный выход на доллар (), то есть число проверенных, бездефектных задач, выполненных на единицу общих экономических затрат. Это обратная величина к . Если полезный выход траектории из раздела «Эффективность на микроуровне и на макроуровне» измеряет долю ресурсов, которая доходит до принятых задач, то полезный выход на доллар измеряет, сколько принятых задач покупает каждый доллар:

В этой формулировке — общее число задач, принятых в кластер, а — полная стоимость траектории задачи . Как установлено в нашей схеме учета стоимости задач, охватывает каждый ресурс, потребленный на протяжении жизненного цикла попытки:

Числитель, , — это число задач, которые удовлетворяют всем функциональным инвариантам без неучтенного вмешательства человека:

Здесь — бинарный индикатор того, что итоговый выход задачи успешно прошел внешнюю детерминированную обвязку проверки (например, наборы модульных тестов, интеграционные линтеры или проверки схем). Член исключает ложные принятия — решения, которые проходят синтаксические тесты, но вносят скрытые регрессии или уязвимости безопасности.

Полезный выход на доллар

Определяющая экономическая целевая метрика , которая измеряет число проверенных, бездефектных выполнений задач агентом, достигнутых на единицу общих финансовых затрат. Объединяя детерминированную проверку постусловий с учетом стоимости всей траектории, полезный выход на доллар согласует планирование ускорителей, выбор моделей и кеширование выполнения с реальной полезностью для предприятия.

Оценка полезного выхода флота на доллар

Рассмотрим корпоративный бенчмарк программной инженерии из задач исправления кода. Сравниваем две эксплуатационные конфигурации: наивную монолитную архитектуру, которая направляет каждое взаимодействие непосредственно в передовую модель без вспомогательных механизмов, и синтезированную архитектуру с контуром управления, которая развертывает профилирование, планирование MLFQ, каскады по уровням и спекулятивное декодирование.

1. Основа цен на оборудование и провайдеров:

  • Передовая модель (): за токенов предзаполнения; за токенов декодирования.
  • Малая языковая модель ( / уровень 1 каскада): за токенов предзаполнения; за токенов декодирования.
  • Эфемерная песочница выполнения: за час процессора ( за секунду).
  • Детерминированный набор проверки: за прогон.
  • Эскалация к человеку (разбор): за устранение дефекта.

2. Базовый уровень: наивная монолитная архитектура

  • Динамика траектории: каждая задача выполняется на . Средняя траектория требует ходов.
  • На ход: токенов предзаполнения, токенов декодирования, секунд выполнения в песочнице.
  • Точность задач: доля принятия с первого прохода составляет . Остальные проваливают верификацию и отбрасываются без устранения человеком ().
  • Стоимость токенов на ход: .
  • Стоимость песочницы на ход: .
  • Стоимость траектории ( ходов): .
  • Стоимость верификации: . Общая стоимость на задачу: .
  • Общая стоимость флота: .
  • Базовый полезный выход:

3. Синтезированная архитектура:

  • Профилирование нагрузки и каскадирование: всех ходов (поиск файлов, синтаксический линтинг, подготовка к коммиту в git) полностью решаются . Только ходов эскалируются на для сложного алгоритмического синтеза.

  • Спекулятивное декодирование: применяется ко всем вызовам с черновой моделью (, средняя доля принятия ). Время декодирования по реальным часам сокращается в 2,1 раза, что уменьшает время удержания песочниц во время генерации.

  • Стоимость токенов на ход (уровень 1 каскада — SLM, 60 процентов ходов):

  • Стоимость токенов на ход (уровень 2 каскада — передовая модель + спекулятивный черновик, 40 процентов ходов): Стоимость передовой модели остается . Накладные расходы на генерацию черновика добавляют . Итоговая стоимость токенов на ход: .

  • Средняя стоимость токенов на ход: .

  • Стоимость песочницы на ход: снижение задержки уменьшает время пребывания песочницы с до :

  • Успешность задач и повторные попытки: иерархическое бюджетирование допускает до ходов для трудных задач. Доля принятия с первого прохода растет до . Из оставшихся задач решаются автоматической повторной эскалацией (добавляя хода уровня 2), а чисто проваливаются и помечаются для проверки человеком ( не учитывается для отклоненной партии, либо задачи решены: принимаем ).

  • Эффективное среднее число ходов на 1 000 задач: хода.

  • Стоимость выполнения траектории: .

  • Стоимость верификации: . Средняя стоимость на задачу: .

  • Общая стоимость флота: .

  • Синтезированный полезный выход:

Синтезированная система достигает улучшения полезного выхода на доллар в 2,71 раза, одновременно сокращая расходы флота на и повышая выход задач на .

Максимизация полезного выхода на доллар выявляет фундаментальный компромисс экономики обслуживания: тратить больше денег на задачу экономически рационально тогда и только тогда, когда предельные расходы дают сверхлинейный рост вероятности принятия задачи. И наоборот, стратегии снижения стоимости, которые подрывают успешность задач, даже немного, часто обрушивают полезный выход на доллар, потому что постоянные издержки инструментальной инфраструктуры, токены предзаполнения и верификация тратятся впустую на невосстановимых провалах.

Эксплуатационная оболочка флота

Масштабирование флота агентов за пределы одного изолированного экземпляра вводит резкие нелинейности, которыми управляют теория очередей и конкуренция за общие ресурсы. Чтобы сохранять экономическую платежеспособность и выполнять соглашения об уровне обслуживания (SLA), архитектор инфраструктуры должен определить экономическую эксплуатационную оболочку системы. Эта оболочка представляет многомерное пространство параметров, ограниченное частотой прибытий (), конкурентностью (), сложностью задач () и потолками бюджета (), внутри которого флот работает устойчиво.

Закон универсальной масштабируемости Нила Дж. Гюнтера моделирует емкость системы при конкурентности :

где измеряет конкуренцию за узкие места сериализации, а — перекрестные помехи или задержки когерентности.

При моделировании масштабирования флота простые линейные допущения о емкости не работают. Мы применяем закон универсальной масштабируемости Нила Дж. Гюнтера (USL), чтобы описать эффективную емкость кластера обслуживания агентов при конкурентной нагрузке траекторий . В агентной системе параметр конкуренции отражает очередь за общими физическими ресурсами: память с высокой пропускной способностью (HBM) на рабочих узлах GPU, лимиты одновременного создания контейнеров в гипервизоре контейнеров и лимиты скорости провайдеров на внешние API инструментов. Параметр когерентности отражает обратные эффекты, возникающие из координации и перекрестных помех: конкуренцию за распределенные блокировки в общих реестрах бюджета, инвалидацию контекстного кеша между узлами кластера и сериализацию базы данных при параллельных фиксациях состояния.

Если оператор поднимает конкурентность выше пика кривой USL (), система входит в режим обратного коллапса. Очереди растут, активации предзаполнения переливаются из SRAM GPU в системную оперативную память хоста, а времена инициализации песочниц испытывают резкое усиление хвостовой задержки. Поскольку траектории агентов управляются последовательными цепочками зависимостей, всплеск задержки на ходу откладывает ходы с по . Если задержка превышает клиентские таймауты, вся траектория прерывается, сводя к нулю при сохранении понесенной стоимости.

Чтобы строго удерживать работу внутри устойчивой оболочки, синтезированная среда выполнения реализует три жестких граничных инварианта:

Во-первых, динамическая граница допуска регулирует вход в зависимости от текущих глубин очередей кластера. Используя модели очередей , разработанные в нашей схеме планирования мощности, планировщик отклоняет или сбрасывает низкоприоритетные фоновые траектории, когда оцениваемое время ожидания в угрожает SLA P95 TTFT интерактивных сессий:

Во-вторых, монотонный потолок эскалации ограничивает глубину и финансовую скорость каскадирования моделей. Агенту запрещено вызывать модель рассуждений более высокого уровня, если ожидаемый прирост информации не превышает разницы в стоимости. Формально, если эскалация с уровня модели на уровень несет дополнительную стоимость , эскалация разрешена тогда и только тогда, когда:

где — экономическая ценность успешного завершения задачи. Если это условие не выполняется, среда выполнения завершает траекторию, сообщая об ограниченном провале, а не сжигая капитал на попытки восстановления с низкой вероятностью успеха.

В-третьих, шлюз эффективности Амдала определяет инвестиции в спекулятивное декодирование и ускорение. Среда выполнения непрерывно измеряет долю времени по реальным часам на критическом пути, которая уходит на авторегрессионное декодирование (), по сравнению с выполнением инструментов и песочницы (). Если профилирование показывает, что , среда выполнения отключает спекулятивное черновое исполнение для этого профиля задачи. Когда задержки окружения доминируют на критическом пути, выделение полосы пропускания памяти GPU и вычислительных ядер на проверку спекулятивных черновиков дает пренебрежимо малое сквозное ускорение и тратит впустую емкость памяти, которая иначе поддержала бы большие размеры пакетов для параллельных запросов.

Непрерывно балансируя частоты допуска, уровни моделей, ускорение декодирования и реестры бюджета относительно эмпирических эксплуатационных границ, синтезированная архитектура гарантирует, что флот работает на пиковом полезном выходе на доллар.

Однако перевод этих архитектурных принципов в производственные системы полон опасностей. Когда проектировщики систем переходят от теоретических формулировок к практическим реализациям, они часто становятся жертвами интуитивно понятных, но катастрофических эксплуатационных ловушек. Опровержение этих распространенных системных заблуждений и описание точных физических ошибок развертывания базовых моделей — необходимый последний шаг в освоении экономики обслуживания.

Заблуждения и ловушки

Проектирование и эксплуатация производственных агентных систем требуют пройти коварный разрыв между задержкой вывода, измеренной на микробенчмарках, и макроэкономической устойчивостью флота. Аппаратные ускорители, сетевые структуры и API базовых моделей имеют нелинейные поверхности стоимости, которые наказывают наивные эксплуатационные допущения. Когда системные инженеры принимают недетерминированные траектории агентов за эквивалентные традиционным удаленным вызовам процедур (RPC) без состояния, получающиеся архитектуры страдают от катастрофического финансового разгона, резкого падения пропускной способности и напрасных инженерных усилий. Следующие заблуждения и ловушки проясняют конкретные физические и экономические режимы отказа, которые возникают в инфраструктуре обслуживания агентов.

Заблуждение и ловушка

Заблуждение: Оценка стоимости модели строго по ценам API за токен определяет самую экономичную модель.

Провайдеры базовых моделей публикуют заметные тарифы в долларах за миллион токенов, что порождает интуитивную, но опасную эвристику: замена модели на более дешевую напрямую снижает операционные расходы. Эта метрика микроуровня структурно обманчива, потому что изолирует прием и генерацию сырых токенов от стохастического обхода пространства состояний, который нужен, чтобы решить автономную задачу. В среде выполнения агента полный финансовый расход определяется не единичными ценами за токен, а уравнением стоимости всей траектории:

где охватывает совокупные расходы на предзаполнение и декодирование по последовательным шагам траектории, плату за выполнение в песочнице, накладные расходы на вызовы инструментов и детерминированные прогоны проверки. Параметр — эмпирическая вероятность того, что сгенерированная траектория проходит все эталонные тесты приемки, не нарушая инвариантов среды, а обозначает стоимость разбора постфактум, которая возникает, когда неудачное или испорченное состояние должно быть проверено и исправлено инженером.

Когда у непривилегированного предсказателя ниже скрытая способность, динамика траектории деградирует по трем взаимосвязанным осям. Во-первых, модель генерирует некорректные вызовы инструментов, неверные схемы и выдуманные пути к файлам, что запускает итеративные циклы самокоррекции и резко раздувает длину траектории . Поскольку каждый шаг диалога дописывает предыдущие результаты инструментов к рабочему контексту, токены предзаполнения растут квадратично:

где — базовый системный промпт, а — прирост контекста, который накапливается на каждом ходу. Номинально дешевая модель, которой для решения задачи нужно ходов, обрабатывает гораздо больше суммарных токенов, чем продвинутая передовая модель, которая правильно планирует за хода.

Во-вторых, более слабые модели выполняют лишние и разрушительные действия с инструментами. Каждый дополнительный ход несет расходы на вычисления в песочнице, единицы чтения и записи базы данных и плату за исходящий трафик, которые часто превосходят плату за API вывода. В-третьих, и это важнее всего, меньшая способность к рассуждению снижает итоговую долю успешных прогонов . Поскольку бизнес-процессы не могут терпеть непроверенные выдумки, сбои, которые проходят мимо автоматических песочниц, переливаются в очереди ручной проверки. Если инженерный разбор человеком стоит в час ( в минуту), а проверка неисправного патча занимает пять минут (), то доля сбоев в добавляет амортизированные накладные расходы в на попытку задачи, что перекрывает любую экономию в долях цента, полученную на скидках на токены.

Архитектурная защита требует перевести телеметрию с расхода токенов на единицу к эффективной стоимости принятого выполнения задачи (). Эксплуатационные обвязки обслуживания должны инструментировать сквозные реестры учета, которые отслеживают полный жизненный цикл траектории, привязывая использование токенов, часы выполнения в песочнице, плату за API инструментов и накладные расходы на проверку к бинарному результату набора проверок задачи. Цели оптимизации должны задаваться на Парето-фронте проверенного выхода на доллар, а задачи должны направляться на более дешевые модели, только когда их эмпирическая вероятность успеха за один проход соответствует эксплуатационному порогу.

Заблуждение и ловушка

Ловушка: Оптимизация скорости генерации токенов, когда время ожидания инструментов доминирует на критическом пути.

Когда интерактивный агент отвечает вяло, инженеры систем часто сосредотачивают усилия на обслуживании вывода: настраивают ядра авторегрессионного декодирования, внедряют спекулятивное декодирование или переходят с 16-битных весов с плавающей точкой (FP16) на 4-битное целочисленное квантование (INT4). Хотя эти меры повышают пропускную способность генерации, они регулярно не дают заметного улучшения времени выполнения задачи по реальным часам.

Такое нерациональное распределение инженерных усилий происходит из-за игнорирования последовательных зависимостей, которые управляют траекторией агента. Задержка критического пути делится на три непересекающихся домена выполнения:

где — совокупная длительность предзаполнения и авторегрессионного декодирования на ходу , — задержка взаимодействия с внешним API или средой, а охватывает накладные расходы хоста, включая сериализацию IPC, барьеры изоляции контейнеров в песочнице и восстановление контекста. Закон Амдала определяет, что теоретическое ускорение , достижимое ускорением компонента вывода, строго ограничено долей времени выполнения, которую занимает модель:

В трассе из таблицы «Иллюстративная трасса» модель занимает 9,4 процента времени по реальным часам, поэтому модель, которая быстрее в 4 раза, ускоряет траекторию лишь в 1,08 раза, а мгновенная модель — только в 1,10 раза. Один лишь запуск тестов занимает 78,6 процента. Средство — прочитать трассу до инвестиций: прогретые пулы песочниц, кеши сборок, выбор тестов и параллельные вызовы инструментов сокращают то, что на самом деле лежит на критическом пути.

В автономных агентах разработки программного обеспечения, анализа данных или оркестрации нескольких сервисов обычно мала. Рассмотрим агента разработки, который выполняет набор тестов: передовая модель может сгенерировать bash-команду за (), но выполнение этой команды требует запустить изолированный контейнер, скомпилировать абстрактное синтаксическое дерево, загрузить зависимости пакетов и выполнить набор тестов длительностью (), после чего следуют усечения журнала среды выполнения и синхронизации песочницы (). В этом сценарии (модель занимает примерно критического пути). Ускорение декодирования вывода с до () сжимает время генерации с до и дает сквозное ускорение задачи:

Инженерное вмешательство тратит значительную архитектурную сложность ради незаметного снижения общей задержки на .

Правильное системное смягчение требует строгой распределенной трассировки критического пути до начала оптимизации. Протягивая заголовки контекста распределенной трассировки через итерации цикла агента, инженеры выделяют реальные структурные узкие места: инициализацию контейнера при холодном старте, блокирующий сетевой ввод-вывод, синхронный опрос базы данных и избыточное свертывание состояния среды. Смягчения должны концентрироваться там, где наибольшая: предварительный прогрев пулов контейнеров-песочниц с форками памяти с копированием при записи (CoW), распараллеливание независимых вызовов инструментов через асинхронные среды выполнения, кеширование детерминированных выходов инструментов и потоковую передачу журналов выполнения, чтобы начать спекулятивное предзаполнение до завершения инструмента.

Заблуждение и ловушка

Заблуждение: Спекулятивное декодирование снижает использование ресурсов модели при любой нагрузке обслуживания.

Спекулятивное декодирование использует легковесную черновую модель , чтобы предсказать последовательность из кандидатных токенов, которые затем параллельно проверяются основной целевой моделью за один модифицированный прямой проход. Поскольку проверка превращает последовательных ограниченных памятью векторно-матричных умножений (GEMV) в одно ограниченное вычислениями матрично-матричное умножение (GEMM), спекулятивное декодирование существенно снижает задержку декодирования на токен для изолированных запросов вывода с одним пакетом. Это снижение задержки часто вводит архитекторов систем в заблуждение: они полагают, что спекулятивное декодирование безусловно экономит вычислительные ресурсы железа и его стоит включать глобально на всех уровнях обслуживания.

Механизм отказа возникает из фундаментального физического компромисса: спекулятивное декодирование меняет сырые операции с плавающей точкой (FLOP) на сокращение времени по реальным часам. Для каждого шага проверки, порождающего принятую последовательность длины , система обслуживания тратит вычислительные усилия на прямых проходов через плюс один прямой проход через по токенам. Поскольку доля принятия при спекуляции строго меньше единицы (), отвергнутые черновые токены представляют отброшенные вычисления. Суммарные FLOP, потраченные на каждый проверенный сгенерированный токен, строго выше при спекулятивном декодировании, чем при стандартном авторегрессионном декодировании:

При малонагруженных сценариях обслуживания, где размер пакета минимален (), шина памяти GPU является связывающим эксплуатационным узким местом. Железо находится глубоко в режиме, ограниченном памятью, по модели Roofline, с арифметической интенсивностью далеко ниже порога насыщения тензорных ядер ускорителя. В этих условиях дополнительные FLOP, выполненные над закешированными весами, фактически «бесплатны», скрыты за задержкой выборки памяти , и дают чистое ускорение по времени без штрафа по пропускной способности.

Однако в производственных флотах агентов, обслуживающих сотни параллельных траекторий, кластер вывода работает под сильным насыщением при больших совокупных размерах пакета (). В этой рабочей точке пакетирование насыщает пропускную способность памяти, переводя движок в режим, ограниченный вычислениями, где утилизация арифметики тензорных ядер приближается к физическому пределу. В этом состоянии арифметические такты уже не бесплатны. Избыточные FLOP, выполненные , и проверка отброшенных черновых ветвей напрямую конкурируют с параллельными запросами за конвейеры выполнения, функциональные блоки и регистровые файлы SRAM. Кроме того, совместное размещение потребляет критичную память с высокой пропускной способностью (HBM), отнимая емкость, которая иначе была бы выделена пулу физических кадров KV-кеша PagedAttention. Возникающее сжатие кадров KV-кеша заставляет планировщик вытеснять активные последовательности или искусственно ограничивать максимальные размеры пакетов, что напрямую снижает общую пропускную способность кластера () и увеличивает задержку в очереди в пуле планирования.

Архитектурная защита требует динамического шлюза спекулятивного декодирования, зависящего от нагрузки. Среды выполнения должны непрерывно отслеживать утилизацию вычислительных ресурсов ускорителя, активные размеры пакетов и глубины очередей планирования. Спекулятивное декодирование должно динамически включаться только для критичных к задержке, непакетированных задач, выполняющихся на критическом пути, и автоматически отключаться в тот момент, когда кластеры обслуживания входят в насыщение, ограниченное вычислениями, где совокупный полезный выход на доллар должен максимизироваться.

Заблуждение и ловушка

Ловушка: Разрешение подагентам порождать дочерних воркеров без иерархических резервирований бюджета.

Сложные каркасы агентов часто реализуют динамическую декомпозицию задач, позволяя родительскому агенту создавать специализированных дочерних подагентов для вспомогательных подпрограмм, параллельного веб-поиска или разбора сбоев компиляции кода. Широко распространенный и катастрофический антипаттерн реализации дает дочерним воркерам неявный доступ к учетным данным API организации-родителя или к глобальным лимитам расходов. Когда подагенты обладают неучтенными неявными полномочиями на выделение вычислительных ресурсов, рекурсивное делегирование создает неограниченную уязвимость распределенного истощения ресурсов.

Механизм отказа проистекает из недетерминированной природы непривилегированного планирования модели в сочетании с циклическими траекториями восстановления после сбоев. Если дочерний агент сталкивается с неоднозначным сбоем инструмента или неразрешимым состоянием среды, его внутренний цикл промпта может определить, что декомпозиция проблемы на несколько параллельных подзадач — оптимальная стратегия восстановления. Если каждый дочерний подагент, в свою очередь, может порождать дальнейших воркеров без структурных границ, система генерирует неконтролируемый каскад асинхронных процессов:

где — коэффициент ветвления порожденных воркеров на глубине рекурсии . Если верхний API инструмента переживает временный отказ или семантическое изменение схемы, каждый активный воркер сталкивается с одной и той же ошибкой одновременно. Интерпретируя сбой как проблему, требующую дальнейшей декомпозиции, флот запускает рекурсивный взрыв исправляющих воркеров, каждый из которых читает длинные трассы ошибок в свои рабочие контексты.

Поскольку стоимость приема токенов накапливается по всем активным ветвям, неограниченный каскад подагентов тратит тысячи долларов коммерческих API-кредитов или истощает KV-кеш локального кластера GPU за минуты. Кроме того, дочерние воркеры, работающие с неучтенной конкурентностью, создают условия распределенного отказа в обслуживании (DDoS) против внутренних песочниц: перегружают очереди сокетов демона контейнеров, исчерпывают эфемерные сетевые порты и вызывают истощение пула соединений с базой данных. Посмертные отмены, которые отправляет родительский процесс, проходят через асинхронные очереди и часто прибывают тогда, когда дочерние воркеры уже выполнили длинные цепочки избыточных вызовов вывода, за которые начислена плата.

Архитектурное смягчение требует строгой реализации иерархических реестров резервирования бюджета, управляемых принципом наименьших привилегий. В этой архитектуре создание подагента опосредуется транзакционной системой кредитного эскроу («Инварианты реестра бюджета для смягчения каскада подагентов»):

Инвариант реестра бюджетаАрхитектурный механизм обеспеченияПредотвращаемый системный сбой
Нулевые неявные полномочияДочерние воркеры получают строго эфемерные, криптографически ограниченные токены сессии с жесткими лимитами токенов и денег.Не дает воркерам списывать расходы по ключам всей организации или по счетам общего пула родителя.
Строгое сохранение бюджетовРодитель с остатком , порождающий потомка , должен эскроу выделить долю , уменьшая свой реестр.Исключает бесконечное финансовое расширение: дерево расходов флота строго ограничено корневым выделением пользователя: .
Монотонные невозобновляемые лимитыРеестры потомков могут только уменьшаться; пополнение бюджета требует явного блокирующего RPC-запроса к родительскому супервизору.Останавливает разгон в цикле: когда потомок исчерпывает свой микробюджет, его принудительно приостанавливают и помещают в эскроу среды выполнения.
Автоматические выключатели скоростиСупервизор-хост оценивает мгновенную скорость расхода по скользящим окнам.Запускает детерминированное завершение, если скорость расхода токенов превышает безопасные эксплуатационные параметры, изолируя ошибочную рекурсию до исчерпания квоты.

Инварианты реестра бюджета для смягчения каскада подагентов: архитектурные механизмы обеспечения и системные сбои, которые предотвращаются при иерархическом делегировании.

В таком режиме, когда дочерний воркер исчерпывает выделенный эскроу, супервизор среды выполнения перехватывает нарушение границы, прекращает ветви спекулятивного выполнения, возвращает неиспользованные блоки KV-кеша и заставляет родителя обработать сбой детерминированно, а не порождать непроверенных исправляющих воркеров.

Освоение физических и экономических границ обслуживания моделей разрушает иллюзию, будто флоты агентов можно строить как модули без состояния, слабо связанные между собой. Взаимодействие учета стоимости всей траектории, пределов Амдала на критическом пути, динамических порогов спекулятивного декодирования и иерархического управления эскроу показывает, что надежность и экономическая жизнеспособность — эмерджентные свойства всего супервизора среды выполнения. Синтез этих экономических инвариантов в единую системную дисциплину создает основу для устойчивой эксплуатации флота.

Итоги

Агента оплачивает задача, которую он завершил, а не токены, которые он выдал, и каждое проектное решение во флоте оценивается по стоимости и времени на принятую задачу. Эта стоимость включает каждый ход, каждый повторно отправленный контекст, каждую секунду песочницы и каждый прогон теста, а также каждую неудачную попытку, которую отношение шансов относит на успешные попытки. Самый большой член по токенам в длинной траектории — повторно отправленный контекст, поэтому кеширование префикса со стабильной раскладкой — первый рычаг, сжатие окупается только при достаточно длинном оставшемся горизонте, а бюджеты на рассуждения и повторы выбираются тем, позволяет ли надежный верификатор дешевым попыткам остановиться на первом успехе. Время следует за критическим путем в трассе, где часто доминируют инструменты и песочницы, поэтому более быстрый вывод и спекулятивное декодирование окупаются только для вызовов на этом пути и только пока мощность обслуживания не загружена. Каскады с верификаторами не дают передовой модели работать на вызовах, которым она не нужна, при условии что шлюзы проверяют то, что важно. Мощность измеряется в траекториях через закон Литтла, а для размещенных моделей — через квоту провайдера, и выделенная мощность окупается выше точки безубыточности загрузки, которую поднимают скидки на кеш. Деньги — единственный ресурс, который никакое восстановление не возвращает, поэтому резервирования ограничивают то, что может потратить любое поддерево, а ограничения скорости расходов — то, как быстро оно тратит, и тот же учет решает, заслуживает ли задача вообще агента.

Оценивайте принятую задачу, а не токен

  • Неудачные попытки задают цену: стоимость на принятую задачу относит каждую неудачную попытку и каждое немодельное слагаемое на успехи, поэтому модель с намного более дешевыми токенами может стоить в несколько раз дороже за каждую завершенную задачу.
  • Повторно отправленный контекст — самый большой член по токенам: на длинной траектории кеширование префикса с раскладкой только с добавлением снижает счет в несколько раз; одно изменчивое поле в начале промпта сводит эту экономию на нет, а сжатие окупается только при длинном оставшемся горизонте.
  • Трасса решает, куда уходит время: более быстрый вывод, включая спекулятивное декодирование, сокращает траекторию лишь пропорционально доле модели на критическом пути, на котором часто доминируют инструменты и песочницы.
  • Дешевым моделям нужны надежные шлюзы: каскады и повторы снижают стоимость, только когда внешняя проверка останавливает неверные выходы; слабый шлюз превращает экономию в ложные принятия и работу по восстановлению.
  • Мощность и деньги удерживаются траекториями: задавайте конкурентность по времени жизни траекторий, а квоты — по токенам на траекторию, и резервируйте бюджет каждого потомка до того, как он потратит, потому что потраченные деньги никогда не откатываются.

Глава придала количественную форму трем принципам. Полезный выход траекторий и принятая задача (принцип «Полезный выход траекторий и принятая задача») стали уравнением стоимости всей траектории и его отношением шансов, которым оценивается каждый рычаг, от кеширования и каскадов до выделенной мощности. Мощность на уровне времени жизни траектории и планирование с учетом хвоста (принцип «Мощность на уровне времени жизни траектории и планирование с учетом хвоста») стали конкурентностью траекторий по закону Литтла, наблюдением, что квота провайдера ограничивает скорость траекторий, и накоплением хвостовых задержек на последовательных вызовах. Монотонное делегирование (принцип «Монотонное делегирование») стало реестром резервирований, который ни один параллельный потомок не может превысить, что важно, потому что запись в песочнице можно откатить, а доллар — нельзя.

От оцененных частей к одной траектории

Когда каждая часть системы оценена, кто отвечает за каждый переход, когда все они работают на одной траектории, и что остается, чем не может владеть ни одна подсистема?

Глава «Координация нескольких агентов» решила, когда разделение задачи окупается, а эта глава оценила каждую принятую задачу, подготовила мощность под времена жизни траекторий и удерживала расходы в зарезервированных бюджетах. Глава «Заключение» запускает каждую подсистему, которую построила книга, на одной траектории, назначает владельца каждому переходу состояния и заканчивается на границе, которую среда выполнения не может пересечь: спецификации того, ради чего была задача.