Intent classification means deciding what a user wants from a short, noisy string, whether that is a search query or a chat message the AmICited glossary. Most teams start with four buckets (informational, navigational, commercial, transactional) and sometimes add local or generative-task intent the SE Ranking guide. That vocabulary is a fine starting point. A wiki page is not a test.
Two things break when you skip a fixed evaluation set. You cannot tell whether a prompt edit helped or hurt, because you are judging from examples you remember. And the examples you remember are the easy ones, so the classifier looks better than it is. A golden set fixes both: a frozen, labeled slice of real traffic that every candidate is scored against the same way, every time.
The failure mode is visible in public data. On a benchmark assembled from 49 corpora across 12 domains, 20 large language models scored below 60% on the full test set and below 25% on a harder, balanced set, with 17 of 20 falling under the random-guess baseline on that hard set, while estimated human performance sat near 81% the IntentGrasp benchmark. Your traffic is narrower than that, but the lesson holds: general model quality is not evidence of quality on your intents. Only your labeled rows are.
So sample what people typed, not what you would phrase. Invented queries are grammatical and predictable, and a classifier that scores well on them still falls apart on abbreviations, typos and half-finished sentences.
A procedure that works:
- Export a window of raw queries with a timestamp and session identifier, and deduplicate exact repeats so one bot or one power user cannot dominate.
- Stratify by traffic share. If 42% of queries are order status, roughly 42% of the golden set is order status. A set that is 25% per intent is balanced, not representative, and it flatters the model on rare intents while hiding regressions on common ones.
- Oversample the tails on purpose. Keep a small slice for rare intents and for queries with no plausible intent at all (test strings, empty submissions, gibberish), because that is where classifiers misfire silently. One query can carry several goals, and identical strings can mean different things depending on context, so ambiguity belongs in the set deliberately the AmICited glossary.
- Draw a random holdout of about 10% to 20% and do not look at it while labeling or tuning.
Size guidance that holds up: about 50 to 100 examples per intent for a five to ten intent classifier, landing near 500 to 1,000 rows, then grow the set each release. Past a few thousand examples the measurement stops improving and you are better off fixing labeling rules. For file shape, the public evaluation scripts for NLU platforms ship an annotated query set built for exactly this purpose, useful as a template even if you never run the code the NLU Evaluation Scripts repository.
Keep a running list of edge cases rather than hoping sampling finds them: typos and transliteration, all caps, emoji-only messages, pasted walls of text, single characters. A query such as "apple" could mean the fruit, the company, the record label or an idiom, and it is a fine permanent resident of your set the AmICited glossary. Add boundary pairs where adjacent intents confuse easily (order status versus cancellation, pricing question versus pricing page). Add multi-intent strings and decide the output contract first, either a primary label or primary plus secondary. Finally, once you have a baseline, pull real queries whose confidence sits near your cutoff; the confidence threshold glossary makes the right point that the cutoff is a business decision and that the default of 0.5 is rarely correct, because the cost of a false positive varies enormously by use the confidence threshold glossary.



