2. Hướng tiếp cận

🧠 Các sub-tasks cần giải quyết

  1. Medical NER — Entity span detection
  2. Entity Classification — 5 nhãn
  3. Code Mapping — ICD-10 (disease) + RxNorm (drug)
  4. Contextual Reasoning — Negation, Family, History
  5. 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ácTrung bìnhCao nhất
Chi phíMiễn phíTrung bình
Phụ thuộc APIKhôngKhông
Phase 1 khả thi⚠️ Cần GPU
Độ phức tạpTrung bìnhCao

🚫 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


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

  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)
  2. 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
  3. Phát triển tiếp:

    • Tự sinh dữ liệu train (từ ICD-10 descriptions + RxNorm)
    • Fine-tune PhoBERT/BioBERT
    • Improve negation detection
  4. Submit sớm:

    • Submit baseline → check điểm → iterate