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:
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user