Lensa ML

Chunking dan Reranking untuk RAG

Langkah 1 dari 6: Kenapa Perlu Chunking?

Retrieval mengembalikan potongan, bukan dokumen

Chunk3 dari 6
Panduan wisata 691 token, dipotong setiap 128 tokenTiap batang satu kalimat; yang lebih terang heading| batas chunk
chunk 3 · token 256–384
…museum in the world and holds the Mona Lisa. The museum opens at 9 am and stays open late on Fridays. It is closed every Tuesday, so plan your visit for another day. Booking a timed ticket online is the easiest way to skip the long queue at the glass pyramid. The Musee d'Orsay, in a former railway station, holds the largest collection of Impressionist paintings. It closes on Mondays instead of Tuesdays. Entry is free on the first Sunday of each month, but booking ahead is still required. [Food and drink] Bakeries sell fresh baguettes early in…
Panjang panduan
691 tok
Chunk
6
Chunk ini
128 tok
Batas embedder
512 tok

Chunk 3 mulai dan berakhir di tengah kalimat. Pemotongan ukuran tetap mengabaikan isi teks, dan 4 dari 5 batas di sini memotong kalimat. Panduan ini lebih panjang dari batas embedder 512 token, dan satu vector untuk semua 6 bagian akan mengaburkan semuanya. Setiap chunk mendapat vector sendiri, dan retrieval mengembalikan chunk, bukan dokumen.

Geser Chunk dari 1 ke 6 dan baca setiap potongan panduan sepanjang 128 token. Jumlah token di sini diperkirakan sekitar 1,3 token per kata bahasa Inggris. Kebanyakan model embedding yang dibangun di atas encoder seukuran BERT menerima 512 token dan diam-diam memotong selebihnya, sehingga akhir dokumen panjang tidak pernah terindeks. Knowledge base sungguhan juga berisi teks yang jauh lebih banyak daripada context 4.096 token pada model 7B. Paper RAG asli mengindeks Wikipedia sebagai potongan 100 kata, mengikuti retriever DPR, dan granularitas itu masih menjadi titik awal yang umum.

Langkah 2 dari 6: Ukuran Chunk

Presisi tetapi terpotong, atau utuh tetapi encer

Ukuran chunk96 token
Query: "Which day is the Louvre closed?"Miss: jawaban terbagi ke dua chunk120hit7/1232128256384512ukuran chunk (token), hit top-1 pada 12 pertanyaan contoh, skor ilustrasi
Chunk
8
Skor chunk teratas
0.52
Panduan lain terbaik
0.47
Porsi jawaban
21%

Batas di token 288 memotong jawaban kuning menjadi dua, jadi tidak ada chunk yang memuat "opens at 9 am" sekaligus "closed every Tuesday". Chunk kecil memang presisi, tetapi kehilangan kalimat yang menjelaskan apa yang dirujuk "It".

Geser Ukuran chunk dari 32 ke 512 token dan lihat kurva hit naik lalu turun. Indeks di sini juga berisi sembilan panduan kota simulasi, sekitar 6.300 token teks perjalanan umum, jadi chunk jawaban selalu punya pesaing. Kebutuhan tiap pertanyaan berbeda: pencarian fakta seperti hari buka cocok dengan chunk kecil, sedangkan pertanyaan rangkuman butuh chunk besar. Salah satu solusi umum adalah small-to-big retrieval, yang mencari di chunk kecil demi presisi, lalu meneruskan bagian induknya yang lebih besar ke model.

Langkah 3 dari 6: Overlap

Ulangi bagian tepi agar jawaban tetap utuh

Ukuran chunk
Overlap0% (0 token)
Token berarsir disimpan di dua chunk · hit memakai skor contohjawaban utuhjawaban terbagi
Chunk
6
Penyimpanan
1.00×
Tetap utuh
10/12
Hit top-1
10/12

Tanpa overlap, 2 dari 12 jawaban melewati batas dan tidak ada chunk yang memuatnya utuh. Overlap juga menggeser setiap batas, jadi jumlah hit top-1 bisa turun di antara pengaturan.

Pilih Ukuran chunk 64, 128, atau 256 dan geser Overlap dari 0 sampai 50 persen. Dengan overlap O, chunk dimulai setiap L − O token, sehingga penyimpanan tumbuh sekitar L / (L − O): pada 128 token dan overlap 25 persen, stride-nya 96 dan faktornya 1,33. Setiap chunk tambahan juga memakan satu panggilan embedding, dan chunk bertetangga yang berbagi teks bisa mengisi beberapa posisi top-k dengan hasil yang nyaris sama. Banyak pipeline berakhir di overlap 10 sampai 20 persen dan mengandalkan batas yang lebih baik untuk sisanya.

Langkah 4 dari 6: Structure-Aware Splitting

Potong pada kalimat, paragraf, dan heading

Potong pada
Ukuran chunk maks96 token
Pemotongan per paragraf, 10 chunk · hit memakai skor contohjawaban utuhjawaban terbagi
Chunk
10 (rata-rata 69)
Potongan tengah kalimat
0
Tetap utuh
12/12
Hit top-1
12/12

Paragraf utuh dikemas sampai 96 token, dan paragraf yang terlalu panjang dipecah menjadi kalimat-kalimatnya. Jawaban yang berada dalam satu paragraf tetap bersama. Setiap jawaban muat utuh di satu chunk.

Klik Tetap, Kalimat, Paragraf, dan Heading, lalu geser Ukuran chunk maks dari 48 ke 256. Recursive splitter, seperti yang ada di LangChain, mencoba pemisah terbesar dulu, yaitu baris kosong antarparagraf, dan baru beralih ke jeda baris lalu spasi kalau potongannya masih terlalu panjang. Splitter Markdown dan HTML memakai heading dengan cara yang sama. Langkah lanjutannya adalah menambahkan judul bagian di awal setiap chunk, supaya potongan yang hanya berbunyi "It closes on Mondays" tetap menyebut museum saat diubah menjadi embedding.

Langkah 5 dari 6: Reranking

Tahap pertama yang cepat, lalu tahap kedua yang teliti

Pertanyaan
Top-k dari bi-encoderk = 5
"Can I pay by card at Metro gates?"Bi-encoder (vector)Rerank cross-encoderThe emergency number…0.51The Louvre is the most…0.47Giverny, where Claude…0.47France uses the euro…0.44The Metro has sixteen…0.36France uses the euro…0.99The Metro has sixteen…0.31The emergency number…0.12Giverny, where Claude…0.10The Louvre is the most…0.05
Peringkat bi-encoder
4
Setelah rerank
1
Proses cross-encoder
5

Vector search menaruh chunk jawaban di peringkat 4. Cross-encoder membaca pertanyaan bersama setiap 5 chunk, lalu memindahkannya ke peringkat 1. Setiap kandidat memakan satu proses cross-encoder, jadi k menentukan latensi. Skor di sini ilustrasi.

Pilih Pertanyaan dan geser Top-k dari bi-encoder dari 1 ke 10. Bi-encoder membuat embedding query dan setiap chunk secara terpisah, jadi vector chunk dihitung sekali saat indexing dan pencarian berupa pencarian nearest neighbour. Cross-encoder memasukkan query dan satu chunk bersama-sama ke transformer yang sama, sehingga attention bisa membandingkan kata-katanya secara langsung. Nogueira dan Cho (2019) memakai BERT dengan cara ini untuk mengurutkan ulang kandidat BM25 di MS MARCO. Pipeline produksi sering mengambil 50 sampai 100 kandidat dan menyimpan 3 sampai 5 teratas dari reranker.

Langkah 6 dari 6: Evaluasi Retrieval

Recall@k dan MRR pada pertanyaan berlabel

Pipeline
k untuk recall@kk = 3
Peringkat chunk jawaban untuk tiap pertanyaan berlabel12345678910>10Louvre closed1/1Orsay closed1/1Airport to city1/1Electric bikes1/2Tipping1/1Versailles court1/1Giverny gardens1/1Dinner time1/4Card on Metro1/4Emergency number1/3Arrondissements1/1Navigo card1/5MRR = rata-rata 1/peringkat (0 setelah peringkat 10) · skor ilustrasi
Recall@3
75%
MRR@10
0.71
Jawaban di peringkat 1
7/12

Vector search saja menghasilkan MRR 0,71. Ia melewatkan pertanyaan yang bergantung pada istilah persis seperti "112" atau "Navigo". Recall@3 menghitung 9 pertanyaan yang chunk jawabannya ada di top 3.

Klik setiap Pipeline dan geser k untuk recall@k dari 1 ke 10. MRR adalah (1/|Q|) Σ 1/rank_i. Untuk vector search di sini, peringkat jawabannya 1 untuk tujuh pertanyaan, lalu 2, 3, 4, 4, dan 5, sehingga MRR = (7 + 0.5 + 0.33 + 0.25 + 0.25 + 0.2) / 12 = 0.71. Melabeli rentang jawaban, bukan ID chunk, membuat kumpulan pertanyaan tetap valid ketika chunking berubah. Reciprocal rank fusion berasal dari Cormack dkk. (2009). Untuk relevansi bertingkat, metrik yang biasa dipakai adalah nDCG.

Bagaimana chunking dan reranking bekerja dalam RAG?

Chunking adalah tahap dalam retrieval-augmented generation (RAG) yang memecah dokumen menjadi potongan pendek, masing-masing diubah menjadi embedding dan disimpan sebagai vector sendiri. Reranking adalah tahap retrieval kedua yang memberi skor ulang pada hasil awal dengan model yang lebih lambat tetapi lebih akurat. Keduanya menentukan teks mana yang sampai ke prompt model bahasa, sehingga menjadi batas atas kualitas jawaban RAG.

Setiap sistem RAG melakukan chunking pada dokumennya, baik untuk menjawab pertanyaan dari artikel dukungan, kontrak hukum, kode, maupun manual produk. Ukuran chunk, overlap, dan letak batasnya mengubah apa yang bisa ditemukan pencarian. Di kebanyakan pipeline produksi, reranker berada di antara vector search dan prompt, karena cross-encoder menangkap potongan relevan yang diberi peringkat terlalu rendah oleh bi-encoder yang cepat. Tim menyetel keduanya dengan kumpulan pertanyaan berlabel dan metrik seperti recall@k dan MRR.

Ide utama

  • RAG mengambil chunk, bukan dokumen utuh, jadi chunking menentukan apa yang bisa ditunjukkan ke model.
  • Chunk kecil cocok secara presisi tetapi bisa memotong jawaban, sedangkan chunk besar menjaganya tetap utuh tetapi mengencerkan embedding-nya.
  • Overlap menjamin jawaban sepanjang overlap pasti muat utuh di salah satu chunk, dengan biaya penyimpanan tambahan.
  • Memotong pada kalimat, paragraf, dan heading menjaga teks yang berkaitan tetap bersama, lebih baik daripada jumlah token tetap.
  • Reranker cross-encoder membaca query bersama setiap kandidat dan memperbaiki urutan pencarian tahap pertama yang cepat, tetapi tidak bisa memulihkan chunk yang tidak pernah terambil.
  • Recall@k dan MRR pada kumpulan pertanyaan berlabel mengubah pilihan chunking dan retrieval menjadi angka yang bisa diukur.

Ulasan singkat tentang topik ini

Pertanyaan umum

Ukuran chunk berapa yang sebaiknya dipakai untuk RAG?

Tidak ada satu ukuran terbaik. Banyak tim mulai di antara 256 dan 512 token dengan overlap 10 sampai 20 persen, lalu membandingkan beberapa ukuran pada kumpulan pertanyaan berlabel. Pertanyaan faktual pendek cenderung cocok dengan chunk kecil, dan pertanyaan yang butuh satu bagian utuh cocok dengan chunk besar.

Apa itu semantic chunking?

Semantic chunking membuat embedding setiap kalimat dan memulai chunk baru ketika kemiripan antarkalimat yang bertetangga turun, dengan asumsi penurunan itu menandai pergantian topik. Caranya tidak butuh ukuran tetap dan mengikuti isi. Biayanya satu panggilan embedding per kalimat saat indexing, dan pada dokumen yang terstruktur baik, hasilnya sering kurang lebih sama dengan pemotongan yang memperhatikan heading.

Apakah reranker sepadan dengan tambahan latensinya?

Sering kali ya. Cross-encoder atas 20 sampai 100 kandidat biasanya menambah puluhan hingga beberapa ratus milidetik di GPU, sedangkan menghasilkan jawaban butuh waktu lebih lama. Manfaatnya paling besar ketika chunk yang benar terambil, tetapi peringkatnya di bawah batas untuk prompt. Kalau chunk yang benar sama sekali tidak ada di daftar kandidat, chunking yang lebih baik atau hybrid search akan lebih membantu.

Apa bedanya BM25 dan vector search?

BM25 memberi skor dokumen berdasarkan kecocokan istilah persis, dengan bobot lebih tinggi untuk istilah langka dan normalisasi panjang dokumen. Vector search membandingkan embedding yang dipelajari, jadi cocok untuk parafrase, tetapi bisa mengaburkan nama langka, kode, dan angka. Hybrid search menjalankan keduanya dan menggabungkan dua daftar peringkat, sering kali dengan reciprocal rank fusion.

Penjelasan terkait

Referensi

  1. Lewis et al. (2020), "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks"
  2. Karpukhin et al. (2020), "Dense Passage Retrieval for Open-Domain Question Answering"
  3. Nogueira and Cho (2019), "Passage Re-ranking with BERT"
  4. Cormack, Clarke, and Buettcher (2009), "Reciprocal Rank Fusion Outperforms Condorcet and Individual Rank Learning Methods"

Terakhir diperbarui