# RAG rebuild plan — chatbot tra cứu hoàn thiện cho Dược thư Quốc gia VN 2018 Ngày 2026-08-06. Grounded bằng: (1) chẩn đoán live service thật, (2) đo toàn corpus đã xử lý, (3) **đọc trực tiếp PDF gốc** (render ảnh, text-layer hỏng). ## 1. Cuốn sách thật ra sao (đọc từ PDF gốc, không suy đoán) - **1668 trang, 2 cột, 3 phần.** Text-layer PDF **hỏng/đảo trang** (trang Paracetamol chèn "papaverin hydroclorid") → mọi trích xuất phải dựa vào **span in đậm + hình học + kiểm tra bằng mắt**, không dùng pdfplumber text. - **Part 2 — chuyên luận thuốc (vật lý ~99–1496):** CÓ 19 field in đậm cố định (Tên chung quốc tế, Mã ATC, Loại thuốc, Dạng thuốc, Dược lý, Chỉ định, Chống chỉ định, Thận trọng, Thời kỳ mang thai/cho con bú, Tác dụng KMM, Hướng dẫn xử trí ADR, Liều lượng, Tương tác, Quá liều, Độ ổn định, Tương kỵ, Thông tin qui chế, Tên thương mại). 684 chuyên luận. - **NHƯNG cấu trúc bên trong field KHÔNG đồng nhất:** 172/684 (25%) là chuyên luận NHÓM. INSULIN gộp ~20 mã ATC, section liều 9.268 ký tự; VITAMIN D 14.197 ký tự/8 ATC. Thuốc con + đối tượng + chỉ định nằm **lẫn trong prose** (nhãn kết thúc bằng ":", ví dụ "Đái tháo đường typ 1:", "Người lớn:"), **không có heading riêng**. Đây là gốc của "không phải section nào cũng như thế". - **Part 1 — chương tổng quát (vật lý ~37–98):** free-form — dàn ý đánh số phân cấp, bảng phân loại đóng khung, heading tự do. Nội dung lâm sàng quan trọng: ngộ độc & thuốc giải độc, kê đơn cho người suy gan/thận/trẻ em/thai kỳ, hướng dẫn theo bệnh. **Corpus hiện KHÔNG có.** - **Part 3 — phụ lục (vật lý ~1497–1528):** phân loại ATC, tính BSA, pha tiêm tĩnh mạch. Dạng tra cứu/bảng. **Corpus hiện KHÔNG có.** ## 2. Gốc bệnh đã đo được (bằng chứng live, không phải cảm tính) Khi resolve trúng 1 thuốc → trả lời ĐÚNG, grounded, có nguồn. Lỗi tập trung ở **tầng hiểu-câu/định-tuyến + thiếu node**, và ở **độ hạt chunk cho section phi đồng nhất** — KHÔNG phải ở embedding/generation: 1. Resolver fuzzy vừa nhận nhầm thuốc bịa (`aspirinol`→aspirin) vừa chết ở tên Anh đúng (`amoxicillin`). **[ĐÃ THAY — mục 3.1]** 2. Không có node: tương tác 2 thuốc, triệu chứng→thuốc, tính liều mg/kg×cân, BSA. 3. Kế thừa đa lượt chập chờn. 4. Section chunk trộn nhiều đối tượng (đo: 72% chunk liều) + chuyên luận nhóm bị cắt mù token-window (INSULIN 8 mảnh, không theo ranh giới thuốc con/chỉ định). 5. Thiếu phạm vi Part 1 + Part 3. ## 3. Kế hoạch đập & xây (phân đợt, mỗi đợt có gate + eval) **GIỮ (xương sống an toàn, đã kiểm chứng — không đập):** extract span-đậm hình học + provenance; quarantine bảng/công thức (ADR 0006); `grounding.verify` (chặn bịa số); skeleton vòng lặp `reasoning.py`. ### 3.1. Não mới — hiểu câu bằng LLM ✅ ĐÃ LÀM + PROVEN (session này) `rag/understanding.py` `LlmQueryUnderstander` → `QueryFrame` (turn_type, drugs [chỉ từ 684 thuốc thật], unknown_drugs, attribute, population, weight_kg, indication). Chạy đúng cả 7 ca killer trên LLM thật. `rag/` không import SDK. Đã dọn 2 embedder 0d giả (SectionOnly/LocalHash), chỉ còn cohere-v4; 118 test pass. ### 3.2. Nối frame vào đường trả lời + thêm node ⬅️ TIẾP THEO ($0, không re-embed) Thay `CatalogDrugResolver` fuzzy + `SectionResolver` keyword bằng router theo `turn_type`: - `drug_attribute`/`drug_overview` → retrieve theo drug_id + attribute. - `interaction` → gom cả 2 thuốc (mục tương tác của mỗi bên) → tổng hợp; "không thấy bằng chứng" phải nói *đã tra ở đâu*, không khẳng định "an toàn". - `symptom_to_drug` → tra ngược `chi_dinh` (48 thuốc chứa "sốt"…). - `dosing_calc` → node tính mg/kg×cân nặng (hàm CÓ TEST, kiểu `calculators.py`, không để LLM nhân số) + BSA. Eval: unit + chạy lại bộ battery live + golden; grounding vẫn bật. Xoá resolver cũ. ### 3.3. Re-chunk structure-aware (đợt lớn — cần owner GO cho re-embed ~$0.5) - **Part 2:** cắt section lớn/nhóm theo **cấu trúc thật trong prose** — nhãn chỉ định ("Đái tháo đường typ 1:"), nhãn đối tượng ("Người lớn:", "Trẻ em:"), tên thuốc con — thành child chunk; parent = cả section để hydrate. Thêm metadata `population_tags`, `indication_tags`, `subdrug_tags` để lọc. Gỡ 72% trộn + INSULIN blob. - **Part 1:** chunk phân cấp open-taxonomy (đường dẫn heading từ dàn ý đánh số); bảng đóng khung → quarantine/tái dựng. - **Part 3:** phụ lục riêng (bảng ATC; BSA → calculator). - Schema v5 (+`content_type` monograph|chapter|appendix, +`chapter_id`). Embed chunk MỚI (cohere, announce trước). **Gate CLAUDE-cũ:** span-ledger phủ đủ **1668 trang, unassigned=0**, provenance còn nguyên, không mất chuyên luận. ### 3.4. Tái dựng 151 bảng quarantine cho retrieval (vision↔geometric consensus) Cell nghi ngờ gắn `needs_expert`; hiển thị vẫn crop+trang (bác sĩ tự đối chiếu). ### 3.5. Eval cuối Golden + battery live, so trước/sau, grounding on; whole-doc gate cho re-chunk. ## 4. Ràng buộc - Codex làm song song → claim ownership trong `coordination/` trước khi sửa. - Không cloud spend nếu chưa có owner GO cụ thể (Part 2 re-embed + Part 1/3 embed). - AWS $138.50 credit khuyến mãi, pay-per-call, idle ≈ $0. ## 5. Thứ tự đề xuất 3.2 trước (bot hết ngu ngay, $0) → 3.3 (mở phạm vi + sửa chunk, cần GO) → 3.4 → 3.5.