Did Your Prompt Change Help? Prove It with an Eval
A model upgrade can change behaviour with no error. What an eval is, the three graders, the held-out slice, and how evals make upgrades routine.
Key takeaways
- Without an eval, a better prompt is a feeling; with one it is a number.
- Start with 20 to 50 real inputs and expected results kept in git next to the prompt.
- Use the cheapest grader that works: exact match, a code assertion, or a calibrated LLM judge.
- Keep a held-out slice you never tune against, so the prompt does not overfit the eval.
- Moving to claude-opus-5-5 drops the default effort from high to medium; set effort in code and let the eval show the difference.
Contents
FAQ
How many eval cases do I need?
Twenty to fifty real inputs are enough to start. Add a case every time a real failure shows up.
Can an LLM grade another LLM?
Yes for fuzzy quality, if a strong model uses a rubric and you first check its scores against a few cases a person scored.
Sources
Only you and the owner see your answer and rating. Send private feedback
Enjoyed it? Support fx-blog with a coffee.
Related posts
Your LLM Proxy Retries the Wrong Errors
What an LLM proxy has to decide on every failure: limits are per organization, which statuses to retry, why nothing is retried after the first streamed byte, and the headroom headers the API already sends.
Your LLM Demo Works. What Every Call Needs in Production
One timestamp in the system prompt and every call misses the cache. Pricing each call, making failures loud, logging per feature, and treating outside text as untrusted.
RAG That Works: Why Retrieval Matters More Than the Prompt
Most bad RAG answers are retrieval problems. How RAG works end to end, the three parts of the grounded prompt, how to measure retrieval alone, and when long context is enough.
Comments
Oldest firstNo comments yet. Start the conversation.
Part 2 ended with the test-case generator running the orders suite and reading its own failures, and one question: when you edit its system prompt, is the next version better, or only different?
Here is a change that throws no error. You move the generator from
claude-opus-5toclaude-opus-5-5, a newer model at a lower price. Its default effort ismedium, where the old one defaulted tohigh. Every call now reasons less than it did yesterday, and nothing in your logs says so.This series, in six parts:
What an eval is
A set of inputs, the result each should produce (or how to score it), and a script that runs them all and prints a number. Without one, "the prompt got better" is a feeling.
Eval products exist, but a folder of YAML cases and a pytest runner is a legitimate first version, and it is where I'd start.
Pick the cheapest grader that works
The middle row is the generator's main grader, and it costs nothing but CPU. Reach for a judge only for what code cannot check.
Keep a slice you never tune against
Tune a prompt against the same cases long enough and it learns those cases, not the task. So hold some back.
Upgrades become routine
Back to the hook. Models are deprecated, and behaviour shifts between generations: verbosity, how eagerly they call tools, how literally they read, parameters that disappear. With an eval, an upgrade is a checklist:
Step 3 catches the hook's silent change; step 5 fixes it. Set effort in code, so the value sits in the diff:
Try it
The generator's cases now compile and pass, and you can prove whether a change helped. What the eval cannot tell you is whether a case tests the rule your product really has. The retry policy for webhook deliveries lives in your docs, not in the model. Part 4, RAG That Works, gives the generator those docs.
Read this with your AI