Dev.to AI πŸ€– Ai πŸ‘ 0 πŸ“– 5 min read

How to evaluate an AI-generated job shortlist

A job-search assistant returns five roles. The titles sound relevant, the links look plausible, and the summary says they match your requirements. What has it actually established? A useful evaluation separates three t

A job-search assistant returns five roles. The titles sound relevant, the links look plausible, and the summary says they match your requirements.

What has it actually established?

A useful evaluation separates three things: whether the assistant completed the task, whether the sources support its claims, and whether the roles fit the person's stated constraints. A fluent answer is not evidence for any of them.

This walkthrough adapts an existing job-shortlist review protocol into a small, repeatable evaluation. It works with any assistant or job-search tool. The worked examples below are fictional; they are not benchmark results.

1. Freeze the task and the first results

Make the request testable. For example:

Find five software engineering roles with a physical workplace in Switzerland. I work in English and cannot meet a mandatory German requirement. I need an advertised workload that includes 80%. Preserve original listing links and explain unresolved requirements.

Record the exact request, date, product, visible model setting and any relevant search settings. Keep that run record separately from the result rows. Avoid placing a CV or private employment history in a public evaluation file.

Freeze the first five results in their original order before checking sources. If the assistant returns three, record three. If a link is broken, keep that result in the review. Replacing it with a better result would change what you are evaluating.

Five results are enough to inspect a workflow. They are not enough to rank assistants generally.

2. Keep three different language questions separate

A source's language tag, the language of the written advert and the working-language requirement are different attributes.

For example, an advert written in English can explicitly require German. A German-written advert might describe English as the working language. A missing language statement settles neither question.

Evaluate the claim the assistant made against the actual requirement. Use explicit labels such as required, preferred, alternative, conflicting and unstated. Do not turn β€œGerman is an advantage” into a mandatory requirement, or β€œnot mentioned” into an English-only guarantee.

The same distinction applies elsewhere: a Swiss headquarters is not evidence that a particular role is based in Switzerland, and a remote label is not evidence that the employer permits work from Switzerland.

3. Review each claim against its source

For every result, record the suggested URL, the source you could actually inspect and the check time. Then review these dimensions independently:

Dimension Evidence to inspect Common unsupported inference
Source access Readable employer advert or authorized ATS page An HTTP 200 response proves the advert is readable
Role Role-specific duties and requirements A matching title proves occupational fit
Workplace Stated work location and explicit remote eligibility Headquarters country determines workplace
Languages Exact required/preferred/alternative wording English-written means English-only
Workload Advertised percentage or range 80–100% guarantees an agreed 80% contract
Schedule Stated days, hours or shifts 80% means a four-day week
Contract and experience Contract terms and accepted experience pathways β€œJunior” means no experience is required
Availability Explicit closure evidence and relevant application destination An Apply button guarantees the job is still open

An inaccessible page should produce an access result: blocked, unavailable, redirect-only or not checked. It should not produce an invented answer about the job.

A source can support one claim and leave another unknown. A single β€œverified” badge hides that distinction.

4. Represent evidence before scoring it

Here is a fictional review record:

{
  "result_number": 1,
  "source_access": "readable",
  "role_match": "supported",
  "language_evidence": "Contradicted: advert explicitly requires German",
  "workload_evidence": "Advert states 80–100%",
  "schedule_evidence": "Unknown: no days stated",
  "availability_evidence": "no_explicit_closure",
  "decision": "exclude",
  "reason": "Mandatory German contradicts the declared essential constraint"
}

This result is readable and relevant to the occupation, but it fails one essential constraint. It should not be called either a fully verified match or a hallucinated vacancy.

For a second fictional result, imagine a source that cannot be read. Keep its requirement evidence unknown and its decision unresolved. A blocked page does not prove that the assistant invented the role.

no_explicit_closure means precisely that. It is not a positive verification that applications are accepted.

5. Report coverage, contradictions and unknowns

Start with counts rather than a single accuracy score. Report how many results were returned, how many sources were readable, which claims were contradicted and what remained unresolved.

The linked blank worksheet uses one row per result. After reviewing it, this standard-library Python script summarizes two useful dimensions without inventing an overall accuracy metric:

import csv
from collections import Counter
from pathlib import Path

path = Path("ai-job-shortlist-review.csv")
with path.open(newline="", encoding="utf-8") as handle:
    # Blank template rows do not count as returned results.
    rows = [row for row in csv.DictReader(handle)
            if row["suggested_url"].strip()]

print(f"Returned results recorded: {len(rows)}")
for field in ("source_access", "role_match", "decision"):
    counts = Counter(row[field].strip() or "unknown" for row in rows)
    print(f"{field}: {dict(counts)}")

readable = sum(row["source_access"] == "readable" for row in rows)
print(f"Readable original sources: {readable}/{len(rows)}")

These are descriptive counts of recorded review labels, not a semantic evaluator. The script cannot determine whether a human or model labeled the evidence correctly.

Keep unreadable sources in the returned-result denominator. If you also report a metric among readable sources, label that separate denominator explicitly. Otherwise a system with many inaccessible sources can look artificially strong.

6. Make repeated runs comparable

For a useful comparison, keep the task, result cutoff and review criteria stable. Record differences in date, access, tool availability and model settings. Live vacancies change, so a later result is not automatically evidence of a better assistant.

Preserve the original run and add later checks as new observations. Do not use today's readable page to rewrite yesterday's blocked result.

For a larger evaluation, use more tasks, independent review and explicit adjudication of disagreements. This protocol alone does not establish reviewer accuracy, causal effects or a representative model ranking. It also does not establish that an application was submitted or that anyone was hired.

The practical outcome is a shortlist a person can inspect: which claims are supported, which are contradicted, and which require follow-up.

Worksheet and provenance

Download the five-row review worksheet. The full review protocol documents the field definitions and limitations. Protocol version: panta-shortlist-review-v1.

Disclosure: I work on Panta, where this protocol was developed. This adaptation was prepared with AI assistance, including generated text. The examples are fictional, and no assistant-performance benchmark is claimed.

πŸ“° Read the original article on Dev.to AI

Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.