Development

A Confidence Threshold That Sends Weak Tickets to People

Antonio Evans9 min read

A support-ticket queue in a company office.
Key points

Key points

  1. 1A confidence threshold should be set per intent, not globally, because the score-to-accuracy relationship differs by class.
  2. 2Choose the floor as the lowest score at which that intent still hits your target precision on a labeled golden set, then verify the result with Cohen's kappa.
  3. 3Store the floor, the raw score and the gate decision in the same record as every model output so you can audit and replay decisions later.
  4. 4Forecast the human queue by applying the per-intent floors to a recent traffic sample before the gate goes live, and staff to that number.

Why one global threshold fails a support classifier

Picture a support ticket classifier with three intents: billing, login and cancellation. A single gate at 0.70 looks tidy in a design doc. It also hides the fact that the model is better calibrated on billing than on login, so the same 0.72 score means different things depending on the label. When you route on one number, you systematically over-trust the weak intent and over-escalate the strong one.

Confidence thresholds are decision boundaries between automated acceptance and human review, and their effectiveness depends on the use case and the data behind them, not on a default value the LlamaIndex glossary. The same page is blunt about the common failure: accepting a default threshold like 0.5 is one of the most frequent mistakes in production systems. Raw model scores are also uncalibrated in absolute terms. A reported 0.95 might be right 88 percent of the time on one field type and 99 percent on another, so equal scores across segments do not promise equal accuracy the human review calibration guide.

That is the argument for per-intent floors. Billing, login and cancellation each get their own boundary derived from evidence, not from an aesthetic preference for round numbers.

There is a second trap worth naming early: aggregate accuracy. The calibration guide's worked example shows an overall 97 percent figure masking segments at 60, 72 and 45 percent, because the dominant segment pulls the average up the human review calibration guide. A classifier at 91 percent overall can still be unacceptable on cancellations, and cancellations are exactly where a wrong routing choice costs the most.

Build the golden set before you touch the threshold

You cannot pick a floor without a reference. A golden dataset is a fixed, versioned set of test cases you run against before every meaningful change the Langfuse guide. It is the answer key: labels are fixed, so you can measure how well the system matches your standards and how that changes over time the Musubi guide.

Three practical rules shape a set you can threshold against.

First, size and composition. A single policy area needs 30 to 50 examples at minimum, and high-stakes categories need at least 100 the Musubi guide. For per-intent thresholds you need enough examples per intent to estimate precision with a usable confidence interval, so aim for at least 50 labeled tickets per intent and expect to grow the set from real failures. Sourcing cases from production failures rather than invented examples is the difference between a test that predicts field behavior and one that flatters your assumptions the qaskills.sh guide.

Second, difficulty. Deliberately hard cases are the point. If your golden set accuracy is consistently 100 percent, it is too easy the Musubi guide. Include tickets that sit near the boundary between billing and cancellation, because those are the ones your threshold will actually decide.

Third, versioning and leakage. Lock a version, keep old versions for trend tracking, and keep evaluation data completely separate from anything used for training or prompt tuning the Musubi guide. Decontamination from training data prevents inflated metrics the Maxim guide. A minimal case in JSONL, the format most eval tools accept, looks like this:

{"ticket_id": "t-1042", "text": "charged twice for august, need one refund", "expected_intent": "billing", "tags": ["billing", "duplicate-charge"], "notes": "near boundary with cancellation"}

Measure agreement, not just accuracy

Once the set exists, run the classifier over it and record, for every ticket, the predicted intent and the model's confidence for that intent. Then compute precision per intent at candidate thresholds. Precision here answers a narrow question: of the tickets the system labeled billing with a score at or above some floor, what share were actually billing according to the golden set?

Accuracy alone misleads when classes are imbalanced. If 70 percent of your tickets are billing, a classifier that always says billing scores 70 percent accuracy while doing nothing useful, and a judge that always predicts the majority class can score high while agreeing with humans no better than chance the Cohen's kappa guide for LLM judges. Cohen's kappa corrects for that by subtracting expected chance agreement, computed as (Po minus Pe) divided by (1 minus Pe), where Po is observed agreement and Pe is agreement expected from the two label distributions the Galileo explainer. Kappa runs from minus 1 to 1, with 1 as complete agreement and 0 as no agreement beyond chance the OneUptime calibration walkthrough.

For a routing gate, treat kappa as a precondition, not a target. If agreement between your classifier and the golden labels sits below roughly 0.6, no threshold will save you, because the errors are not concentrated in low-confidence outputs. The standard interpretation bands put 0.61 to 0.79 at substantial and 0.80 and above at almost perfect, with the 0.80 line originating in medical and social science research and widely adopted by the NLP evaluation community the Cohen's kappa guide for LLM judges. Use 0.80 as the bar for fully autonomous routing on an intent, and require human review on anything below.

A caution on small samples. With fewer than 10 annotations per category, the 95 percent confidence interval on kappa is wider than plus or minus 0.30, which makes the number statistically meaningless the Cohen's kappa guide for LLM judges. Fifty tickets per intent is a floor, not a luxury.

The decision rule for picking each floor

Here is the rule, stated precisely enough to implement.

For each intent, sort the golden-set tickets predicted as that intent by descending confidence. Walk down the list and compute cumulative precision at each score. The floor is the lowest confidence score at which cumulative precision at or above that score still meets or exceeds your target (95 percent in the worked example below), subject to a minimum volume so you are not setting a floor based on three tickets.

Three guards keep the rule honest:

GuardWhat it preventsHow to apply
Minimum support at the floorA floor derived from a handful of lucky high-score ticketsRequire at least 20 golden-set tickets at or above the candidate floor for that intent
Kappa check on routed trafficRouting a class where the model's errors are not confidence-correlatedRequire kappa of 0.80 or higher between classifier and golden labels on the tickets the floor would auto-route
Cross-intent leakage checkBilling floors silently accepting tickets that are really cancellationsCheck the confusion matrix at the floor; if a mislabeled intent appears above the floor, raise it

Notice what the rule does not do. It does not aim for uniform precision across intents in a way that pushes a floor to 0.99 and turns three-quarters of a healthy queue into human work. Target precision is a business input. Pick it per intent from the cost of a wrong routing, which in support is asymmetric: the HDI and MetricNet benchmarks cited in industry writeups put a Tier 1 resolution near 22 dollars against 104 dollars or more once a ticket reaches Tier 3, and escalated requests are reported at three times the cost of first-level resolution the IrisAgent escalation guide and the Maven AGI cost-per-ticket roundup. That asymmetry argues for a high floor on intents whose misroutes tend to escalate, and a lower one on intents whose mistakes are cheap and correctable.

Store the floor with every output

A threshold that lives only in a config file is unauditable. Six months later nobody can explain why ticket 4471 was auto-routed while its near-twin went to a human. Store the decision inputs and the decision in one record per output. A shape that works:

{
  "ticket_id": "t-4471",
  "intent": "billing",
  "confidence": 0.83,
  "floor": 0.86,
  "gate": "route_to_human",
  "model": "classifier-prod",
  "floor_version": "floors-2026-03-billing-v2",
  "golden_set_version": "golden-v3",
  "kappa_at_floor": 0.81,
  "decided_at": "2026-04-02T09:14:22Z"
}

Three fields carry the weight. floor lets you recompute the decision without re-running the model. floor_version and golden_set_version let you reproduce which evidence justified the number. kappa_at_floor records the agreement measured when the floor was set, which is the earliest signal that the floor has gone stale.

Stale floors are a real risk, and not only because models change. Golden datasets capture a snapshot while production distributions keep moving, which is why calibration has to be continuous rather than one-time the Galileo calibration guide. Provider-side model updates can shift scoring distributions silently, and re-judging with an updated model version has been observed to produce uniformly more lenient scores the Galileo calibration guide. Label your outputs with the floor and dataset version from day one; retrofitting that provenance is miserable.

The same discipline applies to how you measure drift in the underlying data. Choosing monitoring thresholds well requires looking at how your data has actually changed over past periods, not guessing at sensitivity the Evidently historical drift tutorial. Dataset stability can be benchmarked against drift rather than assumed the dataset stability benchmark.

Worked example: forecasting the human queue

Now the part teams skip. Suppose your support desk handles 2,000 tickets a day. You have measured the golden set and arrived at these floors:

IntentShare of sampleTarget precisionFloorShare of intent below floor
Billing55%95%0.8618%
Login30%95%0.7431%
Cancellation15%97%0.9224%

Apply the floors to a recent traffic sample and count what falls below. Weight each intent's share by its below-floor rate:

  • Billing: 2,000 times 0.55 times 0.18 equals 198 handoffs per day.
  • Login: 2,000 times 0.30 times 0.31 equals 186 handoffs per day.
  • Cancellation: 2,000 times 0.15 times 0.24 equals 72 handoffs per day.

Total: 456 handoffs per day, or 22.8 percent of traffic.

That number is the staffing question. If a reviewer handles 60 tickets per eight-hour shift, 456 handoffs need about 7.6 reviewer shifts per day, so plan 8, plus cover for absence. Two things about the arithmetic matter more than the answer.

First, the weighted average hides the intent story. A naive blend of the three floors would have suggested roughly 20 percent of traffic, but the actual mix puts login second by volume of handoffs despite being the smallest intent except cancellation, because its floor catches almost a third of its tickets. If login review is expensive, that is where to invest in better training data, not in raising the billing floor.

Second, run a single global floor of 0.80 through the same sample and compare:

Gate designHandoffs per dayShare of trafficNotes
Global floor 0.8037218.6%Fewer handoffs, but billing precision drops below target
Per-intent floors45622.8%Meets precision target on every intent
Per-intent, login floor relaxed to 0.6539219.6%Cheaper, but login precision falls short of 95%

The global gate is not cheaper in any meaningful sense. It moves 84 tickets a day from human review to automated routing, and the billing tickets among them are the ones with confidence between 0.80 and 0.86, which is precisely the band where billing precision falls below your target. You have traded a known number of misroutes for a smaller queue. Whether that trade is good depends on what a misroute costs, which is why the precision target has to come from the business before you compute anything.

A practical sequencing note: forecast on a sample that is genuinely recent and stratified, not on the top of your queue. Random sampling surfaces tail failures that unstratified sampling misses, and stratified sampling of high-confidence extractions is the only way to catch a novel error pattern at high confidence, because nobody looks at auto-routed items the human review calibration guide.

Verify before you switch the gate on

Treat the gate as a staged rollout with measurable exit criteria rather than a toggle.

  1. Replay, do not route. Run the floors against two weeks of historical tickets and compare the routing decision to what actually happened. Disagreements where the gate auto-routed something a human later re-routed are your false accepts.
  2. Shadow on live traffic. Let the gate compute and log decisions while humans still see everything. Compare daily handoff volume to the forecast; a gap above roughly 15 percent means your sample was unrepresentative or the live distribution shifted.
  3. Measure routed precision directly. Weekly, sample a stratified slice of auto-routed tickets (including high-confidence ones) and label them. If measured precision on an intent falls below target for two consecutive weeks, raise that floor.
  4. Watch kappa on the routed slice. A drop in agreement on auto-routed traffic is the signal that the model, the floor, or the golden set has gone stale, and the fix differs in each case the OneUptime calibration walkthrough.
  5. Then reduce human review, intent by intent, on the segments that have demonstrated sustained precision the human review calibration guide.

If you are building the classifier itself and want to swap models or compare a hosted model against your current one without rewriting the client, one API key across text, image, video, audio and embedding models is what Quanta Inference provides; it is OpenAI-compatible and prepaid, so the threshold work above stays the same regardless of which model sits behind the scores.

FAQ

FAQ

How many golden-set examples do I need per intent?

At least 50 labeled tickets per intent as a starting floor, and 100 or more for intents where a misroute is expensive. For kappa to be usable, you need 20 to 30 annotations per category, since fewer than 10 makes the 95 percent confidence interval wider than plus or minus 0.30 the Cohen's kappa guide for LLM judges. Compose the set deliberately hard rather than representative, because golden-set metrics will read lower than production by design the Musubi guide.

What do I do when no threshold meets my precision target for an intent?

That result means the errors are not confidence-correlated, so raising the floor cannot fix it. Check kappa first: below 0.6, the classifier is not distinguishing classes well enough for any gate, and you should collect more labeled failures and revisit the rubric or the model the Cohen's kappa guide for LLM judges. Inspect the confusion matrix at the floor for cross-intent leakage, then either route the whole intent to humans or improve the training data.

Should the floor be the same for every intent?

No. Precision targets should follow the cost of a wrong routing, which varies by intent. A support ticket that escalates costs materially more than one resolved at first contact, with published benchmarks putting higher-tier handling at roughly three times the cost the Maven AGI cost-per-ticket roundup. The floor is the mechanism that turns that cost difference into a routing policy.

How often should I re-derive the floors?

Re-derive on any change to the model, the prompt, or the golden set, and re-verify weekly on a stratified sample of routed traffic between changes. Production distributions keep moving while a golden set stays fixed, and silent provider model updates can shift scoring distributions without warning the Galileo calibration guide. Track kappa on the routed slice as the trigger for a full recalibration versus a floor tweak the OneUptime calibration walkthrough.

Does a higher threshold always mean less human work?

No. A higher floor reduces handoffs only if the model's scores are spread across the range for that intent. If a third of login tickets cluster at 0.60, raising the login floor from 0.65 to 0.80 barely moves volume but drops precision. Forecast the queue by counting the actual share of a recent sample below the candidate floor, as in the worked example, rather than assuming monotonic savings the LlamaIndex glossary.

Sources

Sources

  1. Understanding Confidence Threshold in AI Systems
  2. 5.5, Human Review & Confidence Calibration | AI Cert Guides
  3. Golden dataset evaluation: build and maintain LLM test sets
  4. How to Build Golden Datasets for Content Moderation - Musubi
  5. How to Build a Golden Dataset for LLM Evaluation
  6. Building a “Golden Dataset” for AI Evaluation: A Step-by- ...
  7. cohens-kappa-for-llm-judges.md - sample-GEDD
  8. Enhancing AI Evaluation with Cohen's Kappa Metric
  9. How to Calibrate an LLM-as-a-Judge Against Human ...
  10. Ticket Escalation: How to Reduce Escalations by 40%+
  11. 15 Cost-Per-Ticket Statistics for Customer Support
  12. How to Calibrate Your LLM Judge With Human Annotations
  13. How to detect, evaluate and visualize historical drifts in the ...
  14. Drift-Based Dataset Stability Benchmark
About the author

About the author

Antonio Evans
Antonio Evans

Antonio Evans is the founder of Quanta Intelligence and a fractional CTO who builds HIPAA-ready AI systems for health and life-science companies. Before that he was technical co-founder of FriendsEAT for twenty years, CEO of Socialdraft, and a data engineer at IBM. Antonio lives with his dog Santino in Lisbon, Portugal.

All articles