Panduan Moderasi Konten AI
Discuse memeriksa teks dan gambar untuk sentimen/toksisitas, spam, bahasa yang tidak diinginkan, kata-kata kasar, tautan, dan gambar eksplisit, lalu mengembalikan hasil per kategori agar kode Anda dapat menyetujui, menandai, atau menolak konten secara otomatis. Anda mengirim konten ke satu endpoint, POST https://api.discuse.com/api/v2/check, dan membaca skor terstruktur yang dikembalikan. Panduan ini membahas cara kerja pemeriksaan, pola moderasi di sekitarnya, serta cara menghubungkan Discuse API ke pipeline Anda.
Apa itu moderasi konten AI?
Moderasi konten AI menggunakan model machine-learning untuk mendeteksi dan mengklasifikasikan konten yang berpotensi berbahaya secara otomatis. Jika peninjau manusia membaca satu item dalam satu waktu, model ini menilai konten saat konten tersebut masuk, sehingga kiriman dapat diperiksa sebelum dilihat pengguna lain.
Bagaimana cara kerjanya?
- Kirim konten: Kirim teks dan/atau URL media ke API moderasi.
- Jalankan pemeriksaan: API menjalankan pemeriksaan yang diaktifkan (sentimen, bahasa, spam, kata kasar, gambar, tautan, antivirus).
- Beri skor pada setiap kategori: Setiap pemeriksaan mengembalikan skor dan flag
hityang menunjukkan apakah skor tersebut melewati ambang batas yang Anda konfigurasikan. - Ambil keputusan: Baca
has_violations(serta skor per pemeriksaan) untuk menyetujui, menandai, atau menolak.
Dengan Discuse, permintaannya terlihat seperti ini:
const response = await fetch('https://api.discuse.com/api/v2/check', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.DISCUSE_API_KEY
},
body: JSON.stringify({
content: { text: 'message to check', image_urls: ['https://...'] },
settings: { check_sentiment: true, check_spam: true, check_images: true }
})
});
const result = await response.json(); // { has_violations, results: { sentiment, spamfinder, images, ... }, usage }
Apa saja yang dicakup oleh setiap pemeriksaan Discuse?
Pemeriksaan (toggle settings) |
Cakupan | Field hasil utama |
|---|---|---|
check_sentiment |
Negativitas, toksisitas, kata-kata tidak pantas, ancaman, hinaan dalam teks | sentiment.is_toxic, sentiment.toxicity, sentiment.score, sentiment.hit |
check_spam |
Klasifikasi spam pada teks | spamfinder.label, spamfinder.confidence, spamfinder.is_spam, spamfinder.hit |
check_language |
Apakah teks sesuai dengan bahasa yang diharapkan | language.language, language.confidence, language.hit |
check_badwords |
Kecocokan dengan daftar kata kasar kustom | badwords.hit, badwords.matched_words |
check_images |
Konten gambar eksplisit pada URL gambar | images.porn, images.sexual, images.neutral, images.hit |
check_links |
Reputasi tautan | links.status, links.hit |
check_antivirus |
Malware pada URL dokumen/file | antivirus.status, antivirus.hit |
Setiap toggle berupa boolean. Ambang batas numerik yang mengubah skor menjadi hit dikonfigurasi per proyek di dasbor, bukan dikirim per permintaan — lihat panduan konfigurasi ambang batas.
Manfaat moderasi AI
Skala
AI memproses volume konten yang tidak dapat ditangani oleh tim manusia. Satu panggilan API mengembalikan hasil dalam hitungan milidetik, sehingga moderasi dapat mengimbangi laju kiriman alih-alih tertinggal dalam antrean peninjauan. Padukan pemeriksaan otomatis dengan antrean manusia untuk kasus-kasus yang berada di area abu-abu (dibahas di bawah).
Kecepatan
Pemeriksaan real-time memungkinkan Anda menyaring konten sebelum dipublikasikan:
// Pre-moderation: Check content before publishing
async function publishPost(content) {
const moderation = await checkContent(content);
if (moderation.has_violations) {
return { published: false, reason: moderation.message };
}
// Content passes moderation
return await saveAndPublish(content);
}
Konsistensi
AI menerapkan aturan yang sama secara seragam di seluruh konten, tanpa kelelahan dan tanpa perbedaan antarpeninjau. Keputusan dapat direproduksi: input yang sama dengan ambang batas proyek yang sama akan menghasilkan flag hit yang sama, sehingga penegakan aturan dapat diaudit.
Arsitektur moderasi
Alur pra-moderasi
User Submits → AI Check → Decision
↓
┌───────────┼───────────┐
↓ ↓ ↓
Allow Review Block
↓ ↓ ↓
Publish Human Queue Reject
Alur pasca-moderasi
User Submits → Publish → AI Check → Action
↓
┌────────────┼────────────┐
↓ ↓ ↓
Safe Borderline Violation
↓ ↓ ↓
Keep Flag/Review Remove
Pendekatan hybrid (direkomendasikan)
Respons Discuse menetapkan has_violations begitu pemeriksaan yang diaktifkan melewati ambang batas yang dikonfigurasi, dan menampilkan skor per kategori yang mendasarinya sehingga Anda dapat menambahkan rentang keyakinan Anda sendiri di atasnya:
async function moderateContent(content) {
const result = await checkContent(content);
// Build a confidence figure from the scores you care about.
// e.g. the toxicity score and the spam classifier confidence.
const confidence = Math.max(
result.results?.sentiment?.toxicity ?? 0,
result.results?.spamfinder?.confidence ?? 0,
result.results?.images?.porn ?? 0
);
// High confidence: automate.
if (confidence > 0.95) {
return result.has_violations
? { action: 'auto_remove', reason: result.message }
: { action: 'auto_approve' };
}
// Medium confidence: route to a human.
if (confidence > 0.5) {
await addToReviewQueue(content, result);
return { action: 'pending_review' };
}
// Low confidence: approve, keep watching.
return { action: 'approve_with_monitoring' };
}
Menerapkan moderasi AI
Langkah 1: Tentukan kebijakan Anda
Tentukan konten apa yang dapat diterima dan bagaimana tindakan untuk setiap kategori sebelum Anda memanggil API. Di Discuse, batas numerik untuk setiap kategori berada di pengaturan proyek Anda (dashboard), sehingga kebijakan aplikasi Anda memetakan hasil API ke sebuah tindakan, bukan menentukan ulang ambangnya:
const MODERATION_POLICY = {
// What to do when a given Discuse check reports a hit.
// Thresholds themselves are configured per project in the dashboard.
actions: {
sentiment: 'block', // toxic / threatening text
spam: 'block',
badwords: 'flag',
images: 'block', // explicit imagery
links: 'flag'
}
};
Langkah 2: Integrasikan API
Kirimkan konten dan pemeriksaan yang ingin Anda aktifkan untuk permintaan ini. Setiap toggle check_* adalah boolean opsional yang menimpa default proyek untuk panggilan ini:
async function checkContent(content) {
const response = await fetch('https://api.discuse.com/api/v2/check', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.DISCUSE_API_KEY
},
body: JSON.stringify({
content: {
text: content.text,
image_urls: content.images
},
settings: {
check_sentiment: true,
check_spam: true,
check_images: true
}
})
});
if (!response.ok) {
throw new Error(`Discuse API returned ${response.status}`);
}
return response.json();
}
Langkah 3: Terapkan keputusan
Petakan setiap pemeriksaan yang melaporkan hit ke tindakan yang telah Anda tentukan:
function applyModerationDecision(result) {
const r = result.results || {};
if (r.sentiment?.hit) return { action: MODERATION_POLICY.actions.sentiment, category: 'sentiment' };
if (r.spamfinder?.hit) return { action: MODERATION_POLICY.actions.spam, category: 'spam' };
if (r.images?.hit) return { action: MODERATION_POLICY.actions.images, category: 'images' };
if (r.badwords?.hit) return { action: MODERATION_POLICY.actions.badwords, category: 'badwords' };
if (r.links?.hit) return { action: MODERATION_POLICY.actions.links, category: 'links' };
return { action: 'allow' };
}
Langkah 4: Tangani kasus-kasus khusus
async function handleModerationResult(content, result) {
switch (result.action) {
case 'block':
await notifyUser(content.author, 'content_blocked', result);
await logModeration(content, result);
return false;
case 'flag':
await addToReviewQueue(content, result);
await publishWithWarning(content);
return true;
case 'allow':
await publish(content);
return true;
default:
// Unknown action - fail safe by blocking
await logError('unknown_moderation_action', result);
return false;
}
}
Praktik terbaik
Mulai secara konservatif, lalu sesuaikan seiring waktu
Mulailah dengan ambang batas proyek yang lebih ketat, lalu longgarkan setelah Anda mengukur positif palsu. Di Discuse, ambang batas ini merupakan pengaturan proyek, jadi penyesuaian dilakukan di dashboard (atau melalui API pembaruan pengaturan), bukan di setiap permintaan. Lihat panduan konfigurasi ambang batas untuk alur kerjanya.
Pertahankan antrean peninjauan manusia
AI sebaiknya melengkapi, bukan menggantikan, penilaian manusia untuk kasus-kasus tepi:
async function processReviewQueue() {
const items = await getReviewQueue();
for (const item of items) {
// Present to human reviewer with AI context
const reviewUI = {
content: item.content,
ai_scores: item.moderation_result,
similar_decisions: await getSimilarPreviousDecisions(item)
};
// Human makes final decision
const decision = await presentToReviewer(reviewUI);
// Log for model improvement
await logHumanDecision(item, decision);
}
}
Pantau dan tingkatkan
Lacak metrik utama untuk meningkatkan sistem moderasi Anda:
const METRICS = {
// Accuracy metrics
false_positive_rate: 'Content incorrectly blocked',
false_negative_rate: 'Harmful content missed',
// Operational metrics
average_response_time: 'API latency',
review_queue_depth: 'Human review backlog',
// User impact
appeal_rate: 'Users appealing decisions',
appeal_success_rate: 'Appeals overturned'
};
Tangani banding dengan baik
Saat pengguna mengajukan banding, arahkan item tersebut ke peninjau manusia alih-alih memutuskannya ulang secara otomatis. Berikan skor Discuse asli dan riwayat pengguna kepada peninjau sebagai konteks:
async function handleAppeal(contentId, userId) {
const original = await getContentWithModeration(contentId);
await addToReviewQueue(contentId, {
type: 'appeal',
original_decision: original.moderation, // Discuse `results` saved at decision time
author_history: await getAuthorHistory(userId)
});
return { status: 'pending', message: 'Under review' };
}
API itu sendiri tidak memiliki parameter "context" atau "author history" per permintaan — konteks adalah sesuatu yang Anda terapkan di sisi Anda saat memilih ambang batas dan mengarahkan untuk peninjauan.
Kesalahan umum
Terlalu bergantung pada AI
Mengotomatiskan setiap keputusan berarti mengotomatiskan setiap kesalahan. Tetap libatkan manusia untuk:
- Keputusan kontekstual yang kompleks
- Konten berisiko tinggi (hukum, keselamatan)
- Banding dan kasus khusus
Mengabaikan konteks
Kata-kata yang sama bisa berbahaya atau dapat diterima, tergantung konteksnya:
"I'm going to kill it at this interview!" // Positive
"I'm going to kill you" // Threat
Discuse menilai setiap pesan secara terpisah; Discuse tidak memiliki parameter "konteks" pada tingkat permintaan. Terapkan konteks di sisi Anda: pilih ambang batas proyek yang lebih ketat atau lebih longgar untuk tiap area (postingan publik vs. pesan langsung), dan arahkan hit yang berada di batas abu-abu ke peninjauan manusia.
Sekali atur lalu ditinggal
Moderasi konten memerlukan penyetelan berkelanjutan:
- Pantau tingkat positif palsu/negatif palsu
- Perbarui ambang batas berdasarkan data
- Tinjau pola konten baru
- Latih ulang atau perbarui model
Penegakan yang tidak konsisten
Terapkan kebijakan berdasarkan aturan, bukan berdasarkan siapa yang mempostingnya. Tentukan ambang batas dari tingkat kepercayaan yang terdokumentasi, bukan dari pengecualian ad hoc:
// Avoid: per-person exceptions
if (user.isInfluencer) { /* lenient */ }
// Prefer: thresholds keyed to a documented trust level,
// configured the same way for everyone in that level.
const action = MODERATION_POLICY.actions[category];
Langkah berikutnya
- Mengonfigurasi Ambang Batas - Sempurnakan moderasi Anda
- Menskala Moderasi Konten - Tangani volume tinggi
- Analisis Teks - Pembahasan mendalam tentang moderasi teks
- Deteksi NSFW pada Gambar - Perlindungan konten visual