Уявіть: на форумі щодня публікують 50 000 коментарів. Ручна модерація потребує 12 осіб, кожен пропускає до 3% порушень. Ми стикалися з таким завданням при модернізації великого маркетплейсу — і вирішили його за рахунок каскаду ML-моделей. У цій статті розберемо, як побудувати систему AI-модерації, яка фільтрує спам, токсичність і небажані зображення з точністю >99% при <50 мс затримки.
Користувацький контент — коментарі, відгуки, зображення, повідомлення в чаті — потребує постійного контролю. Автоматика незамінна, коли обсяг перевищує тисячі публікацій на годину. Чисто ручна перевірка тут не масштабується: при 10 000 публікацій на добу команда з п'яти модераторів фізично не впорається. AI-модерація вирішує задачу швидко і дешево, залишаючи людині тільки спірні випадки. Гарантуємо скорочення ручної праці на 80% за рахунок автоматизації.
Що саме піддається автоматичній модерації
Текстовий контент: спам, нецензурна лексика, розпалювання ненависті, погрози, персональні дані у відкритому вигляді. Зображення: відверті матеріали, насильство, порушення авторських прав (через перцептивне хешування). Посилання: фішинг, шкідливі домени. Тональність: токсичні коментарі без явних заборонених слів.
Кожна категорія потребує окремої моделі або окремого API-ендпоінту — універсального рішення немає.
Як працює AI-модерація?
Архітектура будується на одному з трьох патернів.
Синхронна перевірка перед публікацією — користувач відправляє контент, сервер перевіряє його до збереження. Затримка 200–800 мс. Підходить для критичних сценаріїв: оплата відгуків, юридично значущі публікації.
Асинхронна черга — контент зберігається зі статусом pending, фоновий воркер перевіряє через чергу (RabbitMQ, SQS, Redis Streams). Публікація відбувається після схвалення або через N хвилин, якщо порушень немає. Підходить для високонавантажених форумів і чатів.
Гібридна схема — швидка синхронна перевірка за простими правилами (стоп-слова, довжина, патерни) + асинхронна ML-перевірка для тих, хто пройшов первинний фільтр.
POST /api/comment
→ sync: banned words check (< 5ms)
→ sync: OpenAI Moderation API (< 300ms)
→ save with status=published/flagged
→ async: image scan if attachments
Який API обрати?
Порівняння популярних інструментів для модерації тексту та зображень.
| API | Тип контенту | Безкоштовний ліміт | Приблизна ціна | Затримка |
|---|---|---|---|---|
| OpenAI Moderation API | Текст | Так | Безкоштовно | 200-400 мс |
| Google Perspective API | Текст | 1 QPS | $0.25/1000 запитів | 300-600 мс |
| AWS Rekognition | Зображення | 5000 безкоштовних на місяць | $0.001/зображення | 200-500 мс |
| Azure Content Safety | Текст+зображення | 1 млн символів безкоштовно | $0.15/1000 запитів | 300-500 мс |
OpenAI Moderation API обробляє запит у середньому за 200 мс, що в 3 рази швидше за Perspective API при тій же точності. Для російськомовного контенту Perspective дає оцінку токсичності, але може помилятися на сарказмі.
import openai
def moderate_text(content: str) -> dict:
response = openai.moderations.create(input=content)
result = response.results[0]
if result.flagged:
categories = {k: v for k, v in result.categories.__dict__.items() if v}
return {"allowed": False, "categories": categories}
return {"allowed": True}
Google Perspective API — аналіз токсичності з оцінкою від 0 до 1. Атрибути: TOXICITY, SEVERE_TOXICITY, IDENTITY_ATTACK, INSULT, PROFANITY, THREAT. Підтримує російську мову. Квота: 1 QPS безкоштовно, платний тариф від $0.25 за 1000 запитів.
AWS Rekognition — модерація зображень. API DetectModerationLabels повертає ієрархію міток з confidence score. Категорії: Explicit Nudity, Violence, Visually Disturbing, Hate Symbols.
Azure Content Safety — текст і зображення в одному API. Категорії: hate, sexual, violence, self-harm. Кожна оцінюється за шкалою 0–6. Є Groundedness Detection для перевірки фактичності відповідей.
Власна модель на базі fine-tuning
Для специфічного контенту (професійний форум з технічною лексикою, медична платформа) сторонні API дають багато хибних спрацьовувань. Вихід — fine-tuning на своїх даних.
Процес: зібрати датасет із 2000–5000 розмічених прикладів (схвалені/відхилені), донавчити distilbert-base-multilingual-cased через Hugging Face Transformers, розгорнути як окремий сервіс.
from transformers import pipeline
classifier = pipeline(
"text-classification",
model="./moderation-model",
device=0 # GPU
)
def classify_content(text: str) -> tuple[str, float]:
result = classifier(text, truncation=True, max_length=512)[0]
return result["label"], result["score"]
Inference на CPU — ~50 мс на текст до 512 токенів. На GPU (T4) — ~5 мс.
Обробка зображень
Перед відправкою в API потрібна попередня обробка: зміна розміру до 2048px по довгій стороні, конвертація в JPEG з якістю 85%, видалення EXIF-метаданих. Це знижує вартість і прискорює відповідь. Автоматизація дозволяє скоротити штат модераторів у кілька разів, що дає значну економію бюджету. Пілотне впровадження зазвичай окупається протягом кількох місяців.
Для захисту від завантаження заздалегідь відомого забороненого контенту — PhotoDNA (Microsoft) або pHash-порівняння з базою хешів. PhotoDNA інтегрується через Azure, pHash реалізується самостійно:
import imagehash
from PIL import Image
def compute_phash(image_path: str) -> str:
img = Image.open(image_path)
return str(imagehash.phash(img))
def is_known_violation(phash: str, banned_hashes: set, threshold: int = 10) -> bool:
for banned in banned_hashes:
if imagehash.hex_to_hash(phash) - imagehash.hex_to_hash(banned) < threshold:
return True
return False
Dashboard для ручной модерації
Автоматика не приймає рішення по пограничним випадкам — їх потрібно показати модератору. Черга ручної модерації містить:
- контент з confidence 0.4–0.7 (невпевнений результат);
- контент, на який поскаржилися користувачі;
- контент від нових акаунтів без історії.
Інтерфейс: список з фільтрами, гарячі клавіші для швидких рішень (approve/reject/escalate), історія рішень з прив'язкою до оператора, метрики точності по кожному оператору.
Зворотній зв'язок і перенавчання
Модель деградує, якщо контент-патерни змінюються. Цикл покращення:
- Зберігати всі рішення (автоматичні та ручні) з мітками.
- Щотижня аналізувати розбіжності: де автоматика помилилася, модератор виправив.
- Раз на місяць донавчати модель на накопичених виправленнях.
- A/B тестувати нову версію на 10% трафіку перед повним перемиканням.
Моніторинг
Метрики для Grafana/Datadog:
-
moderation.requests.total— загальний обсяг; -
moderation.latency.p99— затримка 99-го перцентиля; -
moderation.flagged.rate— частка заблокованого контенту; -
moderation.false_positive.rate— частка помилкових блокувань (за апеляціями); -
moderation.queue.depth— глибина черги ручної модерації.
Алерт: якщо false_positive.rate > 5% за 24 години — модель потрібно перевірити.
Що входить в роботу
- Інтеграція одного або кількох API (OpenAI, Perspective, Rekognition, Azure).
- Розробка синхронного middleware або асинхронної черги на вашому стеку.
- Dashboard для ручної модерації з історією та метриками.
- Документація по API та архітектурі.
- Навчання команди (2 години онлайн).
- Підтримка 1 місяць після запуску.
Строки реалізації
| Етап | Строк |
|---|---|
| Інтеграція OpenAI Moderation API + базові правила | 3–5 днів |
| Асинхронна черга + статуси контенту | 3–4 дні |
| Dashboard ручної модерації | 5–7 днів |
| Модерація зображень (AWS Rekognition) | 2–3 дні |
| Fine-tuning власної моделі | 10–15 днів |
| Цикл перенавчання + моніторинг | 3–5 днів |
Базова інтеграція з OpenAI Moderation API і чергою ручної перевірки — 2 тижні. Повна система з власною моделлю, моніторингом і dashboard — 5–6 тижнів. Зв'яжіться з нами для пілотного проекту — оцінимо ваше навантаження і запропонуємо рішення. Замовте консультацію з інтеграції.







