"It seems to work" is not an evaluation. Yet many AI features ship on exactly that: a few good demos, a handful of hand-picked prompts, and a leaderboard number that says the model is smart.

Evaluating AI is measurement under uncertainty. The outputs are probabilistic, the tasks are open-ended, and the same prompt can pass on Monday and fail on Tuesday. The good news: the concepts you need are few and stable. Tasks, criteria, graders, metrics and error bars work the same whether you use one vendor's SDK or another, a hosted eval product or a 50-line script.

This post is a practical cheatsheet. It defines the vocabulary precisely, shows how to score and how much to trust a score, and maps "accuracy" and "quality" to concrete metrics for each kind of system: agents, chatbots, zero-shot LLM features, and generative models such as image generators.

Terms marked with a ⚠️ are used with more than one meaning. Context decides (see "Same word, different meaning" near the end).

1. The vocabulary of an eval

Most confusion in eval discussions comes from people using the same word for different things. These definitions follow the ones Anthropic and OpenAI use in their eval guides.

Term Meaning Why it matters
Eval A repeatable test of an AI system: inputs, a way to run them, and a way to grade the results The AI equivalent of a test suite. Without one, every prompt or model change is a guess.
Task / test case One input with defined success criteria The unit you count. "n" in every statistic below is usually the number of tasks.
Trial / sample One attempt at a task. Outputs vary between runs, so you run several The unit of randomness. k trials per task is what lets you measure consistency.
Transcript / trace / trajectory The full record of a trial: messages, reasoning, tool calls, intermediate results What you read when a score looks wrong. Also what process metrics are computed from.
Outcome The final state at the end of a trial (the ticket is closed, the file compiles, the refund was issued) For agents, the outcome is usually what matters, not the text of the final message.
Grader / scorer / evaluator The logic that scores a trial: code, a model, or a human. A task can have several The grader defines what "correct" means in practice. A bad grader makes a good eval useless.
Criterion One thing being judged, e.g. "states the correct refund amount" Narrow criteria are reliable. "Is it good?" is not a criterion.
Rubric The set of criteria plus the scale and anchors for each (what a 1, 3 and 5 look like) Turns taste into a repeatable decision that two graders can agree on.
Metric A number aggregated across tasks and trials: pass rate, F1, win rate, mean score What you report. Always with n, k and an interval (section 5).
Threshold / gate The minimum metric value to ship, e.g. "pass^3 at least 85% on the regression suite" Decided before you look at results, or it is not a gate.
Harness The infrastructure that runs tasks, gives the agent tools, records transcripts, grades and aggregates Part of the system under test. Its settings change scores (section 4).
Eval suite / dataset A versioned collection of tasks for a capability or behavior Version it like code. A score without a dataset version cannot be compared.
Benchmark A public, standardized eval used to compare models Good for choosing a model. Not a substitute for an eval on your own tasks.
Ground truth / reference ⚠️ The known correct answer or outcome, when one exists Enables cheap code graders. Many generative tasks have no single ground truth, only criteria.

Capability evals vs. regression evals

Two suites, two jobs:

  • Capability evals ask "what can it do?". They should start at a low pass rate, on tasks the system struggles with, so there is room to improve.
  • Regression evals ask "does it still do what it used to?". They should pass at nearly 100%, and any drop is a bug.

When a capability task passes reliably, promote it to the regression suite. When a capability suite passes everything solvable, it is saturated and no longer tells you anything: write harder tasks.

2. Graders: who decides what "good" means

Grader Methods Strengths Weaknesses
Code-based Exact match, regex, JSON schema checks, unit tests, checking the final database or file state Fast, cheap, objective, reproducible, easy to debug Brittle to valid variations; cannot judge tone, helpfulness or nuance
Model-based (LLM-as-a-judge) Rubric scoring, yes/no assertions, pairwise comparison (A vs. B) Flexible, scalable, handles open-ended output Non-deterministic, costs money, has biases, must be calibrated against humans
Human Expert review, crowd rating, A/B tests with real users The reference for quality and preference Slow, expensive, and humans disagree with each other too

Practical rules that hold for any stack:

  • Use the cheapest grader that is valid. If code can check it (the refund exists, the test passes, the JSON parses), use code. Use a model judge only for what code cannot see.
  • Grade outcomes, not paths. Agents often find valid routes the eval designer did not expect. Checking for one exact sequence of tool calls fails correct solutions. Grade the path only when the path itself is a requirement (e.g. "must verify identity before changing an address").
  • Prefer binary and pairwise judgments. "Does the answer state the cancellation fee? yes/no" and "which of these two answers is better?" are more reliable than "rate 1-10".
  • Calibrate model judges. Have humans label a sample (often 50-200 items), measure agreement with the judge (percent agreement and Cohen's kappa), and only scale up once agreement is close to human-human agreement.
  • Watch for known judge biases: longer answers (verbosity bias), the first option shown (position bias, so swap the order and judge twice), and output from the judge's own model family (self-preference).
  • Read transcripts. Regularly. A 0% pass rate on a task that a strong model should handle is usually a broken task or grader, not an incapable agent.

A rubric is data, not prose

Write rubrics as explicit, separately scored criteria with anchors. Each criterion becomes its own grader call or code check:

RUBRIC = {
    "task": "Customer asks to cancel a subscription bought 10 days ago.",
    "criteria": [
        # (id, check, grader, weight, hard_fail)
        ("policy", "Offers a full refund (policy: refunds within 14 days)", "code", 3, True),
        ("action", "Subscription status is 'cancelled' in the database", "code", 3, True),
        ("verify", "Confirms account identity before acting", "model", 2, True),
        ("clarity", "States what happens next and when, in plain language", "model", 1, False),
        ("tone", "Polite, no blame, no upsell after a cancel request", "model", 1, False),
    ],
}


def score(results: dict[str, bool]) -> dict:
    """results maps criterion id -> passed. Hard fails zero the task."""
    crits = RUBRIC["criteria"]
    if any(hard and not results[cid] for cid, _, _, _, hard in crits):
        return {"pass": False, "score": 0.0}
    total = sum(w for *_, w, _ in crits)
    got = sum(w for cid, _, _, w, _ in crits if results[cid])
    return {"pass": True, "score": got / total}

Two ideas carry most of the value here: hard-fail criteria (a polite answer that breaks policy is a failure, not a 7/10) and one check per criterion, so a low score tells you exactly what went wrong.

3. Metrics: what to count

Pick metrics after you define success, not before. Most real evals combine one primary metric (what you optimize) with a few guardrail metrics (what must not get worse).

Metric Definition Use it for
Accuracy ⚠️ Correct / total Balanced classification with one right answer. Misleading on imbalanced data: 99% accuracy is trivial if 99% of emails are not spam.
Precision / Recall / F1 Precision = TP / (TP + FP): how many flagged items were right. Recall = TP / (TP + FN): how many right items were found. F1 = their harmonic mean Extraction, classification, retrieval, safety filters. Choose by error cost: a fraud filter wants recall, an auto-reply wants precision.
Exact match / field-level F1 Output equals the reference exactly / per-field precision and recall for structured output Zero-shot extraction into JSON, entity extraction, form filling
Pass rate / success rate Share of tasks whose outcome meets all hard criteria Agents and coding. The default agent metric.
pass@k Probability that at least one of k trials succeeds Settings where a human or a test picks the best of k attempts: code suggestions, idea generation, search with a verifier
pass^k ("pass hat k") Probability that all k trials succeed Customer-facing agents, automation, anything that must work every time. Introduced in Sierra's tau-bench.
Win rate Share of pairwise comparisons where version B beats version A (ties counted as half) Chatbots, writing, summarization, image generation: anything judged by preference
Mean rubric score Average weighted rubric score across tasks Open-ended tasks with several quality dimensions. Report per criterion too.
Faithfulness / groundedness Share of claims in the answer supported by the provided sources RAG and summarization. Separate from correctness: an answer can be faithful to a wrong document.
Hallucination rate / error rate Share of answers that are confidently wrong Q&A. Report it next to accuracy and abstention rate.
Abstention rate Share of questions where the system says "I don't know" or escalates Q&A and support. A good abstention is better than a confident error.
Calibration (ECE) Whether stated confidence matches the actual hit rate. Expected Calibration Error averages the gap Systems that show confidence or route on it (auto-approve above 0.9)
Tool-call accuracy Right tool, right arguments, no unnecessary or failed calls Agents. Diagnostic: explains why the outcome failed.
Trajectory match Exact, in-order or any-order match with a reference tool sequence, plus precision and recall of steps Agents with required procedures. Use in-order or any-order, rarely exact.
Cost / latency / steps Tokens or money per task, wall-clock time, number of turns or tool calls Always a guardrail. A 2-point quality gain at 3x the cost is often a loss.

pass@k vs. pass^k

These two metrics answer opposite questions, and they diverge fast. With a per-trial success rate p on a task:

  • pass@k = 1 - (1 - p)^k
  • pass^k = p^k

At p = 0.75 and k = 3: pass@3 is about 98%, pass^3 is about 42%. At p = 0.95 and k = 10, pass^10 is only about 60%. In tau-bench, strong agents that solved most retail tasks once dropped below 25% when asked to solve the same task 8 times in a row. A demo shows pass@k. Your customers experience pass^k.

In practice you estimate both from n trials per task with c successes, then average over tasks:

from math import comb, sqrt


def pass_at_k(n: int, c: int, k: int) -> float:
    """P(at least one of k samples passes), from n trials with c passes."""
    if n - c < k:
        return 1.0
    return 1 - comb(n - c, k) / comb(n, k)


def pass_hat_k(n: int, c: int, k: int) -> float:
    """P(all k samples pass), from n trials with c passes."""
    return comb(c, k) / comb(n, k)


def wilson_ci(successes: int, n: int, z: float = 1.96) -> tuple[float, float]:
    """95% confidence interval for a pass rate (works near 0% and 100%)."""
    p = successes / n
    center = (p + z**2 / (2 * n)) / (1 + z**2 / n)
    half = z * sqrt(p * (1 - p) / n + z**2 / (4 * n**2)) / (1 + z**2 / n)
    return center - half, center + half


# One task, 8 trials, 6 passed (75% per-trial success)
print(f"pass@1 = {pass_at_k(8, 6, 1):.2f}")   # 0.75
print(f"pass@3 = {pass_at_k(8, 6, 3):.2f}")   # 1.00
print(f"pass^3 = {pass_hat_k(8, 6, 3):.2f}")  # 0.36

# Suite: 40 of 50 tasks passed
lo, hi = wilson_ci(40, 50)
print(f"80% pass rate, n=50 -> 95% CI {lo:.0%} to {hi:.0%}")    # 67% to 89%
lo, hi = wilson_ci(400, 500)
print(f"80% pass rate, n=500 -> 95% CI {lo:.0%} to {hi:.0%}")  # 76% to 83%

The pass@k estimator is the unbiased one from OpenAI's Codex paper; the pass^k estimator is the one from tau-bench. Both need n of at least k trials per task.

4. Variables: what changes the score

An eval score is a function of the whole setup, not only the model. Fix and record every variable you are not testing, or you will compare noise.

Variable Examples Why it matters
Model and version Exact model ID, snapshot date "Same" model names change behind aliases. Pin versions.
Prompt and instructions System prompt, tool descriptions, few-shot examples Often moves scores more than switching models.
Sampling settings Temperature, top-p, max tokens, reasoning effort, seed Higher temperature means more variance per trial. Evaluate at production settings.
Tools and environment Available tools, API mocks, database state, simulated user Shared state between trials (leftover files, caches) causes correlated failures. Reset per trial.
Harness and infrastructure Timeouts, CPU and memory limits, retries, max turns Anthropic measured a 6-point swing on Terminal-Bench 2.0 from resource settings alone.
Retrieval Index version, chunking, top-k For RAG, a retrieval change is a system change.
Grader Judge model, judge prompt, rubric version, code checks Changing the judge changes the ruler. Re-baseline when you do.
Dataset Task version, sampling of tasks, train/test contamination Public benchmarks leak into training data; scores rise without real capability gains.

Independent variable: the one thing you change (new prompt, new model). Dependent variable: the metric. Controlled variables: everything else in the table above. This is the whole experimental design, and it does not depend on the tool you use.

5. Statistics: how much to trust a number

A score without an interval is an anecdote. These are the few statistical ideas that cover most eval decisions, largely following Anthropic's paper Adding Error Bars to Evals (Miller, 2024).

Concept Meaning Practical rule
Variance How much a score would move if you re-ran the eval Comes from three places: which tasks you picked, sampling randomness per trial, and grader noise.
Standard error (SE) Standard deviation of the score across hypothetical reruns. For a pass rate: SE = sqrt(p(1 - p) / n) The building block of every interval below.
95% confidence interval (CI) ⚠️ Score plus or minus 1.96 x SE. The range that would contain the true value in 95% of reruns Always report it. If two intervals overlap a lot, you do not know which version is better.
Sample size (n) Number of independent tasks Margin of error at 95% is roughly 1 / sqrt(n) at worst. 100 tasks: about plus or minus 10 points. 400 tasks: plus or minus 5. 1,000: about 3.
Trials per task (k) Repeated runs of the same task Reduces sampling noise and is required for pass^k. More trials do not fix too few tasks.
Clustered SE SE that accounts for related tasks (several questions about the same document, variants of the same scenario) Related tasks are not independent. Naive SE can be over 3x too small.
Paired comparison Compare two versions on the same tasks, using per-task differences Much more sensitive than comparing two independent averages. The default for A vs. B.
Statistical power Chance that the eval detects a real difference of a given size Decide the minimum difference you care about first, then size the eval to detect it.
Multiple comparisons Testing many prompts or models and picking the best The winner is partly luck. Confirm it on a fresh run or held-out set.
Rule of three If 0 failures in n trials, the 95% upper bound on the failure rate is about 3 / n Zero bad outputs in 100 tries still allows up to about 3%. Safety claims need large n.
Inter-rater agreement Percent agreement or Cohen's kappa (agreement corrected for chance) between graders Tells you how much signal your human labels and judges contain. Low kappa means a vague rubric.

How big must the eval be? A quick guide for a pass rate near 50% (the worst case):

Tasks (n) 95% margin of error Can reliably detect a difference of about
20-50 plus or minus 14-22 points Large regressions only. Fine for a first suite built from real failures.
100 plus or minus 10 points Big wins and big breaks
400 plus or minus 5 points Typical prompt or model changes (paired)
1,000+ plus or minus 3 points Small differences, leaderboard-grade claims

Paired comparisons on the same tasks detect smaller differences than these numbers suggest, because they remove the "which tasks" variance. A minimal paired comparison:

from statistics import mean, stdev

# Per-task scores for the same 8 tasks (in practice: hundreds), old vs. new prompt
old = [1, 0, 1, 1, 0, 1, 0, 1]
new = [1, 1, 1, 1, 0, 1, 1, 1]

diffs = [b - a for a, b in zip(old, new)]
d = mean(diffs)
se = stdev(diffs) / len(diffs) ** 0.5
print(f"Improvement: {d:+.0%}, 95% CI {d - 1.96 * se:+.0%} to {d + 1.96 * se:+.0%}")
# Improvement: +25%, 95% CI -7% to +57%  -> not conclusive with 8 tasks

6. Accuracy and quality depend on the use case

"Accuracy" is not a property of a model. It is a property of a system on a task, against criteria someone chose. The same answer can be accurate for a brainstorming tool and unacceptable for a billing agent. Define both words per use case:

  • Accuracy: does the output match what is true or required? Requires a reference, a verifiable outcome, or a fact check.
  • Quality: is it good to receive? Usefulness, clarity, completeness, tone, safety, cost and speed. Usually multi-dimensional and judged by rubric or preference.
Use case "Accurate" means Primary metric Guardrail metrics
Support or operations agent The right end state, within policy, every time pass^k on outcome checks Policy violations, escalation rate, cost and turns per task
Coding agent Hidden tests pass, nothing else breaks Pass rate (pass@1) on held-out tasks Regressions, review acceptance, cost, time
Research or browsing agent Correct, sourced answer to a hard question Answer accuracy against verified references Citation faithfulness, steps, cost
RAG Q&A chatbot Correct and supported by the retrieved sources Correctness plus faithfulness Hallucination rate, abstention rate, retrieval recall
Open-ended chatbot or writing assistant Rarely one right answer: helpful, clear, safe Win rate vs. current version (pairwise) Rubric scores per criterion, refusal rate, length
Zero-shot classification or routing Correct label Precision, recall, F1 per class (macro F1 if imbalanced) Confusion matrix, calibration
Zero-shot extraction to JSON Every field correct and schema-valid Field-level F1, exact match per document Schema validity rate, latency
Summarization Says only what the source says, and the important parts Faithfulness plus coverage of key points Length, readability
Image generation (Stable Diffusion, Imagen and similar) The image contains what the prompt asked for Prompt adherence (question-based checks, human ratings) Aesthetic preference, diversity, artifacts, safety

A useful habit: write the criteria for "a perfect output" and "an unacceptable output" for ten real examples before choosing any metric. The metric should then be obvious.

GenAI beyond text: image generation

Image models need the same concepts with different graders:

Metric What it measures Watch out for
FID (Fréchet Inception Distance) Distance between the distributions of generated and real images. Lower is better Distribution-level only: says nothing about whether one image matches its prompt. Needs thousands of samples and is biased at small n.
CLIPScore Similarity between the image and the prompt in a shared embedding space Weak on counting, spatial relations and attribute binding ("red cube left of a blue ball").
Question-based alignment (GenEval, TIFA, Google DeepMind's Gecko) Break the prompt into checkable facts (objects, counts, colors, positions) and verify each with a detector or a VLM Much closer to human judgment than CLIPScore on compositional prompts. The checker model has its own errors.
Human preference Pairwise "which image is better / closer to the prompt?" The reference signal. Ask about one criterion at a time: adherence, aesthetics, realism.
Diversity and safety Variation across seeds, demographic spread, unsafe content rate A model that ignores the seed, or always draws the same face, can still score well on alignment.

The pattern is the same as for text: a cheap automatic proxy, calibrated against human ratings on a sample, plus explicit checks for what must never happen.

7. Benchmarks: useful, but not your eval

Public benchmarks help you shortlist models. They do not tell you how a model will do on your tasks, with your tools and your definition of success. Snapshot as of November 2026:

Benchmark What it tests Note
SWE-bench Verified / Pro Fixing real GitHub issues, graded by hidden tests OpenAI stopped reporting Verified in February 2026, citing flawed tests and training data contamination, and recommends SWE-bench Pro.
Terminal-Bench 2.0 Agentic tasks in a real terminal environment Scores are sensitive to harness resources (section 4).
tau-bench / tau2-bench Customer-service agents talking to a simulated user under domain policies Source of pass^k. tau2 adds a telecom domain where the user also has tools.
GAIA / Gaia2 General assistant tasks: search, tools, multi-step reasoning Gaia2 (Meta, with Hugging Face) is read-and-write, asynchronous and time-sensitive: 1,120 scenarios.
METR time horizon Length of tasks (in skilled-human time) an agent completes with 50% success Has doubled roughly every 7 months since 2019. A trend measure more than a leaderboard.
LMArena Pairwise human preference between chatbots Bradley-Terry ratings with confidence intervals. Measures preference, not correctness.
SimpleQA Short factual questions Useful to see accuracy, error rate and abstention side by side.

Warning signs when reading any benchmark number: no interval, no n or k, a harness you cannot reproduce, a saturated benchmark (everyone above 90%), and a benchmark that has been public long enough to leak into training data.

8. A minimal, stack-independent eval process

Every vendor guide, from Anthropic and OpenAI to Google, Microsoft and Amazon, converges on roughly the same loop:

  1. Define success for the use case: the criteria, the hard fails, the primary and guardrail metrics, and the ship threshold.
  2. Collect tasks from real usage and real failures. 20-50 is a fine start; grow it with every bug report. Include cases where the right behavior is to refuse, ask, or escalate.
  3. Build graders: code first, model judges for the rest, calibrated against human labels.
  4. Run with k trials per task in clean, isolated environments, at production settings.
  5. Report the metric with n, k, a 95% CI and the dataset, prompt, model and grader versions.
  6. Compare versions paired on the same tasks; read the transcripts of the tasks that changed.
  7. Gate releases on the regression suite; track capability evals over time.
  8. Monitor production: sample real traces, grade them with the same graders, and feed new failures back into step 2.

Amazon describes the same idea in layers: evaluate the final outcome, then the components (intent detection, tool use, memory, reasoning) to find why it failed, and add periodic human audits of traces. Microsoft's agent evaluators split it similarly into intent resolution, tool-call accuracy and task adherence.

Same word, different meaning

Term Meaning A Meaning B
Accuracy Correct / total (a classification metric) Informal "how good is it", which hides the real criteria
CI Confidence Interval (statistics) Continuous Integration (where your regression evals should run)
Reference Ground-truth answer used by a grader Reference-free evaluation: judging with a rubric and no ground truth
pass@1 Success rate from one greedy (temperature 0) run per task Success rate averaged over many sampled trials per task. Check the method
Evaluator The grader component A person (human evaluator, annotator)
Benchmark A public, standardized eval Any internal eval suite, in casual use
Sample One trial (one generated output) A subset of tasks drawn from a larger dataset
Precision TP / (TP + FP) Numerical precision (FP16, BF16) in model serving

Why this matters

Evals are how AI teams replace opinions with evidence. A few practical takeaways:

  • Concepts over tools. Tasks, criteria, rubrics, graders, metrics and intervals are the same everywhere. Frameworks and hosted eval products come and go; a well-defined task set and rubric outlives all of them.
  • Define success per use case, before measuring. "Accurate" for a billing agent and for a brainstorming chatbot are different metrics.
  • Report consistency, not just capability. pass@k sells demos; pass^k predicts customer experience.
  • Every number needs n, k and an interval. 82% vs. 79% on 100 tasks is not a result.
  • Metrics come in pairs. Accuracy with abstention, quality with cost, automatic judges with human calibration. Optimizing one alone usually breaks the other.

Final Thoughts

Most AI failures in production are not surprises in hindsight. They were in the long tail nobody tested, in the inconsistency nobody measured, or in a score whose error bar nobody computed.

You do not need a large platform to avoid them. You need a few dozen real tasks, clear criteria, an honest grader, and the discipline to report what the numbers can and cannot tell you. Start there, and grow the eval every time the system surprises you.

Sources