feat(ai-moderation): personality-rich user/channel profiling & memory-aware analysis

- moderationPrompt.ts: Add PERSONALITY & MEMORY section instructing LLM to
  use user_profile and channel_culture in analysis, with 3 new few-shot
  examples (normal profile use, deviation detection, don't overfit)
- userProfileLearner.ts: Richer personality summary prompt — asks for
  communication style, passion topics, unique habits/signature traits,
  social dynamics, and writes in warm observer prose
- cultureLearner.ts: Richer channel culture summary — asks for 'vibe',
  inside jokes, social norms, dynamics. Writes in anthropologist style
This commit is contained in:
MythEclipse
2026-06-21 19:11:11 +07:00
parent 21b818a344
commit e5fa2b3f30
3 changed files with 116 additions and 17 deletions
@@ -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):
<messages>
${messagesText}
</messages>
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({
@@ -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 <topik>. <konteks percakapan>. <kesimpulan moderasi>."
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 <user_profile> 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
@@ -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}":
<messages>
${messagesText}
</messages>
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({