DanLevy.net

Продакшен-ИИ — это страшно (и как это исправить)

Если у вашего агента нет защитных ограничений, вы не готовы к продакшену.

Никто не ставит перед собой цель создать небезопасную ИИ-систему. Вы пишете инструкции, тестируете пограничные случаи, добавляете несколько правил валидации. А потом кто-то выясняет, что может заставить вашего бота отыгрывать пирата и раскрывать данные пользователей. Или номер кредитной карты попадает в логи. Или модель уверенно рекомендует продукт конкурента.

Разрыв между «работает на демо» и «безопасно в продакшене» шире, чем ожидает большинство команд.

Частично проблема в том, что сырые LLM не имеют мнения о том, что им следует или не следует делать. Это машины предсказаний, которые пытаются продолжить любой начатый вами паттерн. Дайте им промпт, который выглядит как «режим системного переопределения», и они с радостью подыграют. Это не баг модели; это просто то, как работают языковые модели.

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


Процессоры как уровень безопасности

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

Думайте о них как о промежуточном ПО для взаимодействия с ИИ. Вы складываете нужные компоненты, настраиваете их поведение, и они автоматически запускаются при каждом запросе.

1. Останавливаем пиратов (инъекции промптов)

Атаки с инъекцией промптов стали изощрёнными. Люди используют невидимые символы Unicode, пишут инструкции в base64 или убеждают модель, что они находятся в «режиме отладки», где обычные правила не действуют. Техники продолжают эволюционировать.

Mastra включает процессоры, которые ловят распространённые паттерны:

src/mastra/agents/secure-agent.ts
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 сообщает, какой именно процессор пометил контент, что помогает при отладке ложных срабатываний или настройке порогов.


Чего это не решает

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

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

Большинство проблем безопасности в продакшен-ИИ — это не изощрённые атаки. Это люди, копирующие и вставляющие данные, которые не следует, или обнаруживающие методом проб и ошибок, что бот делает вещи, которые вы не планировали. Процессоры не остановят каждую возможную проблему, но они делают очевидные гораздо сложнее.

Ресурсы

Читайте серию

  1. Маршрутизация LLM
  2. Безопасность и защитные ограничения (Этот пост)
  3. Интеграции MCP и инструментов
  4. Воркфлоу и память