Synthetic Data for AI Agent Evals: Build the Set Before You Have Users
The seed, generate, pair, review mechanism, and the honest ways synthetic eval data lies to you.
AI-drafted, reviewed by Muhammad Qasim Hammad on August 29, 2026. See our AI disclosure.
Table of contents
- What is synthetic data for AI agent evals, and when do you actually need it?
- How do you turn a handful of real examples into a full eval set?
- Which tools actually handle this today?
- How do you pair a synthetic input with an expected outcome?
- Why does synthetic data drift from what real users actually do?
- How does a model end up grading itself on evals it basically wrote?
- What should you actually set up this week?
Your agent has been live for 11 days. You have 40 real conversations, a Slack thread of screenshots from your only beta user, and a prompt change sitting in a draft PR that you are fairly sure fixes yesterday's bug. Neither number helps much yet: 40 real cases will not build a scored eval set, and waiting 6 months for 1,000 more is not a plan. Synthetic data for AI agent evals means using an LLM to generate plausible test inputs, and sometimes a graded expected outcome to go with each one, so you have something to score against before real traffic hands you enough cases on its own.
What is synthetic data for AI agent evals, and when do you actually need it?#
Synthetic data for AI agent evals is a set of test cases an LLM generates instead of ones pulled from real usage, built by seeding a generator with a handful of real examples and asking it for variations. You need it whenever real traffic is too thin to trust: before launch, right after launch, or for a rare edge case.
A production agent eventually gives you the real thing: actual phrasing, actual edge cases, actual failure patterns nobody predicted. The problem is the calendar. Wait for 1,000 real traces before building an eval set and you ship every change blind for months, finding out a prompt edit broke something only when a user hits it first.
Synthetic data does not replace that real data. It buys you a starting eval set immediately instead of after months of waiting, and it stays useful even once real traffic arrives, for the edge cases and adversarial inputs your limited user base has not thrown at you yet.
If you already have a few hundred real, varied traces, skip straight to building the eval set from those and treat synthetic generation as a smaller supplement for the gaps, not the foundation. The flowchart above is a gut check, not a rule: when in doubt, a blend of both beats waiting for either one to be perfect.
How do you turn a handful of real examples into a full eval set?#
The mechanism is seed, generate, pair, review. Start with even 5 to 10 real examples if that is all you have, ask an LLM to write variations and deliberate edge cases from that seed, attach an expected outcome to each new case, then have a human check the batch before it counts as part of your golden set.
This is not a new invention. It is the same seed-and-expand technique behind Self-Instruct and every "generate synthetic examples" button shipped since: give a generator a small set of real, labeled cases, and prompt it to produce more inputs that match the same shape and difficulty, not just the same topic. The seed set is what keeps the output grounded. Skip it and ask a model to write test cases for a support agent cold, and you get generic, easy inputs that miss what your actual users do.
Deliberately generating hard cases matters as much as generating more cases. Ask for edge cases and adversarial inputs by name in the prompt (an ambiguous request, conflicting instructions, a competitor's name dropped into the message, an empty or malformed field) rather than hoping normal variation produces them on its own. If your agent is RAG-grounded, the same technique works from source documents instead of chat logs: generate question, context, and answer triples straight from the documents it retrieves against, which is how our RAG evaluation metrics piece recommends building the labelled set its 4 scores run on.
Which tools actually handle this today?#
LangSmith, Promptfoo, and Braintrust each ship this as a built-in feature instead of a DIY prompt. LangSmith generates new dataset examples from ones you pick, Promptfoo expands seed prompts into test cases and separately red-teams for adversarial ones, and Braintrust generates cases through its Loop tool or pulls them straight from production traces.
You do not need any of these to start. A spreadsheet and a prompt does the job in an afternoon. But if your eval pipeline already lives in one of them, generation is a command or a button away, not a separate script to maintain.
| Tool | Generates | From | Review |
|---|---|---|---|
| LangSmith | New dataset examples | Reference examples you pick, or auto-selected | Edited before adding, tagged synthetic in the source metadata |
| Promptfoo | Expanded test cases, plus adversarial red-team inputs | generate dataset and redteam generate commands | Written to a YAML file you check before running |
| Braintrust | Synthetic cases via its Loop tool | Your app's own prompts and production traces | Stays editable in the dataset UI before an eval run |
Feature docs, if you want the specifics: LangSmith's synthetic example generator, Promptfoo's dataset and red-team commands, and Braintrust's dataset guide. Promptfoo's generator also takes a persona flag, so a batch can target several different user types in 1 run instead of 1 generic voice. Whichever you use, the review column matters more than the generate column. A tool that produces 200 synthetic cases you never look at is not an improvement over 20 real ones you did.
How do you pair a synthetic input with an expected outcome?#
Every eval case needs something to score against, and you have 2 honest options. A rule-based check works when the right answer is checkable by code: a status code, a required field, an exact string. An LLM-graded check works when correctness is fuzzier, like tone or completeness, and needs a rubric the same way a human grader would.
Rule-based grading is cheap and deterministic: the same input always scores the same way, which makes it the right default whenever the task allows it. Reserve LLM grading for cases where no rule can capture what "good" means, like whether a summary kept the important facts or a reply matched the requested tone.
The catch is that an LLM grader inherits every failure mode of an LLM judge, because that is exactly what it is. Non-determinism, leniency, and self-preference bias do not go away just because the thing being graded is synthetic instead of real. Our LLM-as-a-judge pitfalls piece covers all 6 failure modes in depth. The short version: a bad judge is one more way a synthetic eval set can lie to you, on top of any way the data itself is already wrong.
A hybrid works well in practice: use a rule-based check to catch the clear failures cheaply, and reserve the LLM grader for the harder middle cases a script cannot classify either way.
Why does synthetic data drift from what real users actually do?#
Synthetic inputs drift from real ones in a measurable way: they run longer than what people actually type. A 2026 Airbnb study on synthetic search queries found real users write a median of 4 words, a generator seeded with real examples produces a median of 6, and one given no real seed averages nearly 14.
That is not a one-off finding. The same paper shows the gap is fixable: seeding the generator with real examples cut the distributional gap, measured by KL divergence against real query patterns, by roughly 7.5x compared to generating from scratch. The lesson is not that synthetic data is unreliable. It is that synthetic data without a real seed drifts, and synthetic data with one mostly does not. Source
Agent evals should expect a similar shape of gap even where nobody has measured it yet. A synthetic user message tends to read more complete and more polite than what a rushed real person types into a chat box, for the same reason a synthetic search query ran long in the Airbnb study: the generator defaults to a tidier, more grammatical version of the request. Treat that as something to test for, not a settled number.
That drift compounds if nobody checks for it. An eval set that quietly stops resembling real usage still produces scores, and those scores still look fine, right up until a real user hits an input your test set never imagined.
How does a model end up grading itself on evals it basically wrote?#
The failure mode is subtle: the same model family writes your synthetic test cases and grades the output, so both steps share the same stylistic habits. A 2025 study on self-bias in LLM-generated benchmarks found this compounds, with each model tending to rank itself first, even when a panel of other models disagrees.
This happens more easily than it sounds. Ask a model to generate synthetic test cases, then use a model from the same family to grade the outputs against them, and both steps draw on the same sense of what a good answer looks like. The model is not cheating on purpose. Its idea of a plausible edge case and its idea of a correct answer come from the same place, so the score it gives itself runs friendlier than a genuinely independent check would.
That is the same self-preference mechanism behind a biased LLM judge, just applied one step earlier, to the data instead of the score. Generating the test set and grading it with the same model stacks the bias instead of catching it. Source
The fix costs a second API call: generate synthetic cases with 1 model, grade with a different one, and keep a small slice of human-graded cases neither model ever sees during tuning. Treat the generator model as a real decision worth revisiting, not a default, especially anywhere the eval result decides which vendor gets paid.
What should you actually set up this week?#
Start smaller than feels responsible: 5 to 10 real examples, an LLM prompt that generates 20 variations and 5 deliberate edge cases from them, and a rule-based check wherever the task allows one. Review every generated case once before it counts. That is a working eval set by the end of the day, not a research project.
Once real traffic starts arriving, the job flips: fold every new real case into the set, weight it above the synthetic ones you started with, and keep the synthetic share around only for edge cases production has not surfaced yet. Langfuse's own golden-dataset guide suggests starting with 20 to 50 human-reviewed items and growing toward 100 to 1,000 for a full regression set. Source
If you have not built the harness that runs this set on a schedule, testing and evaluating AI agents in n8n covers the trigger-and-score loop this data feeds into. For the adversarial slice specifically, a red-team generator like Promptfoo's produces several hundred attack-style inputs in 1 run, more edge-case coverage than most teams would hand-write in a week.
A synthetic eval set is a start, not a substitute. Its whole job is to make itself obsolete as production data replaces it, section by section.
Frequently asked questions
What is synthetic data for AI agent evals?
How much real data do you need before generating synthetic eval cases?
Does synthetic eval data actually match real user behavior?
Can the same model generate synthetic test cases and grade them?
Which tools generate synthetic eval data automatically?
Sources
Primary references and vendor documentation used while drafting and reviewing this article.
- Bridging the Cold-Start Gap: LLM-Powered Synthetic Data Generation for Natural Language Search at Airbnb
- When LLMs Benchmark Themselves: Deconstructing Self-Bias in Automated Evaluation
- LangSmith: Generate synthetic examples to enhance a dataset
- Promptfoo: Dataset Generation docs
- Promptfoo: Red team quickstart
- Braintrust: Datasets guide
- Langfuse: Golden dataset evaluation guide
Written by
Muhammad Qasim Hammad is an AI agent and automation expert and the founder of Cart Gaze LLC (cartgaze.com). He builds product for the love of it: when an idea lands, a working prototype is usually running within hours, built with the same AI agents and automations he sells. He puts his own output at roughly 20× what it was before agents, and the Agentic OS behind this site is the working proof, documented in public with the tools he actually ran and what they really cost.
AI & Automation Services
Want a pipeline like this running in your business?
I'm Qasim — I design and ship AI agents and n8n automations for solo operators and small teams. Tell me what's eating your team's week, and I'll scope a fix.
Related reading
How to Test and Evaluate n8n AI Agents: Accuracy, Mocks and Regression
An AI agent is non-deterministic, so 'it worked when I tried it' is not testing. Use n8n's built-in Evaluation feature, a golden test set, and the right scoring metrics to test n8n AI agents and prove a change made it better, not worse.
LLM-as-a-Judge Pitfalls: Flaky Scores, Self-Preference, Grading on a Curve
An LLM judge can pass 80%+ agreement with human raters and still lie to you in specific, documented ways: non-deterministic scores, self-preference bias, leniency, and overfitting to the judge itself. Here is what independently-verified research says about each pitfall, and the
How to Build an AI Agent: The 80% That Survives Week Two
Most tutorials get you a working agent in ten minutes and skip what breaks it in week two. Sixteen lessons covering the loop, tool descriptions, memory, fallbacks, guardrails, evaluation, and the cost levers that decide your bill.
n8n AI Agent Hallucinations: How to Ground and Constrain Them
An n8n AI Agent that states a wrong fact or invents a tool result is hallucinating, filling a gap where it has no grounded answer. The fix is not a better model. It is giving the agent real data and constraining what it is allowed to say. Here is how, layered.
What Is an AI Agent? A Plain-English Guide for Builders
An AI agent is a language model running in a loop that decides its own next action, not a chatbot and not a chain. Here is how the perceive-decide-act-observe loop works, how an agent differs from a chatbot, chain, and workflow, and a checklist for when you actually need one.
AI Agent Observability: Tracing, Metrics, and Cost in Production
Your agent gave a wrong answer and you have no idea where it broke. Observability captures the run (every LLM call, tool call, prompt, and cost) so you can replay it and point at the exact failing step. Here are the three pillars, what to log per step, and when a dedicated tool





