From 91b7a2eeafe5707df629cd2038deba7845073a32 Mon Sep 17 00:00:00 2001 From: Power BI Dev Date: Thu, 4 Jun 2026 13:11:16 +0700 Subject: [PATCH] fix: replace LLM guard with simple keyword blocklist --- src/guard.py | 70 +++++++++++++------------------------------- src/handlers/user.py | 12 ++++---- 2 files changed, 26 insertions(+), 56 deletions(-) diff --git a/src/guard.py b/src/guard.py index edba69d..8409bd2 100644 --- a/src/guard.py +++ b/src/guard.py @@ -1,57 +1,29 @@ -""" -Memeriksa apakah pertanyaan user relevan dengan konteks akademik/perkuliahan. -Bot ini hanya melayani topik: pengajaran, riset, kurikulum, administrasi dosen, -jurnal ilmiah, dan kegiatan kampus. -""" - -ACADEMIC_SYSTEM_CHECK = """Anda adalah penjaga topik untuk bot akademik dosen. -Tugasnya HANYA menentukan apakah pertanyaan berikut relevan dengan konteks akademik/perkuliahan. - -Topik yang DIIZINKAN: -- Pengajaran, metode pembelajaran, kurikulum, silabus, RPP -- Riset, jurnal ilmiah, publikasi, metodologi penelitian -- Administrasi kampus, akademik, birokrasi dosen -- Bimbingan mahasiswa, skripsi, tesis, disertasi -- Teknologi pendidikan, e-learning, LMS -- Statistik, analisis data untuk keperluan riset -- Bahasa ilmiah, penulisan akademik -- Konferensi, seminar, workshop akademik - -Topik yang DITOLAK (contoh, tidak terbatas pada ini): -- Saham, investasi, trading, kripto, keuangan pribadi -- Hiburan, gosip, olahraga (kecuali untuk riset) -- Resep masakan, gaya hidup -- Pertanyaan pribadi yang tidak berkaitan dengan profesi dosen -- Politik praktis, agama (kecuali dalam konteks kajian akademik) - -Jawab HANYA dengan satu kata: IZIN atau TOLAK""" - - -async def is_academic_topic(question: str, client, model: str) -> bool: - """Mengembalikan True jika pertanyaan relevan dengan topik akademik.""" - try: - response = await client.chat.completions.create( - model=model, - messages=[ - {"role": "system", "content": ACADEMIC_SYSTEM_CHECK}, - {"role": "user", "content": question} - ], - max_tokens=5, - temperature=0, - ) - verdict = response.choices[0].message.content.strip().upper() - return "IZIN" in verdict - except Exception: - # Jika guard gagal, izinkan saja agar bot tidak mati total - return True - +BLOCKED_KEYWORDS = [ + # Keuangan spekulatif + "saham", "trading", "kripto", "bitcoin", "ethereum", "forex", "investasi saham", + # Hiburan tidak relevan + "gosip", "drakor", "drama korea", "artis", "seleb", "infotainment", + # Perjudian + "judi", "togel", "taruhan", "slot", "kasino", + # Dewasa + "pornografi", "bokep", "xxx", + # Gaming + "mobile legend", "free fire", "pubg", "valorant", "esport", + # Lainnya + "resep masakan", "cara masak", +] REJECT_MESSAGE = ( - "⚠️ Maaf, bot ini khusus untuk kegiatan akademik dan perkuliahan.\n\n" + "⚠️ Maaf, permintaan tersebut di luar cakupan bot ini.\n\n" "Saya dapat membantu dengan:\n" "• 📚 Pengajaran & kurikulum\n" "• 🔬 Riset & penulisan jurnal\n" "• 🎓 Bimbingan mahasiswa\n" "• 🏫 Administrasi kampus\n\n" - "Untuk pertanyaan di luar topik akademik, silakan gunakan layanan lain." + "Silakan ajukan pertanyaan lain." ) + + +def is_blocked(text: str) -> bool: + text_lower = text.lower() + return any(kw in text_lower for kw in BLOCKED_KEYWORDS) diff --git a/src/handlers/user.py b/src/handlers/user.py index d0b92b1..40a81eb 100644 --- a/src/handlers/user.py +++ b/src/handlers/user.py @@ -10,7 +10,7 @@ import database as db import rag import reminder as reminder_module import document as doc_processor -from guard import is_academic_topic, REJECT_MESSAGE +from guard import is_blocked, REJECT_MESSAGE _pending_confirmations: dict = {} REMINDER_KEYWORDS = ["ingatkan", "pengingat", "remind", "jadwalkan", "tolong ingat"] @@ -140,7 +140,7 @@ async def ask(update: Update, context: ContextTypes.DEFAULT_TYPE): question = " ".join(context.args) await update.message.chat.send_action("typing") - if not await is_academic_topic(question, _client, DEEPSEEK_MODEL): + if is_blocked(question): await update.message.reply_text(REJECT_MESSAGE) return @@ -330,11 +330,9 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE): question = text await update.message.chat.send_action("typing") - # Skip guard untuk pertanyaan tentang fitur bot sendiri - if not is_reminder_related: - if not await is_academic_topic(question, _client, DEEPSEEK_MODEL): - await update.message.reply_text(REJECT_MESSAGE) - return + if is_blocked(question): + await update.message.reply_text(REJECT_MESSAGE) + return relevant = await rag.search(user_data["id"], question, n_results=5) context_text = ""