Вы правда верите, что ваш RAG с доступом к API базы данных и системным промптом «никогда не удаляй таблицы» — это безопасный корпоративный агент? Я вижу этот паттерн каждую неделю. Сначала кто-то собирает прототип на коленке, показывает совету директоров, как ИИ ловко парсит логи и заводит задачи в Jira, а потом эта штука едет в бой с правами администратора. А потом случается реальность. Когда мы внедряем AI-safety в корпоративном проде: контур безопасности для агентов, который не даст навредить бизнесу, нельзя опираться на семантические уговоры. Нейросеть — это не ваш послушный джун. Это вероятностный генератор текста, который в любой момент может сойти с ума от одного неудачного входного параметра. Миф индустрии заключается в том, что безопасность автономных систем решается промпт-инжинирингом. На деле, если вы защищаете инфраструктуру простым текстом, у вас нет защиты.
Карта угроз для автономного агента выглядит как кошмар параноика, и начинается всё с классического превышения полномочий. Представьте агента техподдержки, который читает тикет от внешнего пользователя. В теле тикета лежит невинно выглядящий кусок логов, который на самом деле содержит prompt-инъекцию. Агент пропускает это через инструмент чтения, контекст подменяется, и вот уже модель послушно выполняет скрытую инструкцию — например, вытягивает ключи доступа из соседней таблицы и отправляет их внешним GET-запросом под видом проверки статуса. Это прямая утечка через действия. И никакой системный промпт не спасёт, потому что для трансформера базовые инструкции и внешние данные — это единый недифференцированный массив токенов. А если злонамеренной инъекции нет, агент вполне способен устроить блэкаут сам через каскадные ошибки. Он делает неверный API-вызов, получает 400 Bad Request, галлюцинирует, что нужно перебрать все доступные идентификаторы, и уводит ваш внутренний сервис в глухой отказ за три секунды, исчерпав все доступные пулы соединений.
Рынок до сих пор верит, что безопасность языковой модели — это фильтрация мата на выходе и обертка от OpenAI. Наш подход в Morana Labs прямо противоположен: строгое нулевое доверие к нейросети. Именно поэтому мы фокусируемся на llm-rag-onprem решениях. Мы проектируем safety-контур on-prem исходя из презумпции, что модель уже скомпрометирована и действует как злоумышленник внутри периметра. Контур начинается с аппаратной и программной изоляции. Принцип наименьших привилегий здесь абсолютен: у агента нет и не может быть единого IAM-профиля. Инструмент чтения из базы и инструмент записи в лог живут в изолированных песочницах вроде gVisor или микровиртуалках Firecracker. Вызов каждого инструмента проходит через жёсткий детерминированный шлюз, который нейросеть не контролирует.
Защитные слои не должны зависеть от самой LLM. Это классические guardrails на вход и выход. На входе мы режем известные паттерны инъекций быстрыми специализированными классификаторами. На выходе парсим сырое намерение агента до того, как оно превратится в реальный HTTP-запрос. Политики действий определяются жестким кодом: middleware перехватывает вызов, проверяет лимиты rate-limiting, сверяет контекст запроса с разрешенным скоупом и, если агент начинает вести себя неадекватно, мгновенно дергает kill-switch, обрывая сессию.
class AgentGuardrailMiddleware:
def __init__(self, action_policies):
self.policies = action_policies
self.circuit_breaker = CircuitBreaker(fail_max=3, reset_timeout=60)
def intercept_tool_call(self, tool_name, kwargs, agent_context):
if tool_name not in self.policies.allowed_tools(agent_context.role):
raise SecurityException(f"Privilege escalation attempt: {tool_name}")
if not self.circuit_breaker.allow_request():
self.trigger_kill_switch(agent_context.session_id)
raise CascadingFailureError("Too many destructive loops")
# Детерминированная проверка параметров ДО реального вызова
sanitized_kwargs = self.policies.enforce_limits(tool_name, kwargs)
return self.execute_isolated(tool_name, sanitized_kwargs)Любое действие, радикально модифицирующее состояние системы, всегда должно блокироваться контуром и уходить на подтверждение живому человеку. Агент может подготовить черновик транзакции, сформировать сложный SQL-запрос или собрать JSON для массового обновления профилей клиентов, но финальную кнопку «Отправить» нажимает кожаный мешок. Это единственный стопроцентно гарантированный способ ограничить blast radius — радиус поражения от ошибки модели. Если вы даете агенту права на запись в критические системы без human-in-the-loop, вы осознанно играете в русскую рулетку с собственным бизнесом. При этом логирование инцидентов должно быть железобетонным. Вы пишете в базу не просто статус «модель сделала X», вы сохраняете полный граф состояний: какой промпт был сгенерирован под капотом, какой контекст подтянул RAG-модуль, какой инструмент был выбран и с какими аргументами. Когда агент снесет не ту директорию — а он рано или поздно попытается это сделать, — вам потребуется детальный разбор полетов на уровне конкретных токенов, чтобы залатать очередную дыру в политиках.
Честный трейд-офф, о котором не любят говорить продавцы ИИ-интеграций: жёсткие гардрейлы режут полезность агента. Как только вы закручиваете гайки, обкладываете модель лимитами, песочницами и запретами, она неизбежно становится тупее. Она начинает отказываться выполнять легитимные, но чуть более комплексные задачи, ссылаясь на ложноположительные срабатывания политик безопасности. И здесь кроется главная инженерная задача архитектора — найти баланс между автономной пользой и фатальным риском. Абсолютной безопасности нет и не будет, пока вы пускаете стохастическую математику в свои базы данных. Но правильно спроектированный контур безопасности делает последствия галлюцинаций предсказуемыми и локализуемыми. Либо вы строите этот контур до первого инцидента в проде, либо долго и мучительно оправдываетесь перед инвесторами после.