Qwen2.5-1.5B Parcel Record Normalizer
Fine-tuned for the Covent LLM Challenge: a small, narrow-task model that normalizes messy US property/parcel records into a fixed JSON schema.
Model Description
Real-world US county property data comes in wildly inconsistent formats, different field names, merged vs. split address components, inconsistent abbreviations, missing fields, depending on the county and platform (ArcGIS, Socrata, etc.). This model takes a messy, free-text-style property record and outputs clean, structured JSON in one fixed canonical schema:
1{
2 "parcel_id": "",
3 "situs_address": "",
4 "situs_city": "",
5 "situs_state": "",
6 "situs_zip": "",
7 "owner_name": "",
8 "owner_mailing_address": "",
9 "owner_mailing_city": "",
10 "owner_mailing_state": "",
11 "owner_mailing_zip": ""
12}
- Developed by: Afshan
- Model type: LoRA adapter (r=16) on Qwen2.5-1.5B-Instruct, 4-bit quantized
- Language: English
- License: Apache 2.0 (inherited from base model)
- Finetuned from: unsloth/Qwen2.5-1.5B-Instruct-bnb-4bit
Training Data
~2,850 real-world-derived training pairs built from live public parcel records:
- Cook County, IL (Socrata Open Data API)
- DuPage County, IL (ArcGIS REST API)
Each pair consists of a real record synthetically corrupted (abbreviation swaps, typos, punctuation dropping, casing variation, multiple free-text templates) paired with the correct clean JSON as the training target.
Evaluation
Evaluated on 300 real records from three counties never seen during training, Maricopa County (AZ), Travis County (TX), and Denver County (CO), against Claude Opus 4.8 as the frontier baseline, using an identical system prompt for both models.
| Field | This model | Claude Opus 4.8 |
|---|
| situs_address | 22.0% | 18.7% |
| situs_city | 80.0% | 99.3% |
| situs_state | 81.0% | 94.7% |
| situs_zip | 49.3% | 99.3% |
| owner_name | 14.0% | 59.3% |
| owner_mailing_address | 11.7% | 34.7% |
| owner_mailing_city | 53.3% | 36.3% |
| owner_mailing_state | 49.3% | 36.3% |
| owner_mailing_zip | 36.3% | 35.7% |
Opus 4.8 outperforms on fields requiring broad US geographic world-knowledge (city/state/zip associations it learned from pretraining). This model wins specifically on owner mailing address fields, a narrower, structural pattern (owner mailing address often matches situs address when not explicitly stated) learned from real training data rather than world knowledge. parcel_id is excluded from scoring since it never appears in the input text and is unknowable by construction for either model.
How to Use
1from unsloth import FastLanguageModel
2
3model, tokenizer = FastLanguageModel.from_pretrained(
4 model_name="Afshanqasim525/qwen25-1.5b-parcel-normalizer",
5 max_seq_length=512,
6 load_in_4bit=True,
7)
8FastLanguageModel.for_inference(model)
9
10SYSTEM_PROMPT = (
11 "You normalize messy US property records into a fixed JSON schema. "
12 "Given a raw record, output ONLY valid JSON with exactly these keys: "
13 "parcel_id, situs_address, situs_city, situs_state, situs_zip, "
14 "owner_name, owner_mailing_address, owner_mailing_city, "
15 "owner_mailing_state, owner_mailing_zip. "
16 "If a value is unknown, use null. Do not add commentary."
17)
18
19messages = [
20 {"role": "system", "content": SYSTEM_PROMPT},
21 {"role": "user", "content": "Normalize this record:\n75 LEO CT roselle IL 60172\nOwner: STOESSER, JAMES L"},
22]
23inputs = tokenizer.apply_chat_template(messages, tokenize=True, add_generation_prompt=True, return_tensors="pt")
24out = model.generate(inputs, max_new_tokens=200, temperature=0.1, do_sample=False)
25print(tokenizer.decode(out[0][inputs.shape[1]:], skip_special_tokens=True))
Training Hyperparameters
- Base model: Qwen2.5-1.5B-Instruct (4-bit QLoRA)
- LoRA: r=16, alpha=16, targeting q/k/v/o and gate/up/down projections
- Epochs: 2, learning rate: 2e-4, batch size: 8 (x2 grad accumulation)
- Hardware: single T4 GPU (free-tier Colab)
Limitations
- Training data comes from only two Illinois counties; performance on other states' formatting conventions is evaluated but not deeply optimized.
- Frontier baseline comparisons were originally planned against Gemini 3.1 Pro as a lower-cost option, but a regional free-tier access restriction (unrelated to usage/quota) made this infeasible; Claude Opus 4.8 was used instead via the standard API.
- This is a proof-of-concept demonstrating narrow-task specialization, not a production-ready system.
Framework versions