SlowestLooser FoodJSON Unified v6

QLoRA fine-tune of Qwen/Qwen3-0.6B for the SlowestLooser on-device calorie-tracking iOS app. Handles food, drink, and activity queries under one unified JSON schema. Fused + 4-bit MLX bundle, ~330 MB.

What this model does

Pure RAG → JSON transformer. iOS pre-resolves each food/drink/activity item via the on-device DB and passes pre-scaled values in a DB (use verbatim): block. The model copies values into the schema. The model never invents numbers.

Output schema

{
  "name": "<user input verbatim>",
  "items": [
    {
      "type": "food" | "drink" | "activity",
      "name": "...",
      "grams": int, "volume_ml": int, "minutes": int,
      "calories": int,
      "protein": float, "carbs": float, "sugar": float,
      "fat": float, "saturated_fat": float, "salt": float
    }
  ]
}
  • food: grams > 0, volume_ml = 0, minutes = 0
  • drink: volume_ml > 0, grams = 0, minutes = 0
  • activity: minutes > 0, all macros = 0
  • garbage / sarcasm / "skipped dinner": items: []

Training

Setting Value
Method Unsloth QLoRA on Lambda A100 SXM4 40GB
Iterations 3000
Batch size 16
LR schedule linear warmup 50 steps → 1e-4, cosine decay to 1e-5
Optimizer AdamW (8-bit via bitsandbytes)
LoRA rank 32
LoRA scale 20.0
Target modules q/k/v/o + gate/up/down proj
Trainable params ~20M (3.5% of base)
Wall time 27 min

Eval — v6 adversarial Tier B/C suite (122 records, frozen)

Tier B (in-distribution + near-OOD): 68.9% pass
Tier C (garbage / sarcasm / OOD):    71.9% pass

Cross-version comparison (same eval suite):

Model Tier B pass Tier C pass Garbage refusal
base Qwen3-0.6B (no FT) 8.9% 15.6% 25.0%
v6 Qwen3-0.6B (this) 68.9% 71.9% 100.0%
v6 Gemma 3 270M 44.4% 21.9% 25.0%
v6 Qwen3.5-2B 57.8% 65.6% 87.5%
v5 Qwen3-1.7B (predecessor) 76.7% 37.5% 25.0%

vs v5: 8 pp drop on in-distribution Tier B, but +37 pp on Tier C garbage/sarcasm/OOD refusal and 60% smaller on-device footprint.

Dataset

  • 6190 records total (5473 train + 617 holdout + 100 optuna_eval)
  • Sources: 131-entry Python curated catalog + 24,853 cleaned OFF entries + 90 negative examples (garbage/sarcasm/negation)
  • Distribution: 49% food / 16% drink / 20% activity / 16% mixed-2-3 / 13% multi-3-5 / 3% multi-6+ / 1.5% negative

Predecessor lineage

  • v1, v2 — food-only / two-schema food+activity (1.7B)
  • v3, v4 — abandoned (architectural attempts)
  • v5 — first unified items[] schema (1.7B, val 0.040). Currently Juhuu/slowestlooser-v5-4bit. Stays available as legacy.
  • v6 — first model with negative-example training; smaller footprint (0.6B); dramatic refusal-behavior lift. This model.

Known limitations (deferred to v7)

  • "2 Eier", "3 Brötchen" — count units not extracted (0% pass)
  • 6+ ingredient lists collapse (0% pass)
  • "intensives Joggen" — intensity adverbs not modulating MET (0% pass)
  • Swiss German activity dialect ("Wandere im Bärgli" — 0% pass)
  • Qwen3.5-2B fine-tune attempted but didn't lift over base (worth v7 retry on larger GPU)

Notes on the MLX bundle

  • Fused fp16 → quantized to 4-bit MLX (group size 64, ~4.5 bits/weight)
  • config.json was patched at conversion time to expose rope_theta at top level (Qwen3 transformers 5.x uses rope_parameters dict; mlx_lm 0.31.3 doesn't yet read that)
Downloads last month
25
Safetensors
Model size
93.2M params
Tensor type
BF16
·
U32
·
MLX
Hardware compatibility
Log In to add your hardware

4-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Juhuu/slowestlooser-v6-4bit

Finetuned
Qwen/Qwen3-0.6B
Adapter
(401)
this model