Разработка ИИ-агентов · Модуль 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 с приостановкой: дойдя до критичного действия, агент не выполняет его, а формирует запрос на подтверждение (что собирается сделать и почему), сохраняет состояние и ждёт ответа человека. После подтверждения — продолжает, после отказа — выбирает другой путь или останавливается. Хороший агент не только умеет действовать, но и умеет вовремя отдать решение человеку — это не слабость, а признак зрелой системы. Проектируйте точки контроля заранее, а не доверяйте необратимое полностью автономному циклу.
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?
Верный ответ: B
B верно. Handoff — смена ответственного за весь диалог; делегирование — временная передача подзадачи с возвратом результата координатору.
Где должны быть реализованы триггеры эскалации критичных действий?
Верный ответ: B
B верно. Как и guardrails, триггеры эскалации навязываются программно. Промпт и описание помогают, но критичную защиту на них не строят.
Что технически представляет собой human-in-the-loop перед необратимым действием?
Верный ответ: B
B верно. Human-in-the-loop — это точка контроля: перед критичным шагом агент приостанавливается и запрашивает подтверждение человека. Это не отказ от автоматизации (A), а её безопасное проектирование.