0Pricing
AI Engineering Academy · Урок

Эскалация с участием человека

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

«Эскалация с участием человека» — бесплатный урок AI Engineering Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Engineering Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Engineering Academy содержит 4 уроков всего.

Когда агентам требуется руководство человека

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

Определение триггеров эскалации

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

from enum import Enum

class EscalationReason(Enum):
    LOW_CONFIDENCE = 'low_confidence'           # model uncertainty
    DESTRUCTIVE_ACTION = 'destructive_action'   # irreversible change
    AMBIGUOUS_TASK = 'ambiguous_task'           # unclear instructions
    RETRY_BUDGET_EXHAUSTED = 'retry_exhausted'  # too many failures
    POLICY_BOUNDARY = 'policy_boundary'         # approaching limit
    HUMAN_REQUESTED = 'human_requested'         # explicit request
    TIMEOUT = 'timeout'                         # took too long

ESCALATION_THRESHOLDS = {
    'min_confidence': 0.6,
    'max_retries': 5,
    'max_runtime_minutes': 30,
}

Обнаружение низкой уверенности

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

from pydantic import BaseModel

class ConfidenceCheck(BaseModel):
    proposed_action: str
    confidence: float  # 0.0 to 1.0
    uncertainty_reason: str | None
    proceed: bool

async def check_confidence(context: str, proposed_action: str) -> ConfidenceCheck:
    return await judge_client.chat.completions.create(
        model='gpt-4o',
        response_model=ConfidenceCheck,
        messages=[{
            'role': 'user',
            'content': f'Context: {context}\n\nI am about to: {proposed_action}\n\nHow confident am I that this is correct? Be honest about uncertainty.'
        }]
    )

Обнаружение разрушительных действий

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

from dataclasses import dataclass
from typing import Callable

@dataclass
class Tool:
    name: str
    func: Callable
    destructive: bool = False
    description: str = ''

tools = [
    Tool('search_web',     search_web,      destructive=False),
    Tool('read_file',      read_file,       destructive=False),
    Tool('write_file',     write_file,      destructive=True,  description='Overwrites existing file'),
    Tool('send_email',     send_email,      destructive=True,  description='Sends real email to user'),
    Tool('delete_records', delete_records,  destructive=True,  description='Permanent DB deletion'),
]

def requires_approval(tool: Tool) -> bool:
    return tool.destructive

Приостановка агента и ожидание ввода

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

import asyncio

async def escalate_and_wait(task_id: str, reason: EscalationReason, context: str,
                             question: str, timeout_hours: int = 24) -> str:
    # Save checkpoint
    save_checkpoint(load_checkpoint(task_id))
    # Create escalation record
    escalation_id = create_escalation(task_id, reason, context, question)
    # Notify reviewer
    notify_reviewer(escalation_id, question)
    # Wait for response (polling with timeout)
    deadline = asyncio.get_event_loop().time() + timeout_hours * 3600
    while asyncio.get_event_loop().time() < deadline:
        response = get_escalation_response(escalation_id)
        if response:
            return response.guidance
        await asyncio.sleep(60)  # check every minute
    raise TimeoutError(f'Escalation {escalation_id} not answered within {timeout_hours}h')

Создание интерфейса проверяющего

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

# FastAPI escalation endpoint
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class EscalationResponse(BaseModel):
    escalation_id: str
    decision: str  # 'approve', 'reject', 'guide'
    guidance: str | None = None
    reviewer_id: str

@app.post('/escalations/{escalation_id}/respond')
async def respond_to_escalation(esc_id: str, response: EscalationResponse):
    escalation = get_escalation(esc_id)
    if not escalation or escalation.status != 'pending':
        return {'error': 'Escalation not found or already resolved'}
    save_escalation_response(esc_id, response)
    return {'status': 'response_recorded', 'task_will_resume': True}

Внедрение рекомендаций человека в контекст агента

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

def inject_human_guidance(messages: list, decision: str, guidance: str | None) -> list:
    if decision == 'approve':
        messages.append({
            'role': 'user',
            'content': 'Supervisor: Your proposed action has been approved. Proceed.'
        })
    elif decision == 'reject':
        messages.append({
            'role': 'user',
            'content': f'Supervisor: Your proposed action was rejected. Instead: {guidance}'
        })
    elif decision == 'guide':
        messages.append({
            'role': 'user',
            'content': f'Supervisor: Additional guidance: {guidance}'
        })
    return messages

Отслеживание показателей эскалаций

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

def escalation_report(db_connection, days: int = 7) -> dict:
    # SQL query (pseudocode)
    rows = db_connection.execute('''
        SELECT
            reason,
            COUNT(*) as count,
            AVG(EXTRACT(EPOCH FROM (responded_at - created_at)) / 3600) as avg_response_hours,
            SUM(CASE WHEN decision = 'approve' THEN 1 ELSE 0 END) as approvals,
            SUM(CASE WHEN decision = 'reject' THEN 1 ELSE 0 END) as rejections
        FROM escalations
        WHERE created_at > NOW() - INTERVAL '%s days'
        GROUP BY reason
        ORDER BY count DESC
    ''' % days).fetchall()
    return [dict(r) for r in rows]

Постепенное расширение автономности

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

# Autonomy expansion strategy:
# Week 1: escalate for ALL destructive actions
# Week 2: auto-approve file writes to /tmp (low-risk), escalate others
# Week 4: auto-approve all file writes, escalate only email/DB changes
# Week 8: auto-approve emails under 10 recipients, escalate mass emails

# Track approval rates per trigger type:
# Tool: write_file    -> 98% approve -> safe to automate
# Tool: send_email    -> 89% approve -> near-automate with content check
# Tool: delete_records -> 43% approve -> always escalate

Аварийное вмешательство и отмена задачи

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

async def run_agent_with_cancel(task_id: str, messages: list) -> str:
    for step in range(MAX_ITERATIONS):
        # Check cancel flag at start of every step
        if redis_client.get(f'agent:cancel:{task_id}'):
            save_final_status(task_id, 'cancelled')
            return 'Task cancelled by operator.'
        response = await get_next_action(messages)
        if response.is_final:
            return response.answer
        result = await execute_tool(response.tool, response.args)
        messages.append({'role': 'user', 'content': result})
        save_checkpoint_after_step(task_id, step, messages)
    return 'Max iterations reached'

Настройка порогов эскалации

Пороги эскалации требуют настройки. Если порог уверенности слишком высок, агент отправляет на проверку почти каждое действие, перегружая проверяющих. Если он слишком низок, рискованные действия проходят без проверки. В первую неделю начните с консервативных порогов, отслеживайте количество эскалаций и долю одобрений проверяющих, а затем вносите корректировки. Стабильная система должна отправлять на проверку 5–15% задач из-за недостаточной уверенности и почти 100% разрушительных действий; общая доля одобрений при этом должна превышать 80%.

# Threshold tuning guide:
# Escalation rate vs quality trade-off:
#
# confidence_threshold=0.8  -> 35% escalation rate (too many)
# confidence_threshold=0.6  -> 12% escalation rate (target)
# confidence_threshold=0.4  ->  4% escalation rate (too few)
#
# Weekly review of escalation decisions:
# - Approval rate > 90%: lower threshold (too conservative)
# - Approval rate < 70%: raise threshold (not catching real issues)
# - Target: 75-85% approval rate

Быстрая проверка

Проверьте, насколько хорошо вы понимаете проектирование эскалаций с участием человека.

Итоги урока

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

Часто задаваемые вопросы

Урок «Эскалация с участием человека» бесплатный?

Да — полный текст урока «Эскалация с участием человека» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Engineering Academy, подпишись на CoddyKit PRO. Курс AI Engineering Academy содержит 4 уроков всего.

Чему я научусь в уроке «Эскалация с участием человека»?

Определите условия эскалации, при которых агент приостанавливается и запрашивает указания человека: когда уверенность низкая, должно произойти разрушительное действие или исчерпан лимит повторных поп… Ты практикуешь AI Engineering Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Engineering Academy?

Предыдущий опыт не требуется. AI Engineering Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Эскалация с участием человека»?

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

Можно ли писать и запускать код в этом уроке AI Engineering Academy?

Да. Каждый урок AI Engineering Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Классификация режимов отказа агента
  2. Самокоррекция и рефлексивное создание промптов
  3. Контрольные точки и возобновление задач
  4. Эскалация с участием человека
← Назад к AI Engineering Academy