🔎 Thuật toán search mới — bundle-aware, coarse-to-fine

Search KHÔNG index theo Chương (quá thô) cũng KHÔNG ném 1 điều trơ trọi (thiếu ngữ cảnh). Mà: match chính xác ở ĐIỀU → bung BUNDLE làm ngữ cảnh → lọc hiệu lực → nối hướng dẫn/án lệ → mới drill sâu. Đúng cách luật sư đọc.

✗ 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 nhanh
Chạ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 nhanh
Mỗ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) nhanh
Bỏ/đá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 nhanh
Từ đ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 LLM
Trả: 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ũ.