Перейти к основному содержимому

Durable Execution — это не Durable Reasoning: чекпоинтинг состояния агента без потери намерения

Сохранение индекса шага агента — это не сохранение состояния его задачи. Системы, которые чекпоинтят выполнение, но не намерение, возобновляются в беглые, бессвязные прогоны.

Крупный план серверной стойки со светодиодными индикаторами состояния и подписанными сетевыми кабелями, подключёнными к коммутатору.

Две вещи, называемые состоянием

Чекпоинт в рантайме агента обычно фиксирует механику прогона: какой узел графа выполнился, какой инструмент был вызван, что вернул инструмент, какое ребро ожидает. Это состояние выполнения. Его достаточно, чтобы ответить на вопрос «где была машина?»

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

Движки durable execution хорошо справляются с курсором. Они воспроизводят журнал шагов, пропускают завершённую работу и возвращают управление на первом незавершённом шаге. Это правильное поведение для workflow, смысл которого фиксирован в момент определения. Агент — не такой. Его смысл реконструируется на каждом шаге из истории, которую он видит, а история — не то же самое, что намерение, её породившее. Восстановите курсор без контракта — и прогон не упадёт. Он продолжится бегло, в неверном направлении, с тем же уверенным тоном, что и до прерывания.

Перепланирование из устаревшей цели

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

Дублирование побочных эффектов

Классический случай: последний вызов инструмента завершился успешно, но подтверждение было потеряно. Движок durable execution, который возобновляется на первом незавершённом шаге, повторит вызов. Если вызов — это charge_card, send_email или create_ticket, у прогона теперь их два. Это не отказ рассуждения; это отказ контракта чекпоинта. Журнал зафиксировал намерение вызвать, а не факт эффекта, и эти двое различимы только если сам эффект несёт ключ, который распознаёт нижележащая система.

Close-up of a modern building facade with geometric design and reflective windows

Дрейф допущений

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

Работоспособный контракт чекпоинта

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

  • Цель в той форме, которой прогон сейчас привержен, а не в той, с которой он был запущен.
  • Принятые ограничения, каждое с указанием точки прогона, в которой оно было принято, и источника, который его утвердил.
  • Результаты инструментов, ключёванные по ключу идемпотентности, а не по порядку вызовов.
  • Неисполненные обязательства: что прогон обещал сделать, но ещё не сделал.
  • Версию схемы, чтобы чекпоинт, записанный более старым рантаймом, был распознаваем как таковой.

Механизм, который делает это работоспособным на практике, — это ключ идемпотентности в области прогона, выведенный из стабильных входов, а не из настенных часов или последовательности:

key = hash(run_id, step_name, canonical_args)

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

Второй механизм — отказ. Чекпоинт несёт версию схемы, и рантайм отказывается возобновляться между несовместимыми версиями, вместо того чтобы пытаться выполнить миграцию по мере возможности. Миграция намерения — это перепланирование, а перепланирование должно быть явной, логируемой операцией с человеком или![Colorful absIridescent swirls in a soap bubble texture, resembling an oil slickCircuit board macro

Когда не возобновлять

Durable execution — это значение по умолчанию, а не универсальное благо. Три случая говорят в пользу повторного входа, а не продолжения.

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

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

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

Компромисс

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

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

Что записывать

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

ПоделитьсяXLinkedInПостоянная ссылка5 мин чтения

Связанное чтение

На какие вопросы это отвечает

What is the difference between execution state and intent state in an agent run?

Execution state is the cursor: which step ran, which tool returned what, what is pending. Intent state is the goal, the accepted constraints, the assumptions committed to, and the unresolved obligations. A checkpoint that stores only the cursor can resume the machine but not the reasoning.

Why do resumed agents produce duplicate side effects?

Because the journal records the intent to call a tool, not the fact of the effect. If the call succeeded but the acknowledgement was lost, replay re-issues it. Run-scoped idempotency keys derived from stable inputs let the downstream system recognise the replay and return the prior result instead of repeating the effect.

When should a run not be resumed?

When it crossed an authorisation boundary, when the gap since the last checkpoint exceeds the half-life of the external facts it depends on, or when an accepted constraint has been withdrawn at its source. These cases call for re-approval or re-planning, not continuation.

Should checkpoints be migrated across schema versions?

No. Migration of intent is a re-plan and should be an explicit, logged operation. The runtime should version the checkpoint schema and refuse to resume across incompatible versions rather than attempting a silent best-effort migration.