# Groundedness Eval: does the fine-tuned 1.5B hallucinate more than the 7B it replaces? TurboSkillSlug's whole promise is a witness that only says what it saw. So the extraction model has one job above all others: do not invent facts. This eval measures exactly that, comparing the shipped fine-tuned 1.5B LoRA against the Qwen-7B it replaced and against its own un-tuned 1.5B base, on 25 held-out transcripts the LoRA never saw in training. ## Setup - **25 held-out transcripts** (never in the 167-pair training set). - **Three systems**, same prompt, same decoding (temp 0.3, top-p 0.9, 768 tokens): prompted Qwen-7B, prompted Qwen-1.5B base, fine-tuned 1.5B LoRA. - **Two groundedness metrics per extracted fact** (approaches, dead ends, breakthroughs, gotchas): - *Lexical*: fraction of the fact's content words present in the transcript. - *Semantic*: max cosine similarity of the fact's embedding to any sentence window of the transcript (all-MiniLM-L6-v2), grounded if >= 0.55. - **Raw generations saved before scoring**, so the metric can be revised without re-running the models. ## Results | system | semantic | lexical | mean sim | parse | facts | |-----------------|---------:|--------:|---------:|------:|------:| | prompted 7B | 0.716 | 0.576 | 0.640 | 24/25 | 272 | | prompted 1.5B | 0.565 | 0.390 | 0.567 | 21/25 | 140 | | **LoRA 1.5B** | **0.762**| 0.378 | 0.649 | 21/25 | 195 | ## What this shows **The fine-tuned 1.5B matches and slightly exceeds the 7B on semantic groundedness (0.76 vs 0.72), at roughly a third of the active parameters.** The mean per-fact similarity agrees (0.649 vs 0.640). The lexical and semantic metrics disagree sharply for the LoRA: it has the *lowest* lexical overlap (0.378) but the *highest* semantic groundedness (0.762). That gap is the point. The fine-tune taught the model to restate the transcript's meaning in its own words rather than copy spans. Word-overlap scoring punishes that; embedding scoring credits it. The LoRA paraphrases faithfully, which is what a good extractor should do. ## What this does NOT show, and the caveats we are not hiding - **The LoRA is less reliable at producing valid JSON: 21/25 vs the 7B's 24/25.** That is a real cost of the smaller model. In the live app a brace-walking parser and field validators recover most malformed output, but the raw parse rate is what the table reports, unsoftened. - **The semantic threshold is imperfect.** A calibration block of six hand-labeled cases (run before scoring, printed in the logs) passed 5/6: one true paraphrase fell just under the 0.55 line. The single miss is a *false negative* (a grounded fact scored ungrounded), which means the LoRA's real groundedness is if anything *underestimated* here, not inflated. We report the number the fixed threshold produced rather than tuning it after seeing results. - **25 transcripts is a small sample.** Treat the gaps as directional, not precise. The LoRA-vs-7B semantic difference is small enough that the honest claim is "matches or slightly exceeds," not "beats." ## Honest one-line summary A 1.5B LoRA fine-tune reaches 7B-level semantic groundedness on held-out sessions at a third the active size, by learning to paraphrase rather than copy; it pays for this with a lower valid-JSON rate (21/25 vs 24/25), and the metric itself is calibrated to within 5/6 on known cases. --- *Reproduce:* `modal run semantic_eval.py`. Raw generations, per-fact scores, calibration outcome, threshold, and embedding model are all saved in `eval_results_semantic.json` and `eval_raw_outputs.json`.