Saya menjalankan digital twin di situs web saya. Ia menjawab pertanyaan tentang kehidupan dan keahlian saya. Saya memberinya satu aturan ketat: jangan pernah mengada-ada. Jika seseorang bertanya tentang keahlian yang tidak saya miliki, ia harus mengakui bahwa ia tidak tahu. Selama berbulan-bulan, saya percaya sistem ini berfungsi dengan baik. Saya mengujinya secara manual di sana-sini, dan jawabannya tampak meyakinkan. Kemudian saya membangun evaluation harness yang layak. Angkanya sangat mengejutkan. Dari 35 pertanyaan, sembilan mengandung kebohongan terang-terangan. Dari delapan pertanyaan yang dirancang agar tidak bisa dijawab, model tersebut hanya menolak empat. Prompt anti-halusinasi saya gagal sekitar seperempat waktu. Saya merilis produk yang berbohong kepada penggunanya.

Pengaturan Retrieval yang Sangat Sederhana

Saya tidak menggunakan Pinecone atau basis data vektor berat lainnya. Seluruh pengaturannya hanya menggunakan file JSON biasa. Kode saya membagi profil saya menjadi bagian-bagian terpisah. Ketika sebuah pertanyaan datang, sistem menghitung cosine similarity antara kueri dan setiap potongan teks (chunk), memilih kecocokan terdekat, dan memasukkannya ke dalam prompt sebagai konteks. Model tersebut kemudian menghasilkan jawaban berdasarkan apa yang dilihatnya secara ketat di dalam jendela tersebut.

Untuk situs pribadi kecil yang melayani sekumpulan fakta yang sempit, pendekatan ini cepat dan hampir tidak memakan biaya. Tidak ada perjalanan jaringan (network round-trip) ke penyimpanan vektor jarak jauh, tidak ada beban tambahan pengindeksan (indexing overhead), dan tidak ada orkestrasi yang rumit. Anda membaca file, memberi skor pada potongan teks, membangun prompt, dan selesai. Namun, kesederhanaan di sisi backend tidak menjamin kejujuran pada output. Alur kerja (pipeline) yang ringan tetap dapat menimbulkan masalah serius ketika model memutuskan untuk berimprovisasi. Celah antara "ini adalah konteksnya" dan "ini yang akan saya katakan tentangnya" adalah tempat di mana halusinasi terjadi. Anda dapat memberikan paragraf tentang riwayat pekerjaan Anda kepada model, namun tetap mendapatkan jawaban karangan yang meyakinkan tentang bahasa pemrograman yang belum pernah Anda sentuh.

Angka-angka yang Meruntuhkan Kepercayaan Saya

Selama berbulan-bulan, saya menganggap pemeriksaan manual secara acak sudah cukup. Saya akan membuka obrolan, mengajukan pertanyaan yang sudah saya ketahui jawabannya, dan mengangguk ketika responsnya tampak benar. Itulah strategi pengujian saya. Rasanya menyeluruh karena saya menggunakan antarmuka tersebut sendiri. Ternyata tidak.

Ketika saya akhirnya menulis evaluation harness yang dapat dijalankan secara sistematis, gambaran sebenarnya berubah. Rangkaian pengujian melontarkan 35 pertanyaan kepada si twin. Sembilan jawaban mengandung kebohongan. Saya juga menyertakan delapan pertanyaan yang tidak memiliki jawaban di mana pun dalam profil saya. Model tersebut seharusnya menolak semuanya. Ia hanya menolak empat. Prompt anti-halusinasi yang saya susun dengan hati-hati, yang menyertakan bahasa absolut tentang tidak pernah mengada-ada, gagal sekitar 25 persen dari waktu pengujian. Satu dari empat. Itu bukan sekadar kesalahan pembulatan. Itu adalah produk yang rusak.

Berhenti Menguji dengan Pertanyaan yang "Ramah"

Anda tidak bisa menemukan bug hanya dengan menggunakan produk Anda sendiri. Anda menemukannya dengan mencoba merusaknya. Tes manual saya terlalu "ramah". Saya hanya mengajukan pertanyaan di mana saya tahu jawaban pastinya, yang berarti saya secara tidak sadar mengarahkan model ke wilayah yang aman. Saya tidak pernah menguji batas-batasnya. Saya tidak pernah bertanya tentang keahlian yang saya inginkan, atau tentang pengalaman yang tidak pernah terjadi.

Pengujian yang sebenarnya membutuhkan niat adversarial. Anda harus menyusun pertanyaan yang dirancang untuk membuat AI gagal. Anda ingin ia melakukan kesalahan di laboratorium agar ia tidak melakukan kesalahan di depan pengunjung. Rangkaian pengujian yang hanya mengonfirmasi apa yang sudah Anda yakini hanyalah sebuah demo yang dipercantik. Jika Anda tidak secara aktif membuat kasus ekstrem (edge cases) dan pertanyaan jebakan, Anda tidak sedang menguji. Anda sedang berharap.

Dua Kesalahan yang Berdampak

Prompting bukanlah sebuah jaminan. Instruksi panjang dan mendetail yang memberi tahu AI untuk tidak berhalusinasi hanyalah sebuah saran yang dibungkus sebagai perintah. Model mungkin mengikutinya sebagian besar waktu, tetapi ia akan mengabaikan instruksi tersebut saat tekanan statistik mendorongnya ke arah lain. Temperature, probabilitas token, dan bentuk data pelatihan semuanya memiliki bobot yang lebih berat daripada satu kalimat dalam system prompt Anda. Anda harus mengukur kepatuhan dengan data, bukan dengan harapan. Instruksi yang kuat bukanlah fakta yang terverifikasi. Itu adalah sebuah permintaan, dan permintaan bisa ditolak. Jika seluruh strategi keamanan Anda hanya bergantung pada penyusunan kata-kata prompt yang tegas, Anda telah membangun pagar pengaman dari kertas tisu. Anda membutuhkan eval harness yang menghitung seberapa sering model patuh, dalam kondisi apa, dan mengapa ia gagal saat ia gagal. Angka tidak peduli dengan nada bicara Anda.

The evaluation loop was flawed. Here is a subtle trap that almost got me. My original testing tool ran the retrieval process twice. The first run fetched context to check against the ground truth. The second run fetched context for the actual answer generation. In practice, this meant the chunks the judge saw could differ from the chunks the model saw. The judge was grading the answer against data the AI might never have received. An evaluation that grades the wrong input is worse than no evaluation. It gives you a false sense of security. You look at the score, see a high pass rate, and relax. Meanwhile your users are