--- language: - en license: other tags: - qwen3 - text-generation - text2text-generation - air-traffic-control - atc - singapore - military - lora - unsloth - legacy base_model: unsloth/Qwen3-1.7B --- # Qwen3-1.7B — ATC Display Text Formatter (Legacy) > **Status: Legacy.** This model has been superseded by a deterministic rule-based formatter (23 rules, <1ms, 0 VRAM) that achieves equivalent accuracy on all production ATC patterns. The rule-based formatter is now used exclusively in the ASTRA pipeline. This model is retained for reference and potential future use with novel/unseen patterns. Fine-tuned Qwen3-1.7B that converts normalized ASR output into structured ATC display text. Designed to work downstream of the companion Whisper ASR model. ## Performance | Metric | Value | |--------|-------| | Exact match accuracy | **100.0%** (161/161) | | Avg character edit distance | 0.0 | | Best eval loss | 0.0005 | ## Why Legacy? The rule-based formatter now handles all production patterns: - **Speed**: <1ms vs ~250ms per inference - **VRAM**: 0 GB vs ~3.3 GB - **Determinism**: 100% reproducible output, no sampling variance - **Auditability**: Each of the 23 rules is individually testable - **Coverage**: Handles all callsigns, locations, numeric patterns, and ATC abbreviations seen in training data The LLM remains useful if novel patterns emerge that the rule-based system cannot handle. ## Model Details | Key | Value | |-----|-------| | Base model | `unsloth/Qwen3-1.7B` | | Method | bf16 LoRA (rank 16, alpha 32) | | Merged size | 3.3 GB | | Train examples | 1,915 | | Eval examples | 161 | | Thinking mode | Disabled | ## Training - Framework: Unsloth + SFTTrainer (trl) - Optimizer: AdamW 8-bit - Learning rate: 1.2e-4 - Effective batch size: 16 - Precision: bf16 - Packing: enabled - Train on responses only: yes - Converged at step 380 (epoch 3.2) ### Dataset 1,670 unique ATC phrases from `axite.json`, stratified 90/10 split by category. Includes ASR noise augmentation (simulated ASR errors) for robustness. ## What It Does Converts normalized spoken text (ASR output) into structured display text: | Input (normalized) | Output (display) | |-------------------|-----------------| | `camel climb flight level zero nine zero` | `CAMEL climb FL090` | | `contact tengah approach one three zero decimal zero` | `contact Tengah Approach 130.0` | | `squawk seven seven zero zero` | `squawk 7700` | | `request clearance, ninja two f sixteens for western coast departure for i l s.` | `Request clearance, NINJA 2xF16 for Western Coast Departure for ILS.` | ## Usage ```python from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("path/to/LLM", torch_dtype="auto", device_map="auto") tokenizer = AutoTokenizer.from_pretrained("path/to/LLM") messages = [ {"role": "system", "content": "Convert the following air traffic control transcript into structured display text."}, {"role": "user", "content": "camel climb flight level zero nine zero"}, ] text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True, enable_thinking=False) inputs = tokenizer(text, return_tensors="pt").to(model.device) outputs = model.generate(**inputs, max_new_tokens=128, temperature=0.3, top_p=0.9, top_k=30) result = tokenizer.decode(outputs[0][inputs.input_ids.shape[-1]:], skip_special_tokens=True) # "CAMEL climb FL090" ``` ## Inference Settings | Parameter | Value | |-----------|-------| | Temperature | 0.3 | | Top-p | 0.9 | | Top-k | 30 | | Max new tokens | 128 | | Thinking | Disabled (`enable_thinking=False`) |