

As quality engineers, we’ve spent years testing software with a simple mental model:
Given input X, expect output Y.
It works because traditional software is predictable. We know what goes in, we know what should come out, and we can write an assertion to verify it.
AI changes that in two ways:
So the traditional question, “Did the system do exactly what we expected?”, is no longer enough. For AI products we need to ask:
“Did the system behave well within the accepted parameters, according to what we actually care about?”
That’s where AI evals come in, and it’s an area where quality engineers already have many of the skills needed to make a real impact.

AI evaluations, or evals, are a systematic way of measuring how well an AI system behaves against defined expectations. Instead of checking whether a response exactly matches an expected one, we check whether it meets the criteria we care about, such as:
And this brings us to an important distinction i.e. Model evals vs Product evals
Model evals tell us how capable a model is in general: reasoning, coding, answering knowledge questions. They’re useful for comparing models.
Product evals tell us how well the AI works in our product.

Suppose I’m building an AI customer-support assistant. A model might score extremely well on general benchmarks, but that doesn’t tell me whether it can handle:
“My refund has been pending for 15 days. What should I do?”
For my product, I’d expect the AI to:$
That’s a product evaluation. The question shifts from “How good is the model?” to “How well does the AI work in our product?” And this is where QE’s can contribute the most.
I’ll use the customer-support assistant as the running example.
The first thing I wouldn’t do is sit down and write 1,000 test cases. I’d bring the team together:

AI evaluation isn’t a QE-only activity. It’s a team sport.
Start with a small set of realistic scenarios and the behavior you expect from each:

This is your reference dataset. Importantly, it shouldn’t contain only happy paths. Include:
Start small and grow it as you discover new failure modes.
Now comes a more important question: how do we decide whether an AI response is good?
Imagine two quality engineers review the same response. One says, “This looks fine.” The other says, “No, it missed an important requirement.” Neither is necessarily wrong. We just never defined what “good” means.
A rubric is a set of clear, measurable criteria that tells us how a response should be evaluated. Start with the objective:
Evaluate whether the AI provides a correct, policy-compliant response and takes the appropriate next action for a refund request.
From that, we get our criteria: correctness, policy compliance, completeness, escalation, and hallucination. Here’s how three of them might be scored for the “pending 15 days” scenario:

Each scenario in the dataset gets tagged with the criteria that matter for it. The refund-API-down case is judged mainly on hallucination and correctness, while the 15-day case is judged on correctness, policy, and escalation.
This is why a single pass/fail isn’t enough. An AI can give the correct refund status and still fail because it didn’t escalate an overdue refund, made up a delivery date, or ignored the company’s policy.
Run the assistant on every scenario, log the outputs, and have a domain expert review them. Then look across the failures for patterns. Several failures that look different often share one root cause, such as “no escalation logic for overdue refunds.” The patterns tell you which criteria deserve an ongoing metric and which are one-time fixes.

So the same rubric needs to be applied in more than one way. In practice we combine three approaches, each with a different purpose.

Humans are usually where we start. Domain experts and product managers review responses against our criteria, and their judgment establishes what good looks like, what counts as failure, and whether the rubric even makes sense. These reviewed examples become the reference for automated evaluation later.
For each criterion, the first question should be: can I check this with deterministic code? If yes, that’s usually the best place to start. For example:
These checks are fast, cheap, and consistent. If code can reliably decide whether something is correct, there’s little reason to use an LLM for it.
We can easily check whether the refund API was called. But was the response relevant, complete, or appropriately worded? These are semantic qualities that simple assertions can’t capture.