Asisten Pintar Perencana Liburan Jogja
Cukup pilih berapa hari liburan, perkiraan budget, dan suasana yang disukai, asisten pintar akan menyusun jadwal perjalanan harian lengkap dengan tempat wisata nyata di Jogja.
Cukup pilih berapa hari liburan, perkiraan budget, dan suasana yang disukai, asisten pintar akan menyusun jadwal perjalanan harian lengkap dengan tempat wisata nyata di Jogja.
Tantangan & Kebutuhan Pengguna
Menyusun rencana perjalanan (itinerary) multi-hari di Yogyakarta secara manual membutuhkan riset lokasi, pengelompokan arah geografis, dan perhitungan jam operasional. Namun, jika menyerahkan tugas ini sepenuhnya ke Large Language Model (LLM) tanpa batasan data lokal, AI sering mengalami halusinasi dengan menyebut tempat wisata fiktif atau menghasilkan respons teks bebas yang merusak tampilan UI. Sebaliknya, mengirimkan seluruh isi tabel destinasi ke dalam prompt akan menyebabkan pembengkakan token dan melewati batas konteks.
Jadikan LLM sebagai mesin penalaran rute dan strategi jadwal, namun ikat sumber kebenaran datanya pada koleksi entitas yang terverifikasi di database lokal.
Solusi & Cara Kerja
Fitur ini bekerja melalui tiga tahapan: Pre-filtering Context, Constrained Inference, dan Post-processing Hydration. Pertama, `TripPlannerController` memetakan minat pengguna ke kategori database, mengambil destinasi berstatus `approved`, mengurutkannya berdasarkan rating tertinggi, membatasinya maksimal 60 item, lalu memadatkan key JSON menjadi satu huruf (`s`, `n`, `k`, `w`, `r`). Kedua, prompt dikirim ke endpoint Groq (`llama-3.3-70b-versatile`) dengan instruksi ketat pengelompokan koordinat barat-ke-timur/utara-ke-selatan dan kontinuitas antar-hari. Ketiga, respons JSON dibersihkan dari pembungkus markdown, di-decode, lalu setiap item dicocokkan kembali dengan dictionary database yang di-index menggunakan `keyBy('slug')` untuk menyuntikkan URL halaman detail dan foto sampul asli.
Berikut adalah implementasi pemadatan konteks destinasi, sanitasi output LLM, dan proses rekonsiliasi data dari `app/Http/Controllers/Public/TripPlannerController.php`:
Detail & Hal yang Diperhatikan
- Penanganan kategori minat yang masih minim data: Jika hasil filter kategori menghasilkan kurang dari 5 destinasi, sistem otomatis melakukan fallback ke 60 destinasi dengan rating tertinggi secara global agar AI tidak kekurangan referensi.
- Ekstraksi JSON defensif: Meskipun system prompt melarang markdown, LLM terkadang masih menyisipkan teks pembuka atau blok ```json. Kombinasi `preg_replace` dan ekstraksi regex `/\{.*\}/s` memastikan parser `json_decode` tidak gagal.
- Pencegahan N+1 Query saat injeksi data: Koleksi destinasi yang sudah disetujui di-load sekali di luar loop menggunakan `Destination::approved()->with('hero')->get()->keyBy('slug')`, sehingga pencarian di dalam nested loop berlangsung secara O(1) di memori.