✗ Search cũ (RAG ngây thơ)
Embedding → trả top-k đoạn rời rạc.
→ AI thấy "Điều 82" trơ trọi, không biết nó thuộc Chương "Thu hồi đất", không biết đã bị NĐ nào sửa, có án lệ nào. Cite được nhưng hiểu sai ngữ cảnh.
✓ Search mới (bundle-aware)
Hybrid match ở điều → bung Chương (bundle) + tóm tắt → lọc còn hiệu lực → kèm hướng dẫn/án lệ.
→ AI thấy cả cụm + cờ + nguồn, drill xuống điều khi cần. Hiểu đúng, cite đúng.
6 bước
1
Hybrid match ở mức ĐIỀU nhanhChạy song song: full-text (từ khoá, tiếng Việt có dấu) + pgvector (ngữ nghĩa, embedding). Gộp điểm (RRF). Đơn vị match = điều → cite chính xác.
2
Bung BUNDLE làm ngữ cảnh nhanhMỗi điều trúng → lấy Chương/Mục cha (ltree path <@) + tóm tắt bundle + các điều anh em. AI đọc "section này nói gì" trước, không ngộp.
3
Lọc HIỆU LỰC (as_of) nhanhBỏ/đánh dấu điều đã hết hiệu lực tại thời điểm hỏi. Gắn cờ: xanh còn hiệu lực · vàng đã bị sửa · đỏ đã bãi bỏ.
4
Mở rộng qua CITATOR nhanhTừ điều/bundle, đi edge: guides (NĐ/TT hướng dẫn) · amended_by (bản sửa mới) · án lệ viện dẫn. Gom on-demand (không lưu sẵn → không nổ).
5
Re-rank theo thứ bậc đọc nhanhƯu tiên: hiệu lực > thứ bậc (Luật>NĐ>TT) > độ khớp > trạng thái duyệt (xanh trước). Đúng "đọc từ cao xuống thấp".
6
Trả gói GROUNDED cho AI cho LLMTrả: tóm tắt bundle + điều khớp (nguyên văn) + cờ + hướng dẫn/án lệ liên quan + citation từng cái. AI chỉ diễn giải trên gói này — không bịa. Drill sâu = gọi tiếp node_get điều cụ thể.
Vì sao đúng
🎯 Match ở điều (cite chính xác) nhưng trả ở bundle (đủ ngữ cảnh). Thế giới làm vậy: semantic tìm chỗ liên quan, structure (Chương) cho ngữ cảnh, citator cho hướng dẫn/sửa đổi — KHÔNG ai index theo chương vì câu hỏi cắt ngang chương. Coarse-to-fine = AI không ngộp, người dùng tin được.
⏱️ Temporal gắn liền search: mọi kết quả lọc theo as_of + cờ. Hỏi "luật này năm 2020 thế nào" → trả đúng phiên bản 2020. Đổi luật → cờ vàng nhắc, không trả nhầm bản cũ.