Bỏ qua để đến nội dung
Search & RAG

Tầng 4 — Chunking & Indexing

  • Chunk quá nhỏ → mất ngữ cảnh, đại từ mất tham chiếu, embedding thiếu tín hiệu.
  • Chunk quá to → loãng tín hiệu (một câu liên quan trong 2000 token bị pha loãng), và tốn context window khi đưa vào prompt.

Liên hệ với Tầng 0: chunking là cách can thiệp vào dl/avgdl ở tầng dữ liệu. Chunk đều nhau làm b gần như vô nghĩa — đó là dấu hiệu chunking đang làm việc.

Đo thật trên data/corpus.jsonl (gộp/tách tài liệu để mô phỏng các mức chunk, k1 = 1.2, nDCG@5 trên 24 truy vấn):

đơn vị indexavgdl (từ)CV độ dàidao động nDCG@5 khi quét b 0→1b tối ưu
câu lẻ23.60.300.0291.0
tài liệu (~44 từ)48.50.140.0080.25
gộp 2 tài liệu96.90.110.0170.25
gộp 10 tài liệu484.60.080.0030

Chunk càng đều (CV thấp) thì b càng không còn tác dụng, và b tối ưu tụt về 0. b là băng dán cho chunking kém. Grid k1×b đầy đủ và cách chọn chunk size theo loại truy vấn: 3.15.

Khi so sánh hai chunk size, phải cố định ngân sách context. So top-5 chunk nhỏ với top-5 chunk to là so hai lượng văn bản khác nhau — chunk to thắng vì được trả nhiều chữ hơn, không phải vì tìm giỏi hơn. Cố định số token trả về (k điều chỉnh theo avgdl), căng thẳng thật hiện ra: trên corpus này chunk nhỏ thắng ở recall của đúng mẩu thông tin (0.778 vs 0.708), chunk to thắng ở thứ tự (nDCG 0.819 vs 0.758). Đó là lý do parent-child tồn tại — lấy cả hai cột.

Số dẫn từ nguồn ngoài, có benchmark nhiều dataset: truy vấn factoid đáp án ngắn tối ưu ở 64–128 token; truy vấn cần ngữ cảnh rộng cần 512–1024 token. Chưa biết gì về phân bố truy vấn thì khởi điểm 256–512 token, overlap 10–20%.

Chiến lượcCách làmKhi nào dùng
Fixed-size + overlapcắt N token, chồng lấn 10–20%baseline, luôn thử trước
Recursivecắt theo phân cấp: đoạn → câu → từvăn bản có cấu trúc
Semanticcắt ở chỗ embedding của câu kề nhau đổi nhiềuchi phí cao, lợi ích thường nhỏ
Parent-childindex chunk nhỏ để tìm, trả về chunk cha để đọcrất hiệu quả, nên là mặc định
Late chunkingencode cả tài liệu dài trước, rồi pool theo từng chunkchunk thừa hưởng ngữ cảnh toàn tài liệu
Contextual retrievaldùng LLM sinh 1–2 câu ngữ cảnh gắn vào đầu mỗi chunk trước khi indextốn tiền index một lần, cải thiện lớn

Parent-child và contextual retrieval là hai thứ đáng làm nhất. Cả hai đều tấn công đúng vào căng thẳng ở trên: tìm bằng đơn vị nhỏ (tín hiệu đậm), đọc bằng đơn vị lớn (ngữ cảnh đủ).

Chunk nào cũng nên mang: nguồn, ngày, phiên bản, phòng ban, quyền truy cập, loại tài liệu. Lý do:

  1. Filter trước khi tìm rẻ hơn tìm rồi lọc — và nhiều truy vấn thật ra là truy vấn filter, không phải truy vấn semantic (“hợp đồng ký sau tháng 6”).
  2. Trích dẫn được nguồn (Tầng 8).
  3. Phân quyền — bắt buộc, và phải ở tầng index, không phải ở tầng prompt.
Phần 4 — Lý thuyết