Bangun Deterministic Graph RAG Tiga Tingkat Tanpa Vector Search
VOXBLICK.COM - Kamu mungkin sudah mencoba Graph RAG, tetapi tetap saja ada satu masalah yang mengganggu: hasil retrieval kadang “berubah-ubah” antar eksekusi. Tidak selalu karena modelnya salahsering kali karena mekanisme pencarian (terutama vector search) membuat pemilihan node dan konteks tidak deterministik. Artikel ini membahas cara membangun deterministic Graph RAG tiga tingkat yang melampaui vector search, dengan fokus pada aturan prompt untuk menyelesaikan konflik retrieval secara konsisten. Tujuannya sederhana: jawaban yang lebih stabil, konteks yang lebih relevan, dan proses yang mudah direplikasi.
Bayangkan sistem RAG-mu seperti perpustakaan dengan katalog yang jelas. Jika kamu pakai vector search, katalognya seperti “perkiraan kemiripan” yang bisa bergeser.
Namun kalau kamu membangun deterministic graph traversal + aturan prompt yang ketat, katalog berubah jadi “aturan main” yang tegas. Kamu tidak hanya mengambil informasikamu mengendalikan bagaimana informasi dipilih.
Di bawah ini, kamu akan melihat arsitektur tiga tingkat (retrieval → re-rank deterministik → synthesis terkontrol), sekaligus template aturan prompt yang menangani konflik: ketika beberapa node relevan tapi saling bertentangan, atau
ketika beberapa jalur penelusuran memberikan konteks yang sama-sama “meyakinkan”.
Mengapa Deterministic Graph RAG tanpa Vector Search itu Penting?
Vector search memang populer karena cepat dan relatif “toleran” terhadap variasi bahasa. Tetapi determinisme sering hilang karena:
- Ambiguitas embedding: pertanyaan yang mirip bisa menghasilkan ranking berbeda tergantung model embedding, normalisasi, dan parameter.
- Non-determinisme retrieval: top-k bisa berubah jika ada perbedaan skor kecil.
- Konflik konteks: ketika beberapa fragmen sama-sama “dekat”, model harus memilihdan pemilihan itu kadang bergantung pada wording prompt yang tidak konsisten.
Dengan deterministic Graph RAG, kamu mengunci proses pemilihan node berbasis struktur graf dan aturan skor yang stabil. Ini bukan berarti kamu tidak memakai “kemiripan”melainkan kamu memindahkannya dari vector similarity ke aturan yang bisa diaudit.
Konsep Inti: Tiga Tingkat Retrieval yang Terkontrol
Kunci sistem ini adalah memisahkan tanggung jawab ke tiga tingkat, sehingga konflik bisa ditangani secara sistematis.
Level 1: Candidate Generation berbasis Struktur (Tanpa Vector Search)
Tujuan level ini adalah mengumpulkan kandidat node dengan cara deterministik. Kamu bisa memakai pendekatan seperti:
- Keyword/lexical routing: ekstrak istilah kunci dari pertanyaan (mis. entitas, kata teknis, definisi, tanggal, nama kebijakan).
- Hop traversal deterministik: mulai dari node “anchor” (mis. entitas yang dikenali) lalu lakukan traversal dengan aturan batas (mis. maksimal 2 hop ke parent dan 3 hop ke child).
- Schema-based filtering: hanya node yang memenuhi tipe relasi tertentu yang boleh masuk kandidat (mis. relasi defines, evidence_for, contradicts).
Skor kandidat di level ini tidak perlu “mirip vektor”. Gunakan skor yang stabil, misalnya:
- Match type score: exact match > partial match > synonym match (synonym list disimpan statis).
- Path score: skor berdasarkan panjang jalur dan tipe relasi (bisa kamu tetapkan bobot tetap).
- Freshness score (opsional): berdasarkan tanggal rilis dokumen jika ada metadata.
Level 2: Conflict-Aware Re-ranking Deterministik
Di level ini, kamu tidak hanya memilih kandidat “teratas”, tapi juga memastikan konsistensi. Konflik biasanya muncul dalam dua bentuk:
- Kontradiksi isi: dua node membahas kebijakan yang sama tapi hasilnya berbeda.
- Redundansi: beberapa node menjelaskan hal yang sama dengan tingkat detail berbeda.
Re-ranking deterministik bisa kamu lakukan dengan aturan prioritas yang eksplisit. Contoh strategi:
- Prefer Evidence over Summary: node bertipe “evidence” menang atas “summary” jika query memerlukan pembuktian.
- Prefer terbaru jika konflik: jika dua node bertentangan dan ada metadata tanggal, pilih yang lebih baru (atau yang “effective_date” paling relevan).
- Prefer scope yang tepat: jika query menyebut wilayah/produk/versi, pilih node dengan scope yang paling spesifik.
- Dedup by canonical_id: jika node berbeda tapi berasal dari dokumen yang sama (canonical_id sama), ambil yang paling informatif.
Bagian paling krusial: kamu harus membuat model “patuh” dengan aturan ini melalui prompt. Model tidak boleh bebas menilai mana yang benar tanpa mengikuti aturan.
Level 3: Synthesis Terstruktur dengan Aturan Prompt Ketat
Level 3 adalah proses penulisan jawaban. Agar deterministik, kamu perlu:
- Input konteks yang terformat (mis. daftar potongan teks dengan id node, tipe relasi, dan skor).
- Output format yang konsisten (mis. jawaban + daftar klaim + referensi node).
- Aturan penanganan konflik yang membuat model memilih jalur yang disepakati.
Template Aturan Prompt untuk Menyelesaikan Konflik Retrieval
Di sinilah kamu benar-benar “mengunci” determinisme. Gunakan template prompt yang memaksa model mengikuti hierarki keputusan. Berikut contoh aturan yang bisa kamu adaptasi.
Prompt untuk Level 2 (Re-ranking) – “Jangan Menilai Secara Bebas”
Gunakan instruksi seperti ini (kamu bisa menempelkan kandidat node sebagai input):
Kamu adalah re-ranker deterministik. TUGASMU hanya memilih dan menyusun daftar konteks berdasarkan aturan berikut.Aturan: 1) Jika ada kontradiksi isi antar node pada topik yang sama: a) Pilih node dengan tipe relasi: evidence > policy > definition > summary. b) Jika masih konflik, pilih node dengan metadata tanggal paling baru (effective_date jika ada). c) Jika masih konflik, pilih node dengan scope paling spesifik yang cocok dengan parameter query. 2) Jika redundan (canonical_id sama): a) Pilih node dengan jumlah detail tertinggi (lebih banyak fakta/angka/ketentuan). b) Jika sama, pilih node dengan node_id terkecil (tie-break deterministik). 3) Jangan gunakan penilaian semantik bebas untuk mengubah prioritas. Hanya gunakan aturan di atas. Output: - ranked_context: daftar node_id urut berdasarkan skor aturan. - conflict_resolution: ringkasan aturan mana yang dipakai.Prompt untuk Level 3 (Synthesis) – “Klaim Harus Berdasarkan Node yang Dipilih”
Kamu akan menulis jawaban dari konteks yang diberikan. Aturan: 1) Setiap klaim faktual harus merujuk ke node_id yang tersedia di ranked_context. 2) Jika konteks berisi kontradiksi: - Gunakan hanya klaim dari node yang menang menurut conflict_resolution. - Jika tidak ada node yang cukup untuk menjawab sepenuhnya, tulis bagian yang tidak diketahui secara eksplisit. 3) Jangan menambah informasi di luar konteks. 4) Gaya jawaban: ringkas, langkah-langkah jelas, dan gunakan istilah dari query. Format output: - Jawaban: - Klaim (bullet), masing-masing dengan node_id... - Jika ada kekurangan data: "Catatan keterbatasan:" + daftar poinDengan dua prompt ini, kamu tidak memberi ruang interpretasi “bebas”. Model hanya melakukan sintesis dari konteks yang sudah dipilih deterministik.
Merancang Graf: Node, Relasi, dan Metadata yang Membuat Determinisme Mungkin
Tanpa vector search, graf harus kaya struktur. Minimal kamu butuh:
- Node: dokumen, paragraf, definisi, kebijakan, bukti, contoh, atau entitas.
- Relasi: defines, supports, contradicts, depends_on, belongs_to, has_version, effective_date_of.
- Metadata: tanggal, versi, scope (mis. produk/region), canonical_id, tipe node.
Relasi contradicts sangat membantu. Jika kamu tidak memilikinya, kamu tetap bisa mendeteksi konflik secara heuristik (mis. aturan berbasis pola “however/except/does not apply”), tetapi hasilnya biasanya kurang kuat dibanding relasi eksplisit.
Contoh Alur End-to-End: Dari Pertanyaan ke Jawaban Stabil
Misalkan pertanyaanmu: “Apa aturan biaya keterlambatan untuk paket X versi 2024 di wilayah Y?”
- Level 1 mengekstrak entitas: paket X, versi 2024, wilayah Y. Lalu traversal dimulai dari node “Paket X” dan “Kebijakan versi 2024” dengan batas hop tertentu.
- Level 2 mengumpulkan kandidat yang match scope wilayah Y. Jika ada dua node yang kontradiktif, aturan tipe relasi dan effective_date memilih satu yang menang. Redundansi di-canonicalize via canonical_id.
- Level 3 menulis jawaban hanya dari node pemenang, menyertakan klaim per node_id. Jika tidak ada node yang mencakup wilayah Y secara spesifik, model menambahkan “Catatan keterbatasan”.
Hasilnya: meskipun model LLM bisa punya variasi gaya, proses pengambilan konteksnya terkunci oleh aturan yang sama.
Tips Praktis untuk Meningkatkan Kualitas Konteks
- Gunakan tie-break deterministik: mis. node_id terkecil atau urutan dokumen tetap.
- Batasi ukuran konteks: mis. maksimal N node atau total token tertentu agar model tidak “mengarang” dari konteks yang terlalu luas.
- Format konteks yang rapi: sertakan node_id, tipe, dan ringkasan metadata (tanggal/scope) agar model mudah mengikuti aturan.
- Uji dengan set pertanyaan yang “menggandakan konflik”: pertanyaan yang sengaja memicu kontradiksi untuk memastikan ruleset bekerja.
Penutup yang Tetap Praktis
Bangun deterministic Graph RAG tiga tingkat tanpa vector search bukan sekadar mengganti mesin pencariini tentang mendesain struktur graf dan aturan prompt sehingga konflik retrieval bisa diselesaikan secara
konsisten. Level 1 mengunci kandidat dari struktur, Level 2 menyelesaikan konflik dengan prioritas yang bisa diaudit, dan Level 3 memastikan klaim jawaban selalu bersandar pada node yang menang.
Kalau kamu ingin sistem RAG yang lebih stabil untuk produksiterutama pada domain kebijakan, dokumentasi teknis, atau pengetahuan yang sering kontradiktifpendekatan deterministic ini biasanya terasa lebih “terkendali” dibanding mengandalkan kemiripan
vektor. Mulai dari ruleset yang jelas, lalu iterasi graf dan metadata sampai kualitas konteks benar-benar meningkat.
Apa Reaksi Anda?
Suka
0
Tidak Suka
0
Cinta
0
Lucu
0
Marah
0
Sedih
0
Wow
0