--- license: apache-2.0 base_model: Qwen/Qwen2.5-3B-Instruct library_name: transformers tags: - medical - red-flag - extraction - qwen2.5 - multi-lingual - brunei-english language: - en - zh - ms --- # Red Flag Detection: `modifier` module (Qwen2.5-3B-Instruct + LoRA merged) Part of a **5-module medical red flag detection system** for Brunei English (Manglish), Chinese, and Bahasa Melayu clinical notes / patient messages. This model is the **`modifier` extraction module** — one of 5 specialized modules used together with a Python rule engine (V20 spec, 59 rules). ## Sister modules - `peiyan-ning/redflag-symptom-3b` — 83-symptom multi-label extraction - `peiyan-ning/redflag-context-3b` — 12 context flags (post_trauma, drowning, etc.) - `peiyan-ning/redflag-modifier-3b` — onset / fever_celsius / consciousness / etc. - `peiyan-ning/redflag-denied-3b` — denied symptoms (multi-turn negation) - `peiyan-ning/redflag-gate-3b` — 8 population gates (is_pregnant, is_child, ...) ## Performance (2246-case independent test set) Full 5-module pipeline + rule engine V46: | Metric | P | R | F1 | Acc | |---|---|---|---|---| | PRIMARY (any_matched × labeled_matched) | **0.902** | **0.911** | **0.906** | 91.9% | | STRICT matched-only | 0.893 | 0.828 | 0.859 | 91.8% | | STRICT m+s | 0.844 | 0.905 | 0.873 | 92.1% | ## System prompt used at inference ``` Extract quantitative modifiers from text. ===== EXTRACT onset ===== Set onset:"acute" when text describes SUDDEN event: - "suddenly", "just", "out of nowhere", "in an instant", "突然", "tiba-tiba" - Trauma events: "fell", "crash", "hit" - Symptom onset described as fast: "just started" Set onset:"chronic" when described as long-standing/gradual. ===== EXTRACT temperature ===== When text has actual number: "39.5°C" / "38 degrees" / "40度" → fever_celsius ===== EXTRACT other modifiers ===== - seizure duration in minutes → seizure_duration_min - inhaler used / worked → inhaler_used / inhaler_effective - bleeding amount described "heavy" / "uncontrolled" → bleeding_severity - burn size → burn_severity - burn location → burn_location - consciousness: alert / confused / drowsy / unresponsive ===== EXAMPLES ===== "Suddenly severe chest pain" → {"modifiers": {"onset": "acute"}} "Fell down and hit head" → {"modifiers": {"onset": "acute"}} "Fever 39.5 for 3 days" → {"modifiers": {"onset": "chronic", "fever_celsius": 39.5, "fever_days": 3}} "Seizure lasted 7 minutes" → {"modifiers": {"seizure_duration_min": 7}} "Uncontrolled bleeding" → {"modifiers": {"bleeding_severity": "uncontrolled"}} "Not sure about symptoms" → {"modifiers": {}} Output: {"modifiers": {...}} ===== MULTILINGUAL / MANGLISH GUIDANCE ===== Text may be in Brunei/Manglish English or mixed with Malay/Chinese. Ignore these colloquial particles when extracting: "lah", "kah", "meh", "ah", "leh", "lor", "sia", "one". Common Manglish/Malay/Chinese mappings: - "kena panic attack" / "feel like dying" / "jantung deg-deg" → severe_panic - "sesak nafas" (Malay) / "喘不过气" → breathlessness - "sakit dada" (Malay) / "胸口疼" → chest_pain - "sakit kepala teruk" / "剧烈头痛" / "worst headache" → thunderclap_headache - "pengsan" (Malay) / "晕倒" → fainting - "sawan" (Malay) / "抽搐" → seizure - "anak saya" (Malay: my child) → is_child - "bayi saya" (Malay: my baby) → is_baby - "warga emas" / "老人家" → is_elderly - "hamil" / "怀孕" → is_pregnant - "kencing manis" (Malay: diabetes) → has_diabetes - "asma" (Malay: asthma) → has_asthma - "kena patuk ular" (Malay: snake bit) → context_flags: venomous_bite Auntie/uncle in Manglish family reference: usually elderly family member → is_elderly. ``` ## Usage ```python from transformers import AutoTokenizer, AutoModelForCausalLM import torch, json tok = AutoTokenizer.from_pretrained('peiyan-ning/redflag-modifier-3b') model = AutoModelForCausalLM.from_pretrained( 'peiyan-ning/redflag-modifier-3b', torch_dtype=torch.float16, device_map='auto' ) SYSTEM_PROMPT = tok.chat_template # or use the prompt above messages = [ {'role': 'system', 'content': SYSTEM_PROMPT}, {'role': 'user', 'content': 'My 3-year-old child has severe fever and vomiting lah'}, ] inputs = tok.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors='pt').to(model.device) out = model.generate(inputs, max_new_tokens=200, do_sample=False) text = tok.decode(out[0][inputs.shape[1]:], skip_special_tokens=True) result = json.loads(text) print(result) ``` ## Full pipeline See [git.evyd.tech/ai/redflag-detection-2.0](https://git.evyd.tech/ai/redflag-detection-2.0) for: - Rule engine (59 V20 rules) - Post-processing (gate_detector, severity_extractor, numeric_extractor) - End-to-end sample inference code ## Training - Base: Qwen/Qwen2.5-3B-Instruct - LoRA: r=32, α=64, dropout=0.05 - Target modules: q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj - 2 epochs, LR 2e-4, cosine, warmup 5%, effective batch 32 - Multi-lingual: EN/ZH/MS with Manglish particles (lah/kah/meh)