Разработка ИИ-агентов · Модуль 3 · Урок 3.4

Handoff и эскалация, в том числе к человеку

Handoff: передать задачу профильному агенту

Handoff (передача) — это когда текущий агент понимает, что задача не его профиля, и полностью передаёт её другому агенту. В отличие от hub-and-spoke, где координатор лишь делегирует кусок и ждёт результат, при handoff управление диалогом переходит к новому агенту целиком (классика — поддержка: бот-маршрутизатор определяет тему и передаёт разговор «биллинговому» или «техническому» агенту).

При передаче важно отдать вместе с управлением компактную сводку контекста: кто пользователь, что уже выяснено, чего он хочет. Иначе новый агент начнёт с нуля и заставит пользователя повторяться. Handoff — это смена ответственного, а не потеря памяти.

Эскалация: когда агент должен остановиться

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

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

Ключевой принцип: триггеры эскалации навязываются программно (gate в коде), а не «на усмотрение модели». Если действие превышает лимит суммы или попадает в чувствительную категорию — код обязан остановить агента и потребовать эскалацию, что бы модель ни «думала». Это прямое продолжение идеи guardrails из урока 2.5.

Human-in-the-loop: человек как контур контроля

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

Технически human-in-the-loop — это gate с приостановкой: дойдя до критичного действия, агент не выполняет его, а формирует запрос на подтверждение (что собирается сделать и почему), сохраняет состояние и ждёт ответа человека. После подтверждения — продолжает, после отказа — выбирает другой путь или останавливается. Хороший агент не только умеет действовать, но и умеет вовремя отдать решение человеку — это не слабость, а признак зрелой системы. Проектируйте точки контроля заранее, а не доверяйте необратимое полностью автономному циклу.

Эскалация к человеку: gate с приостановкой перед необратимым действием
type Decision struct {
    Action    string  // что собирается сделать агент
    AmountUSD float64 // сумма (если применимо)
    Reason    string
}

// needsHuman — программный триггер эскалации (модель его не обходит).
func needsHuman(d Decision) bool {
    sensitive := map[string]bool{"refund": true, "delete_account": true, "wire": true}
    return sensitive[d.Action] || d.AmountUSD > 100
}

// applyDecision выполняет действие либо ставит его на подтверждение человеку.
func applyDecision(d Decision, approval func(Decision) bool) (string, error) {
    if needsHuman(d) {
        if !approval(d) { // приостановка: ждём решения человека
            return "отклонено человеком: " + d.Action, nil
        }
    }
    return execute(d) // выполняем только после прохождения gate
}

Anti-patterns

Анти-паттернПочему плохоКак правильно
Handoff без передачи контекстаНовый агент начинает с нуля, юзер повторяетсяПередавать компактную сводку: кто, что выяснено, чего хочет
Эскалацию решает «на глаз» сама модельКритичные действия проскакиваютТриггеры эскалации — программный gate в коде
Необратимое действие в полностью автономном циклеНет точки контроля — дорогие ошибкиHuman-in-the-loop: подтверждение человека перед критичным шагом
Считать эскалацию «провалом» агентаАгент рискует там, где должен остановитьсяВовремя отдать решение человеку — признак зрелой системы

Практическое задание

  • Реализуйте handoff: агент-маршрутизатор определяет тему и передаёт диалог профильному агенту со сводкой контекста.
  • Опишите 3 триггера эскалации для вашей задачи (низкая уверенность, чувствительное действие, вне политики).
  • Сделайте триггеры программными (gate в коде), а не пунктом промпта.
  • Добавьте human-in-the-loop: перед необратимым действием агент формирует запрос на подтверждение и ждёт ответа.
  • Проверьте оба исхода подтверждения: «да» → действие выполнено; «нет» → агент выбрал другой путь или остановился.

Проверка знаний

Чем handoff отличается от делегирования в hub-and-spoke?

  • A Ничем
  • B При handoff управление диалогом полностью переходит к другому агенту; в hub-and-spoke координатор лишь поручает кусок и ждёт результат
  • C Handoff работает без LLM
  • D Handoff возможен только между одинаковыми агентами

Где должны быть реализованы триггеры эскалации критичных действий?

  • A Только в системном промпте — модель решит сама
  • B В коде как программный gate, который агент не может обойти
  • C Нигде, эскалация не нужна
  • D В описании инструмента

Что технически представляет собой human-in-the-loop перед необратимым действием?

  • A Полный отказ от автоматизации
  • B Gate с приостановкой: агент формирует запрос на подтверждение, ждёт ответа человека и продолжает/останавливается
  • C Увеличение safety-cap
  • D Ускорение цикла