TriageIQ turns a free-text IT support complaint into a single structured,
schema-valid JSON incident record. It is the fast-path model behind the
TriageIQ predictive complaint-triage & SLA-aware routing engine, fine-tuned on
the AMD Instinct MI300X.
This is Qwen/Qwen3-4B-Instruct-2507 with a bf16 LoRA fine-tune merged into
the base weights — load it like any standard causal LM; no PEFT required at
inference time.
What it does
Given a complaint, the model emits exactly this JSON object and nothing else:
json
1{2"summary":"One-line normalized incident title",3"category":"Software | Hardware | Network | Access",4"urgency":1,5"impact":1,6"assignment_group":"IT Support | Network Ops",7"suggested_first_action":"Concrete first remediation step",8"confidence":0.09}
Design note — priority and SLA are not model outputs. Priority (P1–P5)
and the SLA target are computed deterministically downstream from
(impact, urgency) via the ITSM matrix, and the dynamic SLA-breach-risk is a
separate explainable engine. The model is deliberately kept to the perception
step (text → structured record) so the business logic stays auditable.
Intended use
Automated first-pass triage of IT service-desk tickets into structured records.
Feeding a deterministic routing / SLA engine that consumes the JSON contract.
Demo / research within the TriageIQ project (AMD Hackathon — Customer Complaint
Classification & Routing Engine track).
Not intended for medical, legal, or safety-critical decisions, or as the sole
authority for ticket prioritization without the downstream deterministic engine.
Usage
The model was trained with a fixed system prompt; use it verbatim for best results.
python
1import torch
2from transformers import AutoModelForCausalLM, AutoTokenizer
34model_id ="naazimsnh02/TriageIQ-Qwen3-4B"5tok = AutoTokenizer.from_pretrained(model_id)6model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.bfloat16, device_map="auto")78SYSTEM_PROMPT =(9"You are TriageIQ, an IT service-desk triage assistant. Convert the user's "10"complaint into a single JSON object with EXACTLY these keys: summary, "11"category, urgency, impact, assignment_group, suggested_first_action, "12"confidence. "13"category is one of [Software, Hardware, Network, Access]. "14"assignment_group is one of [IT Support, Network Ops]. "15"urgency and impact are integers 1=High, 2=Medium, 3=Low. "16"confidence is a float 0.0-1.0. "17"Do NOT include priority or SLA — those are computed elsewhere. "18"Output ONLY the JSON object, no prose, no code fences."19)2021complaint ="My laptop won't connect to the office Wi-Fi since this morning and I have a client call in 20 minutes."22messages =[23{"role":"system","content": SYSTEM_PROMPT},24{"role":"user","content": complaint},25]26prompt = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)27inputs = tok(prompt, return_tensors="pt").to(model.device)28out = model.generate(**inputs, max_new_tokens=256, do_sample=False)29print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Serving with vLLM (ROCm or CUDA):
vllm serve naazimsnh02/TriageIQ-Qwen3-4B
Evaluation
Held-out validation set of 75 complaints, greedy decoding, scored with the
project's TriageRecord schema validator (the same contract enforced in
production). Field metrics are computed over schema-valid outputs.
Metric
Base (Qwen3-4B-Instruct)
TriageIQ (fine-tuned)
Schema-valid rate
100.0%
100.0%
Category accuracy
86.7%
97.3% (+10.7)
Assignment-group agreement
90.7%
96.0% (+5.3)
Impact agreement
100.0%
100.0%
Urgency agreement
65.3%
61.3%
The fine-tune's headline gain is category accuracy (+10.7 pts) and routing
accuracy (assignment-group +5.3 pts) while preserving a 100% schema-valid
rate. Urgency — the most subjective field — moves within label noise (a few
cases on 75); it is also the field whose downstream effect is bounded by the
deterministic priority matrix rather than the model alone.
bf16 LoRA was chosen deliberately: on ROCm, bitsandbytes ≤ 0.49.2 has a 4-bit
decode NaN bug, and the MI300X's 192 GB removes any need for quantization on a
4B model — one card co-hosts the fine-tuned model and the live streaming
pipeline without quantization juggling.
Training data
~432 synthetic English IT complaints (357 train / 75 validation). Built from the
~100 unique realistic descriptions in
6StringNinja/synthetic-servicenow-incidents
used as seeds only (the raw set has independently shuffled fields and is not
trained on directly). Seeds were relabeled coherently against a fixed ITSM rubric
by a Qwen2.5-32B-Instruct teacher and paraphrase-augmented for phrasing/persona
diversity, with an 85/15 split stratified by category and de-leaked at the seed
level. Labels never include priority or SLA.
Limitations & biases
Trained on synthetic, English-only, single-paragraph complaints; behavior on
long threads, multi-language, or out-of-distribution domains is unverified.
Two assignment groups (IT Support, Network Ops) and four categories only —
it will coerce inputs into this taxonomy.
urgency is subjective and the weakest field; downstream the deterministic
priority matrix bounds its impact.
Confidence is a learned self-report, not a calibrated probability.
For robustness the production pipeline validates every output against the
schema and falls back to a deterministic rule tagger on invalid JSON — do the
same when integrating.
License
Apache-2.0, inherited from the Qwen/Qwen3-4B-Instruct-2507 base model.