redflag-context-3b / README.md
ningpy's picture
Initial upload: red flag context module (Qwen2.5-3B + LoRA merged)
8f4f058 verified
|
Raw History Blame Contribute Delete
5.18 kB
---
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: `context` 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 **`context` 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 environmental context / mechanism from the user's message.
===== EXTRACT WHEN text mentions =====
- Trauma / fall / accident / crash โ†’ post_trauma
- Recent surgery / procedure โ†’ post_surgery
- Long sitting / long flight / long trip โ†’ post_flight
- Heat / sun exposure / hot day / outdoor 30ยฐC+ โ†’ outdoor_heat
- Pills / medication / chemicals / poison ingested โ†’ substance_ingestion
- Fire / smoke inhaled โ†’ smoke_inhalation
- Chemical fumes / bleach / gas leak โ†’ chemical_exposure
- Cold outdoors / freezing / hypothermia โ†’ cold_exposure
- Water incident / drowning / near-drown โ†’ drowning
- Electric shock / lightning โ†’ electrical_injury
- Snake / spider / scorpion / jellyfish bite/sting โ†’ venomous_bite
- Physical attack / beaten / assault โ†’ serious_assault
===== EXAMPLES =====
"Fell off bike hit head" โ†’ {"context_flags": ["post_trauma"]}
"10-hour flight, chest hurts" โ†’ {"context_flags": ["post_flight"]}
"Been outdoor all day 40 degrees" โ†’ {"context_flags": ["outdoor_heat"]}
"Took double dose of pills" โ†’ {"context_flags": ["substance_ingestion"]}
"Chemical fumes at work" โ†’ {"context_flags": ["chemical_exposure"]}
"Kena patuk ular" โ†’ {"context_flags": ["venomous_bite"]}
"How is asthma treated?" โ†’ {"context_flags": []}
Look for context described DIRECTLY or through natural descriptors.
Output: {"context_flags": [...]}
===== 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-context-3b')
model = AutoModelForCausalLM.from_pretrained(
'peiyan-ning/redflag-context-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)