CloudCodeTree LogoCloudCodeTree
AI NewsTutorialsAbout
CloudCodeTree Logo
CloudCodeTree
  • AI News
  • Tutorials
  • About
← Back to AI News
You Trained the Adapter — Now Prove It Worked: A Three-Step Eval for Fine-Tuned LLMs

You Trained the Adapter — Now Prove It Worked: A Three-Step Eval for Fine-Tuned LLMs

Chris Harper

3 min read

Aug 27, 2026 · 20:09 UTC

AI
Tutorial
Fine-Tuning
HuggingFace

TL;DR: Training loss is not a reliable proxy for whether a fine-tune improved your model. Three checks — held-out perplexity, a standardized benchmark via lighteval, and one task-specific metric — give you numbers worth acting on.

What you'll be able to do after this: run a structured evaluation that catches regressions, confirms real-world improvement, and gives you a defensible number before shipping your LoRA adapter.

Training loss can drop while the model regresses on actual tasks — it measures how well the model predicts the training data, not whether the output is useful. The minimum viable eval stack is three layers:

1. Perplexity on a held-out test set. Measure negative log-likelihood on examples the model never saw during training, then convert to perplexity. Lower than the base model on your domain: the fine-tune learned the distribution. Equal or higher: it didn't.

import torch, math
from transformers import AutoModelForCausalLM, AutoTokenizer

def perplexity(model, tokenizer, texts):
    nlls = []
    for text in texts:
        enc = tokenizer(text, return_tensors="pt")
        with torch.no_grad():
            out = model(**enc, labels=enc["input_ids"])
        nlls.append(out.loss.item())
    return math.exp(sum(nlls) / len(nlls))

Run this against both the base model and your fine-tuned model on the same test set.

2. Standardized benchmark via lighteval. Compare fine-tuned vs. base on a benchmark relevant to your domain. For a medical assistant fine-tune:

lighteval accelerate \
  "pretrained=your-finetuned-model" \
  "mmlu|anatomy|0|0,mmlu|professional_medicine|0|0" \
  --max_samples 200 --output_path ./results

Run the same command against the base checkpoint. The delta is your verifiable improvement.

3. A task-specific metric or LLM-as-judge. For classification: F1 or accuracy on a held-out labeled set. For generation: sample 50–100 outputs from both models, route them to a stronger model (e.g., Claude Sonnet 5) with a rubric, and have it score them blind. Human eval if the stakes are high.

Three mistakes to avoid:

  • Reporting only training loss, which the model directly optimized and can't fail to lower
  • Evaluating only the fine-tuned model — without a base-model baseline you can't claim improvement, only measure absolute performance
  • Using examples from the same distribution as training — test on a different source, time window, or rephrasing

Real limits: Benchmark scores don't capture edge-case or deployment behavior. LLM-as-judge carries the judge model's biases toward its own output style. Perplexity measures prediction probability, not whether the output is actually useful — a model can be confident and wrong. These evals are a floor, not a ceiling.

Sources: Evaluation — HuggingFace LLM Course, Chapter 11 · LLM evaluation metrics guide — machinelearningmastery.com · Quantitative evaluation: ROUGE, BLEU, Perplexity — apxml.com