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

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 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)
Downloads last month
202
Safetensors
Model size
3B params
Tensor type
F16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for ningpy/redflag-context-3b

Base model

Qwen/Qwen2.5-3B
Finetuned
(1586)
this model