Коли мобільний додаток генерує текст, зображення або аудіо через AI, користувач рано чи пізно спробує отримати небажаний контент – навмисно чи випадково. Модерація через системний промпт («не генеруй шкідливий контент») працює гірше, ніж здається: промпт можна обійти, а відповідати за наслідки будете ви. Ми стикалися з цим десятки разів – клієнти приходять після блокування в App Store через скарги на NSFW-контент. Згідно Section 5.1.2 App Store Review Guidelines та політики Google Play для AI-генерованого контенту, вимагається обов'язкова фільтрація. Тільки багатошарова гарантує відповідність вимогам магазинів застосунків і знижує юридичні ризики, включно з GDPR при логуванні. Наш досвід показує, що комбінація пре- та пост-модерації скорочує кількість скарг на 95%.
Що і як фільтруємо
Текстова генерація. 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. Додає 300–500мс, але знижує false negatives на 15%.
Зображення. 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 } Порівняння фільтрів
| Фільтр | Типи контенту | Середня затримка | Точність (F1 на NSFW) | Ціна |
|---|---|---|---|---|
| OpenAI Moderation | Текст (9 категорій) | 150 мс | 0.94 | Безкоштовно |
| Azure Content Safety | Текст + зображення (4 severity) | 300 мс | 0.97 | $0.001/запит |
| Google Vision SafeSearch | Зображення (adult/violence/racy) | 250 мс | 0.92 | $0.0015/запит |
OpenAI Moderation API обробляє запит у 2 рази швидше за Azure Content Safety для тексту, але Azure дає більш детальну градацію severity, що зручно для тонкого налаштування. Для зображень комбінація Google Vision + Azure Coverage знижує false positive rate на 20%.
Користувацький контент і UGC-ризики
Якщо користувач завантажує контент (фото, текст), який передається в LLM як контекст – це окремий вектор ризику. Зображення може містити вбудований текст з інструкціями (prompt injection через OCR), а текстовий документ – спробу перевизначити системний промпт. Для UGC: модерація до того, як контент потрапляє в базу; модерація при кожній передачі в AI-пайплайн. Не кешуйте результат модерації надовго – користувач може змінити контент.
Логування порушень і апеляції
Кожен заблокований запит повинен логуватися з категорією порушення, але без повного тексту повідомлення (GDPR). Користувачеві показуємо зрозуміле повідомлення, а не технічний код помилки. Передбачте механізм оскарження хибних спрацювань – у всіх фільтрів є false positive rate.
Типові помилки при налаштуванні логування
- Зберігання повного тексту запиту – порушує GDPR. Використовуйте хеш або категорію.
- Відсутність метрик false positive / false negative – ви не відстежуєте якість фільтрації.
- Ігнорування апеляцій – користувачі не можуть оскаржити блокування, що веде до негативу.
Процес роботи і терміни
| Етап | Термін | Результат |
|---|---|---|
| Аудит поточних AI-пайплайнів та виявлення вразливостей | 1–2 дні | Звіт з рекомендаціями |
| Вибір та інтеграція фільтрів (OpenAI Moderation / Azure) | 1–2 дні | Працюючий pipeline модерації |
| Двошарова фільтрація (input + output) з налаштуванням порогів | 1–2 дні | Протестована система |
| Логування порушень з категоризацією та метриками | 1–2 дні | Дашборд false positives |
| Механізм апеляції для користувачів | 1 день | Інтерфейс оскарження |
| Документація та навчання команди | 1 день | Readme, схеми, code review |
Орієнтовні терміни: базова інтеграція – 1 день, двошарова фільтрація – 2–3 дні, розширена система з логуванням і апеляцією – 4–5 днів.
Як вибрати фільтр для вашого проекту?
Якщо застосунок працює тільки з текстом і бюджет обмежений – почніть з OpenAI Moderation. Для зображень або строгих вимог compliance комбінуйте Azure Content Safety і Google Vision. Ми допомагаємо підібрати оптимальну конфігурацію під ваші сценарії. Зв'яжіться з нами – оцінимо проект за 2 дні.
Чому одного промпту недостатньо?
Промпт «не генеруй небезпечний контент» легко обходиться через role-playing або multi-turn атаки. Навіть якщо модель навчена уникати NSFW, adversarial промпти можуть пробити захист. Система фільтрів на стороні сервера зупиняє такі спроби до того, як контент досягне користувача.
Ми – команда з 7-річним досвідом мобільної розробки та 50+ успішними проектами. Гарантуємо, що після інтеграції фільтрів ваш застосунок пройде модерацію App Store і Google Play без проблем. Отримайте консультацію прямо зараз.







