| # 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`. |
|
|