Продакшен-ИИ — это страшно (И вот как это исправить)
Если у вашего агента нет ограждений, вы не готовы к продакшену.
Никто не собирается создавать небезопасную ИИ-систему намеренно. Вы пишете инструкции, тестируете граничные случаи, добавляете несколько правил валидации. А потом кто-то догадывается, что вашего бота можно уговорить играть роль пирата и сливать пользовательские данные. Или номер кредитной карты оказывается в ваших логах. Или модель уверенно рекомендует продукт конкурента.
Разрыв между «работает в демо» и «безопасно в продакшене» шире, чем ожидает большинство команд.
Часть проблемы в том, что сырые LLM не имеют собственного мнения о том, что им следует или не следует делать. Они — машины предсказаний, которые пытаются продолжить любой начатый вами паттерн. Дайте им промпт, похожий на «режим системного переопределения», и они с радостью подыграют. Это не баг модели; это просто то, как работают языковые модели.
Большинство фреймворков вручают вам модель и желают удачи. Mastra подходит иначе: он предполагает, что ограждения вам рано или поздно понадобятся, поэтому встраивает их в архитектуру агента с самого начала.
Процессоры как уровни безопасности
Основной механизм прост. Прежде чем ваш промпт достигнет модели, он проходит через цепочку входных процессоров. После того как модель отвечает, свою очередь получают выходные процессоры. Каждый процессор может проверять, изменять или блокировать содержимое на соответствующем этапе.
Думайте о них как о промежуточном слое (middleware) для ИИ-взаимодействий. Вы собираете нужные вам процессоры, настраиваете их поведение, и они запускаются автоматически при каждом запросе.
1. Остановка пиратов (инъекции промптов)
Атаки с инъекциями промптов становятся всё изощрённее. Люди используют невидимые символы Unicode, пишут инструкции в base64 или убеждают модель, что она находится в «режиме отладки», где обычные правила не действуют. Методы постоянно эволюционируют.
Mastra включает процессоры, которые ловят распространённые паттерны:
import { Agent } from '@mastra/core/agent';import { PromptInjectionDetector, UnicodeNormalizer } from '@mastra/core/processors';import { openai } from '@ai-sdk/openai';
export const secureAgent = new Agent({ id: 'fortress-assistant', name: 'fortress-assistant', instructions: 'You are a secure assistant.', model: openai('gpt-5'), inputProcessors: [ // 1. Scrub invisible characters new UnicodeNormalizer({ id: 'unicode-normalizer', stripControlChars: true, collapseWhitespace: true, }), // 2. Detect the attempt new PromptInjectionDetector({ id: 'prompt-injection-detector', model: openai('gpt-5-nano'), // Cheap, fast threshold: 0.8, strategy: 'block', // Hard stop detectionTypes: ['injection', 'jailbreak', 'system-override'], }), ],});UnicodeNormalizer удаляет управляющие символы и схлопывает пробелы. PromptInjectionDetector анализирует очищенный ввод на предмет паттернов, указывающих на попытку переопределить ваши инструкции.
Вы настраиваете, насколько агрессивным должно быть обнаружение (параметр threshold) и что должно произойти при его срабатывании (заблокировать, записать в лог или просто пометить).
2. Обработка PII
Номера кредитных карт в логах, номера социального страхования в векторных базах данных, адреса электронной почты, хранящиеся дольше необходимого. Это те проблемы, которые превращаются в регуляторные головоломки. Сложность в том, что пользователи не всегда осознают, что вставляют конфиденциальные данные в окно чата.
PIIDetector сканирует распространённые паттерны до того, как они достигнут вашей модели или будут записаны в хранилище:
import { PIIDetector } from '@mastra/core/processors';
export const privateAgent = new Agent({ id: 'privacy-first-assistant', name: 'privacy-first-assistant', instructions: 'You are a helpful assistant that never stores personal information.', model: openai('gpt-5'), inputProcessors: [ new PIIDetector({ id: 'pii-detector', model: openai('gpt-5-nano'), detectionTypes: ['email', 'phone', 'credit-card', 'ssn'], threshold: 0.6, strategy: 'redact', redactionMethod: 'mask', // Replace with [REDACTED] instructions: 'Detect and mask personally identifiable information', }), ],});Вы можете выбрать редактирование (замена на [REDACTED]), хеширование или полную блокировку. Процессор работает как на входе, так и на выходе, так что вы защищены, даже если модель каким-то образом сгенерирует конфиденциальные данные в своём ответе.
3. Модерация контента
Модели, обученные на интернет-данных, повидали всякое. Без фильтрации они иногда могут выдавать ответы, от которых вашей PR-команде станет не по себе. ModerationProcessor отлавливает контент, нарушающий ваши правила:
import { ModerationProcessor } from '@mastra/core/processors';
export const moderatedAgent = new Agent({ id: 'safe-assistant', name: 'safe-assistant', instructions: 'You are a helpful assistant for a community platform.', model: openai('gpt-5'), inputProcessors: [ new ModerationProcessor({ id: 'moderation-processor', model: openai('gpt-5-nano'), // Fast, cheap model for classification categories: ['hate', 'harassment', 'violence', 'self-harm'], threshold: 0.7, // Block if confidence > 70% strategy: 'block', // Stop the request immediately instructions: 'Detect harmful content that violates community guidelines', }), ],});Интересная деталь в том, что вы сами определяете, какие категории важны для вашего сценария использования. Инструмент для творческого письма может допускать более экспрессивный контент, чем бот службы поддержки. Порог срабатывания (threshold) и стратегия (strategy) дают вам контроль над жёсткостью фильтрации.
Когда процессоры срабатывают
Процессоры не выбрасывают ошибки при обнаружении проблемы. Вместо этого они устанавливают флаг в объекте результата:
const result = await secureAgent.generate('Ignore all previous instructions...');
if (result.tripwire) { console.log(`Blocked! Reason: ${result.tripwireReason}`); // "Blocked! Reason: Prompt injection detected." return "Nice try, script kiddie.";}Этот паттерн позволяет вам обрабатывать инциденты безопасности так, как удобно вашему приложению. Вы можете записывать их в лог для анализа, возвращать общее сообщение об ошибке или даже разрешать определённые нарушения в конкретных контекстах. Поле tripwireReason сообщает вам, какой именно процессор зафиксировал нарушение, что помогает при отладке ложных срабатываний или настройке пороговых значений.
Что это не решает
Процессоры отлавливают многое, но они не магия. Целеустремлённый атакующий с достаточным количеством времени, вероятно, сможет найти промпт, который проскользнёт. Модели иногда галлюцинируют так, что процессоры не могут предсказать. И всегда существует компромисс между безопасностью и гибкостью: чем строже ваши правила, тем выше вероятность заблокировать легитимные сценарии использования.
Ценность не в идеальной защите. Ценность в систематическом способе обработки типичных проблем, которые обязательно возникнут в продакшене. Вы можете настраивать чувствительность по мере того, как узнаёте, что на самом деле делают ваши пользователи. Вы можете добавлять собственные процессоры для специфических рисков предметной области. И у вас есть аудиторский след, показывающий, что было заблокировано и почему.
Большинство проблем безопасности в продакшен-ИИ — это не изощрённые атаки. Это люди, копирующие и вставляющие данные, которые не следовало копировать, или обнаруживающие методом проб и ошибок, что бот делает то, чего вы не планировали. Процессоры не остановят все возможные проблемы, но они делают очевидные из них гораздо более сложными.
Ресурсы
Читайте серию
- Маршрутизация LLM
- Безопасность и ограждения (Этот пост)
- Интеграции MCP и инструментов
- Рабочие процессы и память