BAB 33. RECOMMENDATION ENGINE
Tujuan
Recommendation Engine bertugas memilih tutor terbaik secara bertahap dan adil melalui 5 stage pemrosesan sebelum notifikasi dikirim.
Alur 5 Stage
flowchart LR
S1["Stage 1\n🔍 Filtering"] --> S2["Stage 2\n⚙️ Scoring"]
S2 --> S3["Stage 3\n📊 Ranking"]
S3 --> S4["Stage 4\n⚖️ Fairness\nAdjustment"]
S4 --> S5["Stage 5\n📲 Notification\nCascade"]
style S1 fill:#1e1b4b,color:#a5b4fc
style S2 fill:#4c1d95,color:#ddd6fe
style S3 fill:#2e1065,color:#e9d5ff
style S4 fill:#1e3a5f,color:#93c5fd
style S5 fill:#064e3b,color:#a7f3d0
Stage 1 — Filtering
Menghapus kandidat yang tidak memenuhi syarat dasar sebelum dihitung skornya (efisiensi komputasi).
Filter yang diterapkan:
| Filter | Kondisi |
|---|---|
| Sekolah sama | school_id harus sama |
| Status aktif | is_active = true |
| Skill relevan | Memiliki skill terkait subject_id |
| Tidak sedang meeting | Tidak ada booking dengan status on_going |
| Bukan diri sendiri | student_id ≠ request.student_id |
| Tidak diblokir | Tidak ada relasi blokir |
Stage 2 — Scoring
Menghitung seluruh komponen skor untuk setiap kandidat yang lolos filtering.
Lihat detail formula di BAB 32 — AI Matching Algorithm.
Stage 3 — Ranking
Mengurutkan kandidat berdasarkan matching_score dari tertinggi ke terendah.
$candidates = $candidates->sortByDesc('matching_score');
Stage 4 — Fairness Adjustment
Mencegah tutor yang sama selalu dipilih meskipun selalu memiliki skor tertinggi. Ini menjaga distribusi beban yang adil antar tutor.
Formula Adjusted Score:
Keterangan:
Recent Sessions= jumlah sesi dalam 7 hari terakhirPenalty= 0.5 per sesi
Contoh:
Tutor A memiliki raw score 95.2 tetapi sudah membantu 6 sesi minggu ini:
Jika Tutor B memiliki raw score 93.0 dengan 1 sesi minggu ini:
✅ Tutor B dipilih karena adjusted score lebih tinggi.
Stage 5 — Notification Cascade
Notifikasi dikirim secara bertahap (cascade) — bukan serentak ke semua tutor sekaligus.
Alasan: Memberikan waktu respon dan menghindari notifikasi berlebihan.
Contoh Cascade:
[t=0s] → Notifikasi ke Tutor #1
[t=30s] → Jika belum ada respon → Notifikasi ke Tutor #2
[t=60s] → Jika belum ada respon → Notifikasi ke Tutor #3
[t=90s] → Jika semua menolak → Notifikasi ke siswa: "Coba lagi nanti"
sequenceDiagram
participant Sys as System
participant T1 as Tutor #1
participant T2 as Tutor #2
participant T3 as Tutor #3
participant S as Siswa
Sys->>T1: Push notification
Note over T1: Tunggu 30 detik
T1-->>Sys: Tidak merespons
Sys->>T2: Push notification
T2->>Sys: Reject
Sys->>T3: Push notification
T3->>Sys: Accept ✅
Sys->>S: "Tutor ditemukan!"
Roadmap Peningkatan AI
flowchart LR
A["📋 Rule-Based\n(Sekarang)"] --> B["⚖️ Weighted Rule\n(v1.1)"]
B --> C["🔄 Adaptive Weight\n(v1.5)"]
C --> D["🤖 ML Ranking\n(v2.0)"]
D --> E["👥 Collaborative\nFiltering (v2.5)"]
E --> F["🧠 Deep Learning\n(v3.0)"]
style A fill:#059669,color:#fff
style F fill:#7c3aed,color:#fff
| Fase | Metode | Keunggulan |
|---|---|---|
| v1.0 | Rule-Based | Transparan, mudah diimplementasikan |
| v1.1 | Weighted Rule | Bobot dapat dikonfigurasi admin |
| v1.5 | Adaptive Weight | Bobot menyesuaikan data historis |
| v2.0 | ML Ranking | Belajar dari pola pengguna |
| v2.5 | Collaborative Filtering | Rekomendasi berbasis preferensi serupa |
| v3.0 | Deep Learning | Rekomendasi kontekstual yang sangat akurat |