Saya Membangun Aplikasi RAG, Lalu Bertanya Mobil Apa yang Saya Sukai. Ia Tidak Tahu.

Saya sedang membangun alat chat dokumen bernama Kenning. Alat ini menggunakan RAG (Retrieval-Augmented Generation) untuk memungkinkan pengguna mengajukan pertanyaan tentang file yang diunggah.

Saya membangun seluruh pipeline dari awal menggunakan:

  • Java 21 dan Spring Boot
  • Spring AI
  • PostgreSQL dengan pgvector
  • Ollama (menjalankan llama3.2:3b dan nomic-embed-text)
  • Docker Compose

Pipeline-nya bekerja seperti ini: Unggah file → Ekstrak teks → Chunk teks → Konversi chunk menjadi vektor → Simpan di pgvector → Cari chunk yang serupa → Kirim chunk + pertanyaan ke model → Dapatkan jawaban beserta sumbernya.

Sistemnya berjalan, tetapi saya menemui dua kegagalan yang berbeda. Keduanya terlihat sama, tetapi penyebabnya berbeda.

Kegagalan 1: Modelnya bingung.

Saya bertanya: "Model embedding apa yang digunakan proyek ini?" Dokumen tersebut menyatakan jawabannya secara eksplisit. Model berhasil mengambil teks yang benar. Namun, ia menjawab dengan mengatakan bahwa ia tidak tahu, padahal ia mengulang nama model yang benar di kalimat berikutnya.

Teori saya: Model 3B terlalu kecil. Ia berhasil mengambil data yang tepat tetapi tidak bisa memberikan jawaban yang meyakinkan. Model yang lebih besar kemungkinan besar akan memperbaiki hal ini.

Kegagalan 2: Model tidak menemukan apa pun.

Saya bertanya: "Merek mobil apa yang saya sukai?" Dokumen tersebut menyebutkan bahwa saya menyukai BMW. Namun, sistem mengembalikan nol hasil. Skor kemiripannya terlalu rendah untuk melewati ambang batas (threshold) saya.

Teori saya: Pengenceran chunk (chunk dilution). Dokumen uji saya pendek. Dokumen tersebut mencampur banyak topik seperti Spring AI, OAuth2, dan preferensi mobil saya ke dalam satu chunk. Vektor untuk chunk tersebut menjadi encer di antara semua topik itu. Pertanyaan spesifik tentang mobil kehilangan kekuatannya terhadap chunk yang terlalu luas. Strategi chunking yang lebih baik akan memperbaiki hal ini.

Pelajaran yang dipetik:

  • Model kecil memiliki batasan penalaran.
  • Chunking yang naif memengaruhi akurasi pengambilan data (retrieval).
  • Mendebug "mengapa" itu terjadi lebih penting daripada sekadar memperbaiki kesalahan.

Arsitekturnya sudah kokoh. Memang lambat dan terkadang salah, tetapi siklusnya sudah lengkap.

Sumber: https://dev.to/mido-dev/i-built-a-rag-app-then-asked-it-what-car-i-like-it-didnt-know-583n

Komunitas belajar opsional: https://t.me/GyaanSetuAi