Надёжность: гардрейлы, лимиты, человек-в-цикле, песочница

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

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

Четыре уровня защиты

1. Гардрейлы входа и выхода

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

def input_guardrail(request):
    banned = ["удали всё", "сотри базу"]
    if any(b in request.lower() for b in banned):
        return (False, "запрос отклонён гардрейлом")
    return (True, request)

for r in ["посчитай 2+2", "удали всё немедленно"]:
    ok, msg = input_guardrail(r)
    print(f"{r:25} -> допущен: {ok} ({msg})")

Вывод:

посчитай 2+2              -> допущен: True (посчитай 2+2)
удали всё немедленно      -> допущен: False (запрос отклонён гардрейлом)

2. Лимиты шагов и бюджета

Из раздела 3: жёсткий лимит итераций. В продакшне добавляют и лимит бюджета — на число токенов или денег. Как только бюджет исчерпан, агент останавливается, даже если не закончил.

budget = 1000          # лимит «токенов»
spent = 0
cost_per_step = 300

step = 0
while True:
    if spent + cost_per_step > budget:
        print(f"Бюджет {budget} исчерпан на шаге {step+1} — остановка.")
        break
    step += 1
    spent += cost_per_step
    print(f"шаг {step}: потрачено {spent}/{budget}")

Вывод:

шаг 1: потрачено 300/1000
шаг 2: потрачено 600/1000
шаг 3: потрачено 900/1000
Бюджет 1000 исчерпан на шаге 4 — остановка.

3. Человек-в-цикле (human-in-the-loop)

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

def needs_approval(action):
    risky = ["удалить", "оплатить", "отправить"]
    return any(word in action for word in risky)

def execute(action, human_says_yes):
    if needs_approval(action):
        if not human_says_yes:
            return f"ОТКЛОНЕНО человеком: {action}"
        return f"ВЫПОЛНЕНО с одобрения: {action}"
    return f"выполнено автоматически: {action}"

print(execute("посчитать сумму", human_says_yes=False))
print(execute("оплатить счёт 5000", human_says_yes=False))
print(execute("оплатить счёт 5000", human_says_yes=True))

Вывод:

выполнено автоматически: посчитать сумму
ОТКЛОНЕНО человеком: оплатить счёт 5000
ВЫПОЛНЕНО с одобрения: оплатить счёт 5000

4. Песочница для кода

Если агент выполняет код (универсальный инструмент из урока 2.1), делать это нужно в песочнице — изолированном окружении без доступа к вашим файлам, сети и системе. Тогда даже вредоносный или ошибочный код не навредит. На практике это контейнер с ограниченными правами, тайм-аутом и лимитом памяти.

Сводка защит

ЗащитаОт чего
Гардрейлы входа/выходаопасные запросы и ответы
Лимит шагов и бюджетазацикливание и рост стоимости
Человек-в-цикленеобратимые действия
Песочницавред от выполнения кода

Итог

  • Гардрейлы проверяют вход и выход агента; лимиты шагов и бюджета не дают ему «разориться» и зациклиться.
  • Опасные действия проходят через человека-в-цикле; выполнение кода — только в песочнице.
  • Надёжный агент — это автономность, обложенная этими защитами по всем уровням.
Проверьте себя
1. Что делает гардрейл (guardrail) в продакшн-агенте?
AУскоряет вызовы модели
BПроверяет и ограничивает вход и выход агента (опасные запросы, недопустимые ответы)
CХранит долгосрочную память
DВыбирает инструмент по имени
2. Зачем нужен человек-в-цикле (human-in-the-loop)?
AЧтобы ускорить агента
BЧтобы необратимые/опасные действия (трата, удаление, отправка) выполнялись только с одобрения человека
CЧтобы заменить модель человеком полностью
DЧтобы увеличить контекстное окно
3. Почему выполнение кода агентом нужно делать в песочнице?
AПесочница ускоряет код
BИзоляция без доступа к файлам, сети и системе не даёт вредоносному или ошибочному коду навредить
CПесочница обязательна по протоколу MCP
DИначе код не запустится
Поддержать проект