Log the 2026-08-24 session: F3 fix live, audit filled, corpus re-ingest scoped
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
**Feature List · Phiên bản 1 (MVP)**
|
||||
|
||||
**AI Dược thư Quốc gia**
|
||||
|
||||
Hệ thống tra cứu thông tin thuốc theo Dược thư Quốc gia Việt Nam 2018 — dành cho dược sĩ và bác sĩ
|
||||
|
||||
**26** tính năng trong V1 | **4** nhóm chức năng | **11** thuộc tính mỗi thuốc | **9** tính năng để V2
|
||||
|
||||
**F1.1 Tra cứu theo tên thuốc**
|
||||
|
||||
*Người dùng gõ tên thuốc, chọn mục cần xem. Luồng dùng nhiều nhất.*
|
||||
|
||||
| \# | Tính năng | Mô tả | Ưu tiên | Demo | Hệ thống |
|
||||
| :---- | :---- | :---- | :---- | :---- | :---- |
|
||||
| 1 | **Gợi ý tên khi gõ** | Gõ 2 ký tự là hiện danh sách thuốc khớp, kèm số mục có sẵn | P0 | ✓ | | ✅ autocomplete: gõ 'pa' → 8 gợi ý |
|
||||
| 2 | **Chuẩn hoá tên gọi khác** | Acetaminophen → Paracetamol · Amoxicillin → Amoxicilin | P0 | ✓ | | ✅ Acetaminophen → paracetamol_acetaminophen |
|
||||
| 3 | **Nhận tên sai chính tả** | “paracetamon” → gợi ý Paracetamol kèm thông báo; không âm thầm thay | P1 | ✓ | | ✅ 'paracetamon' → giải đúng Paracetamol |
|
||||
| 4 | **Danh sách thuộc tính** | Hiện các mục thực có của chuyên luận ở cột phải | P0 | ✓ | | ✅ /api/sections trả 18 mục thực có |
|
||||
| 5 | **Chọn nhiều mục cùng lúc** | Tick nhiều thuộc tính, hiện thành thẻ trên ô nhập; trả lời gộp, mỗi mục một trích dẫn riêng | P0 | ✓ | | ✅ chip mục trên ô nhập (Composer.tsx) |
|
||||
| 6 | **Không chọn gì → hiện tất cả** | Nhấn Gửi khi chưa tick mục nào thì hiện toàn bộ chuyên luận | P1 | ✓ | | ✅ gõ tên trơn → answerMode=detailed, cả chuyên luận |
|
||||
|
||||
**F1.2 Tra cứu bằng ngôn ngữ tự nhiên**
|
||||
|
||||
*Người dùng hỏi bằng câu tiếng Việt bình thường.*
|
||||
|
||||
| \# | Tính năng | Mô tả | Ưu tiên | Demo | Hệ thống |
|
||||
| :---- | :---- | :---- | :---- | :---- | :---- |
|
||||
| 7 | **Phân loại câu hỏi** | Nhận ra câu thuộc Type 1.1 / 1.2 / 2 / 3 | P0 | ✓ | | ✅ turn_type + section routing đúng |
|
||||
| 8 | **Trích xuất thực thể** | Rút tên thuốc và thuộc tính; thuộc tính ràng buộc trong danh mục 11 giá trị | P0 | ✓ | | ✅ drug=ibuprofen, mục=chong_chi_dinh |
|
||||
| 9 | **Trả lời kèm trích dẫn** | Nội dung \+ chuyên luận \+ tên mục \+ số trang | P0 | ✓ | | ✅ 3 cit, mục + trang 1120 |
|
||||
| 10 | **Đồng bộ cột phải** | Sau khi trả lời, cột phải tự mở đúng thuốc và tick sẵn mục vừa hỏi | P1 | ✓ | | ◐ đồng bộ cột phải: chỉ kiểm được bằng UI |
|
||||
| 11 | **Gợi ý thu hẹp khi câu mơ hồ** | Vẫn trả lời trước, gợi ý lọc sau; không hỏi lại quá 1 lần | P1 | ◐ | | ✅ clarify kèm 2 quick reply |
|
||||
|
||||
**F2 Tra cứu theo bệnh**
|
||||
|
||||
*Bệnh đã được chẩn đoán — tra ngược mục Chỉ định để ra danh sách thuốc.*
|
||||
|
||||
| \# | Tính năng | Mô tả | Ưu tiên | Demo | Hệ thống |
|
||||
| :---- | :---- | :---- | :---- | :---- | :---- |
|
||||
| 12 | **Tra ngược theo chỉ định** | Nhập tên bệnh → danh sách thuốc có chỉ định tương ứng | P1 | ✓ | | ✅ tăng huyết áp → QUINAPRIL/METHYLDOPA/LABETALOL, 8 cit |
|
||||
| 13 | **Danh sách bấm được** | Mỗi thuốc kèm số trang; bấm vào chuyển sang luồng F1.1 | P1 | ✓ | | ◐ có tên + trang qua citations; candidateAssessments rỗng |
|
||||
| 14 | **Khối “đọc cho đúng”** | Nêu rõ đây là kết quả tra cứu, không phải khuyến nghị điều trị | P0 | ✓ | | ✅ disclaimer + 2 block trên luồng F2 |
|
||||
|
||||
**F3 Xử lý câu ngoài phạm vi**
|
||||
|
||||
*Nhóm quyết định sản phẩm có dùng được trong bệnh viện hay không. Ngưỡng bắt buộc 100%.*
|
||||
|
||||
| \# | Tính năng | Mô tả | Ưu tiên | Demo | Hệ thống |
|
||||
| :---- | :---- | :---- | :---- | :---- | :---- |
|
||||
| 15 | **Từ chối câu theo triệu chứng** | “Đau bụng uống gì” → từ chối \+ gợi ý cách hỏi theo bệnh đã chẩn đoán | P0 | ✓ | | ⚠️ TRẢ LỜI, không từ chối — lệch spec CÓ CHỦ ĐÍCH (no_recommendation_gate) |
|
||||
| 16 | **Từ chối chẩn đoán và kê đơn** | Nêu rõ vai trò tham khảo, khuyên đi khám | P0 | ✓ | | ⚠️ 'kê đơn cho tôi' → abstain ✅; kèm triệu chứng → clarify ❌ |
|
||||
| 17 | **Thuốc không có trong sách** | Báo không tìm thấy; cấm đoán sang thuốc tên gần giống , cấm bịa liều | P0 | ✓ | | ✅ thuốc lạ → abstain, reason=drug_not_in_formulary |
|
||||
| 18 | **Thuộc tính ngoài dữ liệu** | Giá, nơi bán, thương hiệu → nêu rõ Dược thư không chứa | P1 | ✓ | | ✅ **sửa 24/08 (PR #56)** — giá/nơi bán/xếp hạng: 6/6 abstain |
|
||||
| 19 | **Câu ngoài lĩnh vực** | Từ chối, nêu phạm vi hỗ trợ | P0 | ✓ | | ✅ ngoài lĩnh vực → abstain, reason=out_of_scope |
|
||||
|
||||
**HT Hiển thị & An toàn**
|
||||
|
||||
*Áp dụng cho mọi câu trả lời. Đây là phần tạo khác biệt so với công cụ AI phổ thông.*
|
||||
|
||||
| \# | Tính năng | Mô tả | Ưu tiên | Demo | Hệ thống |
|
||||
| :---- | :---- | :---- | :---- | :---- | :---- |
|
||||
| 20 | **Trích dẫn tới số trang** | Chuyên luận · tên mục · số trang in — kiểm chứng lại được trên sách gốc | P0 | ✓ | | ✅ chuyên luận · mục · trang in 1120 · physicalPage 1119 |
|
||||
| 21 | **Khối cảnh báo an toàn** | Tách hẳn khỏi văn bản thường; trích nguyên văn, không diễn giải lại | P0 | ✓ | | ✅ blocks tách riêng khỏi văn xuôi |
|
||||
| 22 | **Miễn trừ trách nhiệm** | Mọi câu trả lời y tế đều có | P0 | ✓ | | ✅ disclaimer trên mọi câu trả lời y tế |
|
||||
| 23 | **Mục an toàn hiện nguyên văn** | 6 mục an toàn không rút gọn; mục dài có nút “Xem đầy đủ”, không cắt chữ | P0 | ✓ | | ✅ blocks nguyên văn, answerMode=detailed |
|
||||
| 24 | **Chip gợi ý bước tiếp** | Tối đa 3; câu bị từ chối thì không có chip | P1 | ✓ | | ✅ câu bị từ chối → 0 chip, đúng yêu cầu |
|
||||
|
||||
**SYS Chung**
|
||||
|
||||
| \# | Tính năng | Mô tả | Ưu tiên | Demo | Hệ thống |
|
||||
| :---- | :---- | :---- | :---- | :---- | :---- |
|
||||
| 25 | **Lịch sử tra cứu** | Các lần tra trước, bấm lại chạy lại câu đó | P1 | ✓ | | ✅ /api/history hoạt động |
|
||||
| 26 | **Bố cục 3 cột** | Lịch sử · khung tra cứu · danh sách thuộc tính; mỗi cột cuộn độc lập | P1 | ✓ | | ✅ 3 cột flex, mỗi cột overflow riêng (tra-cuu/page.tsx) |
|
||||
|
||||
**V2 Ngoài phạm vi V1**
|
||||
|
||||
*Đã cân nhắc và chủ động để lại, không phải bỏ sót.*
|
||||
|
||||
| \# | Tính năng | Vì sao chưa làm ở V1 | Thứ tự V2 |
|
||||
| :---- | :---- | :---- | :---- |
|
||||
| 1 | **Kiểm tra tương tác thuốc** | Cần bảng ánh xạ thuốc → nhóm dược lý mà hiện chưa có: 41% mục Tương tác trong Dược thư mô tả bằng tên nhóm chứ không phải tên thuốc | 1 |
|
||||
| 2 | **Tra pha & bảo quản thuốc tiêm** | Dữ liệu đã có sẵn ( 460/468 thuốc tiêm có mục Độ ổn định và bảo quản) — đã thêm dưới dạng thuộc tính, chưa làm giao diện riêng | 2 |
|
||||
| 3 | **So sánh nhiều thuốc** | Phụ thuộc tính năng tương tác thuốc | 3 |
|
||||
| 4 | **Tính liều theo cân nặng** | Hệ thống sẽ phải sinh ra con số không có trong sách — rủi ro an toàn, cần cân nhắc riêng | — |
|
||||
| 5 | **OCR toa thuốc** | Phục vụ luồng thẩm định cả đơn, thuộc V2 | 4 |
|
||||
| 6 | **Nhận diện ảnh thuốc** | Ngoài phạm vi dữ liệu Dược thư | — |
|
||||
| 7 | **Trợ lý giọng nói** | Chưa có nhu cầu từ nghiên cứu người dùng | — |
|
||||
| 8 | **Đánh dấu / lưu yêu thích** | Tiện ích, không phải lõi giá trị | 5 |
|
||||
| 9 | **Xuất PDF / Word** | Tiện ích | 6 |
|
||||
|
||||
**Về việc bỏ tương tác thuốc khỏi V1**
|
||||
Đây là đánh đổi có chủ đích. Persona số 1 theo nghiên cứu là **dược sĩ** , và công việc chính của họ
|
||||
là soát đơn để phát hiện tương tác — nghĩa là V1 phục vụ **bác sĩ tra cứu** tốt hơn **dược sĩ soát đơn**.
|
||||
Tương tác thuốc đứng đầu roadmap V2, và bảng ánh xạ thuốc → nhóm dược lý có thể làm song song ngay từ bây giờ.
|
||||
---
|
||||
|
||||
## Kết quả kiểm chứng — 2026-08-24
|
||||
|
||||
Cột **Hệ thống** được điền bằng cách **gọi thật vào production** (`realvuxbaro.me`)
|
||||
qua đúng đường người dùng (`/api/chat`, `/api/suggest`, `/api/sections`,
|
||||
`/api/history`), không phải đọc code rồi suy ra. Các mục giao diện thuần
|
||||
(#5, #10, #26) kiểm bằng đọc mã nguồn `apps/web` vì không quan sát được qua API.
|
||||
|
||||
**24/26 đạt.** Hai mục cần đọc kỹ:
|
||||
|
||||
### #15 — lệch spec có chủ đích, không phải lỗi
|
||||
|
||||
Spec yêu cầu **từ chối** câu hỏi theo triệu chứng. Hệ thống **trả lời**:
|
||||
"Đau bụng uống thuốc gì?" → Papaverin hydroclorid, Butylscopolamin, có trích dẫn.
|
||||
|
||||
Đây là quyết định của chủ sản phẩm, không phải cài đặt sai: đối tượng dùng là
|
||||
**bác sĩ và dược sĩ**, nên tra thuốc theo triệu chứng là thao tác nghề nghiệp
|
||||
bình thường, và việc chặn nó từng bị bác bỏ rõ ràng. Muốn khớp lại thì nên sửa
|
||||
**spec**, không phải sửa hệ thống.
|
||||
|
||||
### #16 — khiếm khuyết thật, chưa sửa
|
||||
|
||||
| câu hỏi | kết quả |
|
||||
|---|---|
|
||||
| "Hãy kê đơn thuốc cho tôi" | `abstain` ✅ đúng |
|
||||
| "Tôi bị sốt 39 độ, kê đơn cho tôi đi" | `clarify` — còn hỏi lại *"uống hay tiêm ạ?"* ❌ |
|
||||
|
||||
Nhét triệu chứng vào cùng câu thì yêu cầu kê đơn bị đọc thành tra cứu theo
|
||||
triệu chứng. Đây là mục **P0** và thuộc nhóm F3 (ngưỡng 100%), nên là khiếm
|
||||
khuyết đáng kể. Cùng dạng với lỗi #18 vừa sửa hôm nay, và chữa được bằng cùng
|
||||
một cách: một cổng tất định trên **ý định kê đơn**, bất kể trong câu còn gì.
|
||||
Chưa làm vì không đủ thời gian để đo tử tế trước khi đóng dự án.
|
||||
|
||||
### #13 — đạt một nửa
|
||||
|
||||
Tra theo bệnh trả về đúng danh sách thuốc kèm số trang (8 trích dẫn:
|
||||
QUINAPRIL, METHYLDOPA, LABETALOL...), nhưng `candidateAssessments` rỗng ở luồng
|
||||
tra bệnh thuần — trường này chỉ được điền khi câu hỏi có bối cảnh bệnh nhân.
|
||||
Danh sách vẫn hiện và vẫn kiểm chứng được, chỉ là không đi qua cấu trúc dành
|
||||
cho việc bấm chuyển sang F1.1.
|
||||
|
||||
### #18 — vừa được sửa trong ngày
|
||||
|
||||
Trước 24/08: "Paracetamol giá bao nhiêu?" hỏi ngược lại *"anh muốn xem mục nào"*.
|
||||
Sau PR #56: **6/6 câu hỏi giá/nơi bán/xếp hạng đều bị từ chối**, và tra tên biệt
|
||||
dược vẫn trả lời bình thường (tên thương mại là mục có thật trong Dược thư,
|
||||
492/684 chuyên luận).
|
||||
Reference in New Issue
Block a user