File size: 5,104 Bytes
4ad65d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
---
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)