Реализация Content Safety фильтров для AI-генерации в мобильном приложении
Когда мобильное приложение генерирует текст, изображения или аудио через AI, пользователь рано или поздно попробует получить нежелательный контент — намеренно или случайно. Модерация через системный промпт («не генерируй вредоносный контент») работает хуже, чем кажется: промпт можно обойти, а отвечать за последствия будете вы.
Что и как фильтруем
Текстовая генерация. OpenAI Moderation API — бесплатный эндпоинт, возвращает оценки по категориям: hate, harassment, self-harm, sexual, violence и их подкатегориям. Latency — 100–200мс, что приемлемо как пост-фильтр:
// iOS — Swift
func moderateContent(_ text: String) async throws -> Bool {
let request = ModerationRequest(input: text)
let response = try await openAIClient.moderations.create(request)
let result = response.results.first!
// Возвращаем true если контент безопасен
return !result.flagged
}
Применяем к пользовательскому вводу (input moderation) и к ответу модели (output moderation). Двойная проверка добавляет ~200–400мс к общей латентности, но даёт защиту на обоих слоях.
Azure Content Safety — более детальная градация (safe / low / medium / high severity) и дополнительные категории для регулируемых рынков. Нужен, если приложение работает в EU/US с требованиями compliance.
Изображения. DALL-E 3 и Stable Diffusion имеют встроенные safety checkers, но их можно обойти adversarial промптами. Дополнительный слой — Google Cloud Vision SafeSearch или AWS Rekognition для постпроверки сгенерированного изображения:
// Android — Google Cloud Vision
suspend fun isImageSafe(imageBytes: ByteArray): Boolean {
val image = Image.newBuilder().setContent(ByteString.copyFrom(imageBytes)).build()
val request = AnnotateImageRequest.newBuilder()
.addFeatures(Feature.newBuilder().setType(Feature.Type.SAFE_SEARCH_DETECTION))
.setImage(image)
.build()
val response = imageAnnotatorClient.batchAnnotateImages(listOf(request))
val safeSearch = response.responsesList.first().safeSearchAnnotation
return safeSearch.adult == Likelihood.VERY_UNLIKELY &&
safeSearch.violence == Likelihood.VERY_UNLIKELY
}
Пользовательский контент и UGC-риски
Если пользователь загружает контент (фото, текст), который передаётся в LLM как контекст — это отдельный вектор риска. Изображение может содержать встроенный текст с инструкциями (prompt injection через OCR), а текстовый документ — попытку переопределить системный промпт.
Для UGC: модерация до того, как контент попадает в базу; модерация при каждой передаче в AI-пайплайн. Не кэшируйте результат модерации надолго — пользователь может изменить контент.
Логирование нарушений и аппеляции
Каждый заблокированный запрос должен логироваться с категорией нарушения, но без полного текста сообщения (GDPR). Пользователю показываем понятное сообщение, а не технический код ошибки. Предусмотрите механизм оспаривания ложных срабатываний — у всех фильтров есть false positive rate.
Ориентиры по срокам
Базовая интеграция OpenAI Moderation API — 1 день. Двухслойная фильтрация (input + output) с обработкой ошибок — 2–3 дня. Расширенная система с логированием, метриками и механизмом апелляции — 4–5 дней.







