← Resources
TUTORIAL · 2026-02-12
Bangun Pipeline RAG Produksi Tanpa LangChain (2026)
Anda dapat mengirimkan pipeline RAG berkelas produksi dalam beberapa ratus baris kode dengan menyusun SDK provider, pgvector, dan reranker secara langsung. Lewati abstraksi LangChain hingga Anda memiliki kebutuhan konkret yang benar-benar dipecahkannya.
Mengapa tim membongkar LangChain pada 2026
Pada 2026, menghapus LangChain dari produksi telah menjadi pola engineering yang dapat dikenali, dengan postmortem publik dari tim yang dulu mengevangelisasinya. Set keluhannya konsisten: abstraksi berlapis yang mengaburkan apa yang sebenarnya dikirim ke model, perubahan breaking yang sering antar versi minor, dan sesi debugging yang berubah menjadi ekspedisi spelunking melalui kelas wrapper.
Pergeseran mendasarnya adalah SDK provider menjadi bagus. SDK OpenAI, Anthropic, dan Google sekarang mengirim streaming first-class, structured output, tool call, dan batching. Voyage, Cohere, dan Jina mengekspos endpoint REST yang bersih untuk embedding dan reranking. Postgres dengan pgvector menangani pencarian ANN hingga sekitar 10 juta vektor tanpa vector database khusus.
Untuk sebagian besar workload RAG, framework yang Anda inginkan pada 2023 sekarang adalah empat panggilan fungsi dan satu query SQL. Default yang masuk akal pada 2026 adalah memulai dengan SDK mentah, menambahkan abstraksi pipeline tipis ketika Anda merasakan kesulitan nyata, dan memperlakukan framework berat sebagai opt-in.
Lima tahap yang dibutuhkan setiap pipeline RAG
Setiap sistem RAG produksi, terlepas dari framework, terurai menjadi lima tahap yang sama. Menamai mereka secara eksplisit membuat kode lebih mudah diuji dan diganti sepotong demi sepotong.
- Ingest: muat dokumen sumber, normalisasi encoding, hapus boilerplate.
- Chunk: pisahkan menjadi unit retrieval dengan ID stabil dan metadata sumber.
- Embed dan index: encode chunk ke vector store, di samping index leksikal untuk pencarian hybrid.
- Retrieve dan rerank: tarik set kandidat luas, lalu persempit dengan reranker cross-encoder.
- Generate dan cite: rakit prompt dengan konteks yang diambil dan kembalikan jawaban dengan atribusi sumber.
Jaga setiap tahap sebagai fungsi murni dengan input dan output yang diketik. Tahap retrieval tidak boleh mengetahui LLM mana yang akan generate; tahap generation tidak boleh mengetahui model embedding mana yang digunakan. Pemisahan ini adalah apa yang dijanjikan framework dan jarang disampaikan, karena mereka memasangkan tahap melalui objek chain yang opaque. Menulisnya sendiri memakan waktu sore dan menghilangkan kategori risiko upgrade.
Strategi chunking: semantik, rekursif, dan agentik
Chunking adalah tempat sebagian besar kualitas RAG dimenangkan atau hilang. Tiga pola mendominasi pada 2026.
Split karakter rekursif pada hierarki separator (paragraf, kalimat, lalu karakter) adalah baseline. Cepat, deterministik, dan cukup baik untuk prosa. Chunking semantik meng-embed kandidat split dan menggabungkan chunk berdekatan yang embedding-nya dekat, menghasilkan unit yang koheren secara topik dengan biaya ingest yang lebih tinggi. Chunking agentik meminta LLM kecil mengusulkan titik split untuk dokumen terstruktur seperti kontrak atau transkrip, di mana heading dan batas giliran lebih penting daripada jumlah karakter.
def recursive_chunk(text, max_chars=1200, overlap=150):
seps = ["\n\n", "\n", ". ", " "]
def split(s, depth=0):
if len(s) <= max_chars or depth == len(seps):
return [s]
parts, sep = [], seps[depth]
for p in s.split(sep):
parts.extend(split(p, depth + 1))
return parts
raw = split(text)
return [raw[i] + raw[i+1][:overlap] for i in range(len(raw)-1)] + [raw[-1]]
Mulai rekursif, ukur, lalu naik ke semantik hanya pada kelas dokumen di mana evaluasi menunjukkan itu berbuah.
Embedding dan reranker: Voyage, BGE, dan Cohere
Gambar 2026 untuk retriever lebih jelas dari setahun lalu. Voyage AI, sekarang bagian dari MongoDB, mengirim voyage-3-large sebagai model dense general-purpose yang kuat dan merilis keluarga voyage-4 pada awal 2026 dengan varian mixture-of-experts yang ditujukan ke puncak leaderboard RTEB. embed-v4 dari Cohere adalah frontrunner produksi lainnya. Untuk self-hosting open-weight, bge-m3 dari BAAI tetap menjadi default: model tunggal yang mendukung retrieval dense, sparse, dan multi-vector lintas 100-plus bahasa, dengan konteks 8192 token.
Untuk reranking, Cohere rerank-v3.5 adalah workhorse: satu model multilingual, chunk 4096 token, dan latency p50 sekitar 80-150 ms pada payload tipikal. Voyage rerank-2 kompetitif dan terintegrasi dengan bersih jika Anda sudah menggunakan embedding Voyage.
Aturan praktis: pilih satu dense embedder, satu reranker, dan kunci pasangan di belakang interface. Swap nanti membutuhkan reindex, bukan rewrite.
Menyambungkan retrieval, generation, dan citation
Dengan pgvector Anda mendapatkan pencarian hybrid dan citation dalam SQL yang lugas. Simpan chunk dengan ID dokumen, embedding, dan tsvector untuk recall leksikal. Ambil set kandidat luas, rerank, lalu teruskan N teratas ke LLM dengan ID sumber eksplisit yang diinstruksikan untuk dikutip oleh model.
import psycopg, voyageai, cohere
vo, co = voyageai.Client(), cohere.Client()
def retrieve(query, k=40, top_n=8):
qvec = vo.embed([query], model="voyage-3-large").embeddings[0]
with psycopg.connect(DSN) as conn:
rows = conn.execute(
"SELECT id, doc_id, text FROM chunks ORDER BY embedding <=> %s LIMIT %s",
(qvec, k)).fetchall()
docs = [r[2] for r in rows]
ranked = co.rerank(model="rerank-v3.5", query=query, documents=docs, top_n=top_n)
return [rows[r.index] for r in ranked.results]
```
Untuk pgvector, default ke index HNSW dengan m=16 dan ef_construction=64, tambahkan prefilter tenant atau recency sehingga scan ANN dimulai sempit, dan selalu pasangkan `ORDER BY embedding <=> $1` dengan `LIMIT`. Teruskan chunk yang diambil ke LLM dengan ID-nya dan instruksikan model untuk memancarkan marker citation; resolusi marker tersebut kembali ke URL sumber dalam langkah postprocess.
Evaluasi: hit rate, MRR, dan faithfulness
Pipeline RAG tanpa harness evaluasi adalah tebakan. Bangun harness sebelum Anda tune apa pun. Kit minimum adalah set query berlabel 100 hingga 500 contoh yang mencakup tipe pertanyaan yang sebenarnya Anda harapkan, ditambah tiga metrik.
Hit rate at K menjawab apakah chunk yang benar masuk ke set kandidat, yang mengisolasi kualitas retrieval. Mean reciprocal rank menangkap seberapa tinggi chunk yang tepat diberi peringkat, yang adalah apa yang dibayar oleh reranker untuk diperbaiki. Faithfulness, diberi skor oleh LLM judge yang diprompt untuk membandingkan setiap klaim yang dihasilkan dengan chunk yang dikutip, menangkap apakah model berhalusinasi melewati konteksnya.
Jalankan harness pada setiap perubahan: ukuran chunk baru, embedder berbeda, edit prompt. Plot ketiga metrik dari waktu ke waktu di dashboard yang sama. Ketika perubahan meningkatkan MRR tetapi menjatuhkan faithfulness, reranker memunculkan distraktor dan prompt generation membutuhkan guardrail, bukan lebih banyak tuning retrieval.
Kapan beralih ke orchestrator terkelola
Pipeline yang dirakit tangan tetap dapat dipelihara selama satu tim memilikinya dan jumlah tahap kecil. Titik di mana orchestrator terkelola berbuah adalah ketika non-engineer perlu menyetel retrieval, ketika Anda menjalankan banyak pipeline secara paralel untuk kelas dokumen yang berbeda, atau ketika Anda menginginkan config yang ter-versi dan routing A/B tanpa redeploy.
Pada titik itu, pilihannya adalah antara framework berat seperti LlamaIndex atau Haystack, dan platform berbasis config yang mengekspos tahap retrieval sebagai unit deklaratif. osStudio, editor orkestrasi no-code di osFoundry, mengambil pendekatan kedua: lima tahap di atas adalah objek konfigurasi first-class dengan embedding dan reranking Voyage terkelola di belakang satu proxy, sehingga Anda mempertahankan BYOK di sisi LLM dan menghindari lock-in framework di sisi retrieval.
Pertanyaan yang berguna bukan framework versus tanpa framework. Apakah konfigurasi pipeline Anda layak menjadi kode, config, atau UI, dan jawaban itu berubah seiring tim tumbuh.
Frequently asked questions
- Apakah saya benar-benar membutuhkan vector database untuk RAG?
- Mungkin tidak sampai Anda melewati beberapa juta vektor. Postgres dengan pgvector menangani hingga sekitar 10 juta vektor dengan nyaman dengan index HNSW, pencarian hybrid via tsvector, dan filter SQL standar untuk tenancy dan recency. Anda mewarisi backup, replikasi, dan kontrol akses dari database yang sudah Anda operasikan. Vector database khusus seperti Qdrant, Milvus, atau Weaviate menjadi layak biaya operasionalnya ketika Anda membutuhkan index berskala miliar yang ter-shard, filtering khusus pada QPS sangat tinggi, atau fitur seperti retrieval multi-vector yang belum disamai pgvector. Mulai dengan pgvector dan migrasikan hanya ketika bottleneck terukur memaksanya.
- Apakah reranker benar-benar layak dengan latency-nya?
- Untuk sebagian besar workload yang berat retrieval, ya. Reranker cross-encoder seperti Cohere rerank-v3.5 atau Voyage rerank-2 biasanya menambahkan 80 hingga 200 milidetik pada p50 pada set kandidat 40 hingga 100 chunk, dan secara konsisten mengangkat mean reciprocal rank 10 hingga 30 persen di atas dense retrieval saja. Latency disembunyikan di belakang panggilan LLM mana pun yang mengikuti, yang biasanya mendominasi anggaran yang terlihat pengguna. Lewati reranker hanya untuk flow gaya autocomplete yang kritis terhadap latency di bawah 200 milidetik end to end, atau ketika set kandidat Anda sudah cukup kecil sehingga dense ranking dapat diandalkan.
- Bagaimana cara menangani overlap chunk tanpa membengkakkan storage?
- Gunakan overlap kecil 10 hingga 15 persen dari ukuran chunk, disimpan sebagai offset karakter ke dokumen sumber alih-alih teks yang diduplikasi. Pada waktu retrieval Anda dapat secara opsional mengambil chunk tetangga untuk perluasan konteks. Ini menjaga index tetap ramping dan menghindari pembayaran untuk token yang sama dua kali selama embedding. Jika Anda membutuhkan konteks yang lebih kaya untuk generation, pola parent-document bekerja dengan baik: index chunk kecil untuk presisi retrieval, lalu resolusi hit kembali ke section parent-nya sebelum diteruskan ke LLM. Lookup parent adalah query indexed tunggal dan menambah latency yang dapat diabaikan.
- Apa cara paling sederhana untuk mengevaluasi kualitas RAG?
- Bangun set berlabel 100 hingga 200 query representatif dengan ID chunk yang seharusnya diambil. Hitung hit rate at K dan mean reciprocal rank dari tahap retrieval saja, yang mengisolasi kualitas retriever dari noise generation. Untuk faithfulness, gunakan LLM judge yang diprompt untuk membandingkan setiap klaim yang dihasilkan dengan chunk yang dikutip dan beri skor grounded versus unsupported. Jalankan ketiga angka pada setiap perubahan yang berarti dan perlakukan regresi sebagai blocker. Setup tiga-metrik ini menangkap mayoritas regresi RAG dalam praktek dan menghindari jebakan mengoptimalkan satu angka sambil diam-diam menyakiti yang lain.
Sources