S15
IF1402 Praktikum
Sesi 15 - Mini Project Integratif
Sesi 15 dari 16

Mini Project Integratif

Pada sesi ini mahasiswa tidak lagi belajar konsep secara terpisah. Semua potongan yang sudah dipelajari sejak awal semester mulai dirangkai menjadi satu sistem yang utuh. Preprocessing, fitur teks, model klasifikasi, embedding, prompt, semantic search, dan RAG tidak berdiri sendiri lagi, melainkan bekerja bersama seperti komponen dalam sebuah mesin.

Perumpamaannya seperti merakit sepeda motor. Selama ini mahasiswa sudah mengenal ban, rem, rantai, lampu, dan setang satu per satu. Pada sesi 15, semua komponen itu harus dipasang menjadi kendaraan yang benar-benar bisa dijalankan. Di sinilah mini project menjadi sangat penting, karena mahasiswa belajar bahwa proyek nyata selalu menuntut integrasi, bukan sekadar potongan kode.

Fokus: integrasi semua konsep Output: prototipe sederhana Contoh: chatbot, semantic search, analisis sentimen
Pertanyaan inti sesi ini Bagaimana mengubah pengetahuan terpisah tentang NLP dan AI generatif menjadi aplikasi kecil yang punya tujuan nyata?
Jawaban singkatnya Tentukan masalah, siapkan data, rancang pipeline yang sederhana tetapi jelas, lalu evaluasi apakah sistem benar-benar membantu pengguna.
Hasil belajar Mahasiswa mampu merancang, membangun, menguji, dan menjelaskan mini project yang menggabungkan beberapa konsep dari seluruh perkuliahan praktikum.

Apa yang dimaksud mini project integratif

Mini project integratif adalah proyek kecil yang menggabungkan beberapa kemampuan sekaligus. Di dalamnya ada tujuan yang jelas, ada masukan berupa data teks atau dokumen, ada proses analisis atau generasi, dan ada keluaran yang berguna. Proyek tidak harus besar. Justru proyek yang baik untuk praktikum adalah proyek yang sederhana tetapi selesai, bisa dijelaskan, dan dapat diuji.

Perumpamaan mudah

Bayangkan tugas mahasiswa bukan lagi belajar cara memakai obeng, tang, dan palu satu per satu. Tugasnya sekarang adalah membuat rak kecil yang bisa dipakai. Rak itu tidak perlu mewah, tetapi harus kokoh, fungsional, dan dapat diterangkan proses pembuatannya.

Empat pilihan mini project yang cocok untuk mata kuliah ini

1

Analisis sentimen ulasan

Sistem membaca ulasan pengguna, memprediksi sentimen, lalu merangkum keluhan atau pujian utama. Proyek ini cocok untuk mahasiswa yang ingin menggabungkan model klasik dengan fitur generatif.

2

Semantic search dokumen

Sistem menerima pertanyaan, lalu mencari dokumen yang paling mirip maknanya. Proyek ini cocok untuk mahasiswa yang ingin menonjolkan embedding dan cosine similarity.

3

Chatbot FAQ berbasis RAG

Sistem menjawab pertanyaan berdasarkan dokumen tertentu, misalnya panduan akademik, FAQ laboratorium, atau aturan praktikum. Ini adalah pilihan yang paling representatif untuk integrasi akhir.

4

Generator ringkasan atau parafrase

Sistem membantu meringkas keluhan pelanggan, berita, atau artikel pendek. Cocok untuk mahasiswa yang ingin fokus pada prompt engineering dan text generation.

Alur kerja proyek yang dianjurkan

Agar proyek tidak melebar, mahasiswa sebaiknya mengikuti alur yang sederhana. Pertama tentukan masalah dan pengguna. Kedua tentukan data yang akan dipakai. Ketiga buat pipeline paling dasar yang pasti jalan lebih dulu. Keempat tambahkan fitur pendukung bila waktu masih ada. Pendekatan ini jauh lebih aman daripada langsung mencoba sistem yang terlalu besar.

Aturan emas mini project adalah ini: lebih baik proyek kecil tetapi benar-benar selesai, daripada proyek besar tetapi hanya setengah jadi.

A

Tentukan masalah

Contoh masalah: mahasiswa kesulitan mencari jawaban dari dokumen panduan akademik yang panjang.

B

Tentukan data

Contoh data: file PDF panduan, FAQ, kumpulan teks peraturan, atau dataset ulasan aplikasi.

C

Buat pipeline dasar

Contoh: preprocessing, embedding, retrieval, lalu tampilkan hasil teratas. Setelah itu baru tambahkan generation atau tampilan web.

D

Evaluasi dan presentasikan

Uji beberapa contoh pertanyaan atau data, lalu jelaskan bagian yang berhasil dan bagian yang masih lemah.

Studi kasus utama: chatbot FAQ kampus berbasis RAG sederhana

Studi kasus ini menggabungkan beberapa materi sekaligus. Dokumen kampus dipecah menjadi bagian kecil, setiap bagian diubah menjadi embedding, lalu saat ada pertanyaan sistem mencari bagian dokumen yang paling relevan. Setelah itu bagian dokumen tadi diberikan ke LLM untuk membantu menyusun jawaban yang lebih jelas.

Perumpamaannya seperti pustakawan cerdas. Mahasiswa datang membawa pertanyaan. Pustakawan tidak langsung menjawab dari hafalan. Ia mencari halaman buku yang paling relevan lebih dulu, baru menjelaskan isi halaman itu dengan bahasa yang lebih mudah dimengerti.

Contoh struktur data proyek

Misalkan kita punya beberapa potongan dokumen akademik seperti berikut.

documents = [
    "Mahasiswa wajib melakukan registrasi ulang pada awal semester sesuai jadwal akademik.",
    "Pengajuan cuti akademik dilakukan sebelum masa pengisian KRS berakhir.",
    "Praktikum yang melebihi batas ketidakhadiran dinyatakan tidak lulus.",
    "Pembayaran UKT dilakukan melalui bank mitra yang tercantum pada portal akademik.",
    "Mahasiswa dapat mengajukan surat aktif kuliah melalui sistem layanan akademik."
]

Kode lengkap 1: semantic retrieval sederhana

Kode berikut adalah langkah dasar untuk mencari potongan dokumen yang paling relevan terhadap pertanyaan pengguna.

from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")

documents = [
    "Mahasiswa wajib melakukan registrasi ulang pada awal semester sesuai jadwal akademik.",
    "Pengajuan cuti akademik dilakukan sebelum masa pengisian KRS berakhir.",
    "Praktikum yang melebihi batas ketidakhadiran dinyatakan tidak lulus.",
    "Pembayaran UKT dilakukan melalui bank mitra yang tercantum pada portal akademik.",
    "Mahasiswa dapat mengajukan surat aktif kuliah melalui sistem layanan akademik."
]

doc_embeddings = model.encode(documents)

def retrieve_context(query, docs, embeddings, top_k=2):
    query_embedding = model.encode([query])
    scores = cosine_similarity(query_embedding, embeddings)[0]
    top_indices = np.argsort(scores)[::-1][:top_k]
    results = []
    for idx in top_indices:
        results.append({
            "document": docs[idx],
            "score": float(scores[idx])
        })
    return results

query = "Bagaimana cara mengurus cuti kuliah?"
results = retrieve_context(query, documents, doc_embeddings, top_k=2)

for item in results:
    print(item["score"], "->", item["document"])

Kode lengkap 2: panggil LLM dengan context hasil retrieval

Sesudah dokumen relevan ditemukan, kita bisa menyuruh LLM menjawab berdasarkan context tersebut. Prompt juga harus mengingatkan model agar menolak jika pertanyaan di luar topik.

import requests

GROQ_API_KEY = "gsk_XXXX...."
GROQ_MODEL = "llama-3.1-8b-instant"
GROQ_URL = "https://api.groq.com/openai/v1/chat/completions"

allowed_topics = [
    "nlp", "text mining", "preprocessing", "tf-idf", "klasifikasi teks",
    "embedding", "transformer", "llm", "prompt engineering", "rag",
    "semantic search", "evaluasi model", "etika ai generatif"
]

def ask_llm_with_context(question, contexts):
    context_text = "\n".join([f"- {c['document']}" for c in contexts])

    system_prompt = (
        "Anda adalah asisten untuk mata kuliah Pembelajaran Mesin untuk Teks dan AI Generatif. "
        "Jawab hanya pertanyaan yang masih berhubungan dengan outline mata kuliah. "
        "Jika di luar tema, jawab: Maaf Pembahasan diluar Tema. "
        "Jawab tanpa markdown, jangan gunakan bullet, heading, atau format tebal. "
        "Gunakan paragraf biasa, bahasa Indonesia yang mudah dipahami, dan berikan contoh perumpamaan sederhana."
    )

    user_prompt = (
        f"Context dokumen:\n{context_text}\n\n"
        f"Pertanyaan mahasiswa: {question}\n\n"
        "Bila context tidak cukup, katakan dengan jujur bahwa dokumen yang tersedia belum cukup. "
        "Jangan mengarang fakta di luar context."
    )

    response = requests.post(
        GROQ_URL,
        headers={
            "Authorization": f"Bearer {GROQ_API_KEY}",
            "Content-Type": "application/json"
        },
        json={
            "model": GROQ_MODEL,
            "messages": [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt}
            ],
            "temperature": 0.4
        },
        timeout=60
    )

    data = response.json()
    return data["choices"][0]["message"]["content"]

question = "Kalau mau cuti akademik kapan sebaiknya diajukan?"
contexts = retrieve_context(question, documents, doc_embeddings, top_k=2)
answer = ask_llm_with_context(question, contexts)
print(answer)

Kode lengkap 3: mini aplikasi interaktif dengan Streamlit

Jika ingin presentasi lebih menarik, mahasiswa dapat membungkus pipeline tadi ke aplikasi ringan dengan Streamlit.

import streamlit as st
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import requests

GROQ_API_KEY = "gsk_XXXX...."
GROQ_MODEL = "llama-3.1-8b-instant"
GROQ_URL = "https://api.groq.com/openai/v1/chat/completions"

st.set_page_config(page_title="FAQ Akademik RAG", page_icon="🎓")
st.title("Chatbot FAQ Akademik Berbasis RAG")
st.write("Tanyakan hal yang berkaitan dengan dokumen akademik yang tersedia.")

@st.cache_resource
def load_model():
    return SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")

model = load_model()

documents = [
    "Mahasiswa wajib melakukan registrasi ulang pada awal semester sesuai jadwal akademik.",
    "Pengajuan cuti akademik dilakukan sebelum masa pengisian KRS berakhir.",
    "Praktikum yang melebihi batas ketidakhadiran dinyatakan tidak lulus.",
    "Pembayaran UKT dilakukan melalui bank mitra yang tercantum pada portal akademik.",
    "Mahasiswa dapat mengajukan surat aktif kuliah melalui sistem layanan akademik."
]

doc_embeddings = model.encode(documents)

def retrieve_context(query, top_k=2):
    query_embedding = model.encode([query])
    scores = cosine_similarity(query_embedding, doc_embeddings)[0]
    top_indices = np.argsort(scores)[::-1][:top_k]
    return [documents[i] for i in top_indices]

def ask_llm(question, contexts):
    context_text = "\n".join(contexts)
    system_prompt = (
        "Anda asisten mata kuliah berbasis dokumen akademik. "
        "Jika pertanyaan di luar tema dokumen atau di luar outline mata kuliah, jawab: Maaf Pembahasan diluar Tema. "
        "Jawab dalam paragraf biasa, jelas, hangat, dan beri perumpamaan sederhana."
    )
    user_prompt = f"Context:\n{context_text}\n\nPertanyaan: {question}"

    response = requests.post(
        GROQ_URL,
        headers={
            "Authorization": f"Bearer {GROQ_API_KEY}",
            "Content-Type": "application/json"
        },
        json={
            "model": GROQ_MODEL,
            "messages": [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": user_prompt}
            ],
            "temperature": 0.3
        }
    )
    data = response.json()
    return data["choices"][0]["message"]["content"]

question = st.text_input("Masukkan pertanyaan")

if st.button("Tanya") and question.strip():
    contexts = retrieve_context(question)
    answer = ask_llm(question, contexts)

    st.subheader("Jawaban")
    st.write(answer)

    st.subheader("Context yang dipakai")
    for c in contexts:
        st.info(c)

Contoh alternatif mini project: analisis sentimen plus ringkasan keluhan

Bagi mahasiswa yang ingin proyek yang lebih ringan, bisa membuat sistem yang memprediksi sentimen ulasan aplikasi lalu meringkas keluhan yang paling sering muncul. Ini menggabungkan klasifikasi dan generative AI.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
import requests

# Contoh data kecil
data = {
    "text": [
        "Aplikasinya sangat membantu dan mudah dipakai",
        "Sering error saat login dan tampilannya lambat",
        "Fitur cukup bagus tetapi notifikasinya terlambat",
        "Pelayanan cepat dan aplikasi sangat berguna",
        "Saya kecewa karena data sering gagal dimuat"
    ],
    "label": ["positif", "negatif", "negatif", "positif", "negatif"]
}

df = pd.DataFrame(data)
X_train, X_test, y_train, y_test = train_test_split(
    df["text"], df["label"], test_size=0.4, random_state=42
)

pipeline = Pipeline([
    ("tfidf", TfidfVectorizer()),
    ("clf", LogisticRegression(max_iter=1000))
])

pipeline.fit(X_train, y_train)
pred = pipeline.predict(X_test)
print(classification_report(y_test, pred))

ulasan_baru = [
    "Aplikasi sering macet ketika saya mengisi formulir",
    "Sangat bagus dan memudahkan pekerjaan saya",
    "Login berhasil tapi proses unggah file lama sekali"
]

prediksi = pipeline.predict(ulasan_baru)
for teks, label in zip(ulasan_baru, prediksi):
    print(label, "->", teks)

keluhan = [teks for teks, label in zip(ulasan_baru, prediksi) if label == "negatif"]
ringkasan_keluhan = " ".join(keluhan)

system_prompt = (
    "Anda membantu merangkum keluhan pengguna aplikasi. "
    "Jawab dalam bahasa Indonesia yang mudah dipahami dan beri saran perbaikan singkat."
)

user_prompt = f"Ringkas inti keluhan berikut: {ringkasan_keluhan}"

response = requests.post(
    "https://api.groq.com/openai/v1/chat/completions",
    headers={
        "Authorization": "Bearer gsk_XXXX....",
        "Content-Type": "application/json"
    },
    json={
        "model": "llama-3.1-8b-instant",
        "messages": [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ]
    }
)

print(response.json()["choices"][0]["message"]["content"])

Checklist minimal agar mini project dinilai layak

Harus ada

Masalah yang jelas, data atau dokumen, pipeline yang berjalan, contoh input dan output, evaluasi sederhana, serta penjelasan keterbatasan sistem.

Sangat disarankan

Tampilan sederhana, misalnya notebook yang rapi atau aplikasi ringan. Presentasi akan jauh lebih kuat jika pengguna bisa mencoba sistem secara langsung.

Mini project yang baik tidak harus memakai model paling canggih. Yang lebih penting adalah alurnya masuk akal, hasilnya bisa diuji, dan mahasiswa dapat menjelaskan alasan setiap langkah.

Format presentasi proyek yang disarankan

Saat presentasi, mahasiswa sebaiknya menceritakan proyek seperti bercerita tentang sebuah solusi, bukan sekadar membacakan kode. Mulailah dari masalah, lalu tunjukkan data, pipeline, demo singkat, hasil evaluasi, dan bagian yang masih perlu dikembangkan. Dengan cara ini dosen dapat menilai bukan hanya produk akhirnya, tetapi juga cara berpikir mahasiswa.

Urutan presentasi yang aman:
1. Masalah apa yang ingin diselesaikan
2. Siapa pengguna sistem
3. Data atau dokumen apa yang dipakai
4. Pipeline sistem dari input sampai output
5. Demo singkat
6. Hasil evaluasi
7. Kelebihan dan keterbatasan
8. Rencana pengembangan

Contoh integrasi sederhana dalam PHP

Bila mahasiswa ingin tetap konsisten dengan modul web PHP, mereka bisa membuat form pertanyaan lalu memanggil API Groq untuk menjawab berdasarkan context yang sudah dipilih sebelumnya.

<?php
$contexts = [
    "Pengajuan cuti akademik dilakukan sebelum masa pengisian KRS berakhir.",
    "Mahasiswa dapat mengajukan surat aktif kuliah melalui sistem layanan akademik."
];

$question = $_POST['question'] ?? '';

function askGroqWithContext($question, $contexts) {
    $apiKey = 'gsk_XXXX....';
    $model = 'llama-3.1-8b-instant';
    $url = 'https://api.groq.com/openai/v1/chat/completions';

    $contextText = implode("\n", $contexts);

    $payload = [
        'model' => $model,
        'messages' => [
            [
                'role' => 'system',
                'content' => 'Anda adalah asisten pembelajaran. Jawab hanya dalam topik mata kuliah. Jika di luar topik, jawab: Maaf Pembahasan diluar Tema. Gunakan paragraf biasa, jelas, dan mudah dipahami.'
            ],
            [
                'role' => 'user',
                'content' => "Context dokumen:\n" . $contextText . "\n\nPertanyaan: " . $question
            ]
        ],
        'temperature' => 0.4
    ];

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json'
    ]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));

    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    return $data['choices'][0]['message']['content'] ?? 'Jawaban tidak tersedia.';
}

if (!empty(trim($question))) {
    $answer = askGroqWithContext($question, $contexts);
    echo nl2br(htmlspecialchars($answer));
}
?>

Ruang Diskusi Mahasiswa dengan Sistem LLM

Tanyakan konsep, latihan, studi kasus, atau minta penjelasan ulang dengan bahasa yang lebih sederhana. Sistem hanya melayani topik yang masih berkaitan dengan mata kuliah ini.

Konteks halaman: Sesi 15 - Mini Project Integratif Fokus: NLP, text mining, transformer, LLM, prompt, semantic search, RAG

Halo, saya siap membantu diskusi belajar Anda.

Silakan tanyakan materi yang berkaitan dengan mata kuliah ini, misalnya preprocessing, TF-IDF, klasifikasi teks, embedding, transformer, LLM, prompt engineering, semantic search, RAG, evaluasi model, etika AI, atau studi kasus yang serupa.

Bila pertanyaan di luar tema mata kuliah, sistem akan menolak dengan sopan.

Jawaban akan dibuat lebih jelas, tidak monoton, penuh contoh, dan memakai paragraf biasa tanpa markdown.