Tháng 10 mình làm tool consult_course cho Dan Tech MCP. Agent của học viên đang sửa code app thì gọi tool, gửi một dòng mô tả việc đang làm, server trả về vài đoạn kiến thức trong khóa học khớp với việc đó. Ghi lại các con số đo được, ai làm RAG cho nội dung tiếng Việt chắc sẽ gặp y hệt.
Trích xuất. Mỗi bài học được Claude Opus đọc một lần lúc xuất bản và tách thành các unit: nguyên tắc, lỗi thường gặp kèm cách sửa, code mẫu, checklist, khi nào không nên dùng. 167 bài (tính theo từng ngôn ngữ) ra 1.296 unit, trung bình 7,8 unit một bài, chạy 52 phút, tốn khoảng 19 USD. Luật kiểm ban đầu mình viết theo Haiku. Đổi sang Opus thì luật đó loại 31/86 unit, vì Opus viết dài hơn giới hạn vài ký tự, ít keyword tiếng Việt hơn mức tối thiểu, hoặc để placeholder trong code inline. Phải nới giới hạn khoảng 25%.
Lần đo đầu dùng full-text của Postgres. Bộ eval 30 câu hỏi, cần đúng 26 mới bật. Kết quả 24/30. Câu tiếng Việt đúng 10/10, câu tiếng Anh 10/14, câu trộn Anh Việt 4/6. Cả 6 ca trượt đều là câu tiếng Anh hoặc trộn, 4 ca có bài đúng chỉ viết bằng tiếng Việt. Full-text khớp theo chữ, nên câu tiếng Anh gặp unit tiếng Việt chỉ còn khớp được qua tên API.
Lỗi nặng hơn nằm ở chỗ khác. 6 câu không có bài đúng và 4 câu ngoài phạm vi khóa (Postgres cron, Next.js, Python, SwiftUI) vẫn nhận 2 đến 5 unit mỗi câu. Agent nhận mấy unit đó sẽ tự tin áp lời khuyên lạc đề vào code của học viên.
Lần đo thứ hai dùng hybrid: thêm embedding Gemini 768 chiều, gộp với full-text bằng Reciprocal Rank Fusion (k=60), cộng một ngưỡng cosine tối thiểu. Mình quét ngưỡng từ 0,45 tới 0,75 trên tập dev và chọn 0,70, mức cao nhất mà dev vẫn giữ được 17/20. Kết quả 25/30, hit@3 tăng từ 19 lên 22. Câu ngoài phạm vi trả rỗng 4/4, câu không có bài đúng còn lọt 3/6. Đổi lại mỗi lần gọi chậm thêm khoảng 0,7 giây vì phải embed câu hỏi.
Vẫn thiếu 1 ca so với ngưỡng 26. Hạ ngưỡng xuống 0,69 là cứu được 1 ca trong holdout, nhưng như vậy là chỉnh theo holdout, nên mình giữ 0,70 và chấp nhận 25/30. Tool bật từ 09/10.
liked this




