Skip to content

Yapay Zeka Destekli Moderasyon (AI Moderation)

Cloudflare Workers AI (Llama 3.1 8B) ile otomatik şikayet kalkanı, şikayet analizi ve kurs kalite ön incelemesi.

Achidemy, Cloudflare Workers AI (Meta Llama 3.1 8B Instruct) kullanarak DMCA/şikayet süreçlerini ve kurs onay akışını destekleyen yapay zeka tabanlı moderasyon sistemine sahiptir. Bu sistem, yöneticilerin iş yükünü azaltır ve platformun Safe Harbor yükümlülüklerini güçlendirir.


ÖzellikAçıklama
ModelCloudflare Workers AI: @cf/meta/llama-3.1-8b-instruct
Bindingcontext.cloudflare.env.AI — wrangler.toml’da [ai] binding tanımlı olmalı
ErişimŞikayet analizi ve kurs incelemesi sadece admin rolü
Otomatik kalkanÖğrenci şikayetinde tetiklenir; eşik aşılırsa kurs otomatik yayından kaldırılır

1. Otomatik Moderasyon Kalkanı (Auto-Takedown)

Section titled “1. Otomatik Moderasyon Kalkanı (Auto-Takedown)”

Öğrenci bir kursu şikayet ettiğinde (reportCourse mutation), sistem aktif (pending) şikayet sayısını kontrol eder. Eşik değerine (varsayılan 5) ulaşıldığında kurs otomatik olarak incelemeye alınır ve pazardan kaldırılır.

  • Mutation: reportCourse(input: ReportCourseInput!): Boolean
  • Dosya: app/graphql/schema.tsMutation.reportCourse resolver
  1. Şikayet course_reports tablosuna insert edilir.
  2. Aynı kurs için status = "pending" olan şikayet sayısı hesaplanır.
  3. Sayı ≥ 5 ise:
    • Kurs status = "pending_review", isMarketplaceVisible = false yapılır.
    • Eğitmene uyarı bildirimi gönderilir (createNotification + runBackground).
    • Bildirim dili getNotificationLangForUser ile eğitmenin ülkesine göre seçilir (TR/EN).
    • sendEmailOpt: true ile e-posta da tetiklenir.
  • Sabit: 5 (kod içinde if (pendingCount >= 5)).
  • Değiştirmek için app/graphql/schema.ts içindeki reportCourse resolver’ında eşik kontrolünü güncelleyin.

2. AI Şikayet Analizi (analyzeCourseReports)

Section titled “2. AI Şikayet Analizi (analyzeCourseReports)”

Admin, bir kursa gelen tüm şikayetleri yapay zeka ile özetleyebilir. Model; ortak nedenleri, metinlerdeki linkleri, kritiklik skorunu ve eylem tavsiyesini üretir.

query AnalyzeCourseReports($courseId: ID!) {
analyzeCourseReports(courseId: $courseId) {
summary
commonReasons
extractedLinks
criticalityScore
recommendation
}
}
AlanTipAçıklama
summaryString!Tüm şikayetlerin genel özeti (Türkçe)
commonReasons[String!]!Tespit edilen ortak sorun etiketleri (örn. Telif, Spam)
extractedLinks[String!]!Şikayet metinlerinden çıkarılan URL’ler
criticalityScoreInt!1–10 arası kritiklik (10 en acil)
recommendationString!Yöneticiye eylem tavsiyesi
  • Sadece user.role === "admin" erişebilir.
  • Kurs için hiç şikayet yoksa "Bu kurs için henüz şikayet bulunmuyor." hatası döner.
  • Sistem yönergesi: Platform güvenlik yöneticisi rolü.
  • Görevler: Ortak problemleri bul, URL’leri ayıkla, kritiklik skoru ver, sadece JSON dön.
  • Girdi: Her şikayet Şikayet N - Neden: X | Açıklama: Y formatında birleştirilir.
  • Bileşen: AIReportAnalyzerapp/routes/admin.reports.$courseId.tsx içinde tanımlı (inline).
  • Sayfa: /admin/reports/:courseId — Şikayet detay sayfasında “Achidemy AI Moderatör” paneli.
  • Buton: “Tüm Şikayetleri Analiz Et” — GraphQL query tetikler, sonuç kartlarda gösterilir.
  • Görsel: Kritiklik skoruna göre renk (8+ kırmızı, 5–7 amber, <5 yeşil).

3. AI Kurs Kalite Ön İncelemesi (analyzeCourseContentForAdmin)

Section titled “3. AI Kurs Kalite Ön İncelemesi (analyzeCourseContentForAdmin)”

Admin, bir kursu onaylamadan önce yapay zeka ile kalite ve uyumluluk kontrolü yapabilir. Model; başlık, açıklama, müfredat, fiyat, kapak görseli ve tanıtım videosu durumunu inceler.

query AnalyzeCourseContentForAdmin($courseId: ID!) {
analyzeCourseContentForAdmin(courseId: $courseId) {
summary
contentIssues
missingAssets
profanityDetected
qualityScore
recommendation
}
}
AlanTipAçıklama
summaryString!Kursun genel durumu hakkında 2 cümlelik özet
contentIssues[String!]!Argo/küfür içeren başlıklar veya sorunlu metinler
missingAssets[String!]!Eksik gereksinimler (kapak görseli, tanıtım videosu vb.)
profanityDetectedBoolean!Küfür/argo tespit edildi mi?
qualityScoreInt!1–10 arası kalite skoru
recommendationString!Yöneticiye eylem tavsiyesi (onaylanmaya hazır / eksikler giderilmeli)
  • Sadece user.role === "admin" erişebilir.
  • Kurs bulunamazsa "Kurs bulunamadı." hatası döner.
  • Kurs meta: Başlık, açıklama (HTML etiketleri temizlenmiş), fiyat, kapak görseli var mı, tanıtım videosu var mı.
  • Müfredat: Bölüm başlıkları ve her dersin adı + süresi (saniye).
  • Sistem yönergesi: Global eğitim platformu “Kalite ve Uyumluluk Kontrol (QA)” asistanı.
  • Görevler:
    1. Argo, küfür, nefret söylemi, spam veya anlamsız metin var mı?
    2. Fiyat mantıklı mı?
    3. Kapak görseli ve tanıtım videosu eksik mi?
    4. Müfredat yeterli mi? (ders yok, süre sıfır vb.)
    5. 1–10 arası kalite skoru ver.
  • Çıktı: Sadece geçerli JSON; markdown veya normal metin yasak.
  • Bileşen: AICourseReviewerapp/components/admin/AICourseReviewer.tsx
  • Sayfa: /admin/course/:slug/preview — Kurs önizleme sayfasında sağ sütunda, video ve fiyat kartının arasında.
  • Buton: “Otomatik Tara” — GraphQL query tetikler.
  • Görsel:
    • profanityDetected → Kırmızı (ShieldAlert) veya yeşil (CheckCircle) kart.
    • missingAssets → Amber uyarı kartı.
    • qualityScore → 8+ yeşil, 5–7 amber, <5 kırmızı dairesel badge.

  • wrangler.toml: [ai] binding ile AI değişkeni tanımlanmalı.
  • Context: GraphQL resolver’larında context.cloudflare.env.AI veya (cloudflare as any)?.env?.AI kullanılır.
  • Kontrol: if (!AI?.run)"AI servisi kapalı." hatası.

Model bazen markdown kod bloğu içinde JSON döndürebilir. Tüm AI resolver’larında:

const raw = aiResponse?.response?.trim() ?? "";
const cleanJsonStr = raw
.replace(/```json\s*/gi, "")
.replace(/```\s*/g, "")
.trim();
const parsed = JSON.parse(cleanJsonStr);

Parse hatasında log + kullanıcıya "Yapay zeka analizi şu anda yapılamıyor." mesajı.

  • AI binding yoksa veya AI.run başarısız olursa → throw new Error("Yapay zeka analizi şu anda yapılamıyor.").
  • Frontend’de toast.error(...) ile kullanıcıya gösterilir.

DosyaAçıklama
app/graphql/schema.tsreportCourse (auto-takedown), analyzeCourseReports, analyzeCourseContentForAdmin resolver’ları
app/routes/admin.reports.$courseId.tsxAIReportAnalyzer (şikayet analizi UI)
app/components/admin/AICourseReviewer.tsxKurs kalite ön incelemesi UI
app/routes/admin.course.$slug.preview.tsxAICourseReviewer entegrasyonu