LangChef
Evaluation for teams without an evaluation team

Did that change make it better or worse?

Model swaps, retriever changes, fine-tunes. LangChef gives you a straight answer — or tells you your test set was never big enough to have one.

The situation

You maintain a retrieval app, a classifier, or an agent that calls a few tools. It works. Then:

Same question every time, and it usually gets answered by eyeballing twenty outputs, or by a pass rate in a spreadsheet that moved three points, or not at all — which is the most common answer, and why only about a third of teams running AI in production evaluate it on live traffic.

This is not a tooling problem. Half a dozen capable eval platforms exist and several are free. What is missing is the person who knows whether your grader can be trusted and how many examples a number needs before it means anything. LangChef stands in for them.

Which of these are you

The answer changes what this tool does for you, so it is worth settling before anything else. The difference is not what your app is built from. It is whether you already know the right answer.

You do not have the answer

Q&A, summarisation, generation, agent output. There is no single correct string, so something has to read the answer and judge it. That something is usually a model, and a model nobody has checked is not a measuring instrument.

Calibration comes first here, and it is the part almost nobody sells. If your judge disagrees with your own people three times in ten, every number computed downstream inherits that error and none of them will tell you.

You already have the answer

Retrieval, classification, reranking. You know which document should have come back, which label is correct, which ordering is right. Comparing to it is arithmetic, not judgement.

There is nothing to calibrate, and we will not pretend otherwise. Skip straight to the experiment. recall@k, MRR, nDCG, accuracy and F1 are computed from your targets, and no rubric, no judge and no forty labels are involved.

Neither is the lesser path. If you have hard targets you have solved the hardest problem in evaluation already, and you get an answer sooner. What you still need is the part that has nothing to do with judging:

Being straight about what is built

Today the tool runs the free-text path end to end. The hard-target path is designed and not yet shipped: bringing your own rows of input and target is #14, and it is blocked on one decision that has to be made before any statistics are written. The paired comparison, the detection limit and the pre-registration all exist now and are task-agnostic. What is missing is the loader and the per-task metrics.

Four ways this goes wrong

The grader nobody graded

Your judge marks 95% of answers good, which sounds healthy. If only 5% of your answers are genuinely bad, a judge that marks everything good also scores 95% — and from that number alone you cannot tell the two apart.

LangChef: you label forty examples once. It then reports whether the judge agrees with you more than luck explains, how often it misses real problems, how often it cries wolf, and which kinds of answer it gets wrong.

The difference that isn't there

83% to 80% on ninety examples. That swing is comfortably inside what randomness produces when nothing changed — but the number moved, and somebody has to make a call.

LangChef: returns regression, improvement, or can't tell, with the range the true difference sits in. When it can't tell, it says how small a change this test set could ever have caught.

The ruler that moved

You tightened the grading prompt on Tuesday. Monday's 83% and Wednesday's 88% were never measuring the same thing, but they still line up on a chart.

LangChef: records which rubric and model produced every number, and refuses to compare two runs measured differently. It stops rather than drawing the chart.

Not knowing which half broke

Quality drops four points after an embedding swap. Is the generator worse, or is it being handed worse context? Those have nothing in common as fixes, and one pass rate over both cannot separate them.

LangChef: one rubric criterion per failure mode — grounding for retrieval, correctness for generation — and the judge must name the one it failed on, so failures stay attributable instead of pooled.

You are the diner, not the chef

The name is about who does the cooking. You say what you want in plain language. The harness — Claude Code, or whatever agent your team already runs — takes the order and comes back with one or two ways to test it. You pick one and agree what it may spend. The kitchen runs the sampling, the judging and the statistics out of sight. What arrives is a dish and one question: is this good enough to ship?

That question is the only judgement the design asks of you, and it is the only one that does not need an evaluation background. Everything before it — which metric, how many examples, whether the judge can be trusted, whether the difference is real — is kitchen work.

In the restaurantHereWho does it
"Paneer, and make it slightly spicy"What "good" means for your app — the rubricYou, once
The kitchen learns your palateJudge calibration against ~40 of your own labelsYou taste, it learns
The waiter suggests a dish or twoOne or two experiment designsThe harness
You order, and see the priceApprove the design and its budget, before any trafficYou
The kitchen cooksSampling, judging, statistics, comparisonThe langchef CLI
The dish arrivesA decision memo
Do you like it?Ship it, or don'tYou
And you are a regular, not a walk-in

The part that matters is what happens when you are not in the room. Once the kitchen knows your palate it keeps watching — when your provider retires a model, when traffic drifts, when the judge starts disagreeing with you again, it notices on a schedule and tells you before you order something you will not like. A tool that only works when you are driving it is a tool you have to remember to drive.

What you get back

A verdict, with error bars

Regression, improvement, or can't-tell — never a bare number. Plus the smallest change the run could have detected, which turns a shrug into a plan.

An answer for "did quality hold"

Cutting cost with a small model isn't a hunt for an improvement. It's a check that the drop sits inside a tolerance you set first. How to read that.

A memo, not a dashboard

One page that opens with whether the judge can be trusted, then the result, then what the run could not rule out. Every figure traces to a file on disk.

Nothing leaves your machine

No hosted service, no account, no vendor holding your traces. It runs where your code runs, and the workspace is text you review in a pull request.

What it is not, and who it is not for

It ships no test cases — your examples come from your traffic, because a benchmark of someone else's questions tells you nothing about yours. There is no UI. And somebody does have to say what "good" means and mark forty examples: anyone promising otherwise is selling you a judge nobody checked.

Skip it if you already have an eval team and a calibrated judge — you have solved this — or if your feature is still changing shape weekly. Come back when it settles.

It does not replace the tools you already run. If your runs live in MLflow, they stay in MLflow; LangChef is the thing that decides what to measure and whether the answer means anything. See integrations.

Pre-alpha — version 0.1.0

19 of 22 commands are live. The workspace format and command surface still move; the exit codes are the part meant to be stable. The tracker has what is done and what is open.