RAG không phải phép màu

dạo này RAG (retrieval-augmented generation) được nói tới như giải pháp cho mọi thứ. "chunk tài liệu, embed, bỏ vô vector DB, xong." thực tế không đơn giản vậy.

tôi có 3 tháng làm R&D về sinh test case tự động từ tài liệu yêu cầu phần mềm, dùng RAG với model 7B fine-tune. mấy thứ tôi rút ra.

rag pipeline

chuyện chunk tài liệu nghe thì dễ — cắt ra từng đoạn 512 tokens. nhưng tài liệu kỹ thuật không phải blog. nó có bảng biểu, đánh số, tham chiếu chéo. cắt theo token là hỏng context.

tôi phải viết một cái chunker riêng, hiểu được heading, table, list. tốn khoảng 2 tuần. nhưng nó tiết kiệm nhiều đau khổ về sau.

vụ chọn embedding model cũng thú vị. thử 3 loại, multilingual-e5-large ngon nhất cho tiếng việt — tài liệu của tôi nửa anh nửa việt. mấy model chỉ train tiếng anh gặp tiếng việt là tệ hẳn.

một thứ tôi không ngờ: retrieve nhiều chunk chưa chắc đã tốt. ban đầu tôi nhồi 10 chunk vô context. kết quả tệ. đọc paper mới biết có hiện tượng "lost in the middle" — model chỉ để ý đầu và cuối prompt, bỏ qua phần giữa.

giảm xuống 3-5 chunk, sắp xếp theo relevance, chunk quan trọng nhất để cuối. accuracy tăng ~15%.

về fine-tuning, tôi dùng LoRA, train trên ~2000 cặp requirement-test case. mục đích không phải làm model thông minh hơn, mà là dạy nó format output cho đúng. model gốc đã biết ngôn ngữ rồi, chỉ cần chỉ nó cách trình bày test case.

kết quả cuối cùng: hệ thống generate được test case đúng khoảng 70%. 30% còn lại cần người sửa. không đủ để automate 100%, nhưng tiết kiệm khoảng 40% thời gian của team tester.

với project R&D 3 tháng, 2 người, tôi thấy vậy là ổn. nhưng nếu ai nói với bạn "RAG easy lắm", hỏi lại họ 3 câu: chunk strategy là gì, dùng embedding model nào, xử lý hallucination ra sao. không trả lời được là chưa build thật.

vài paper hữu ích: bài gốc về RAG, lost in the middle, LoRA.