|

LLM Eval Score Checklist Before You Trust DeepEval

LLM eval score checklist for DeepEval with three checks before trusting scores

LLM eval score checklist is the difference between a useful release signal and a fancy number that gives your team false confidence. I see QA teams add DeepEval, get a score like 0.82, and immediately treat it like a Selenium pass rate. That is a mistake.

DeepEval is moving fast. PyPI lists DeepEval 4.1.1 as the latest package version, uploaded on 16 July 2026, and the GitHub repository reports more than 16,900 stars through the public GitHub API. That adoption is a good signal. It does not remove the QA work. The QA work is to ask: can I reproduce this score, explain the failures, and defend the release decision?

Table of Contents

Contents

Why an LLM Eval Score Is Not Enough

An LLM eval score looks objective because it is numeric. A QA engineer sees 0.87 and assumes the system is safer than 0.81. That thinking works only when the test input, expected behavior, scoring rubric, evaluator model, and dependency versions are controlled.

DeepEval calls itself “The LLM Evaluation Framework” on PyPI and in its official evaluation docs. It supports test cases, metrics, pytest-style runs, and CI-friendly workflows. That is useful. But an evaluation framework is still a test harness. A test harness can lie when the fixture data changes silently or when the assertion does not map to a real product risk.

LLM evals are closer to exploratory testing than unit testing

A unit test usually has a stable function, stable input, and stable expected output. LLM behavior is messier. The model can change. The retriever can change. Your prompt can change. The scorer can change. Even a harmless dependency upgrade can move your score by a few points.

That does not make LLM evaluation useless. It means QA has to treat it like a release gate with audit evidence, not like a dashboard decoration.

The score hides the bug distribution

A single average can hide dangerous failures. Ten harmless formatting failures and two serious hallucination failures can produce the same average as twelve minor misses. For a customer-support bot, one toxic or legally wrong answer matters more than thirty low-risk paraphrase misses.

This is why I do not approve an AI release from the aggregate score alone. I want to see the failing examples, the product area they cover, and the risk attached to each failure.

Version movement is part of the risk

The PyPI JSON API reports DeepEval 4.1.1 with Python support from 3.9 to below 4.0. The public DeepEval GitHub repository was created on 10 August 2023 and had thousands of stars by July 2026. A fast-moving tool can give teams better capability, but it also means your release notes and pinned dependencies matter.

If your team upgrades DeepEval without recording the version, you cannot tell whether a score changed because your product got better or because the evaluator changed.

The 3 Checks Before Trusting a Score

My LLM eval score checklist has three checks. They are intentionally boring. Boring checks save releases.

  1. Frozen dataset: the same examples run today, tomorrow, and next week.
  2. Known scorer version: DeepEval, evaluator model, prompt rubric, and thresholds are pinned.
  3. Failing examples reviewed: a human QA or product owner reads the failures before a release decision.

If these 3 checks are missing, I call the score a draft signal. It can start a conversation, but it should not block or approve a production release.

Why this matters more after DeepEval 4.1.1

DeepEval 4.1.1 landing on PyPI is a reminder that eval frameworks are not static. The release feed shows recent DeepEval releases in 2026, including 4.0.x and 4.1.x lines. That pace is normal for AI tooling. The QA response should be version-aware test governance.

For a normal UI automation suite, you already pin Playwright, Selenium, Chrome, Java, Python, or Node versions. LLM evals deserve the same discipline.

The minimum evidence I want in a pull request

Every AI feature PR should carry 4 pieces of evidence:

  • Dataset hash or dataset commit SHA.
  • DeepEval package version and evaluator model name.
  • Score summary by metric, not only one average.
  • Top failing examples with reviewer notes.

This is similar to the release-impact thinking I use in AI eval dependency monitoring for QA teams. The tool update is not the story. The release risk caused by that update is the story.

Check 1: Freeze the Dataset

A frozen dataset means your evaluation input is controlled. It does not mean the dataset never improves. It means every score is tied to an identifiable dataset version.

I like a simple folder shape:

evals/
  datasets/
    support_refunds.v1.jsonl
    support_refunds.v2.jsonl
  tests/
    test_support_refunds.py
  reports/
    2026-07-20-deepeval-4.1.1.json

The version number in the filename is not enough. Add a hash to the CI output so nobody can swap a file and keep the same name.

# scripts/hash_eval_dataset.py
import hashlib
from pathlib import Path

path = Path("evals/datasets/support_refunds.v1.jsonl")
digest = hashlib.sha256(path.read_bytes()).hexdigest()
print(f"dataset={path.name}")
print(f"sha256={digest}")

What goes into a good eval dataset

A good dataset is not a random dump of production chats. It is a curated test set. For LLM applications, I want at least 4 buckets:

  • Happy path: normal questions where the answer should be straightforward.
  • Boundary cases: incomplete input, vague wording, or mixed intent.
  • Known past bugs: issues that already reached QA, support, or production.
  • Abuse or safety cases: prompts that test refusal, policy, privacy, or tool misuse.

For a RAG system, I also add “retrieval pressure” examples: questions where the answer exists in one document but is easy to confuse with another. That is where hallucination bugs often hide.

Do not let analytics rewrite the benchmark automatically

Some teams stream production questions into the eval set every night. I like the idea for discovery, but not for release gating. If the gate dataset changes daily, your score trend becomes hard to explain.

Use production data to propose new examples. Review them. Label them. Add them as v2 or v3. Then compare scores across versions intentionally.

A small DeepEval-style test file

DeepEval documentation explains evaluation test cases and metrics in its official docs. A minimal pattern looks like this:

# evals/tests/test_refund_policy.py
from deepeval import assert_test
from deepeval.test_case import LLMTestCase
from deepeval.metrics import AnswerRelevancyMetric

metric = AnswerRelevancyMetric(threshold=0.7)

def test_refund_answer_is_relevant():
    case = LLMTestCase(
        input="Can I get a refund after 45 days?",
        actual_output="Refunds are available within 30 days of purchase.",
        expected_output="Refunds are normally limited to 30 days."
    )
    assert_test(case, [metric])

This is not a full production setup. It is a starting point. The important part is that the test case belongs to a tracked dataset and the threshold is visible in code.

Check 2: Pin the Scorer Version

The second item in the LLM eval score checklist is the scorer version. “We use DeepEval” is not enough. Which DeepEval version? Which metric? Which evaluator model? Which threshold? Which prompt rubric?

PyPI shows DeepEval 4.1.1 as the current package at the time of this run. GitHub release metadata shows DeepEval 4.1.0 published on 12 July 2026. Those are specific facts you can record in a release note. You do not need to turn every dependency upgrade into a big meeting, but you do need traceability.

Pin the package

For Python projects, pin the version in your lock file. If your team uses plain requirements files, make it explicit:

deepeval==4.1.1
pytest==8.4.1

I prefer a lock file generated by uv, Poetry, or pip-tools for serious projects. The goal is simple: a rerun next week should use the same evaluator package unless a human intentionally changes it.

Record the evaluator model

Many LLM eval metrics use an LLM as a judge. That judge has a model name and sometimes a provider-side version. If the judge changes, the score can change even when your product output stays the same.

Put this in your report:

{
  "eval_tool": "deepeval",
  "eval_tool_version": "4.1.1",
  "judge_model": "gpt-4.1-mini",
  "dataset": "support_refunds.v1.jsonl",
  "dataset_sha256": "...",
  "thresholds": {
    "answer_relevancy": 0.70,
    "faithfulness": 0.75
  }
}

Do not hide this metadata in a CI log that disappears after 14 days. Store it with the release artifact or attach it to the pull request.

Keep the rubric under version control

If you use G-Eval or any custom rubric, the prompt is part of the test. A one-line wording change can make the judge stricter or softer. Treat the rubric like test code.

I use this convention:

  • evals/rubrics/support_faithfulness.v1.md
  • evals/rubrics/support_faithfulness.v2.md
  • evals/reports/<date>-<git-sha>.json

This makes review practical. A senior SDET can look at the diff and ask whether the new rubric still matches the business risk.

Check 3: Review Failing Examples

The third check is the one teams skip when deadlines get tight. They see a pass rate above the threshold and move on. I do the opposite. I start with the failures.

DeepEval can give you metric-level feedback, but the release decision still needs a human read. A failing example may be harmless. It may also reveal a product bug that the average score hides.

Create a failure review table

Here is the format I use in PR comments:

Case ID Metric Score Risk Decision
refund-014 faithfulness 0.42 High Block
refund-019 answer relevancy 0.66 Medium Fix next sprint
refund-033 format 0.50 Low Accept

The table forces better judgment. A low formatting score may not matter for a backend summarizer. A low faithfulness score in a medical, finance, or policy workflow should stop the release.

Read the actual outputs

Never approve an AI feature from chart screenshots alone. Read at least the top 10 failures or every high-risk failure, whichever is larger. For a small dataset of 50 examples, I read all failures. For a dataset of 500 examples, I sample by product area and risk bucket.

This is the same discipline behind building an eval CI gate. The gate is only useful when the team can explain why it passed or failed.

Separate product failures from eval failures

Not every red eval is a product bug. I classify failures into 4 groups:

  • Product bug: the model or system gave a wrong answer.
  • Retrieval issue: the needed source was not retrieved.
  • Dataset issue: the expected answer is outdated or unclear.
  • Scorer issue: the judge misunderstood a valid answer.

This classification is where QA adds value. A developer may fix the prompt. A data engineer may fix retrieval. A product manager may rewrite policy text. QA owns the evidence trail.

How I Put DeepEval in CI

A useful eval gate should run in CI without drama. It should fail loudly when risk is high and warn when the signal needs review. I do not want a 40-minute mystery job that blocks every merge and nobody understands.

Start with a small smoke suite

Begin with 20 to 50 high-value examples. Pick examples that represent real product risk. A support bot needs refund, cancellation, privacy, escalation, and hallucination checks. A browser agent needs login, checkout, permission, navigation, and recovery checks.

Run the smoke suite on every pull request. Run the larger suite nightly. This mirrors how many teams already split Playwright tests into PR smoke and scheduled regression.

GitHub Actions example

Here is a practical CI shape:

name: llm-evals

on:
  pull_request:
  workflow_dispatch:

jobs:
  deepeval-smoke:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - name: Install eval dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements-evals.txt
      - name: Record dataset hash
        run: python scripts/hash_eval_dataset.py
      - name: Run DeepEval smoke suite
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
        run: pytest evals/tests -q

The command is intentionally simple: pytest evals/tests -q. DeepEval integrates with Python test workflows, and the official pytest assertion documentation shows the broader assertion model used by Python test suites. Keep the job readable so another SDET can debug it at 1 AM.

Threshold rules that do not create noise

I like 3 levels:

  1. Block: high-risk metric below threshold on protected flows.
  2. Warn: medium-risk metric drops by more than an agreed delta.
  3. Track: low-risk formatting or tone issue that does not change user safety.

Do not block every small score movement. You will train developers to ignore the gate. Block only when the risk is clear and the failure examples prove it.

India QA Career Context

For QA engineers in India, this skill is not optional anymore. Product companies are asking SDETs to test AI workflows, browser agents, copilots, and RAG systems. Service companies are slower, but the direction is visible.

I see a practical salary gap forming. A manual tester who only executes test cases may stay near the lower bands. An SDET who can build Playwright automation, write Python evals, review LLM failures, and explain CI gates has a stronger case for ₹25-40 LPA roles in product teams. That range depends on city, company, interview performance, and experience. It is not a promise. It is a realistic target band for strong mid-level to senior engineers in Bengaluru, Hyderabad, Pune, and remote product roles.

What hiring managers will ask

Expect questions like:

  • How do you test hallucination in a support chatbot?
  • How do you prevent prompt changes from silently reducing quality?
  • How do you test an AI browser agent after a Playwright upgrade?
  • How do you explain an eval score to a product manager?

If you can answer with a dataset, a scorer version, and 3 reviewed failures, you sound like an AI QA engineer, not a tool tourist.

A portfolio project you can build this week

Pick one workflow: refund policy bot, travel booking assistant, HR policy Q&A, or ecommerce support. Create 30 examples. Add DeepEval. Pin the package. Add a GitHub Actions job. Publish the failure review table in your README.

Then connect it to a broader QA story using PromptFoo vs DeepEval: QA Guide for LLM Evals. Recruiters remember projects that show judgment, not only tool names.

Common Mistakes I See

The mistakes are repeatable. That is good news. Repeatable mistakes can be turned into a checklist.

Mistake 1: treating the score as a release certificate

A score is evidence, not a certificate. If the dataset is weak, the score is weak. If the scorer is unpinned, the score is unstable. If nobody reviewed the failures, the score is incomplete.

Mistake 2: using only synthetic examples

Synthetic examples help you scale coverage, but they should not replace real bugs and real user questions. Add production-inspired cases after privacy review. Strip personal data. Keep the examples short enough that a reviewer can understand them.

Mistake 3: changing thresholds without a note

A threshold change is a release decision. If answer relevancy moves from 0.80 to 0.70, write down why. Maybe the original threshold was unrealistic. Fine. Record it.

Mistake 4: hiding eval reports from QA

If only the AI engineer can read the report, the process is broken. QA should own the release signal with product and engineering. Put the summary where testers already work: pull request comment, CI artifact, Jira ticket, or release checklist.

Mistake 5: ignoring dependency monitoring

DeepEval, model providers, embedding models, retrievers, and browser automation packages can all move. If you track only application code, your AI testing signal has blind spots. I recommend pairing eval gates with a release watcher like the pattern in AI Release Watcher for QA.

Key Takeaways

The LLM eval score checklist is simple because release decisions need repeatability. Before you trust a green DeepEval result, check the evidence behind it.

  • Freeze the dataset and record a hash for every serious eval run.
  • Pin DeepEval, the evaluator model, the rubric, and the threshold.
  • Review failing examples before approving the release.
  • Classify failures as product bug, retrieval issue, dataset issue, or scorer issue.
  • Use CI gates for high-risk flows, but avoid noisy blockers for low-risk score movement.

My rule is blunt: if I cannot reproduce the score and explain the failures, I do not trust the release. That rule protects teams from false confidence.

FAQ

What is an LLM eval score checklist?

An LLM eval score checklist is a short release review that verifies the dataset, scorer version, and failing examples behind an LLM evaluation result. It helps QA teams decide whether a score is trustworthy enough for CI or release approval.

Is DeepEval enough to test an AI product?

No single framework is enough. DeepEval helps structure LLM test cases and metrics, but you still need product risk analysis, dataset review, dependency monitoring, human failure review, and manual exploratory testing for new behavior.

Should I block a release if the eval score drops?

Block only when the drop affects a high-risk flow or reviewed failures show real product harm. For low-risk tone or formatting changes, create a warning and track it. A noisy gate loses trust quickly.

How many examples do I need for an eval dataset?

Start with 20 to 50 examples for a PR smoke suite. Add a larger nightly suite after the team understands failure patterns. Quality matters more than raw count in the first version.

How do I explain LLM evals in an SDET interview?

Explain them like release gates. Talk about frozen datasets, pinned scorer versions, CI execution, failure review, and risk classification. Then show a GitHub repo with code, reports, and a README that explains the tradeoffs.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.