Spaces:
Runtime error
Runtime error
| 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. | |