Research / September 9, 2026
Simulated data for support agents
We trained a support agent on 1,057 simulated conversations that cost about 15 dollars. On a public benchmark it beat the same model trained on expert-written conversations, 30% to 17.5%. The margin over the experts is promising, not settled.
The short version. To fine-tune a support agent, most teams pay experts to write example conversations. We asked whether a simulator could write them instead, given only the agent's tools and policy. It wrote 1,057 conversations for a public support benchmark. We trained the same model an expert-data vendor had trained, with their recipe, and scored both on the benchmark's own test. Ours won, 30% to 17.5%. The gain over the untrained model is beyond doubt. The margin over the experts rests on 40 tasks, so we call it promising. Every training row is on Hugging Face.
Same base model, same recipe, same official scorer. Counts are 2, 7 and 12 of 40. Only the simulated-data model separates from the untrained one at this sample size (p = 0.006).
| Item | Value |
|---|---|
| No training | 5.0% |
| 1,057 expert-written rows | 17.5% |
| 1,057 simulated rows | 30.0% |
The experiment
tau2-bench is a public benchmark from Sierra. A model plays a support agent with real tools and a policy document, and a second model plays the customer. A task passes only when the world at the end matches the answer key.
In April 2026 the expert-data company AfterQuery published a run on it: 1,057 expert-written conversations, an 8-billion-parameter open model, and the recipe. Same base model, same recipe, same scorer. Only the conversations changed. Ours came from a simulator that had seen only the agent's tools and policy.
How the simulator writes a conversation
It maps the situations first. Ask a model for a thousand customer requests and you get a thousand versions of the same one. So the simulator reads the policy as data and builds six axes.
| Axis | Values |
|---|---|
| Policy rule | the 16 rules |
| Tool | the 13 tools |
| Tool condition | works, times out, malformed, stale, permission denied |
| Account state | exists, missing, already acted on, duplicate, partly done |
| Customer stance | ten values from ordinary to adversarial |
| History | fresh, prior failure, prior partial action, contradicts earlier, repeat visit |
Six axes describe hundreds of thousands of situations. The simulator picks a set where every pair of values appears together at least once (a pairwise covering design, from software testing), because most real failures come from two things interacting. For telecom that came to 240 situations, and 150 were written out.
It gives each customer a way of typing. Prose, lowercase, clipped, or typos.
The writer model gets this as an aside in prose, never as a label, because a model told to be terse tends to write an essay about terseness.
| Item | Value |
|---|---|
| Ordinary prose | 126 |
| All lowercase | 26 |
| No punctuation | 26 |
| Clipped | 25 |
| Abbreviated | 18 |
| Typos | 11 |
| Run-on | 7 |
It plays the conversation out. One hosted small model plays both sides. The agent has the tools and the policy. The customer has the situation card and nothing about the policy. A fake back-end answers every tool call the same way for a given seed.
It keeps or drops. Rule checks remove conversations that are wrong by construction: an action claimed but never taken, an account number the customer never gave, success declared after a failed tool call. Then a grader model reads every survivor against a rubric and keeps or drops it with a reason. For telecom, 369 in, 310 out.
What the model learned
Twelve of the 40 test tasks end correctly by handing the customer to a person. The trained model passed nine. A typical win: the lookups fail, and the model transfers the customer instead of guessing. Fifteen of the 310 training conversations contain that pattern, and nobody wrote them. The simulator drew them from the policy's own escalation rules. The passes split evenly across the benchmark's hard and easy customer tags.
Three caveats. The model learned when to hand off better than when to keep going, so restraint is graded in the next set. Retail and airline, trained the same way, did not match the expert-data numbers. The expert figure is their best checkpoint per domain, ours the final one.
What this teaches about post-training
Post-training is where an agent's behavior is made. Forty-eight minutes on one GPU changed nothing about what the model knows and everything about what it does.
The expensive part was never the writing. It was choosing which situations to write. An expert knows that a suspended line plus a failed lookup plus an impatient customer is a case that matters. A covering design found that case without being told. The next run is the full 114-task split with repeated trials.
Grading is where a dataset gets its quality. The 310 training rows survived a rule check and a rubric.
A number is only as good as its test. The test is the benchmark's own held-out split, and every training row was checked for overlap against all 2,449 benchmark tasks [5, §16].
For researchers
Single trial on the official test split, protocol pre-registered and matched to AfterQuery's run line by line [2]. Pass counts , and of . Two-sided Fisher exact test [6] on the table: simulated vs untrained , simulated vs expert .
| Value | |
|---|---|
| situation axes | 16 policy clauses; 13 tools; tool condition (success, timeout, malformed, stale, permission denied); world state (exists, missing, already acted on, duplicate, partially completed); customer stance (ten values from ordinary to adversarial); history (fresh, prior failure, prior partial action, contradicts earlier, repeat visit) |
| sampling | strength-2 covering array over the six axes [3]: for every two axes with and values, each of the pairs appears in at least one row; 240 regions, 150 rendered, embedding-diversity objective among candidates |
| persona | per row, a second draw of texture, tone, length and pressure, given to the writer as a prose aside |
| rollouts | one hosted Qwen3-4B-Instruct-2507 plays agent (real tools, policy) and user (situation card, no policy); mock world deterministic per seed; two rollouts per situation, six-turn target, median eight messages |
| grading | deterministic conduct checks (action claimed without a tool call, identifier the user never gave, success declared after a failed call), then an LLM grader against a written rubric with a keep-or-drop reason per row; telecom pool 369, kept 310 |
| base | meta-llama/Meta-Llama-3.1-8B-Instruct |
| adapter | LoRA rank 32, alpha 64 [4] |
| optimizer | lr 2e-5, cosine, effective batch 16, 3 epochs (AfterQuery's recipe, unchanged) |
| hardware | one H100, 48 minutes |
| data | 1,057 rows across retail, airline and telecom; telecom 310 |
| leakage check | 0 of 1,057 rows above 0.9 cosine against all 2,449 tau2 tasks; max 0.65 |
| eval | tau2-bench official harness [1], test split, GPT-4.1 user, temperature 0, single trial |
| dataset | the rows, with each row's grader rule and reason [7] |
References
- Barres, V., Dong, H., Ray, S., Si, X. and Narasimhan, K. (2025). τ²-Bench: Evaluating conversational agents in a dual-control environment. arXiv:2506.07982.
- AfterQuery (2026). How AfterQuery expert data drives model performance on τ²-bench. afterquery.com. Accessed September 9, 2026.
- Kuhn, D. R., Wallace, D. R. and Gallo, A. M. (2004). Software fault interactions and implications for software testing. IEEE Transactions on Software Engineering, 30(6), 418-421.
- Hu, E. J., Shen, Y., Wallis, P., Allen-Zhu, Z., Li, Y., Wang, S., Wang, L. and Chen, W. (2022). LoRA: Low-rank adaptation of large language models. International Conference on Learning Representations. arXiv:2106.09685.
- Lambert, N. (2025). Reinforcement Learning from Human Feedback. arXiv:2504.12501. Online at rlhfbook.com.
- Fisher, R. A. (1935). The logic of inductive inference. Journal of the Royal Statistical Society, 98(1), 39-82.
- While. (2026). tau2-simulated [dataset]. Hugging Face. huggingface.co/datasets/while-ai/tau2-simulated.
- whilehq (2026). whileai SDK [software]. Apache 2.0. github.com/whilehq/whileai-sdk.
Run it
The simulator is the open-source whileai SDK. This call produced the set, and it takes any agent's tools and system prompt:
pip install whileaiimport whileai.simulations as wai
data = wai.simulate(
agent="openai:gpt-4.1-mini", tools=TOOLS, system_prompt=POLICY
)
data.grade(
rubric=RUBRIC
) # the hosted judge writes reward and reason onto every row
print(data.pass_at)The SDK README goes from that call to a gated training set.