From a0bf7dfdd99e61499fb1292af6fdbfa13d7bca0e Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Fri, 5 Jun 2026 15:28:04 +0700 Subject: [PATCH] chore(ai-moderation): harden LLM prompt and lexical scanner against evasion techniques and cross-lingual vulgarities --- .../ai-moderation/indonesianTextNormalizer.ts | 12 +++++- .../modules/ai-moderation/moderationPrompt.ts | 39 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts b/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts index 9b10017..b68315b 100644 --- a/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts +++ b/services/discord-gateway/src/modules/ai-moderation/indonesianTextNormalizer.ts @@ -134,6 +134,10 @@ const BADWORD_CATEGORIES: BadwordEntry[] = [ "kacang", "edan", "gila", + "titten", + "bitch", + "whore", + "slut" ], }, { @@ -162,6 +166,8 @@ const BADWORD_CATEGORIES: BadwordEntry[] = [ "unta", "bangke", "bangsat", + "kys", + "kill yourself" ], }, { @@ -217,6 +223,8 @@ const BADWORD_CATEGORIES: BadwordEntry[] = [ "dasar cina", "dasar tionghoa", "dasar pribumi", + "nigger", + "nigga" ], }, ]; @@ -391,9 +399,9 @@ export function buildModerationTextEvidence( } if (badwordHits.length > 0) { - notes.push(`Indonesian badword detected: ${badwordHits.join(", ")}`); + notes.push(`Known badword detected: ${badwordHits.join(", ")}`); } else { - notes.push("no Indonesian badword detected"); + notes.push("no known badword detected"); } return { diff --git a/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts b/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts index d5a0339..cf30fd5 100644 --- a/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts +++ b/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts @@ -40,6 +40,11 @@ Pedoman ini mencerminkan nilai-nilai yang dijunjung server. Terapkan dengan bija - Perbedaan pendapat itu wajar. Serangan personal, penghinaan, dan merendahkan orang lain tidak. - **Pelecehan Agama / Candaan Berlebihan:** Dilarang keras menjadikan tata cara ibadah (seperti sholat), simbol agama, atau ritual sebagai bahan candaan satir, meme, atau parodi (contoh: sholat di depan foto Stalin, menggabungkan ibadah dengan tokoh/entitas tidak pantas). Meskipun konteksnya humor atau satir, "candaan berlebihan" terkait agama WAJIB di-flag sebagai "sara". +### Anti-Evasion & Obfuscation (STRICT RULE) +- **Zalgo / Leetspeak / Simbol:** Pesan yang menggunakan karakter simbolik acak, Zalgo text, atau leetspeak (misal: "++++++K1[[ your $€/F", "b1tch", "k0nt0l") adalah TEKNIK EVASI. JANGAN PERNAH menganggapnya sebagai "pesan abstrak", "typo", atau "tanpa makna". KAMU WAJIB mendekode/membaca makna aslinya. Jika maknanya merujuk pada "kill yourself", "die", ancaman, atau kata kasar, FLAG sebagai "harassment" atau "hate_speech" dengan severity "high" atau "critical". +- **Bahasa Asing & Vulgaritas Obscure:** Kata-kata vulgar atau ofensif dalam bahasa asing/slang (seperti "titten" (German for tits), "nigger", "kys", "whore") ADALAH PELANGGARAN. JANGAN abaikan atau anggap sebagai "bercanda/tidak bermakna serius" hanya karena menggunakan huruf kapital (mis. "AKU RAJA TITTEN") atau bahasa non-Indonesia. +- **Zero Tolerance untuk Evasi:** Setiap indikasi bahwa user mencoba menyembunyikan kata kasar/ancaman di balik simbol HARUS langsung di-flag. Jangan beri toleransi atau label "clean". + ### Hindari Konflik dan Jaga Kedamaian - Dilarang memancing keributan, drama, atau pertengkaran di channel umum. - Ajakan/mengumpat untuk menyelesaikan masalah personal di channel publik → "conflict_instigation". @@ -185,7 +190,15 @@ Output: {"results":[{"message_id":"12121","status":"flagged","flags":["offensive Contoh 12 — Username ofensif (isi pesan memperkuat): Input: [target] id=13131 user=nazi_babi_itu: bener tuh nih ras emang harus dibasmi -Output: {"results":[{"message_id":"13131","status":"flagged","flags":["offensive_username","hate_speech","sara"],"score":0.9,"categories":["offensive_username","hate_speech","sara"],"severity":"high","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Username 'nazi_babi_itu' mengandung unsur SARA","bener tuh nih ras emang harus dibasmi"],"analysis":"nazi_babi_itu memiliki username SARA dan isi pesan memperkuat tone kebencian dengan ajakan kekerasan terhadap ras tertentu. Pelanggaran berat."}]}`; +Output: {"results":[{"message_id":"13131","status":"flagged","flags":["offensive_username","hate_speech","sara"],"score":0.9,"categories":["offensive_username","hate_speech","sara"],"severity":"high","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Username 'nazi_babi_itu' mengandung unsur SARA","bener tuh nih ras emang harus dibasmi"],"analysis":"nazi_babi_itu memiliki username SARA dan isi pesan memperkuat tone kebencian dengan ajakan kekerasan terhadap ras tertentu. Pelanggaran berat."}]} + +Contoh 13 — Obfuscation / Zalgo Text (Evasion): +Input: [target] id=14141 user=hater: ++++++K1[[ your $€/F" "~`| \0ve $ 1F ¥°U |}iE ®© +Output: {"results":[{"message_id":"14141","status":"flagged","flags":["harassment","hate_speech"],"score":0.95,"categories":["harassment","hate_speech"],"severity":"critical","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["++++++K1[[ your $€/F","\\0ve $ 1F ¥°U |}iE"],"analysis":"Pesan menggunakan teknik obfuscation/simbol untuk menyembunyikan frasa 'Kill yourself I love if you die'. Ini adalah ancaman dan pelecehan berat yang disamarkan."}]} + +Contoh 14 — Vulgaritas Bahasa Asing / All-Caps: +Input: [target] id=15151 user=troll: AKU RAJA TITTEN +Output: {"results":[{"message_id":"15151","status":"flagged","flags":["vulgar_language"],"score":0.85,"categories":["vulgar_language"],"severity":"medium","confidence":0.9,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["AKU RAJA TITTEN"],"analysis":"Pesan menggunakan kata vulgar bahasa asing ('titten' berarti payudara dalam bahasa Jerman) dengan huruf kapital. Ini adalah pelanggaran vulgar_language meskipun formatnya seperti candaan."}]}`; /** * Text-only examples extracted from FEW_SHOT_EXAMPLES for text-mode prompts. @@ -223,7 +236,15 @@ Output: {"results":[{"message_id":"12121","status":"flagged","flags":["offensive Contoh 12 — Username ofensif (isi pesan memperkuat): Input: [target] id=13131 user=nazi_babi_itu: bener tuh nih ras emang harus dibasmi -Output: {"results":[{"message_id":"13131","status":"flagged","flags":["offensive_username","hate_speech","sara"],"score":0.9,"categories":["offensive_username","hate_speech","sara"],"severity":"high","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Username 'nazi_babi_itu' mengandung unsur SARA","bener tuh nih ras emang harus dibasmi"],"analysis":"nazi_babi_itu memiliki username SARA dan isi pesan memperkuat tone kebencian dengan ajakan kekerasan terhadap ras tertentu. Pelanggaran berat."}]}`; +Output: {"results":[{"message_id":"13131","status":"flagged","flags":["offensive_username","hate_speech","sara"],"score":0.9,"categories":["offensive_username","hate_speech","sara"],"severity":"high","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Username 'nazi_babi_itu' mengandung unsur SARA","bener tuh nih ras emang harus dibasmi"],"analysis":"nazi_babi_itu memiliki username SARA dan isi pesan memperkuat tone kebencian dengan ajakan kekerasan terhadap ras tertentu. Pelanggaran berat."}]} + +Contoh 13 — Obfuscation / Zalgo Text (Evasion): +Input: [target] id=14141 user=hater: ++++++K1[[ your $€/F" "~`| \0ve $ 1F ¥°U |}iE ®© +Output: {"results":[{"message_id":"14141","status":"flagged","flags":["harassment","hate_speech"],"score":0.95,"categories":["harassment","hate_speech"],"severity":"critical","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["++++++K1[[ your $€/F","\\0ve $ 1F ¥°U |}iE"],"analysis":"Pesan menggunakan teknik obfuscation/simbol untuk menyembunyikan frasa 'Kill yourself I love if you die'. Ini adalah ancaman dan pelecehan berat yang disamarkan."}]} + +Contoh 14 — Vulgaritas Bahasa Asing / All-Caps: +Input: [target] id=15151 user=troll: AKU RAJA TITTEN +Output: {"results":[{"message_id":"15151","status":"flagged","flags":["vulgar_language"],"score":0.85,"categories":["vulgar_language"],"severity":"medium","confidence":0.9,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["AKU RAJA TITTEN"],"analysis":"Pesan menggunakan kata vulgar bahasa asing ('titten' berarti payudara dalam bahasa Jerman) dengan huruf kapital. Ini adalah pelanggaran vulgar_language meskipun formatnya seperti candaan."}]}`; /** * Media-capable examples extracted from FEW_SHOT_EXAMPLES for media-mode prompts. @@ -266,7 +287,15 @@ Output: {"results":[{"message_id":"12121","status":"flagged","flags":["offensive Contoh 12 — Username ofensif (isi pesan memperkuat): Input: [target] id=13131 user=nazi_babi_itu: bener tuh nih ras emang harus dibasmi -Output: {"results":[{"message_id":"13131","status":"flagged","flags":["offensive_username","hate_speech","sara"],"score":0.9,"categories":["offensive_username","hate_speech","sara"],"severity":"high","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Username 'nazi_babi_itu' mengandung unsur SARA","bener tuh nih ras emang harus dibasmi"],"analysis":"nazi_babi_itu memiliki username SARA dan isi pesan memperkuat tone kebencian dengan ajakan kekerasan terhadap ras tertentu. Pelanggaran berat."}]}`; +Output: {"results":[{"message_id":"13131","status":"flagged","flags":["offensive_username","hate_speech","sara"],"score":0.9,"categories":["offensive_username","hate_speech","sara"],"severity":"high","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["Username 'nazi_babi_itu' mengandung unsur SARA","bener tuh nih ras emang harus dibasmi"],"analysis":"nazi_babi_itu memiliki username SARA dan isi pesan memperkuat tone kebencian dengan ajakan kekerasan terhadap ras tertentu. Pelanggaran berat."}]} + +Contoh 13 — Obfuscation / Zalgo Text (Evasion): +Input: [target] id=14141 user=hater: ++++++K1[[ your $€/F" "~`| \0ve $ 1F ¥°U |}iE ®© +Output: {"results":[{"message_id":"14141","status":"flagged","flags":["harassment","hate_speech"],"score":0.95,"categories":["harassment","hate_speech"],"severity":"critical","confidence":0.95,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["++++++K1[[ your $€/F","\\0ve $ 1F ¥°U |}iE"],"analysis":"Pesan menggunakan teknik obfuscation/simbol untuk menyembunyikan frasa 'Kill yourself I love if you die'. Ini adalah ancaman dan pelecehan berat yang disamarkan."}]} + +Contoh 14 — Vulgaritas Bahasa Asing / All-Caps: +Input: [target] id=15151 user=troll: AKU RAJA TITTEN +Output: {"results":[{"message_id":"15151","status":"flagged","flags":["vulgar_language"],"score":0.85,"categories":["vulgar_language"],"severity":"medium","confidence":0.9,"recommended_action":"delete","policy_version":"default-2026-05-30","evidence":["AKU RAJA TITTEN"],"analysis":"Pesan menggunakan kata vulgar bahasa asing ('titten' berarti payudara dalam bahasa Jerman) dengan huruf kapital. Ini adalah pelanggaran vulgar_language meskipun formatnya seperti candaan."}]}`; // --------------------------------------------------------------------------- // Section: Output Schema + XML Delimiter Instructions @@ -323,6 +352,10 @@ Tulis: "[user] memiliki username yang . . . . ." +Contoh baik: "hater menggunakan teknik simbol acak untuk menyamarkan frasa 'kill yourself'. Ini adalah ancaman nyata yang di-obfuscate. Melanggar kebijakan keselamatan." + ### Jika sexual_deviation: Tulis: "[user] . . Melanggar kebijakan server." Contoh baik: "fox mempromosikan identitas LGBT dan komunitas furry. Melanggar kebijakan server terkait penyimpangan seksual."