2. Hướng tiếp cận
🧠 Các sub-tasks cần giải quyết
- Medical NER — Entity span detection
- Entity Classification — 5 nhãn
- Code Mapping — ICD-10 (disease) + RxNorm (drug)
- Contextual Reasoning — Negation, Family, History
- Relation Extraction — Quan hệ giữa các concept
📊 So sánh các Option
| Tiêu chí | Option A: NER-only ✅ | Option C: Hybrid (Self-host) |
|---|---|---|
| GPU cần | ❌ Không (CPU) | ⚠️ Có thể (7-9B LLM) |
| Độ chính xác | Trung bình | Cao nhất |
| Chi phí | Miễn phí | Trung bình |
| Phụ thuộc API | Không | Không |
| Phase 1 khả thi | ✅ | ⚠️ Cần GPU |
| Độ phức tạp | Trung bình | Cao |
🚫 Option B (LLM API) đã bị loại — BTC xác nhận không được dùng API ngoài, chỉ self-host ≤ 9B params
Option A: Lightweight NER Pipeline (Recommended cho Phase 1)
Kiến trúc
Input Text
↓
PhoBERT / BioBERT fine-tune
↓
NER → Entity spans + types
↓
Code Mapping (Fuzzy string matching)
↓
Negation Detection (rule-based / dependency parse)
↓
JSON Output
Chi tiết
1. Medical NER:
- PhoBERT-base (~135M params) — chạy CPU được
- Fine-tune trên dữ liệu tự sinh + public medical datasets
- Output: entity spans + type classification
2. Code Mapping:
- ICD-10: Fuzzy string matching + synonym dictionary
- RxNorm: Tải database RxNorm full → build index → cosine similarity
3. Contextual Reasoning:
- Negation: Dependency parse (thấy “không”, “chưa” trước entity → isNegated)
- Family: Keyword pattern (“bố”, “mẹ”, “gia đình”)
- History: Keyword pattern (“tiền sử”, “đã từng”)
Ưu điểm
- Chạy CPU được
- Không phụ thuộc API
- Chi phí = 0
Nhược điểm
- Độ chính xác phụ thuộc nhiều vào dữ liệu tự sinh
- Rule-based có thể miss edge cases
Option B: LLM Pipeline (Nếu BTC cho phép API)
Kiến trúc
Input Text
↓
Prompt → LLM API (DeepSeek/GPT/Claude)
↓
Structured JSON output
↓
Hậu xử lý (validate format)
↓
Final JSON
Prompt template
You are a medical NLP system. Given a clinical text in Vietnamese,
extract all medical concepts and output as JSON.
Types: TRIỆU_CHỨNG, TÊN_XÉT_NGHIỆM, KẾT_QUẢ_XÉT_NGHIỆM,
CHẨN_ĐOÁN (→ ICD-10), THUỐC (→ RxNorm)
Assertions: isNegated, isFamily, isHistorical
Input: {text}
Output: JSON array of concepts
Ưu điểm
- Dễ implement
- Độ chính xác cao
- Xử lý được negation/context tốt
Nhược điểm
- ⚠️ BTC chưa trả lời có cho dùng API ngoài không (câu hỏi trên diễn đàn chưa được reply)
- Phase 1: tốn chi phí API
- Rate limit
Option C: Hybrid (Khuyến nghị cho các Phase sau)
Kiến trúc
Input Text
↓
NER model nhẹ → span detection
↓
LLM (< 9B) self-hosted → mapping + reasoning
↓
JSON Output
Chi tiết
Component 1 — NER model:
- Dùng model nhẹ (< 500M params) chỉ cho span detection
- Output: vị trí + type của entity
Component 2 — LLM local < 9B:
- Gemma-2 9B, Qwen2.5-7B, DeepSeek-7B, etc.
- ICD-10/RxNorm mapping
- Assertion reasoning
Ưu điểm
- Balance giữa accuracy và chi phí
- Không phụ thuộc API ngoài
Nhược điểm
- Cần GPU cho LLM 7-9B
- Phase 1 khó chạy full pipeline
✅ Kế hoạch hành động Phase 1
-
Kiểm tra constraint:
- BTC có cho dùng API không? (theo dõi diễn đàn)
- BTC có cấp ICD-10/RxNorm database không? (câu hỏi chưa trả lời)
-
Build baseline (ưu tiên):
- Rule-based NER với regex + dictionary
- ICD-10 mapping bằng fuzzy matching
- RxNorm mapping bằng tải database → search index
- Kiểm tra output format
-
Phát triển tiếp:
- Tự sinh dữ liệu train (từ ICD-10 descriptions + RxNorm)
- Fine-tune PhoBERT/BioBERT
- Improve negation detection
-
Submit sớm:
- Submit baseline → check điểm → iterate