Cara Kerja RAG, dengan Bahasa Sederhana
Berikut alur dasarnya, tanpa istilah yang ribet:
- Ambil dokumenmu (FAQ, artikel, catatan internal, apa pun yang berbasis teks) dan pecah jadi potongan-potongan kecil.
- Ubah tiap potongan jadi deretan angka yang disebut embedding, yang merepresentasikan makna dari teks itu.
- Simpan embedding-embedding itu di database yang mendukung pencarian kemiripan (similarity search).
- Saat user tanya sesuatu, ubah juga pertanyaannya jadi embedding.
- Cari di database potongan mana yang embedding-nya paling mirip maknanya dengan pertanyaan tadi.
- Kirim potongan-potongan yang cocok itu, bersama pertanyaan aslinya, ke AI sebagai konteks.
- AI-nya jawab pakai konteks itu, bukan menebak-nebak dari data training umum.
Bayangkan ini seperti kasih AI setumpuk sticky notes yang relevan sebelum kamu tanya sesuatu, bukannya berharap dia ingat semuanya dari memori.
Kenapa PostgreSQL + pgvector
Ada vector database khusus seperti Pinecone atau Weaviate, dan search engine seperti Meilisearch juga sudah mendukung vector search sekarang. Di artikel ini, kita pakai PostgreSQL dengan extension pgvector karena:
- Kalau aplikasi Laravel kamu sudah pakai PostgreSQL, kamu nggak perlu database service terpisah lagi.
- Setup-nya cukup mudah baik di lokal maupun di kebanyakan hosting.
- Ada package PHP yang solid untuk ini dan cocok dipakai bareng Eloquent.
Langkah 1: Aktifkan pgvector
Pastikan kamu pakai PostgreSQL sebagai database. Lalu install extension pgvector di server database-mu. Di kebanyakan sistem yang sudah ada PostgreSQL, caranya:
Kalau kamu pakai Docker, cara paling gampang adalah ganti image Postgres-mu ke
Langkah 2: Install Package PHP
Publish dan jalankan migration yang mengaktifkan extension-nya di database kamu:
Langkah 3: Buat Tabel Documents
Buat migration untuk menyimpan potongan dokumen dan embedding-nya:
Kita pakai
Langkah 4: Buat Model
Langkah 5: Generate Embedding dan Simpan Chunk
Buat service untuk menangani proses ubah teks jadi embedding dan menyimpannya:
Ini strategi chunking sederhana berdasarkan paragraf. Untuk dokumen beneran, apalagi yang panjang, kamu butuh chunking yang lebih pintar (panjang karakter tetap dengan overlap, atau dipecah berdasarkan heading), tapi ini sudah cukup untuk memahami konsepnya.
Sekarang kamu bisa ingest dokumen seperti ini:
Langkah 6: Ambil Chunk yang Relevan dan Tanya ke AI
Tambahkan method untuk mencari chunk paling relevan dan menyusun prompt dengan chunk-chunk itu:
Perhatikan instruksi di prompt-nya: "kalau jawabannya tidak ada di konteks, katakan kamu tidak tahu." Ini penting. Tanpa instruksi itu, AI-nya bisa saja balik menebak dari pengetahuan umumnya, bukannya mengakui kalau jawabannya memang nggak ada di dokumenmu, yang malah menghilangkan tujuan dari RAG itu sendiri.
Cara Mengetesnya
Kalau kamu sudah ingest dokumen yang menyebutkan kebijakan refund, AI-nya seharusnya jawab pakai konten itu, bukan ngarang sendiri.
Hal yang Perlu Ditingkatkan Nanti
Ini versi dasar yang sudah jalan. Untuk pemakaian production, ada beberapa hal yang perlu kamu pikirkan nanti:
- Chunking yang lebih baik. Pecah per paragraf itu masih kasar. Pertimbangkan chunk ukuran tetap dengan overlap supaya konteksnya nggak terpotong secara janggal.
- Ingestion lewat queue. Generate embedding untuk dokumen besar butuh waktu. Pindahkan ini ke queued job, jangan dijalankan secara synchronous.
- Re-ranking hasil. Kadang embedding yang paling dekat bukan berarti chunk yang paling berguna. Beberapa setup menambahkan langkah re-ranking setelah retrieval.
- Mencantumkan sumber. Kembalikan info dokumen mana asal jawabannya, supaya user bisa verifikasi informasinya.
Selanjutnya
Sekarang, chatbot kita nunggu seluruh respons AI selesai dulu baru ditampilkan, yang bisa kerasa lambat untuk jawaban panjang. Di artikel selanjutnya, kita akan implementasikan streaming response, supaya teksnya muncul kata demi kata seiring AI-nya generate, mirip seperti interface ChatGPT.
Ini adalah Part 5 dari series "Laravel + AI Integration".




