sentinel-api / README.md
Mustafa Öztürk
Fix HF metadata emoji
5bdeec3
---
title: Sentinel API
emoji: "🛡️"
colorFrom: blue
colorTo: green
sdk: docker
app_port: 7860
pinned: false
---
# Sentinel API
# Hibrit İçerik Moderasyon Sistemi
Türkçe ve İngilizce kullanıcı içeriklerini düşük gecikmeyle analiz edip zararlı içeriği otomatik sınıflandıran, kara liste + yapay zeka modellerini birlikte kullanan katmanlı bir moderasyon sistemidir.
## 1. Proje Amacı
Bu proje, gerçek zamanlı içerik moderasyonunda hem hızlı hem de yüksek doğruluklu karar üretmek için kural tabanlı filtreleri ve makine öğrenmesi modellerini tek bir hibrit akışta birleştirir.
## 2. Kullanılan Teknolojiler
- `Python 3.x`
- `FastAPI` (API servis katmanı)
- `Uvicorn` (ASGI sunucu)
- `Streamlit` (moderasyon paneli)
- `PyTorch` (inference altyapısı)
- `Transformers` (BERTurk tokenizer/model yükleme)
- `Detoxify` (toxicity, insult, threat, identity attack skorları)
- `Supabase` (canlı kara liste veritabanı)
- `Pandas` / `Openpyxl` (toplu veri analizi)
- `Scikit-learn` / `Matplotlib` (değerlendirme ve raporlama)
## 3. Proje Dizin Yapısı
```text
moderasyon/
├─ main.py
├─ app.py
├─ utils.py
├─ performance_test.py
├─ stress_test.py
├─ vram_check.py
├─ requirements.txt
├─ models_cache/
│ ├─ bertturk-offensive-42k/
│ └─ bertturk-hate-speech/ # v4 raporunda aktif akıştan çıkarıldı
└─ app/
├─ api/
│ └─ endpoints.py
├─ core/
│ └─ config.py
├─ db/
│ └─ supabase_client.py
├─ ml/
│ └─ model_loader.py
├─ services/
│ ├─ cache_manager.py
│ └─ moderation_service.py
└─ utils/
└─ text_utils.py
```
## 4. Sistem Nasıl Çalışır?
Sistem, gelen metni önce temizler, sonra spam/gibberish ve kara liste kontrollerini yapar, en son gerekli ise ML modellerini çalıştırıp tek bir karar motorunda sonucu üretir.
### 4.1 Genel Akış
```mermaid
flowchart TD
A[POST /analyze] --> B[clean_text_nfkc]
B --> C{is_spam?}
C -- Evet --> D[SPAM/GIBBERISH - Early Exit]
C -- Hayir --> E[Supabase Cache Kontrolu]
E --> F{Dil}
F -- TR --> G[BERTurk Offensive + Detoxify Multilingual]
F -- EN --> H[Gibberish Detector + Detoxify Original]
G --> I[calculate_verdict]
H --> I
I --> J[decision + risk + action + latency_ms]
```
### 4.2 TR Pipeline
- Metin normalize edilir (`NFKC`, obfuscation temizliği, leet dönüşümü).
- `is_spam()` hızlı kuralları çalışır; pozitifse model çağrılmaz.
- Supabase kara listesi RAM cache içinden taranır.
- `BERTurk Offensive 42K` ile `off_score` hesaplanır.
- `Detoxify Multilingual` ile toxicity/insult/threat/identity attack skorları alınır.
- `calculate_verdict()` son kararı üretir.
### 4.3 EN Pipeline
- Metin normalize edilir.
- `is_spam()` kontrolü yapılır.
- Supabase EN cache taranır.
- Gibberish detector `noise > 0.98` ise erken çıkış verir.
- `Detoxify Original` 6 etiketli skor üretir.
- `calculate_verdict()` ile nihai sınıflandırma yapılır.
## 5. Modeller, Veri Setleri ve Eğitim Süreci
### 5.1 Kullanılan Veri Setleri
- `Toygar/turkish-offensive-language-detection` (aktif TR modeli)
- Toplam: `53,005`
- Train: `42,398`, Validation: `1,756`, Test: `8,851`
- Etiketler: `0=temiz`, `1=offensive`
- `fawern/turkish-hate-speech` (referans)
- v4 notu: ayrı hate modeli aktif akıştan çıkarılmıştır.
### 5.2 Fine-Tuning Özeti (BERTurk Offensive 42K)
- `num_train_epochs=3`
- `batch_size=16`
- `learning_rate=2e-5`
- `weight_decay=0.01`
- `fp16=True`
- `load_best_model_at_end=True`
Eğitim gözlemi (özet): model ilk epoch'tan sonra hızla iyileşir, sonraki epoch'larda doğruluk artışı sınırlı kalsa da en iyi checkpoint otomatik seçilerek stabil performans korunur.
### 5.3 Neden Hibrit Mimari?
- Sadece blacklist: semantik saldırganlığı kaçırabilir.
- Sadece model: obfuscation ve açık küfürlerde gereksiz gecikme yaratabilir.
- Hibrit yaklaşım: erken çıkış + semantik model kombinasyonuyla hız/doğruluk dengesi sağlar.
## 6. Başarı Metrikleri (Rapor v4)
### 6.1 Model Kalitesi
- TR Accuracy: `%92`
- TR Macro F1: `%92`
- Offensive sınıfı F1: `%92`
### 6.2 Performans
- Tek istek gecikmesi:
- TR: `~90ms - 240ms`
- EN: `~54ms - 111ms`
- Hedef: `<300ms` (karşılanıyor)
### 6.3 Stress Test
- `50` istek, `5` eş zamanlı kullanıcı
- Ortalama gecikme: `319.69ms`
- Throughput: `15.01 req/sec`
- GPU: `RTX 3050 Ti Laptop GPU`
- VRAM: `687.36MB allocated / 750MB reserved`
### 6.4 Gerçek Veri Testi (500 Tweet)
- Toplam süre: `83 saniye` (`~166ms/satır`)
- Dağılım:
- `TEMİZ`: `216` (`%43.2`)
- `KÜFÜR/PROFANITY`: `169` (`%33.8`)
- `SALDIRGAN/TOXIC`: `87` (`%17.4`)
- `İNCELEME GEREKLİ`: `27` (`%5.4`)
- `SPAM/GİBBERİSH`: `1` (`%0.2`)
## 7. API Endpointleri
- `POST /analyze`
- Girdi: `{"text": "...", "platform_dil": "tr|en"}`
- Çıktı: `decision`, `risk_level`, `details`, `latency_ms`
- `GET /refresh-cache`
- Supabase kara listesini sistemi durdurmadan RAM'e yeniden yükler.
- `GET /vram-status`
- GPU bellek kullanımını döndürür.
## 8. Önemli Fonksyonlar
### 8.1 `clean_text_nfkc()` ne yapar?
Dosya: `app/utils/text_utils.py`
- Mesajdaki karakterleri standartlaştırır.
- Gizlenmiş küfürleri görünür hale getirir.
- Örnek: `m.a.l` -> `mal`, `ger1zekalı` -> `gerizekalı`.
Kısaca: Kullanıcı metnini “makine için okunabilir ve karşılaştırılabilir” hale getirir.
### 8.2 `is_spam()` ne yapar?
Dosya: `app/utils/text_utils.py`
- Çok kısa, anlamsız, tekrar eden veya reklam kalıbı içeren metni işaretler.
- Eğer spam ise pahalı model çağrısını atlar.
Kısaca: Sistemin hem hızını artırır hem de gereksiz GPU kullanımını azaltır.
### 8.3 `load_blacklist_to_ram()` ne yapar?
Dosya: `app/services/cache_manager.py`
- Supabase'deki `blacklist` tablosunu sayfalı şekilde çeker.
- TR ve EN kelimeleri ayrı sözlüklerde RAM'e alır.
- `/refresh-cache` çağrısıyla canlı güncellenir.
Kısaca: Kara listeyi veritabanından her istekte tekrar okumadan çok hızlı kullanmayı sağlar.
### 8.4 `run_moderation()` ne yapar?
Dosya: `app/services/moderation_service.py`
- Tüm moderasyon adımlarını sırayla çalıştıran ana fonksiyondur.
- Temizleme -> spam -> kara liste -> model -> karar akışını yönetir.
- Sonuçta API'nin döndüğü tüm karar bilgilerini üretir.
Kısaca: Bu fonksiyon sistemin beyni gibi çalışır.
### 8.5 `calculate_verdict()` ne yapar?
Dosya: `app/services/moderation_service.py`
- Kara liste eşleşmeleri ve model skorlarını tek bir karara dönüştürür.
- Risk seviyesini (`CRITICAL`, `MEDIUM`, `LOW`, `NONE`) belirler.
- Karşılık gelen aksiyonu (`CENSOR`, `MONITOR`, `ALLOW`) tetikler.
Kısaca: Model skorlarını insanlar için anlaşılır moderasyon kararına çevirir.
### 8.6 `/analyze` endpoint'i ne yapar?
Dosya: `app/api/endpoints.py`
- Dış sistemin çağırdığı ana API kapısıdır.
- Metni alır, `run_moderation()` ile analiz eder.
- JSON formatında karar + gecikme bilgisi döndürür.
Kısaca: Platform ile moderasyon motoru arasındaki köprüdür.
## 9. Kurulum ve Çalıştırma
### 9.1 Gereksinimler
- Python 3.10+
- CUDA destekli GPU (önerilir, zorunlu değil)
- Supabase proje bilgileri (`SUPABASE_URL`, `SUPABASE_KEY`)
### 9.2 Kurulum
```bash
pip install -r requirements.txt
```
### 9.3 API'yi Başlatma
```bash
uvicorn main:app --reload
```
### 9.4 Streamlit Paneli Başlatma
```bash
streamlit run app.py
```
## 10. Notlar ve İyileştirme Önerileri
- Bilinen kenar vaka: aşırı tekrar + küfür kombinasyonlarında bazı metinler spam'e düşebilir.
- Öneri 1: tekrar harf sadeleştirmesini spam kontrolünden önce kesinleştir.
- Öneri 2: `İNCELEME GEREKLİ` eşiğini veri dağılımına göre yeniden kalibre et.
- Öneri 3: platformdan gelen etiketli gerçek verilerle periyodik yeniden eğitim yap.
---
Hazırlanan bu README, `Teknik Araştırma & Geliştirme Raporu v4` içeriğini proje kod yapısıyla birlikte tek dokümanda birleştirir.
## 11. Docker ve Hugging Face Spaces Deployment
Bu proje FastAPI servisini `main.py` içindeki `app` nesnesi ile başlatır. Docker imajı içinde doğru başlangıç komutu bu nedenle `uvicorn main:app ...` şeklindedir.
### 11.1 Yerelde Docker ile test
```bash
docker build -t sentinel-api .
docker run --rm -p 7860:7860 \
-e SUPABASE_URL="https://YOUR_PROJECT.supabase.co" \
-e SUPABASE_KEY="YOUR_SUPABASE_KEY" \
sentinel-api
```
Test isteği:
```bash
curl -X POST "http://127.0.0.1:7860/analyze" \
-H "Content-Type: application/json" \
-d '{"text":"örnek metin","platform_dil":"tr"}'
```
### 11.2 Hugging Face Spaces adımları
1. Hugging Face hesabında `New Space` oluştur.
2. `SDK` olarak `Docker` seç.
3. Bu repodaki dosyaları Space'e yükle (`Dockerfile`, `requirements.txt`, `app/`, `main.py`, `models_cache/` vb.).
4. Space ayarlarında `Settings -> Variables and secrets` bölümüne şu secret'ları ekle:
- `SUPABASE_URL`
- `SUPABASE_KEY`
5. Build tamamlandığında servis `7860` portunda ayağa kalkar.
Notlar:
- Bu Docker kurulumunda `torch` CPU wheel olarak yüklenir (HF Spaces free tier için uygun).
- `.dockerignore` dosyası, gereksiz yerel dosyaları imaja dahil etmeyerek build süresini ve imaj boyutunu azaltır.