From 795acc7c4096132f80e361d59a99f67fe8670f7c Mon Sep 17 00:00:00 2001 From: "Muhammad.haekal Rahmatullah" Date: Sun, 1 Nov 2026 23:06:04 -0500 Subject: [PATCH] Upload files to "/" --- gemini-code-1793591350535 Haekal.py | 149 ++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 gemini-code-1793591350535 Haekal.py diff --git a/gemini-code-1793591350535 Haekal.py b/gemini-code-1793591350535 Haekal.py new file mode 100644 index 0000000..fdc3ff8 --- /dev/null +++ b/gemini-code-1793591350535 Haekal.py @@ -0,0 +1,149 @@ +import math +import re +from collections import Counter + + +class UKWMSAI_RAG: + """Sistem RAG Sederhana berbasis Pure Python untuk topik Kecerdasan Buatan + + di Teknik Informatika Universitas Katolik Widya Mandala Surabaya (UKWMS). + """ + + def __init__(self, knowledge_base): + print("[INFO] Menginisialisasi Basis Pengetahuan UKWMS - AI...") + self.documents = knowledge_base + self.vocab = self._build_vocab(self.documents) + # Pra-penghitungan vektor TF-IDF untuk dokumen lokal + self.doc_vectors = [ + self._compute_tfidf(doc, self.vocab, self.documents) + for doc in self.documents + ] + + def _tokenize(self, text): + """Membersihkan teks dan memecahnya menjadi kata-kata (token).""" + return re.findall(r"\b\w+\b", text.lower()) + + def _build_vocab(self, docs): + """Membangun kamus kata unik dari seluruh dokumen.""" + vocab = set() + for doc in docs: + vocab.update(self._tokenize(doc)) + return sorted(list(vocab)) + + def _compute_tfidf(self, text, vocab, all_docs): + """Menghitung bobot TF-IDF secara manual tanpa library eksternal.""" + tokens = self._tokenize(text) + tf = Counter(tokens) + total_tokens = len(tokens) if tokens else 1 + + vector = {} + for word in vocab: + # Term Frequency (TF) + term_freq = tf[word] / total_tokens + + # Inverse Document Frequency (IDF) + doc_count = sum(1 for d in all_docs if word in self._tokenize(d)) + idf = ( + math.log(len(all_docs) / (doc_count + 1)) + 1 if doc_count > 0 else 0 + ) + + vector[word] = term_freq * idf + return vector + + def _cosine_similarity(self, vec1, vec2): + """Menghitung kemiripan kosinus antara dua vektor TF-IDF.""" + intersection = set(vec1.keys()).intersection(set(vec2.keys())) + numerator = sum(vec1[x] * vec2[x] for x in intersection) + + sum1 = sum(val ** 2 for val in vec1.values()) + sum2 = sum(val ** 2 for val in vec2.values()) + denominator = math.sqrt(sum1) * math.sqrt(sum2) + + if denominator == 0: + return 0.0 + return numerator / denominator + + def retrieve(self, query, top_k=1): + """Mencari dokumen paling relevan menggunakan Cosine Similarity.""" + query_vector = self._compute_tfidf(query, self.vocab, self.documents) + scores = [] + + for i, doc_vec in enumerate(self.doc_vectors): + score = self._cosine_similarity(query_vector, doc_vec) + scores.append((score, self.documents[i])) + + # Urutkan berdasarkan skor tertinggi + scores.sort(key=lambda x: x[0], reverse=True) + return [doc for score, doc in scores[:top_k]] + + def generate_answer(self, query): + """Tahap Generation: Menggabungkan hasil retrieval dengan format jawaban RAG.""" + retrieved_docs = self.retrieve(query, top_k=1) + context = ( + retrieved_docs[0] + if retrieved_docs + else "Maaf, informasi tidak ditemukan." + ) + + # Template Generator Extractive RAG + answer = ( + f"==================================================\n" + f"HASIL GENERASI RAG - INFORMATIKA UKWMS (KECERDASAN BUATAN)\n" + f"==================================================\n" + f"Pertanyaan : {query}\n\n" + f"Konteks Relevan (Retrieved):\n-> {context}\n\n" + f"Jawaban Sistem:\n" + f"Berdasarkan kurikulum dan data akademik Prodi Informatika UKWMS, " + f"fokus pada bidang Kecerdasan Buatan mencakup informasi berikut:\n" + f'"{context}"\n' + f"==================================================" + ) + return answer, retrieved_docs + + +# ========================================== +# EKSEKUSI PROGRAM +# ========================================== +if __name__ == "__main__": + # 1. Dataset / Basis Pengetahuan Lokal UKWMS - Kecerdasan Buatan + ukwms_ai_kb = [ + ( + "Program Studi Informatika Fakultas Teknik UKWMS menyediakan" + " peminatan khusus Data Science and Artificial Intelligence (AI)" + " untuk membekali mahasiswa dengan kemampuan analisis data dan" + " pembelajaran mesin." + ), + ( + "Mata kuliah inti dalam bidang Kecerdasan Buatan di Informatika UKWMS" + " meliputi Machine Learning, Deep Learning, Natural Language" + " Processing (NLP), Computer Vision, dan Data Mining." + ), + ( + "Laboratorium Komputasi dan Sistem Cerdas di Teknik Informatika" + " UKWMS Kampus Kalijudan Surabaya sering digunakan mahasiswa untuk" + " mengembangkan proyek akhir berbasis kecerdasan buatan dan IoT." + ), + ( + "Penelitian dosen dan mahasiswa Informatika UKWMS di bidang AI" + " banyak berfokus pada pengenalan pola citra medis, sistem" + " rekomendasi, dan analisis sentimen bahasa Indonesia." + ), + ( + "Lulusan peminatan Kecerdasan Buatan dari Informatika UKWMS bergelar" + " Sarjana Komputer (S.Kom.) dengan profisiensi tinggi sebagai AI" + " Engineer, Data Scientist, dan Machine Learning Practitioner." + ), + ] + + # 2. Inisialisasi Sistem RAG + rag = UKWMSAI_RAG(ukwms_ai_kb) + + # 3. Contoh Pengujian Pertanyaan Tugas + sample_query = ( + "Apa saja mata kuliah kecerdasan buatan yang dipelajari di informatika" + " ukwms?" + ) + + # 4. Menjalankan Pipeline + final_answer, sources = rag.generate_answer(sample_query) + print("\n" + final_answer) \ No newline at end of file