Evals ML
Flat isometric illustration of a pink faceted gem lit from below, ringed by six dark tiles topped with cream discs, on a purple field of faint glyph-like rain.
Eval Tooling

LLM Eval Frameworks Compared: Pick the Right One

A comparison of lm-evaluation-harness, OpenAI Evals, HELM, Inspect, promptfoo, DeepEval and Ragas, with the task shapes each harness actually fits.

By Evals ML Editorial · · 6 min read

Eval frameworks are not interchangeable, and the usual failure is picking one for its popularity and then bending the task to fit it. The frameworks in wide use divide cleanly along one axis: whether they exist to reproduce standard academic benchmarks, or to test an application you built. Choosing on that axis first removes most of the difficulty.

The comparison

FrameworkMaintained byBuilt forGrading styleBest fit
lm-evaluation-harnessEleutherAIReproducing academic benchmarks across many modelsLog-likelihood ranking and exact match, task-definedComparing base models on MMLU, GSM8K and similar published sets
OpenAI EvalsOpenAICustom evals expressed as data plus a templateExact/fuzzy match and model-graded templatesTeams already on the OpenAI API wanting a registry of small evals
HELMStanford CRFMBroad, multi-metric benchmarking of many modelsMulti-metric: accuracy plus calibration, robustness, fairness, bias, toxicity, efficiencyReporting where one accuracy number is not an acceptable summary
Inspect AIUK AI Security InstituteStructured evals with solvers, tools and scorers in PythonProgrammatic scorers plus model-graded scorersAgentic and multi-step tasks, safety and capability evaluations
promptfoopromptfoo (open source)Prompt and model regression testing in CIDeclarative assertions in YAML, plus model-graded checksCatching prompt regressions on every commit
DeepEvalConfident AIApplication-level LLM testing in a pytest idiomMetric classes including G-Eval, hallucination and relevancyPython teams who want evals to look like unit tests
RagasVibrant LabsRetrieval-augmented generation specificallyFaithfulness, response relevancy, context precision and recallDiagnosing whether the retriever or the generator is at fault

Benchmark reproduction harnesses

lm-evaluation-harness is the reference implementation for standardised benchmark tasks. Tasks are declared as configuration, models are plugged in behind a common interface, and the same task definition runs against a local Hugging Face model, a vLLM server or a hosted API. Its value is consistency: when two models are scored by the same task file with the same shot count, the comparison is meaningful in a way that two vendor-published numbers are not. Its limitation is that it is built around benchmark items with a known correct answer, so it is a poor fit for open-ended application output.

If the plan is to run MMLU, GSM8K or HumanEval and get a defensible number, this is the tool, and the details of what those three sets contain are covered in LLM benchmarks explained.

HELM, from Stanford’s Center for Research on Foundation Models, takes a deliberately different position. Its framing is that a single accuracy figure is an inadequate description of a model, so every scenario is scored on multiple metrics at once, including calibration, robustness to perturbation, fairness, bias, toxicity and efficiency, with results published as a browsable matrix rather than a ranking. It is heavier to run than a task-level harness and is aimed at producing a public, comparable report rather than a fast internal signal.

Application-level frameworks

OpenAI Evals stores evals in a registry: a JSONL file of samples plus a YAML declaration of which eval class runs against it. The built-in classes cover basic match and includes checks, and a model-graded class allows a rubric to be supplied as a prompt template. The structure is simple enough that adding an eval is mostly a data exercise, which is its main appeal, and the framework is naturally centred on OpenAI’s own API.

Inspect AI is published by the UK AI Security Institute and is structured around three composable pieces: a dataset, a solver chain that describes how the model is prompted and what tools it may call, and a scorer that grades the result. That decomposition is what makes it well suited to agentic evaluations, where the interesting behaviour happens over several turns and tool calls rather than in a single completion. Scorers can be programmatic or model-graded, and the log format is designed to be inspected item by item rather than reduced to an aggregate.

promptfoo treats evaluation as regression testing. A YAML file lists prompts, providers and test cases with assertions attached, and the runner produces a side-by-side matrix across providers. Because the configuration is declarative and the runner is a CLI, it drops into CI without much ceremony, which is exactly what you want for the specific job of catching a prompt edit that quietly broke twenty cases.

DeepEval aims at the same job from the opposite direction, making evals look like pytest tests so they live next to the application’s other tests. Its metric library includes an implementation of G-Eval, the chain-of-thought-plus-form-filling grading approach, alongside metrics for hallucination, relevancy and toxicity.

Ragas narrows the scope on purpose. Its metrics are built around the retrieval-augmented generation pipeline and separate the two halves of it: context precision and context recall describe whether the retriever fetched the right passages, while faithfulness and response relevancy, the metric older material calls answer relevancy, describe whether the generator used them. That separation is the whole point, because a RAG system that answers badly has two possible culprits and one aggregate score cannot tell them apart.

Choosing

The practical decision tree is short.

  1. Are you comparing base models on published benchmarks? Use lm-evaluation-harness. Use HELM instead if the report needs to cover more than accuracy.
  2. Are you testing a RAG pipeline? Start with Ragas, because it is the only one that decomposes retrieval from generation by default.
  3. Are you testing an agent that uses tools over several turns? Inspect AI, because the solver and scorer split matches that shape.
  4. Do you mainly need a gate in CI? promptfoo if you want declarative YAML, DeepEval if you want it inside pytest.
  5. Do you want a registry of small custom evals against a hosted API? OpenAI Evals.

These are not exclusive. A common and sensible arrangement runs one benchmark harness quarterly for model selection and one application-level framework on every commit, because the two answer different questions: which model to build on, and whether today’s change broke anything.

What no framework provides

Every framework on this list ships a runner, a set of metrics and some adapters. None of them ships your evaluation set. The dataset is the part that determines whether the whole exercise is informative, and it is the part nobody can generate for you: it has to come from the inputs your system actually receives and the failures you actually care about. The design of that set, including how to split development from test and why synthetic cases systematically miss the hard inputs, is covered in designing an LLM evaluation that actually tells you something.

The second thing none of them provide is a trustworthy judge. Every framework here offers model-graded metrics, and every one of those inherits the judge model’s position, verbosity and self-preference biases. Switching frameworks does not fix that; calibrating the judge does, and the procedure is set out in LLM-as-a-judge bias.

Cost before commitment

Framework choice barely affects cost. Sampling budget does. A suite that runs at pass@1 on 500 prompts is 500 generations; the same suite at pass@10 is 5,000, and if the grader is itself a model, each of those adds a judging call on top. Multiply that by every commit if the suite runs in CI.

Working the number out before adopting a framework is cheap, and the Pass@k and evaluation cost calculator does it directly: dataset size, sampling budget and token rate in, total generations, dollar cost and worst-case margin of error out. In practice that calculation is what decides the suite’s shape, more often than any feature comparison does.

Summary

Pick on task shape, not popularity. Benchmark reproduction goes to lm-evaluation-harness or HELM. RAG goes to Ragas. Agentic and multi-turn goes to Inspect AI. CI gating goes to promptfoo or DeepEval. Whichever runner ends up in the repository, the dataset and the grader are still yours to get right, and they are where the informative content of an evaluation lives.

Sources

  1. EleutherAI: lm-evaluation-harness
  2. OpenAI: Evals framework and registry
  3. Stanford CRFM: Holistic Evaluation of Language Models (HELM)
  4. UK AI Security Institute: Inspect AI
  5. Inspect AI documentation: tasks, datasets, solvers and scorers
  6. promptfoo documentation: declarative test cases and assertions
  7. Confident AI: DeepEval
  8. Vibrant Labs: Ragas
  9. Ragas documentation: available metrics

Related