Blog articles

Benchmarking LLMs in a User Simulator

By Kaleb · Founding Member of Technical Staff at Bluejay

Benchmarking the LLM behind Bluejay Digital Humans

Bluejay tests agents by calling them with simulated people. We call these Digital Humans.

A Digital Human will hold a conversation with an agent the same way a real person would.

When it comes to running a test (simulation), the test is only good when both the agent and the Digital Human work. Thus if the Digital Human messes up, the test evaluates to still fail the agent even though it is not the agent’s fault!

Our goal is to decide which LLM simulates a Digital Human best on quality, latency and cost.

GPT 6 Sol scored highest at 82.0%, while the Gemmas replied fastest but scored lowest.

This post walks through how we built the benchmark, the tradeoffs we made, and what we found.

Digital Human Configuration

Each Digital Human field has a pass or fail check worth points, and a conversation’s score is the points it earned out of the points possible.

Enum-based fields, which include but are not limited to:

Field Verification Points
Language Passes if a language detector reads each reply as the set language, one of 20+ 1
Language, autodetect Passes if each reply is in the language the agent used 1
Verbosity Passes if replies fit the set length: 1 to 5 words for low, 10 to 25 for medium, 30+ for high 1
Fluency Passes if the speech matches the set level: native, intermediate or beginner 1
Grammar Passes if the grammar fits the fluency level 1
Natural speech Passes if it sounds like a person on a call 1
Attack type Red team tests only. Passes if the caller tries the set type of attack, such as prompt injection 1
Attack vector Red team tests only. Passes if the caller uses the set method, such as impersonating the system 1

Free text instructions, which include but are not limited to:

Field Verification Points
Intent Passes if the caller does every part of its goal that the call gave it a chance to do 6
Role Passes if the caller plays who it is for the whole call 1
Hangup rule Passes if the caller hangs up when the rule says 1
Silence rule Passes if the caller goes quiet when the rule says 1

Building the benchmark set

Anonymization

We built the set from anonymized Digital Human configurations across many industries, creating an initial pool of over 5,000 Digital Humans. To remove real details without adding bias:

Creating a diverse set

We wanted 500 diverse Digital Humans that represent the tests we’ve seen. To pick them, we first needed a number for how different two Digital Humans are.

The difference score

We scored every possible pair in the pool from 0 to 1:

d=12⋅settings that differsettings both set+12⋅∑fpf(1−simf⁡)∑fpf

where

Text similarity

Embedding cosine is the default way to compare text, so we tested it first on four intents (shortened here):

  1. Make a dental claim. If the agent can’t get your name right after you spell it, just say yes.
  2. Make a medical claim, with the same extra line.
  3. Make a claim.
  4. Make a dental claim.
Pair What differs 3-word phrase overlap Embedding cosine
1 and 2 Dental vs medical 0.898 0.971
3 and 4 One word, dental 0.875 0.969
1 and 3 Topic and the extra line 0.550 0.963
1 and 4 The extra line 0.621 0.992
2 and 3 Topic and the extra line 0.550 0.977
2 and 4 Topic and the extra line 0.541 0.963

Embedding cosine scored every pair between 0.96 and 0.99. It can’t tell a one-word change that changes the test from a whole extra instruction.

So we use each method where it works:

Choosing the set

Now we had over 5,000 Digital Humans and room for 500.

To measure a set, we took how close every Digital Human in the pool sits to its nearest pick, and compared that to a random sample of the same size. We explored a few paths:

Each method below keeps one central Digital Human per group.

Method Gain over random, 50 Digital Humans Gain over random, 500 Digital Humans
FasterPAM (k-medoids) 22% 22%
Greedy facility location 21% 22%
Ward linkage 21% 21%
k-means 18% 19%
Alternating k-medoids 8% 11%

We ended up using greedy facility location, scoring similar to FasterPAM. It starts with an empty set and adds one Digital Human at a time, each time picking the one that brings the rest of the pool closest to the set.

Adding one at a time let us skip any Digital Human whose source already filled 10% of the set. FasterPAM can’t do this, because it starts with a full set and keeps trading one pick for another, so there’s no point where it adds a Digital Human and can check the rule.

Two ways to score

We ran the 500 Digital Humans on each model and scored the conversations two ways.

Relative scoring

With this scoring method we run a blind pairwise comparison.

  1. Each Digital Human runs once on our baseline (GPT 5.4) and once on the candidate.
  2. The transcripts are anonymized (model removed).
  3. Two frontier LLM judges from different vendors read both transcripts with the Digital Human’s fields and pick which model followed each instruction better.
  4. Each judge grades each pair twice, with the order swapped.
  5. If the two grades disagree, it’s a tie. The score is wins plus half the ties, so 50% means no difference.

The advantage of this scoring method is that judges always have a reference point. This lets the judge catch smaller differences than an absolute scorer.

Absolute scoring

With this scoring method we grade each conversation on its own against a fixed checklist.

  1. Each Digital Human runs on each model.
  2. The transcripts are anonymized (model removed).
  3. Two frontier LLM judges from different vendors grade every check in the configuration tables as pass or fail.
  4. A check whose moment never came, like a hangup rule in a call that never got there, isn’t counted in the score.
  5. The score is points earned out of points possible, averaged over the two judges, with a 95% range from resampling the Digital Humans.

The advantage of this scoring method is that every model lands on one scale to hill climb. We can compare every model at once and see how far each one is from 100%.

In our benchmarking, we use relative scoring to accurately decide if a candidate beats an incumbent model, and an absolute score to set a north star.

Results

Model Absolute score Avg reply (ms) p95 reply (ms) p99 reply (ms) Cost per conversation
GPT 6 Sol 82.0% 1,346 2,049 3,385 $0.0122
Qwen3.8-27B 79.1% 1,903 1,833 18,876 Self-hosted
Gemini 3.8 Flash 77.9% 2,126 3,495 6,584 $0.0084
GPT 5.4 77.4% 1,001 1,403 1,844 $0.0280
Gemma 4 31B 70.9% 736 1,116 1,522 Self-hosted
Gemma 4 26B 69.2% 749 873 1,269 Self-hosted

Notes:

Where the missing points goIntentObjectivesLengthRoleEverything else
0%10%20%30%GPT 6 Sol18.0%Qwen3.8-27B20.9%Gemini 3.8 Flash22.1%GPT 5.422.6%Gemma 4 31B29.1%Gemma 4 26B30.8%
Latency● avg  ○ p95  | p99
0.5s1s2s5s10s20sGPT 6 Sol1.3 sQwen3.8-27B1.9 sGemini 3.8 Flash2.1 sGPT 5.41.0 sGemma 4 31B736 msGemma 4 26B749 ms
CostPer conversation
0¢1¢2¢3¢GPT 6 Sol1.22¢Qwen3.8-27Bself-hosted, no per-call priceGemini 3.8 Flash0.84¢GPT 5.42.80¢Gemma 4 31Bself-hosted, no per-call priceGemma 4 26Bself-hosted, no per-call price

Takeaways

  1. Benchmark your methods to a simple baseline continuously for best results.
  2. Use relative scoring to pick a winner and absolute scoring to see how far every model is from good.
  3. Following the intent is the most difficult area for Digital Humans.

Test your agent with
better Digital Humans

Run Digital Humans built from real test cases against your voice and text agents.