Blog/Modern AI Engineering

Fine-tuning and preference optimization

Fine-tuning is the most over-reached-for tool in applied LLM work, and on the right problem the highest-leverage one. This chapter is a decision guide first and mechanics second, because choosing wrongly costs months.

The decision table

Your problemReach for
Model lacks knowledge (your docs, your data)RAG: knowledge changes; weights shouldn’t have to
Model lacks format/tone/procedure consistencyFew-shot prompting first; fine-tune when examples stop helping
Model is right but too expensive/slow at scaleFine-tune a small model on the big model’s validated outputs (distillation)
Model must make judgment calls matching your policyPreference optimization on human-labeled comparisons
Task is narrow, high-volume, latency-criticalFine-tuned small model: this is the sweet spot
You have < ~500 good examplesYou don’t have a fine-tuning problem yet

The most common expensive mistake: fine-tuning to inject knowledge. Facts learned by SFT go stale, can’t be access-controlled, and can’t cite sources. Retrieval does all three.

Supervised fine-tuning with LoRA

Full fine-tuning updates all weights; LoRA freezes them and learns low-rank adapters, a few percent of parameters, which makes single-GPU adaptation of 7–8B models routine. QLoRA adds 4-bit quantization of the frozen base, pushing memory down another ~4×.

from peft import LoraConfig, get_peft_model

config = LoraConfig(
    r=16, lora_alpha=32, lora_dropout=0.05,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
    task_type="CAUSAL_LM",
)
model = get_peft_model(base_model, config)   # prints ~0.5–2% trainable params

What actually moves the needle, in order:

  1. Data quality. A hundred hand-checked, varied examples beat ten thousand scraped ones. Deduplicate near-identical items; they overweight one behavior.
  2. Data format = production format. Train on exactly the prompt template you serve. Template drift is the classic silent regression.
  3. Held-out eval from day one (chapter 5): including a general-capability probe, because narrow SFT can degrade everything else the model does.
  4. Hyperparameters, distantly: r ∈ {8,16,32}, LR ~1e-4–2e-4 for adapters, 1–3 epochs. More epochs mostly buy memorization.

Tooling: Hugging Face PEFT for adapters, TRL for the training loops (SFT, DPO, GRPO and friends).

Preference optimization: DPO and GRPO

SFT teaches “output things like these.” Preference methods teach “prefer this over that”, which is the natural label when correctness is graded, not binary (helpfulness, tone, policy compliance, ranking quality).

  • DPO (Rafailov et al., 2023) trains directly on (prompt, chosen, rejected) pairs: no reward model, no rollout infrastructure. It is the pragmatic default for preference data, stable and cheap. Watch its known failure mode: pushing down the rejected response can drag down fluency wholesale if pairs are low-contrast; filter pairs where the margin is meaningful.
  • GRPO (Shao et al., 2024) is an online policy-gradient method that normalizes rewards within a group of sampled responses per prompt, dispensing with a value model. It shines when you have a programmatic reward (verifiable answers, unit tests, format validators, a ranking metric) rather than pairwise human labels: the reasoning-model recipe.

Rule of thumb from my own experiments (my MAP-PO work applies SFT/DPO/GRPO to sexism-detection agents): SFT establishes the format floor, preference optimization buys the last points of judgment quality, and the reward/pair definition matters more than the algorithm choice.

Distillation, briefly

Generate outputs with a frontier model, keep only the ones that pass validation (schema checks, judges, human spot-audit), and SFT a small model on the survivors. Check your provider’s terms for training-on-outputs restrictions; then this is the standard route to 10–50× serving-cost reductions on narrow tasks.

Ship checklist

  • Base model license permits your use; adapter weights stored and versioned with their training-data snapshot.
  • Eval delta documented: target task ↑, general probes flat, safety probes flat.
  • Rollback path: adapters make this easy: serve base + adapter, and removal is a config change.
  • Re-train trigger defined (data drift, template change, base-model deprecation): a fine-tune is a product with a lifecycle, not a one-off artifact.