You tweak a system prompt to fix one complaint, or switch to a newer model because it's cheaper. The app still compiles, the unit tests still pass, and a week later users report that answers got worse. LLMs are non-deterministic, so a classic test that expects an exact string either fails randomly or checks too little to catch the regression.
Evals fix this. An eval runs your AI feature against a set of real examples and scores each output against criteria you define, so you can see whether a change made things better or worse before you ship it.
Assert.AreEqual("Your order #1234 ships on Monday.", response.Text);
❌ Figure: Bad example - Bad example - An exact-match assertion fails whenever the model rewords a correct answer, so the team learns to ignore it
50 real support questions, each checked for the correct order number (code check) and scored for relevance and groundedness (LLM judge). The build fails if fewer than 95% pass.
✅ Figure: Good example - Good example - A dataset of real cases with code checks, an LLM judge and a pass threshold catches regressions without flaky failures
You don't need a platform to start. A spreadsheet of cases and a test that loops over them is already an eval. When you outgrow that, use a tool built for it:
Here is a .NET eval that uses an LLM judge to score coherence, adapted from the Microsoft quickstart:
IEvaluator coherenceEvaluator = new CoherenceEvaluator();EvaluationResult result = await coherenceEvaluator.EvaluateAsync(messages, response, chatConfiguration);NumericMetric coherence = result.Get<NumericMetric>(CoherenceEvaluator.CoherenceMetricName);Assert.IsFalse(coherence.Interpretation!.Failed);Assert.IsTrue(coherence.Interpretation.Rating is EvaluationRating.Good or EvaluationRating.Exceptional);
Running evals in the same test suite as the rest of your code is a good start, because the whole team sees them on every build.
🙂 Figure: OK example - OK example - EagleEye runs its OpenAI tests alongside its other integration tests. Scoring them against a dataset with thresholds turns them into evals