RAG: Membuat AI Menjawab dari Dokumenmu Sendiri
Pertanyaan yang paling sering saya dengar dari klien: "Bisa nggak AI-nya menjawab berdasarkan dokumen kami sendiri?"
Bisa. Namanya RAG โ Retrieval-Augmented Generation. Dan ini jauh lebih sederhana daripada kedengarannya.
Idenya dalam satu kalimat
Sebelum bertanya ke model, cari dulu potongan dokumen yang paling relevan, lalu selipkan potongan itu ke dalam pertanyaan.
Itu saja. Tidak ada pelatihan ulang, tidak ada fine-tuning, tidak ada GPU.
Alurnya
Dokumen โ dipotong โ jadi embedding โ disimpan di database
โ
Pertanyaan โ jadi embedding โ cari yang mirip โโ
โ
Potongan relevan + pertanyaan โ LLM โ Jawaban
Kenapa harus dipotong
Menyuapkan seluruh dokumen 200 halaman ke setiap pertanyaan itu mahal dan justru menurunkan kualitas jawaban โ informasi pentingnya tenggelam di antara yang tidak relevan.
Potong per bagian yang bermakna. Untuk dokumen berstruktur, potong per heading. Untuk teks mengalir, sekitar 500โ1000 kata dengan sedikit tumpang tindih supaya konteks di batas potongan tidak hilang.
Embedding: mengubah makna jadi angka
Embedding mengubah teks jadi deretan angka, di mana teks yang maknanya mirip menghasilkan angka yang berdekatan. Ini yang membuat pencarian bekerja berdasarkan makna, bukan kecocokan kata.
Pertanyaan "bagaimana cara refund" akan menemukan bagian berjudul "Pengembalian Dana" โ meski tidak ada satu kata pun yang sama.
Menyimpannya: tidak perlu database baru
Banyak orang langsung memasang Pinecone atau Weaviate. Untuk kebanyakan kasus, itu berlebihan. PostgreSQL dengan ekstensi pgvector sudah lebih dari cukup.
CREATE EXTENSION vector;
CREATE TABLE potongan (
id SERIAL PRIMARY KEY,
dokumen_id INT,
isi TEXT,
embedding vector(1536)
);
CREATE INDEX ON potongan
USING hnsw (embedding vector_cosine_ops);
Mencari yang paling mirip:
SELECT isi
FROM potongan
ORDER BY embedding <=> %s
LIMIT 5;
Merangkainya
def jawab(pertanyaan):
vektor = buat_embedding(pertanyaan)
potongan = cari_terdekat(vektor, limit=5)
konteks = "\n\n---\n\n".join(p.isi for p in potongan)
respons = client.messages.create(
model="claude-opus-5",
max_tokens=4000,
messages=[{
"role": "user",
"content": (
"Jawab pertanyaan berikut HANYA berdasarkan konteks di bawah. "
"Kalau jawabannya tidak ada di konteks, katakan tidak tahu.\n\n"
f"KONTEKS:\n{konteks}\n\nPERTANYAAN: {pertanyaan}"
),
}],
)
return next(b.text for b in respons.content if b.type == "text")
Yang menentukan berhasil atau tidak
Kualitas RAG hampir seluruhnya ditentukan oleh tahap pencarian, bukan modelnya. Kalau potongan yang diambil salah, model sepintar apa pun akan menjawab salah.
Jadi ketika hasilnya mengecewakan, jangan langsung ganti model. Cek dulu: potongan apa yang sebenarnya diambil? Sembilan dari sepuluh kali, masalahnya ada di sana.
Satu instruksi kecil yang sangat penting: "kalau jawabannya tidak ada di konteks, katakan tidak tahu". Tanpa itu, model akan mengarang dengan percaya diri.
Baca Juga
Membangun AI Agent yang Benar-benar Dipakai
Kebanyakan proyek AI agent gagal bukan karena modelnya kurang pintar, tapi karena masalahnya salah pilih.
pgvector: Pencarian Semantik Tanpa Menambah Infrastruktur
Sebelum memasang vector database khusus, cek dulu โ PostgreSQL yang sudah kamu punya mungkin sudah cukup.
Otomasi Tanpa Coding dengan n8n: Panduan Mulai
Tidak semua otomasi layak ditulis dengan kode. Kadang seret-lepas sudah cukup โ dan jauh lebih mudah dirawat.
Komentar (0)
Belum ada komentar. Jadilah yang pertama!
Tinggalkan Komentar
Komentar akan tampil setelah disetujui.