fix: replace LLM guard with simple keyword blocklist
This commit is contained in:
+21
-49
@@ -1,57 +1,29 @@
|
|||||||
"""
|
BLOCKED_KEYWORDS = [
|
||||||
Memeriksa apakah pertanyaan user relevan dengan konteks akademik/perkuliahan.
|
# Keuangan spekulatif
|
||||||
Bot ini hanya melayani topik: pengajaran, riset, kurikulum, administrasi dosen,
|
"saham", "trading", "kripto", "bitcoin", "ethereum", "forex", "investasi saham",
|
||||||
jurnal ilmiah, dan kegiatan kampus.
|
# Hiburan tidak relevan
|
||||||
"""
|
"gosip", "drakor", "drama korea", "artis", "seleb", "infotainment",
|
||||||
|
# Perjudian
|
||||||
ACADEMIC_SYSTEM_CHECK = """Anda adalah penjaga topik untuk bot akademik dosen.
|
"judi", "togel", "taruhan", "slot", "kasino",
|
||||||
Tugasnya HANYA menentukan apakah pertanyaan berikut relevan dengan konteks akademik/perkuliahan.
|
# Dewasa
|
||||||
|
"pornografi", "bokep", "xxx",
|
||||||
Topik yang DIIZINKAN:
|
# Gaming
|
||||||
- Pengajaran, metode pembelajaran, kurikulum, silabus, RPP
|
"mobile legend", "free fire", "pubg", "valorant", "esport",
|
||||||
- Riset, jurnal ilmiah, publikasi, metodologi penelitian
|
# Lainnya
|
||||||
- Administrasi kampus, akademik, birokrasi dosen
|
"resep masakan", "cara masak",
|
||||||
- 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
|
|
||||||
|
|
||||||
|
|
||||||
REJECT_MESSAGE = (
|
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"
|
"Saya dapat membantu dengan:\n"
|
||||||
"• 📚 Pengajaran & kurikulum\n"
|
"• 📚 Pengajaran & kurikulum\n"
|
||||||
"• 🔬 Riset & penulisan jurnal\n"
|
"• 🔬 Riset & penulisan jurnal\n"
|
||||||
"• 🎓 Bimbingan mahasiswa\n"
|
"• 🎓 Bimbingan mahasiswa\n"
|
||||||
"• 🏫 Administrasi kampus\n\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)
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import database as db
|
|||||||
import rag
|
import rag
|
||||||
import reminder as reminder_module
|
import reminder as reminder_module
|
||||||
import document as doc_processor
|
import document as doc_processor
|
||||||
from guard import is_academic_topic, REJECT_MESSAGE
|
from guard import is_blocked, REJECT_MESSAGE
|
||||||
|
|
||||||
_pending_confirmations: dict = {}
|
_pending_confirmations: dict = {}
|
||||||
REMINDER_KEYWORDS = ["ingatkan", "pengingat", "remind", "jadwalkan", "tolong ingat"]
|
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)
|
question = " ".join(context.args)
|
||||||
await update.message.chat.send_action("typing")
|
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)
|
await update.message.reply_text(REJECT_MESSAGE)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -330,9 +330,7 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
|||||||
question = text
|
question = text
|
||||||
await update.message.chat.send_action("typing")
|
await update.message.chat.send_action("typing")
|
||||||
|
|
||||||
# Skip guard untuk pertanyaan tentang fitur bot sendiri
|
if is_blocked(question):
|
||||||
if not is_reminder_related:
|
|
||||||
if not await is_academic_topic(question, _client, DEEPSEEK_MODEL):
|
|
||||||
await update.message.reply_text(REJECT_MESSAGE)
|
await update.message.reply_text(REJECT_MESSAGE)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user