Use with vLLM
vllm serve unified-analytics/nordic-pii-spans-qwen3.5-4b-BF16 --max-model-len 4096
Send the system prompt from prompt.json as the system message and the text as the user message:
curl http://localhost:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{ "model": "unified-analytics/nordic-pii-spans-qwen3.5-4b-BF16", "temperature": 0, "max_tokens": 1500, "chat_template_kwargs": {"enable_thinking": false}, "messages": [{"role": "system", "content": "<system prompt from prompt.json>"}, {"role": "user", "content": "Ring Kari Nordmann på 912 34 567."}]}'
Or let the client do it, including character positions and redaction:
python nordic_pii.py spans --url http://localhost:8000 --span-api openai --model unified-analytics/nordic-pii-spans-qwen3.5-4b-BF16 "Ring Kari Nordmann på 912 34 567."
Results
The same fine-tuned weights in three formats, each scored on all 2,000 test texts and the 100 check texts (exact F1 /
overlap F1 / personal text covered):
The GGUF runs through llama.cpp, the other two through vLLM 0.26, all on one RTX PRO 6000 Blackwell. BF16 and Q8_0 are
equally accurate within noise; NVFP4 gives up about half a point to a point.
About this build
The full fine-tuned weights in BF16 safetensors (Qwen3_5ForConditionalGeneration): the 16-bit model the GGUF and the
NVFP4 build were made from. Use it with vLLM or Transformers, or as the starting point for further fine-tuning.
Qwen3.5-4B's vision tower is included unchanged; the model was trained on text only.
License
Apache 2.0, like the base model.