Lompat ke konten
โ† Semua tulisan

RAG: Membuat AI Menjawab dari Dokumenmu Sendiri

N Nicholaus Verdhy Putranto 01 Juli 2026 ยท 3 menit baca ยท 17 dilihat

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.

Bagikan ke WhatsApp Bagikan ke X

Komentar (0)

Belum ada komentar. Jadilah yang pertama!

Tinggalkan Komentar

Komentar akan tampil setelah disetujui.

Baca Juga