soup advise — decide before you train
Before you touch a GPU, ask: do you actually need to fine-tune? Or is your problem better solved with prompt engineering, RAG, DPO instead of SFT, or GRPO over rewards?
soup advise (v0.54.0) is a pre-flight decision engine. It classifies your task, profiles your dataset, and emits a ranked verdict across:
PROMPT_ENG— your data is too small / your goal is solvable with a better promptRAG— high-variance factual recall is better handled with retrievalSFT— supervised fine-tuning is the right baselineDPO— you already have preference pairs (chosen/rejected)GRPO— you have reasoning traces + ≥ 500 rows, RL over verifiable rewards wins
Usage
soup advise run data.jsonl --goal "polite customer support chat"Output (a real run on a 300-row customer-support tone dataset, with the Rich panel flattened to text):
soup advise — verdict
Choice: SFT
Confidence: 0.66
Task: style_shaping
Rows: 300
Why:
Task is style_shaping with 300 rows and healthy diversity (0.04). SFT is the right starting point.
Flip when:
the prompt-engineering baseline already meets your target metric (run `soup advise --probe` to measure).
Next: `soup advise explain` for the rubric, or `soup advise compare` for past verdicts.The panel carries the choice, a confidence, the task category, the row count, the reason and the condition that would flip it. The verdict is written to a local cache so soup advise explain can print the rubric for the last one.
Heuristics
- Task classification: keyword + structural signals.
tool_callsfield → tool_use;<think>...</think>blocks → reasoning; chat-shaped messages → input-extraction. The--goalstring carries ~10× the row weight when classifying. - Dataset profile: row count, avg input/output chars, type-token diversity, label variance,
has_chosen_rejected,has_reasoning_traces. Capped at 2,000-row sample for speed. - Verdict rubric: preference pairs detected → DPO · reasoning traces with 500 rows or more → GRPO · under 50 rows → PROMPT_ENG (training will overfit) · high-variance factual → RAG · default → SFT
--probe and --probe-model — an ROI estimate, heuristic by default
soup advise run data.jsonl --goal "..." --probe
soup advise run data.jsonl --goal "..." --probe --probe-model HuggingFaceTB/SmolLM2-135M --probe-device cpu--probe adds an ROI table with a prompt-engineering, a RAG and an SFT row. On its own it is an offline heuristic over the shape of your data (output length, diversity, row count, label variance): no model is loaded, nothing is trained, and it returns in a moment. The sft row is labelled "100-step LoRA probe" and the sft ETA row is a per-step estimate, but at this level both are estimates, not measurements.
A measurement needs --probe-model <hf-id> (with --probe-device cuda or cpu; auto-detected when omitted). It loads that model, scores zero-shot and few-shot completions on a held-out slice with token-F1, LoRA-trains for 100 steps and reports the relative held-out-loss improvement (clamped to [-0.2, 0.7]), and it also measures how closely the base model already predicts your targets. The RAG row stays a heuristic in both modes, because Soup ships no retriever to measure. Pass --probe alongside --probe-model to have the table printed. If the live probe cannot run (for example the model fails to load), it falls back to the heuristic without raising an error, so a table that looks heuristic after --probe-model means the live path did not run.
There is no time limit on the probe. The function that runs it accepts a 600-second timeout_seconds argument and ignores it (the source marks it "reserved for a future hard wall-clock budget"), so a live probe on a large model runs until it finishes.
--record — a history file shared across projects
soup advise run data.jsonl --goal "..." --record --notes "first pass, 4k rows"Appends a frozen HistoryEntry to ~/.soup/advise_history.jsonl (atomic, file-locked via fcntl.flock on POSIX / msvcrt.locking on Windows, 64 KB per-line cap, 16 MiB file cap, 10k row cap). --notes attaches up to 4,096 characters to the entry. The log is one file for every project, and soup advise compare lists it.
Verdicts do read it back, but narrowly. The history bias is scoped to the current project (one project's wins must not bias another's), and it only counts entries that carry a measured outcome in [-1, 1]. Once a project has three or more accepted verdicts for the same choice with a recorded outcome, an average of +0.3 or better nudges that choice's confidence up (and a strong SFT record can flip a marginal RAG call to SFT), while a negative average for GRPO makes it fall back to SFT. --record always writes accepted=True with no outcome, and no command at v0.75.2 writes one, so recording on its own does not change later verdicts.
Override the path with SOUP_ADVISE_HISTORY_PATH — containment-checked to $HOME / $CWD / tempfile.gettempdir(). Default file perms: 0o600.
Subcommands
soup advise run data.jsonl --goal "..." # explicit (also the default)
soup advise explain # print the full rubric
soup advise compare --limit 20 # prior verdicts from advise_history.jsonl, newest firstThe top-level argv preprocessor _rewrite_advise_argv injects run so soup advise data.jsonl works without typing the subcommand.
The advise: config block is not read
The config schema declares an advise: block with three keys: goal (a default goal string, up to 4096 characters), probe (default false) and record (default false). It is accepted by the schema, but nothing in v0.75.2 reads it. soup advise never opens soup.yaml, so the goal, the probe and the history record come only from --goal, --probe and --record on the command line, whatever the file says.
See also
- Autopilot — the literal next step after
soup advise - Eval design — turn your data into evals
- Trace-to-preference — distill production traffic into DPO pairs
- Pre-flight & tooling (v0.64) —
soup tunabilitypicks the right base model after advise picks the right task;soup plan+soup applythen lock the plan with drift detection before training
Soup is free and Apache-2.0. If it saved you a training run, starring the repo costs nothing and helps most. You can also fund the GPU time behind the work a 4 GB laptop cannot reach.