diff --git a/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts b/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts index a3e5863..1161511 100644 --- a/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts +++ b/services/discord-gateway/src/modules/ai-moderation/cultureLearner.ts @@ -44,16 +44,45 @@ async function learnChannelCulture( .map((m) => `${m.username}: ${m.content}`) .join("\n"); - const prompt = `Anda adalah AI ahli perilaku sosiologis dan budaya online. -Tugas Anda adalah merangkum budaya (culture) dari sebuah channel chat berdasarkan riwayat pesan-pesan yang dianggap bersih (clean/tidak melanggar). + const prompt = `Anda adalah AI ahli sosiologi digital dan pembaca budaya online. +Tugas Anda adalah merangkum KEPRIBADIAN SEBUAH CHANNEL — bagaimana "rasanya" berada di channel ini, +siapa saja anggotanya, dan norma tidak tertulis apa yang berlaku. -Pesan-pesan terakhir: +Pesan-pesan terakhir dari channel (hanya pesan bersih/clean): ${messagesText} -Berdasarkan pesan-pesan di atas, buatlah ringkasan singkat (maksimal 3 paragraf) mengenai gaya bahasa, topik obrolan, dan norma sosial di channel ini. Ringkasan ini akan digunakan oleh sistem AI moderasi untuk memahami konteks dan "inside jokes" yang wajar di channel ini. -Jangan menambahkan teks basa-basi, langsung berikan ringkasannya.`; +Berdasarkan pesan-pesan di atas, buatlah ringkasan singkat (maksimal 4 paragraf) +mengenai: + +1. **"VIBE" channel** — Bagaimana suasana channel ini? Serius dan profesional? Santai dan penuh tawa? + Campuran? Apakah channel terasa hangat, sarkastik, chaos, atau tertib? Jelaskan "feel"-nya. + +2. **Gaya bahasa dan inside jokes** — Bahasa apa yang dominan (Indonesia/Inggris/campuran)? + Apakah ada slang, meme, atau referensi yang khas di channel ini? Istilah-istilah teknis atau + inside joke yang sering muncul? Apakah orang-orang di sini saling sapa atau langsung ke topik? + +3. **Topik utama & aktivitas** — Apa yang biasanya dibahas di channel ini? Coding problem? Ngobrol + santai? Sharing berita? Debat? Apakah ada ritual atau rutinitas (misal "pagi bro", "makan siang")? + +4. **Dinamika sosial & norma tidak tertulis** — Siapa anggota yang paling aktif? Apakah ada tokoh + sentral atau "pengurus" informal? Apakah channel ini ramah ke pendatang baru atau lebih eksklusif? + Norma apa yang berlaku (misal: no politics, no NSFW, strict on-topic, atau bebas)? + +**GAYA RINGKASAN**: Tulislah seperti seorang antropolog yang sedang mendeskripsikan sebuah desa +digital dengan bahasa Indonesia yang hidup dan natural. JANGAN gunakan format bullet point dalam +output — tulis dalam bentuk prosa paragraf yang mengalir. Jangan basa-basi, langsung berikan +ringkasannya. + +Contoh gaya yang baik: "Channel ini adalah pusat komunitas developer dengan vibe santai dan +kekeluargaan. Bahasa dominan campuran Indonesia-Inggris dengan banyak istilah teknis React dan +Rust. Inside joke yang sering muncul adalah soal 'production bug' dan 'deploy Friday' — mereka +punya tradisi saling ledek kalau ada yang nge-deploy pas Jumat sore. Topik utama adalah debug +help, code review, dan kadang curhat karir. Channel sangat ramah ke pendatang baru — setiap +pertanyaan baru selalu direspons dengan antusias. Norma tidak tertulis: dilarang keras promosi +judi/NSFW, tapi selain itu bebas. Ada dua anggota senior yang jadi 'mom' channel—sabar jelasin +hal dasar ke newbie tanpa judge."`; try { const completion = await llmChat({ diff --git a/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts b/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts index 0fd00ad..b1a2c21 100644 --- a/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts +++ b/services/discord-gateway/src/modules/ai-moderation/moderationPrompt.ts @@ -545,8 +545,51 @@ Struktur wajib: ] } +## PERSONALITY & MEMORY — Gunakan Profil Pengguna dan Kultur Channel +Sistem ini memiliki MEMORI tentang setiap pengguna dan channel. Data ini disediakan sebagai bagian dari konteks: + +### Profil Pengguna (user_profile) +Setiap pesan mungkin disertai tag user_profile yang berisi ringkasan kepribadian pengguna — gaya komunikasi, topik favorit, dan cara mereka berinteraksi dengan orang lain. **Gunakan informasi ini untuk personalisasi:** + +- **Jika profil menunjukkan pengguna biasanya santai/bercanda**: Analisis bisa menggunakan tone yang lebih memahami konteks — misalnya "Pengirim yang biasanya bercanda tentang coding, kali ini..." jika sesuai. +- **Jika ada perubahan perilaku mencolok**: Misalnya pengguna yang biasanya teknis/formal tiba-tiba mengirim konten provokatif — ini patut dicatat dalam analysis sebagai perilaku yang tidak sesuai profil mereka. +- **Jika profil menunjukkan pengguna sering membahas topik tertentu**: Gunakan sebagai konteks. Misal "Pengirim yang hobi coding dan diskusi teknis, sedang bertanya tentang error programming." +- **JANGAN menghakimi berdasarkan profil**: Profil adalah konteks, bukan bukti. Jika pesan bersih, jangan flag hanya karena profil mencurigakan. +- **JANGAN overfit**: Jika profil tidak relevan dengan pesan saat ini, jangan paksa referensi. Kadang analysis cukup tanpa menyebut profil. + +### Kultur Channel (channel_culture) +Beberapa channel mungkin menyertakan tag channel_culture yang menjelaskan topik dan vibe channel. **Gunakan untuk konteks:** +- Jika channel culture menyebut channel ini adalah tempat diskusi coding → lebih mudah menganggap pesan teknis sebagai normal/AMAN. +- Jika channel culture menyebut channel ini adalah tempat santai/off-topic → slang dan candaan lebih wajar. +- **JANGAN** gunakan channel culture untuk mengabaikan pelanggaran nyata. + +### Prinsip Memory-Aware Moderation +1. **PERSONALITY**: Jadikan analysis terasa personal — seolah-olah sistem "mengenal" pengguna. Bukan template generik. +2. **CONTEXT**: Gunakan profil untuk memahami apakah pesan ini TYPICAL atau ANOMALOUS untuk pengguna tersebut. +3. **FAIRNESS**: Profil tidak pernah menjadi alasan untuk mem-flag pesan yang bersih, atau membersihkan pesan yang melanggar. +4. **NATURAL**: Jangan paksa referensi profil. Jika tidak relevan, analysis yang natural tanpa profil lebih baik daripada dipaksakan. + ## FORMAT WAJIB — Field "analysis" HARUS deskriptif berdasarkan konten: +### Contoh Analysis dengan Personality (baru): + +**Contoh A — User profiling membantu:** +Input: [target] user=dev_ganteng: Gess benerin dong kode error ini [stack trace panjang] +Profil user: Gaya komunikasi santai dan teknis. Sering coding, React/Node.js. Aktif membantu anggota lain. +Analysis baik: "Pengirim yang antusias dengan coding sedang meminta bantuan debugging dengan stack trace lengkap. Percakapan teknis yang konstruktif. Sesuai dengan profilnya sebagai developer aktif yang sering berbagi kode. Tidak ada pelanggaran." +Analysis buruk: "Pesan berisi teks teknis tanpa pelanggaran." (generik, tidak personal) + +**Contoh B — Perilaku mencolok (deviasi dari profil):** +Input: [target] user=santai_bos: Anjing lu pada goblok semua, pada ngerti apa? +Profil user: Gaya komunikasi sangat santai dan ramah. Sering menggunakan emot. Jarang marah. Topik: gaming, meme. +Analysis baik: "Pengirim yang biasanya ramah dan santai tiba-tiba melontarkan makian kolektif ke arah anggota lain. Ini adalah perilaku yang tidak sesuai dengan profilnya yang biasanya positif. Harassment terarah dengan kata kasar. Perlu ditindak." +Analysis buruk: "Pesan mengandung makian. Melanggar aturan." (kehilangan konteks penting bahwa ini tidak biasa untuk user ini) + +**Contoh C — Profil tidak relevan (jangan dipaksakan):** +Input: [target] user=budi99: wkwk ngakak +Analysis baik: "Pengirim tertawa dengan slang Indonesia 'wkwk' dan 'ngakak'. Ekspresi humor biasa, tidak ada pelanggaran." +Analysis buruk: "Pengirim yang biasanya membahas coding sedang tertawa. Sesuai dengan profilnya." (dipaksakan) + ### Jika HANYA TEKS (tidak ada gambar/media): Tulis: "Pengirim membahas tentang . . ." Contoh baik: "Pengirim membahas tentang makan siang dengan teman-teman. Percakapan santai menggunakan slang Indonesia. Tidak ada pelanggaran." @@ -595,7 +638,10 @@ CRITICAL: - JANGAN PERNAH menyebutkan nama / username pengguna secara langsung. Selalu gunakan kata "Pengirim" atau "Pengguna". - Selalu sebutkan ISI KONTEN secara spesifik — apa yang dibicarakan, apa yang terlihat di gambar. - Gunakan informasi dari Media analysis untuk mendeskripsikan gambar. -- Analisis harus MEMBERI KONTEKS, bukan hanya menyatakan status.`; +- Analisis harus MEMBERI KONTEKS, bukan hanya menyatakan status. +- GUNAKAN untuk personalisasi analysis — jadikan analysis terasa seperti sistem "mengenal" pengguna. +- Jika perilaku pesan menyimpang dari profil yang diketahui, CATAT dalam analysis sebagai informasi kontekstual yang relevan. +- JANGAN paksa referensi profil jika tidak relevan — analysis natural lebih baik dari yang dipaksakan.`; // --------------------------------------------------------------------------- // Composer: assembles all sections with XML delimiters diff --git a/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts b/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts index 12df91b..004bf5d 100644 --- a/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts +++ b/services/discord-gateway/src/modules/ai-moderation/userProfileLearner.ts @@ -43,25 +43,49 @@ async function learnUserProfile( .map((m) => m.content) .join("\n"); - const prompt = `Anda adalah AI ahli psikologi dan analisis perilaku online. -Tugas Anda adalah merangkum profil kepribadian seorang pengguna berdasarkan -riwayat pesan-pesan mereka di server Discord. + const prompt = `Anda adalah AI ahli psikologi, analisis perilaku online, dan pembaca karakter. +Tugas Anda adalah merangkum profil kepribadian SEORANG PRIBADI — bukan sekadar statistik +gaya bicara — berdasarkan riwayat pesan-pesan mereka di server Discord. +Buatlah ringkasan yang KAYA AKAN PERSONALITAS sehingga pembaca merasa "mengenal" orang ini. Pesan-pesan terakhir dari user "${userId}": ${messagesText} -Berdasarkan pesan-pesan di atas, buatlah ringkasan singkat (maksimal 3 paragraf) +Berdasarkan pesan-pesan di atas, buatlah ringkasan singkat (maksimal 4 paragraf) mengenai: -1. Gaya komunikasi (formal/casual/teknis/bercanda/serius) -2. Topik-topik yang sering dibahas -3. Kepribadian dan karakter yang terpancar -4. Cara berinteraksi dengan orang lain -Ringkasan ini akan digunakan oleh sistem AI moderasi untuk memahami konteks -dan kebiasaan pengguna saat memoderasi pesan mereka. -Jangan menambahkan teks basa-basi, langsung berikan ringkasannya.`; +1. **Gaya komunikasi & ciri khas bicara** — formal/casual/teknis/bercanda/sarkastik/enteng. + Apakah orang ini suka pake singkatan, emot, reaksi berlebihan ("WKWKWK"), atau nada datar? + Bagaimana mereka memulai dan mengakhiri pembicaraan? + +2. **Topik-topik yang sering dibahas** — apa PASSION mereka? Coding, gaming, musik, debat? + Apakah mereka inisiator topik atau lebih suka merespon? + +3. **Kepribadian dan karakter yang terpancar** — Apakah mereka ramah dan hangat? Kritis dan analitis? + Easy going? Gampang marah? Humoris? Supportif? Suka memprovokasi? Suka membantu? + Apa "vibe" yang mereka pancarkan secara keseluruhan? + +4. **Cara berinteraksi dengan orang lain** — Apakah mereka sering memulai percakapan? + Lebih suka 1-on-1 atau grup? Suka nge-tag orang? Gampang akrab atau menjaga jarak? + Apakah mereka populer di komunitas? Sering dibalas orang lain? + +5. **Kebiasaan unik / signature** — Apakah ada pola bicara khas, kata favorit, atau inside joke + yang sering mereka gunakan? Apa yang membedakan mereka dari anggota lain? + +**GAYA RINGKASAN**: Tulislah seperti seorang pengamat yang cerdas dan hangat sedang mendeskripsikan +seorang teman. Gunakan bahasa Indonesia alami. Berikan "rasa" dari orang ini — bukan hanya fakta kering. +JANGAN gunakan format bullet point dalam output. Tulis dalam bentuk prosa paragraf. +Jangan menambahkan teks basa-basi seperti "berikut ringkasannya". Langsung berikan ringkasannya. + +Contoh gaya yang baik: "Pengirim adalah developer yang sangat teknis dan antusias. Gaya bicaranya santai +dan penuh dengan inside joke tentang coding. Ia sering membantu anggota lain dengan error programming +dan punya selera humor yang kering — suka melontarkan sarkasme ringan yang mudah dikenali. Topik +favoritnya adalah React, Rust, dan game indie. Dalam percakapan, ia cenderung proaktif membahas +solusi dan jarang terlibat drama. Secara keseluruhan, ia adalah anggota yang konstruktif dan aset +komunitas, meskipun kadang blak-blakan saat kesal. Bila ia tiba-tiba melontarkan makian personal +atau konten SARA, itu akan SANGAT tidak sesuai dengan karakternya dan patut dicurigai."`; try { const completion = await llmChat({