---
license: apache-2.0
base_model: unsloth/Qwen2.5-1.5B-Instruct
tags:
- medical
- insurance
- stark-law
- compliance
- healthcare
- qlora
- unsloth
- dhs
- revenue-integrity
language:
- en
library_name: peft
pipeline_tag: text-generation
datasets:
- AmareshHebbar/insurance-classifier-sft
co2_eq_emissions:
emissions: 0
source: "estimate, not measured with a carbon-tracking tool"
training_type: "fine-tuning"
geographical_location: "EU-West"
hardware_used: "NVIDIA A40 (48GB)"
model-index:
- name: insurance-classifier-qwen25-1b
results: []
---
# ⚖️ Insurance Coverage Classifier (Stark Law DHS)
### Qwen2.5-1.5B fine-tuned for insurance coverage classifier (stark law dhs)
[](https://huggingface.co/AmareshHebbar/insurance-classifier-qwen25-1b)
[](https://huggingface.co/datasets/AmareshHebbar/insurance-classifier-sft)
[](https://www.apache.org/licenses/LICENSE-2.0)
[](https://huggingface.co/unsloth/Qwen2.5-1.5B-Instruct)
[](https://github.com/unslothai/unsloth)
[](https://wandb.ai/amareshhebbar-/axiomapper/runs/PASTE_RUN_ID)
*Part of the [Medical AI Fine-tuned Model Suite](https://huggingface.co/AmareshHebbar/medical-ai-model-suite) — 16 specialist models, one per task*
---
## TL;DR
Classifies CPT/HCPCS codes against **Stark Law Designated Health Services (DHS)** categories.
```
INPUT: CPT/HCPCS: 86890\nService: Autologous blood process
OUTPUT: Code: 86890\nStark Law: DESIGNATED HEALTH SERVICE (DHS)\nNote: Self-referral restrictions apply under Section 1877. Verify applicable exceptions before billing.
```
| | |
|---|---|
| **Base model** | [unsloth/Qwen2.5-1.5B-Instruct](https://huggingface.co/unsloth/Qwen2.5-1.5B-Instruct) |
| **Method** | QLoRA, 4-bit NF4, rank 16 |
| **Training data** | [insurance-classifier-sft](https://huggingface.co/datasets/AmareshHebbar/insurance-classifier-sft) — 1,601 real-world rows |
| **Training compute** | NVIDIA A40 (48GB), ~0.4h |
| **License** | Apache 2.0 |
---
## Architecture
```
+-------------------------+
user prompt --> | Qwen2.5-1.5B-Instruct | --> base weights (frozen, 4-bit NF4)
| + LoRA adapter (r=16) | --> insurance-classifier-qwen25-1b
+-------------------------+
|
v
structured output
(code / JSON / classification)
```
This repo contains **only the LoRA adapter** (~20MB), not the full merged weights. Load it on top of the base model as shown below — this keeps the download small and lets you swap adapters on one base model in memory.
---
## Intended use
Automate compliance screening for hospital revenue integrity teams.
### Direct use
Give a CPT/HCPCS code and service description, get back its DHS classification and a compliance note.
### Downstream use
Feed into a physician self-referral compliance screening tool, flagging codes for legal review.
### Out of scope
Legal advice. This model is a screening aid, not a substitute for healthcare counsel reviewing an actual referral arrangement.
> **This model is not a substitute for a certified medical professional's judgment.** Output should be reviewed by a qualified person before being used in a clinical or billing decision.
---
## Quickstart
### Option A — Transformers + PEFT
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
import torch
base_model = "unsloth/Qwen2.5-1.5B-Instruct"
adapter = "AmareshHebbar/insurance-classifier-qwen25-1b"
tokenizer = AutoTokenizer.from_pretrained(base_model)
model = AutoModelForCausalLM.from_pretrained(
base_model,
torch_dtype=torch.bfloat16,
device_map="auto",
)
model = PeftModel.from_pretrained(model, adapter)
messages = [
{"role": "system", "content": "You are an insurance coverage specialist. Given a CPT/HCPCS code, classify whether it is a Designated Health Service (DHS) under Stark Law Section 1877 and provide the relevant category."},
{"role": "user", "content": "CPT/HCPCS: 86890\nService: Autologous blood process"},
]
inputs = tokenizer.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True).to(model.device)
outputs = model.generate(inputs, max_new_tokens=128, temperature=0.1, do_sample=True)
print(tokenizer.decode(outputs[0][inputs.shape[1]:], skip_special_tokens=True))
```
**Expected output:**
```
Code: 86890\nStark Law: DESIGNATED HEALTH SERVICE (DHS)\nNote: Self-referral restrictions apply under Section 1877. Verify applicable exceptions before billing.
```
### Option B — Unsloth (2x faster load + inference)
```python
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="AmareshHebbar/insurance-classifier-qwen25-1b",
max_seq_length=512,
load_in_4bit=True,
)
FastLanguageModel.for_inference(model)
messages = [
{"role": "system", "content": "You are an insurance coverage specialist. Given a CPT/HCPCS code, classify whether it is a Designated Health Service (DHS) under Stark Law Section 1877 and provide the relevant category."},
{"role": "user", "content": "CPT/HCPCS: 70553\nService: MRI brain with and without contrast"},
]
prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=128, temperature=0.1, do_sample=True)
print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
```
### Option C — vLLM (production serving, OpenAI-compatible)
```bash
vllm serve unsloth/Qwen2.5-1.5B-Instruct \
--enable-lora \
--lora-modules insurance-classifier-qwen25-1b=AmareshHebbar/insurance-classifier-qwen25-1b \
--host 0.0.0.0 --port 8000 --dtype bfloat16
```
```python
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
response = client.chat.completions.create(
model="insurance-classifier-qwen25-1b",
messages=[
{"role": "system", "content": "You are an insurance coverage specialist. Given a CPT/HCPCS code, classify whether it is a Designated Health Service (DHS) under Stark Law Section 1877 and provide the relevant category."},
{"role": "user", "content": "CPT/HCPCS: 80053\nService: Comprehensive metabolic panel"},
],
temperature=0.1,
)
print(response.choices[0].message.content)
```
### Option D — GGUF / llama.cpp (CPU / edge inference)
This repo ships LoRA adapter weights, not a pre-merged GGUF. To run on llama.cpp, merge first:
```bash
pip install unsloth
python -c "
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained('AmareshHebbar/insurance-classifier-qwen25-1b', load_in_4bit=False)
model.save_pretrained_gguf('insurance-classifier-qwen25-1b-gguf', tokenizer, quantization_method='q4_k_m')
"
```
---
## Training details
### Data
Trained on 1,601 examples extracted from **real CMS HCPCS 2026 Stark Law Designated Health Services code list** ([source](https://www.cms.gov/medicare/coding-billing/hcpcs-codes/annual-release)). No synthetic or LLM-generated training data — every example pairs real-world input with its authoritative output.
| Split | Rows |
|---|---|
| Train | 1,280 |
| Validation | 160 |
| Test | 161 |
Full extraction pipeline documented on the [dataset card](https://huggingface.co/datasets/AmareshHebbar/insurance-classifier-sft).
### Hyperparameters
| Parameter | Value |
|---|---|
| LoRA rank (r) | 16 |
| LoRA alpha | 32 |
| LoRA dropout | 0 |
| Target modules | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj |
| Quantization | 4-bit NF4 (QLoRA) |
| Max sequence length | 512 |
| Optimizer | paged_adamw_8bit |
| LR schedule | 2e-4, cosine |
| Gradient checkpointing | Unsloth (smart offload) |
### Training compute
| | |
|---|---|
| **GPU** | NVIDIA A40 (48GB) |
| **Cloud provider** | RunPod |
| **Training time** | ~0.4h (incl. eval + hub push) |
| **Tracking** | [W&B run](https://wandb.ai/amareshhebbar-/axiomapper/runs/PASTE_RUN_ID) |
| **CO2 estimate** | self-reported, not measured with a carbon tracker — treat as approximate |
Fine-tuned with [Unsloth](https://github.com/unslothai/unsloth) for 2x faster training and reduced VRAM, using TRL's `SFTTrainer`. Full project: [wandb.ai/amareshhebbar-/axiomapper](https://wandb.ai/amareshhebbar-/axiomapper).
---
## Bias, risks & limitations
**Data recency.** Training data reflects a specific snapshot in time (CMS FY2026 / dataset publish date). Codes, rates, and rules referenced may become outdated as source authorities issue updates — always cross-check against the live authoritative source before high-stakes use.
**Failure mode.** Like any LLM, this model can produce a plausible-sounding but incorrect output, especially on rare, ambiguous, or highly compound real-world cases that fall outside the training distribution. It does not know when it's wrong.
**Language.** English-language input only (Hindi-medical model excepted, where Hindi system prompts are used but underlying clinical reasoning data is largely English-sourced).
**Not a regulated medical device.** This model has not been validated, cleared, or approved by any regulatory body (FDA, CDSCO, or equivalent) as a medical device or clinical decision support tool. It is a research/engineering artifact.
**Misapplication risk.** Do not use this model as the sole basis for a clinical, billing, or compliance decision affecting a real patient or claim. Do not deploy in an emergency triage context without a human-in-the-loop and clear escalation paths.
---
## FAQ
**Q: Can I merge the adapter into the base model for faster inference?**
Yes — use `model.merge_and_unload()` after loading with PEFT, or use Unsloth's `save_pretrained_merged()` method.
**Q: Why QLoRA instead of full fine-tuning?**
The base model already has strong language and medical knowledge from pretraining. QLoRA adapts only ~0.5-1% of parameters, which is enough to specialize the output format and domain without the cost or overfitting risk of full fine-tuning.
**Q: Can I fine-tune this further on my own data?**
Yes, this adapter can be used as a starting checkpoint for continued fine-tuning. Note this may require merging first depending on your training framework.
**Q: Why is the output format so strict?**
Each task was trained on a fixed system prompt and consistent output structure. Following the documented system prompt closely (see Quickstart above) gives the most reliable results — deviating from it may produce inconsistent formatting.
**Q: Does this model store or transmit my input data?**
No. Like any open-weight model, all inference happens locally on your own infrastructure (or wherever you deploy it) — nothing is sent back to the model author.
---
## Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| `ValueError: padding_token not set` | Base tokenizer has no pad token | Set `tokenizer.pad_token = tokenizer.eos_token` before inference |
| Garbled / repeated output | Wrong chat template applied | Make sure you use `tokenizer.apply_chat_template`, not a raw string prompt |
| CUDA OOM on load | Insufficient VRAM | Use `load_in_4bit=True` (already default above) or reduce `max_seq_length` |
| Adapter loads but ignores fine-tuning | Base model mismatch | Confirm you loaded the **exact** base listed above — adapters are not portable across different base models or quantizations |
---
## Related models in this suite
| Model | Task | Size |
|---|---|---|
| [icd10-coder-qwen25-7b](https://huggingface.co/AmareshHebbar/icd10-coder-qwen25-7b) | ICD-10-CM medical coding | 7B |
| [snomed-mapper-qwen25-7b](https://huggingface.co/AmareshHebbar/snomed-mapper-qwen25-7b) | Clinical concept mapping | 7B |
| [icd10-to-drg-qwen25-1b](https://huggingface.co/AmareshHebbar/icd10-to-drg-qwen25-1b) | ICD-10 to DRG reimbursement | 1.5B |
| [pmjay-classifier-qwen25-3b](https://huggingface.co/AmareshHebbar/pmjay-classifier-qwen25-3b) | India PM-JAY classification | 3B |
**Full suite overview:** [AmareshHebbar/medical-ai-model-suite](https://huggingface.co/AmareshHebbar/medical-ai-model-suite)
---
## Changelog
| Version | Date | Notes |
|---|---|---|
| v1.0 | 2026 | Initial release — QLoRA fine-tune on 1,601 real-world rows |
---
## Citation
```bibtex
@misc{medicalai2026,
author = {Hebbar, Amaresh},
title = {Medical AI Fine-tuning Suite},
year = {2026},
publisher = {HuggingFace},
url = {https://huggingface.co/AmareshHebbar}
}
```
## Contact
[](https://github.com/amareshhebbar)
[](https://www.linkedin.com/in/gvamaresh)
[](https://huggingface.co/AmareshHebbar)