{"id":6866,"date":"2026-08-08T17:13:03","date_gmt":"2026-08-08T17:13:03","guid":{"rendered":"https:\/\/dialnexa.com\/blogs\/?p=6866"},"modified":"2026-08-08T17:14:04","modified_gmt":"2026-08-08T17:14:04","slug":"the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat","status":"publish","type":"post","link":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/","title":{"rendered":"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb-1024x576.png\" alt=\"\" class=\"wp-image-6870\" srcset=\"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb-1024x576.png 1024w, https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb-300x169.png 300w, https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb-768x432.png 768w, https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb-1536x864.png 1536w, https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb.png 1672w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h5 class=\"wp-block-heading\"><em>Three matchers in, we learned the real lessons the hard way: cosine similarity that couldn&#8217;t tell &#8220;yeah&#8221; from &#8220;nah&#8221;, a base model that ranked beautifully but couldn&#8217;t decide, a quantization step that resurrected our worst bugs \u2014 and why the data pipeline, not the model, turned out to be the asset.<\/em><\/h5>\n\n\n\n<h2 class=\"wp-block-heading\">The bug that made this a story<\/h2>\n\n\n\n<p>Our voice agents make outbound phone calls. Latency is the whole game: if the agent takes two seconds to respond, humans talk over it, repeat themselves, or hang up. One of our best latency tricks is a\u00a0<strong>predictive cache<\/strong>: while the agent is speaking, a background LLM predicts the user&#8217;s most likely next utterances (&#8220;Yes&#8221;, &#8220;Who is this?&#8221;, &#8220;I&#8217;m busy right now&#8221;) and pre-generates full responses for each. When the user actually speaks, if their utterance matches a prediction, we serve the cached response in ~80 ms instead of paying ~1.5 s for LLM + TTS.<\/p>\n\n\n\n<p>The catch is the word\u00a0<em>matches<\/em>. Serving a cached response to the wrong utterance isn&#8217;t a latency win \u2014 it&#8217;s the agent confidently answering a question nobody asked.<\/p>\n\n\n\n<p>One day a user said&nbsp;<strong>&#8220;Sure.&#8221;<\/strong>&nbsp;and our agent responded as if they&#8217;d said&nbsp;<strong>&#8220;\u0928\u0939\u0940\u0902, \u0905\u092d\u0940 busy \u0939\u0942\u0901&#8221;<\/strong>&nbsp;<em>(&#8220;no, I&#8217;m busy right now&#8221;)<\/em>&nbsp;\u2014 because our match gate scored that pair at 0.999. A user said&nbsp;<strong>&#8220;\u0939\u093e\u0902 \u091c\u0940 \u092c\u094b\u0932\u093f\u090f&#8221;<\/strong>&nbsp;<em>(&#8220;yes, go ahead&#8221;)<\/em>&nbsp;and got the response for&nbsp;<strong>&#8220;\u0928\u0939\u0940\u0902, \u0905\u092d\u0940 \u0938\u092e\u092f \u0928\u0939\u0940\u0902 \u0939\u0948&#8221;<\/strong>&nbsp;<em>(&#8220;no, I don&#8217;t have time&#8221;)<\/em>. Same polarity flip, same absurd confidence.<\/p>\n\n\n\n<p>That incident is the middle of the story, not the start. The gate that failed there was already our second matching system \u2014 and understanding why it failed the way it did requires the whole journey:&nbsp;<strong>cosine similarity \u2192 a fine-tuned English cross-encoder (v3) \u2192 a multilingual one (v4.1)<\/strong>. Each stage earned the next.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act I \u2014 Cosine similarity, and where it tops out<\/h2>\n\n\n\n<p>The first version of the matcher was the obvious one: embed the incoming utterance, embed the predicted utterances, serve the best candidate if cosine similarity clears a threshold. One small sentence-embedding model, a few milliseconds, no training required.<\/p>\n\n\n\n<p>It worked \u2014 for a narrow definition of &#8220;worked.&#8221; Two problems surfaced almost immediately, and they&#8217;re both fundamental to how phone conversations look as text:<\/p>\n\n\n\n<p><strong>Phone replies are short, and short replies all embed alike.<\/strong>&nbsp;The most common user turns are things like &#8220;Yes.&#8221;, &#8220;Yeah.&#8221;, &#8220;Nah.&#8221;, &#8220;Who is this?&#8221;, &#8220;Not now.&#8221; Sentence embeddings place these in a tight little cluster:&nbsp;<strong>&#8220;Yeah&#8221; vs &#8220;Nah&#8221; \u2014 opposite meanings \u2014 score ~0.7. &#8220;Yeah&#8221; vs &#8220;Yes, go ahead&#8221; \u2014 same meaning \u2014 also ~0.7.<\/strong>&nbsp;The true-match and false-match score distributions overlap almost completely on short text. There is no threshold that separates them, because the information that distinguishes them (one negation token) is a rounding error in a pooled embedding.<\/p>\n\n\n\n<p><strong>So the threshold gets cranked, and recall starves.<\/strong>&nbsp;The only safe operating point was ~0.9 with top-1 matching \u2014 which in practice means near-exact wording. &#8220;Not now&#8221; wouldn&#8217;t match &#8220;I&#8217;m busy right now.&#8221; &#8220;Go on&#8221; wouldn&#8217;t match &#8220;Please continue.&#8221; The cache hit on the turns where the LLM predicted the user&#8217;s&nbsp;<em>exact words<\/em>&nbsp;and missed the far larger set where it predicted their&nbsp;<em>meaning<\/em>. We were leaving most of the latency win on the table to stay safe \u2014 and still occasionally serving a wrong short-reply match that snuck over 0.9.<\/p>\n\n\n\n<p>The conclusion wasn&#8217;t &#8220;embeddings are bad.&#8221; It was a division of labor that survived every later version:&nbsp;<strong>embeddings are a fine shortlist; they cannot be the judge.<\/strong>&nbsp;Retrieval and judgment are different jobs. We kept cosine to fetch candidates and went looking for a judge.<\/p>\n\n\n\n<p>(Why not an LLM judge? 300\u2013800 ms even on a fast hosted model \u2014 you&#8217;d spend the latency budget deciding whether you&#8217;re allowed to save it. The judge had to run in tens of milliseconds on CPU, next to the audio pipeline.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act II \u2014 v3: a small English cross-encoder earns the job<\/h2>\n\n\n\n<p>The right architecture for &#8220;are these two utterances interchangeable?&#8221; is a&nbsp;<strong>cross-encoder<\/strong>: feed the pair&nbsp;<code>(actual_utterance, predicted_utterance)<\/code>&nbsp;through one small transformer that attends&nbsp;<em>across<\/em>&nbsp;both texts, output a single probability. Unlike bi-encoder embeddings, the model sees both sentences at once \u2014 a negation token in one can attend to its counterpart in the other. With int8 quantization, a 6-layer model scores a 20-candidate shortlist in a few dozen milliseconds on two CPU threads.<\/p>\n\n\n\n<p>We started from&nbsp;<code>cross-encoder\/stsb-distilroberta-base<\/code>&nbsp;\u2014 a model already fine-tuned for sentence-similarity judgment \u2014 and taught it our domain in two data passes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>~2,900 real pairs mined from production logs<\/strong>: actual (utterance \u2192 prediction) decisions, labeled. Real pairs anchor the distribution.<\/li>\n\n\n\n<li><strong>~1,700 synthetic pairs in equivalence clusters<\/strong>: paraphrase sets for the intents that matter on calls (agreement, refusal, deferral, identity questions, repeat requests\u2026), plus a hand-picked set of\u00a0<strong>danger negatives<\/strong>\u00a0\u2014 the &#8220;yeah&#8221;\u2194&#8221;nah&#8221; class that cosine could never see.<\/li>\n<\/ul>\n\n\n\n<p>Two deployment choices from this era proved more valuable than the model itself:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Shadow mode first.<\/strong>\u00a0The matcher scored every lookup while cosine still made the serving decision, logging what it\u00a0<em>would<\/em>\u00a0have done. A week of shadow traffic calibrated the threshold on reality instead of the test set, for free.<\/li>\n\n\n\n<li><strong>Fail-open, always.<\/strong>\u00a0If the model artifact is missing or scoring fails, the cache degrades to conservative cosine behavior rather than blocking calls. (This choice ages interestingly \u2014 see the ops lesson at the end.)<\/li>\n<\/ol>\n\n\n\n<p>The error asymmetry defined the operating point, and it&#8217;s worth stating because it shaped every version since: a&nbsp;<strong>false positive speaks a wrong response to a live human<\/strong>&nbsp;\u2014 user-visible harm. A&nbsp;<strong>false negative just falls back to the LLM<\/strong>&nbsp;\u2014 the latency win is lost, nothing bad is said. So we run at extreme thresholds (0.998 in probability space for v3) and optimize recall&nbsp;<em>under<\/em>&nbsp;an FPR ceiling, never accuracy.<\/p>\n\n\n\n<p>v3&#8217;s results, against the cosine baseline it replaced:&nbsp;<strong>recall 0.42 at 1.7% FPR<\/strong>&nbsp;on held-out real pairs \u2014 versus cosine&#8217;s effectively-exact-match recall at any safe threshold. Every known hole flipped: &#8220;go on&#8221; \u2192 &#8220;Please continue&#8221; went from 0.001 to 0.9996; &#8220;who&#8217;s calling&#8221; matched &#8220;Who is this?&#8221;; &#8220;not now&#8221; matched &#8220;I&#8217;m busy&#8221;; and all 745 held-out negatives stayed below threshold. In production, the hit rate on candidate-bearing turns roughly tripled against safe-cosine, at a serve precision around 86%.<\/p>\n\n\n\n<p>Life was good. In English.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act III \u2014 The multilingual reckoning<\/h2>\n\n\n\n<p>Then our traffic did what traffic does: it stopped being English. Hindi and Hinglish campaigns ramped, and the v3 matcher \u2014 never told anything about Hindi \u2014 didn&#8217;t fail humbly. It failed at&nbsp;<strong>0.999 confidence<\/strong>, in the worst possible class: polarity flips. &#8220;\u0939\u093e\u0902 \u091c\u0940 \u092c\u094b\u0932\u093f\u090f&#8221; (<em>yes, go ahead<\/em>) served the cached response for &#8220;\u0928\u0939\u0940\u0902, \u0905\u092d\u0940 \u0938\u092e\u092f \u0928\u0939\u0940\u0902 \u0939\u0948&#8221; (<em>no time right now<\/em>). A user saying &#8220;3 \u0932\u094b\u0917 \u0939\u0948\u0902 \u0939\u092e&#8221; (<em>we&#8217;re three people<\/em>) matched &#8220;\u092e\u0948\u0902 \u0905\u0915\u0947\u0932\u093e \u0939\u0942\u0901&#8221; (<em>I&#8217;m alone<\/em>).<\/p>\n\n\n\n<p>The root cause took twenty minutes to find and one sentence to state:&nbsp;<strong>the training data contained zero Devanagari rows.<\/strong>&nbsp;The model wasn&#8217;t bad at Hindi; it had never been asked to learn it, and cross-lingual pairs landed in a region of its space where the decision boundary was noise. A model&#8217;s confidence is only meaningful inside its training distribution \u2014 outside it, the sigmoid still happily prints 0.999.<\/p>\n\n\n\n<p>We shipped a stopgap the same week \u2014 a&nbsp;<strong>cross-script serving guard<\/strong>&nbsp;(never serve a prediction whose Unicode script profile doesn&#8217;t match the utterance&#8217;s) \u2014 which blocked the visible cross-script disasters but couldn&#8217;t touch same-script errors. The real fix was a multilingual retrain.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act IV \u2014 The base-model bake-off, or: pre-trained \u2260 pre-aligned<\/h2>\n\n\n\n<p>For the multilingual base we short-listed two open-source candidates and fine-tuned both on identical data (~4.6k pairs at that point), evaluated on a held-out set split by call so no conversation leaks across splits:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MuRIL<\/strong>\u00a0(Google) \u2014 BERT pre-trained on 17 Indian languages. The &#8220;obvious&#8221; choice.<\/li>\n\n\n\n<li><strong>mmarco-mMiniLMv2-L12-H384-v1<\/strong>\u00a0\u2014 a multilingual MiniLM\u00a0<em>already fine-tuned as a relevance cross-encoder<\/em>\u00a0on mMARCO (machine-translated MS MARCO, 14 languages).<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>base<\/th><th>test AUC<\/th><th>recall @ FPR \u2264 2%<\/th><\/tr><\/thead><tbody><tr><td>MuRIL (raw masked-LM)<\/td><td>0.90<\/td><td><strong>0.00<\/strong><\/td><\/tr><tr><td>mMiniLMv2 (mMARCO cross-encoder)<\/td><td>0.94<\/td><td>0.43<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>MuRIL&#8217;s row is the one worth staring at. AUC 0.90 means it&nbsp;<em>ranks<\/em>&nbsp;pairs decently \u2014 but at any threshold tight enough for our FPR ceiling, it recalled&nbsp;<strong>nothing<\/strong>. A raw masked-LM head must learn the entire concept of &#8220;these two utterances are interchangeable&#8221; from your fine-tuning data, and a few thousand pairs cannot carve a boundary sharp enough to operate at sub-1% FPR. The mMARCO model had already spent its pre-training learning a calibrated relevance boundary \u2014 our fine-tune only had to&nbsp;<em>move<\/em>&nbsp;it, not&nbsp;<em>create<\/em>&nbsp;it. It even fixed all five of the real production Hindi FPs&nbsp;<em>with zero Hindi fine-tuning rows<\/em>, purely from multilingual relevance pre-training.<\/p>\n\n\n\n<p><strong>Lesson: for small-data fine-tunes, the head you inherit matters more than the languages you inherit.<\/strong>&nbsp;It&#8217;s the same lesson that made v3 work (stsb-distilroberta was already a similarity judge) \u2014 we just had to relearn it against a tempting domain-match.<\/p>\n\n\n\n<p>The bonus surprise: the mMiniLM has ~118M parameters against distilroberta&#8217;s 66M, yet runs&nbsp;<strong>2.8\u00d7 faster<\/strong>&nbsp;(59 ms vs 165 ms for a 20-candidate batch on two pinned CPU threads). Nearly all its parameters sit in a 250k-token embedding table \u2014 a lookup, not compute. Its transformer stack is 12 layers \u00d7 384 wide vs 6 \u00d7 768, and attention\/FFN cost scales roughly quadratically with width.&nbsp;<strong>Parameter count is a storage metric, not a speed metric.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act V \u2014 v4 \u2192 v4.1: the data does the work<\/h2>\n\n\n\n<p>Architecture settled, the rest was data. The final v4.1 training set (~6,900 pairs) is three deliberate layers:<\/p>\n\n\n\n<p><strong>Layer 1: mined production pairs \u2014 including our own false positives.<\/strong>&nbsp;We reconstructed real (utterance \u2192 prediction) decisions from logs: served hits, near-miss rejections, and the full inventory of real Hindi FPs from the incident. Mined pairs flow into validation and test; synthetic rows go to train only.&nbsp;<strong>You measure on reality, always.<\/strong><\/p>\n\n\n\n<p><strong>Layer 2: intent clusters with severity-weighted negative relations.<\/strong>&nbsp;Sixteen clusters of Hindi\/Hinglish utterance surfaces (affirm, decline, busy-defer, repeat-request, can&#8217;t-hear, identity-question, hedge\u2026), each mixing Devanagari and romanized spellings \u2014 transliteration equivalence comes free when &#8220;\u0939\u093e\u0901 \u091c\u0940&#8221; and &#8220;haan ji&#8221; share a cluster. Negatives pair&nbsp;<em>across<\/em>&nbsp;clusters, and&nbsp;<strong>each negative relation is weighted by how badly its confusion hurt us in production<\/strong>: affirm\u2194decline gets 60 pairs (the polarity flip), agreement\u2194deferral 35 (a real incident), identity-question\u2194affirm 30. Eight relation pairs are deliberately&nbsp;<em>excluded<\/em>&nbsp;\u2014 greeting\u2194affirm, defer\u2194callback-time \u2014 because their equivalence is context-dependent, and teaching them as negatives would be teaching lies.<\/p>\n\n\n\n<p><strong>Layer 3: concept grids \u2014 the v4.1 breakthrough.<\/strong>&nbsp;v4 trained on layers 1\u20132 still failed 23 of a 100-pair adversarial suite, and the failures had a pattern: the model had memorized our&nbsp;<em>surfaces<\/em>, not the&nbsp;<em>concepts<\/em>. It knew &#8220;\u0939\u093e\u0901&#8221;\u2260&#8221;\u0928\u0939\u0940\u0902&#8221; but matched &#8220;\u091a\u0932\u0947\u0917\u093e&#8221; to &#8220;\u0928\u0939\u0940\u0902 \u091a\u0932\u0947\u0917\u093e&#8221;. It knew one time-slot trap but matched &#8220;at 6 AM&#8221; to &#8220;at 6 PM&#8221;.<\/p>\n\n\n\n<p>So we stopped writing examples and started writing&nbsp;<em>generators<\/em>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Negation frames<\/strong>\u00a0\u2014 27 frames \u00d7 (affirmative, negated, paraphrase) \u00d7 three surface languages:\u00a0<code>(\"I can make it\", \"I can't make it\", \"I'll be there\")<\/code>,\u00a0<code>(\"\u091a\u0932\u0947\u0917\u093e\", \"\u0928\u0939\u0940\u0902 \u091a\u0932\u0947\u0917\u093e\", \"\u091a\u0932 \u091c\u093e\u090f\u0917\u093e\")<\/code>.<\/li>\n\n\n\n<li><strong>Value slots<\/strong>\u00a0\u2014 same frame, different values \u21d2 miss; alias values (&#8220;at 6 PM&#8221; ~ &#8220;\u0936\u093e\u092e 6 \u092c\u091c\u0947&#8221;) \u21d2 hit. Times, dates, amounts, tools, cities.<\/li>\n\n\n\n<li><strong>Token swaps<\/strong>\u00a0\u2014 &#8220;senior developer&#8221; \u2260 &#8220;junior developer&#8221;, &#8220;marketing head&#8221; \u2260 &#8220;marketing intern&#8221;.<\/li>\n\n\n\n<li><strong>Question\u2194answer<\/strong>\u00a0\u2014 &#8220;can I call you back?&#8221; \u2260 &#8220;please call me back&#8221;. A question is not its answer.<\/li>\n<\/ul>\n\n\n\n<p>410 generated rows. The adversarial suite went&nbsp;<strong>23 FPs \u2192 3 \u2192 0<\/strong>&nbsp;(the last step is the quantization fix below). Same architecture, same recipe.<\/p>\n\n\n\n<p><strong>Lesson: when a model fails a category, don&#8217;t add examples \u2014 add the axis.<\/strong>&nbsp;A grid that varies exactly one concept across many surfaces teaches the concept; a pile of one-off examples teaches the pile.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Act VI \u2014 Quantization tried to quietly undo our training<\/h2>\n\n\n\n<p>We ship int8 (dynamic quantization, ONNX Runtime, CPU). The first int8 export passed the aggregate metrics \u2014 AUC barely moved \u2014 and failed the adversarial gate:&nbsp;<strong>three negatives we had explicitly trained to reject came back above threshold<\/strong>, pairs like &#8220;\u0930\u093e\u0924 \u0915\u094b 8 \u092c\u091c\u0947&#8221; ~ &#8220;\u0938\u0941\u092c\u0939 8 \u092c\u091c\u0947&#8221; (8 PM vs 8 AM).<\/p>\n\n\n\n<p>The mechanism generalizes. Fine-tuning against hard negatives places them&nbsp;<em>just<\/em>&nbsp;on the safe side of the boundary \u2014 that&#8217;s what &#8220;hard negative&#8221; means. Per-tensor quantization applies one scale to a whole weight matrix; outlier channels compress everyone else&#8217;s resolution, adding just enough logit noise to push borderline negatives back across.&nbsp;<strong>Your hardest-won training signal lives exactly where quantization noise does the most damage.<\/strong>&nbsp;Per-channel quantization (a scale per output channel) fixed all three at ~6% size cost.<\/p>\n\n\n\n<p>Two rules came out of this:&nbsp;<strong>quantize per-channel, and re-run the adversarial gate on every exported artifact \u2014 not the checkpoint, the artifact.<\/strong>&nbsp;The bytes you validate must be the bytes you deploy; the threshold is recalibrated per artifact too, because every export shifts the score distribution.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The model can&#8217;t do it alone<\/h2>\n\n\n\n<p>Three non-model layers do real work in production:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>The cross-script guard stayed<\/strong>\u00a0\u2014 demoted from stopgap to belt-and-suspenders. Even a semantically perfect cross-language match can be the wrong\u00a0<em>serve<\/em>: the cached response was generated for a Hindi turn and would answer an English speaker in Hindi.<\/li>\n\n\n\n<li><strong>A language allowlist.<\/strong>\u00a0Weeks after v4.1 shipped, Urdu traffic appeared \u2014 zero training data, and same-script on both sides, so the guard was blind. It produced confident FPs (&#8220;\u06a9\u06cc\u0627\u061f&#8221; \u2192\u00a0<em>&#8220;I don&#8217;t know&#8221;<\/em>\u00a0at 0.996). Now any utterance carrying a non-Latin script outside the trained set bypasses the cache in microseconds, before embedding or model. On its first full day this absorbed\u00a0<strong>31% of all checked turns<\/strong>\u00a0\u2014 a multilingual campaign had ramped overnight.<\/li>\n\n\n\n<li><strong>Thresholds as economics.<\/strong>\u00a0We launched v4.1 at 0.995 knowing the sweep (recall 0.65 @ 4.1% FPR, vs 0.59 @ 2.5% at 0.998) and reasoning about costs: an FP speaks a wrong sentence to a human; a miss costs ~1.4 s on one turn. The threshold is an env var; the decision reverses in one restart.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Results: the three-era scoreboard<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>cosine-only<\/th><th>v3 (English SLM)<\/th><th>v4.1 (multilingual SLM)<\/th><\/tr><\/thead><tbody><tr><td>judge on short replies (&#8220;yeah&#8221;\/&#8221;nah&#8221;)<\/td><td>inseparable (~0.7 both)<\/td><td>separated<\/td><td>separated, 3 languages of surfaces<\/td><\/tr><tr><td>recall at safe FPR<\/td><td>near-exact matches only<\/td><td>0.42 @ 1.7% (EN)<\/td><td>0.65 @ 4.1% (EN+HI+Hinglish)<\/td><\/tr><tr><td>the polarity-flip class<\/td><td>present<\/td><td>suppressed in EN,&nbsp;<strong>0.999-confident in HI<\/strong><\/td><td><strong>zero observed in prod<\/strong><\/td><\/tr><tr><td>hard FPs (share of serves, prod)<\/td><td>\u2014<\/td><td>~10%<\/td><td>~4.5%, trending ~3%<\/td><\/tr><tr><td>20-candidate batch (2 CPU threads)<\/td><td>~1 ms (but can&#8217;t judge)<\/td><td>165 ms<\/td><td><strong>26 ms p50 \/ 59 ms p95<\/strong><\/td><\/tr><tr><td>conversion on candidate-bearing turns<\/td><td>\u2014<\/td><td>~33%<\/td><td>43\u201345%<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>The first Tamil serve through v4.1 was correct (&#8220;\u0bae\u0bcd&#8230; \u0b95\u0bc7\u0bb3\u0bc1\u0b99\u0bcd\u0b95.&#8221; \u2192 &#8220;\u0b86\u0bae\u0bcd, \u0baa\u0bc7\u0b9a\u0bb2\u0bbe\u0bae\u0bcd&#8221;) with zero Tamil training rows \u2014 multilingual relevance pre-training carrying recall to languages we never taught, while the concept grids kept the danger classes suppressed. Not every language gets that for free (see: Urdu), which is why the allowlist exists.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The lesson we didn&#8217;t want: how good models silently vanish<\/h2>\n\n\n\n<p>Remember the fail-open design from Act II? It bit us twice. Both times, the model artifact&#8217;s download credentials had expired; a host rebuild later, the fleet was quietly serving on cosine-only fallback \u2014 the Act I system \u2014 and the only symptom was one WARNING line at boot. Days of &#8220;the matcher seems off&#8221; reports later, the cause was a credential timestamp.<\/p>\n\n\n\n<p><strong>Every fail-open path needs a fail-loud alert.<\/strong>&nbsp;If your system degrades gracefully by design, an alert on the degradation is part of the feature. It costs one log-matching rule, and it converts &#8220;discovered by a confused test call&#8221; into &#8220;paged at deploy time.&#8221;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What&#8217;s next<\/h2>\n\n\n\n<p>The production FP audit is itself the next training set: every judged serve becomes a labeled row, every FP class becomes a grid. The v4.2 backlog, each item traceable to a specific production example: numeral\u2194word aliases (&#8220;10th standard&#8221; ~ &#8220;tenth grade&#8221; \u2014 currently over-suppressed), compound day+time slots (&#8220;today at 2&#8221; vs &#8220;tomorrow at 2&#8221; \u2014 one slipped through at 1.0000), fragment suppression (&#8220;Actually,&#8221; must never match a content answer), voicemail-greeting rejection, and an English hedge\u2194commit relation to mirror the Hindi one.<\/p>\n\n\n\n<p>Which is the meta-lesson of the three versions:&nbsp;<strong>the model is a snapshot; the data pipeline is the asset.<\/strong>&nbsp;Mine production, judge it, turn judgments into grids, retrain, re-gate, ship, repeat. The second lap around that loop took a tenth the time of the first \u2014 and the third is mostly waiting for a GPU.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p><em>Current model: fine-tuned&nbsp;<code>cross-encoder\/mmarco-mMiniLMv2-L12-H384-v1<\/code>, int8 per-channel, ONNX Runtime CPU. Training: single T4, ~155 s per run on ~6.9k pairs. Serving: ~30 ms per 20-candidate batch on 2 CPU threads at a 0.995 threshold, behind a cosine shortlist, a cross-script guard, and a language allowlist.<\/em><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Three matchers in, we learned the real lessons the hard way: cosine similarity that couldn&#8217;t tell &#8220;yeah&#8221; from &#8220;nah&#8221;, a base model that ranked beautifully&#8230; <a class=\"read-more\" href=\"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/\">Continue reading <span class=\"screen-reader-text\">The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat<\/span><\/a><\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_canonical":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-6866","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat<\/title>\n<meta name=\"description\" content=\"Three matchers in, we learned the real lessons the hard way: cosine similarity that couldn&#039;t tell &quot;yeah&quot; from &quot;nah&quot;, a base model that ranked beautifully\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat\" \/>\n<meta property=\"og:description\" content=\"Three matchers in, we learned the real lessons the hard way: cosine similarity that couldn&#039;t tell &quot;yeah&quot; from &quot;nah&quot;, a base model that ranked beautifully\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/\" \/>\n<meta property=\"og:site_name\" content=\"DialNexa\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-08T17:13:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-08T17:14:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Swapnil Rajawat\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Swapnil Rajawat\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/\"},\"author\":{\"name\":\"Swapnil Rajawat\",\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#\\\/schema\\\/person\\\/efd0425858bfec05c7d9af5467f426dd\"},\"headline\":\"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat\",\"datePublished\":\"2026-08-08T17:13:03+00:00\",\"dateModified\":\"2026-08-08T17:14:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/\"},\"wordCount\":2665,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/dialnexa_neural_matcher_under_1mb-1024x576.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/\",\"url\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/\",\"name\":\"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/dialnexa_neural_matcher_under_1mb-1024x576.png\",\"datePublished\":\"2026-08-08T17:13:03+00:00\",\"dateModified\":\"2026-08-08T17:14:04+00:00\",\"description\":\"Three matchers in, we learned the real lessons the hard way: cosine similarity that couldn't tell \\\"yeah\\\" from \\\"nah\\\", a base model that ranked beautifully\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/#primaryimage\",\"url\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/dialnexa_neural_matcher_under_1mb.png\",\"contentUrl\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/dialnexa_neural_matcher_under_1mb.png\",\"width\":1672,\"height\":941},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#website\",\"url\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/\",\"name\":\"DialNexa Blog\",\"description\":\"Voice AI insights, customer communication playbooks, sales automation guides, and contact center operations advice from DialNexa.\",\"publisher\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#organization\",\"name\":\"DialNexa\",\"url\":\"https:\\\/\\\/dialnexa.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/cropped-cropped-favicon-300x300-1.png\",\"caption\":\"DialNexa\"},\"image\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#\\\/schema\\\/person\\\/efd0425858bfec05c7d9af5467f426dd\",\"name\":\"Aditya Kamat\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2bac6093f2c106601f2620c4742408b2309ce68a14e346271eeff423712019cb?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2bac6093f2c106601f2620c4742408b2309ce68a14e346271eeff423712019cb?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2bac6093f2c106601f2620c4742408b2309ce68a14e346271eeff423712019cb?s=96&d=mm&r=g\",\"caption\":\"Swapnil Rajawat\"},\"jobTitle\":\"Co-Founder\",\"description\":\"Co-Founder of DialNexa. Expert in voice AI, conversational technology, and enterprise telephony. Building the future of AI-powered customer engagement.\",\"url\":\"https:\\\/\\\/dialnexa.com\",\"worksFor\":{\"@id\":\"https:\\\/\\\/dialnexa.com\\\/blogs\\\/#organization\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat","description":"Three matchers in, we learned the real lessons the hard way: cosine similarity that couldn't tell \"yeah\" from \"nah\", a base model that ranked beautifully","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/","og_locale":"en_US","og_type":"article","og_title":"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat","og_description":"Three matchers in, we learned the real lessons the hard way: cosine similarity that couldn't tell \"yeah\" from \"nah\", a base model that ranked beautifully","og_url":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/","og_site_name":"DialNexa","article_published_time":"2026-08-08T17:13:03+00:00","article_modified_time":"2026-08-08T17:14:04+00:00","og_image":[{"width":1672,"height":941,"url":"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb.png","type":"image\/png"}],"author":"Swapnil Rajawat","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Swapnil Rajawat","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/#article","isPartOf":{"@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/"},"author":{"name":"Swapnil Rajawat","@id":"https:\/\/dialnexa.com\/blogs\/#\/schema\/person\/efd0425858bfec05c7d9af5467f426dd"},"headline":"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat","datePublished":"2026-08-08T17:13:03+00:00","dateModified":"2026-08-08T17:14:04+00:00","mainEntityOfPage":{"@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/"},"wordCount":2665,"commentCount":0,"publisher":{"@id":"https:\/\/dialnexa.com\/blogs\/#organization"},"image":{"@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/#primaryimage"},"thumbnailUrl":"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb-1024x576.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/","url":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/","name":"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat","isPartOf":{"@id":"https:\/\/dialnexa.com\/blogs\/#website"},"primaryImageOfPage":{"@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/#primaryimage"},"image":{"@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/#primaryimage"},"thumbnailUrl":"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb-1024x576.png","datePublished":"2026-08-08T17:13:03+00:00","dateModified":"2026-08-08T17:14:04+00:00","description":"Three matchers in, we learned the real lessons the hard way: cosine similarity that couldn't tell \"yeah\" from \"nah\", a base model that ranked beautifully","breadcrumb":{"@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/#primaryimage","url":"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb.png","contentUrl":"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2026\/08\/dialnexa_neural_matcher_under_1mb.png","width":1672,"height":941},{"@type":"BreadcrumbList","@id":"https:\/\/dialnexa.com\/blogs\/the-30-millisecond-judge-training-a-small-model-to-decide-when-our-voice-agent-is-allowed-to-cheat\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/dialnexa.com\/blogs\/"},{"@type":"ListItem","position":2,"name":"The 30-Millisecond Judge: Training a Small Model to Decide When Our Voice Agent Is Allowed to Cheat"}]},{"@type":"WebSite","@id":"https:\/\/dialnexa.com\/blogs\/#website","url":"https:\/\/dialnexa.com\/blogs\/","name":"DialNexa Blog","description":"Voice AI insights, customer communication playbooks, sales automation guides, and contact center operations advice from DialNexa.","publisher":{"@id":"https:\/\/dialnexa.com\/blogs\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dialnexa.com\/blogs\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/dialnexa.com\/blogs\/#organization","name":"DialNexa","url":"https:\/\/dialnexa.com","logo":{"@type":"ImageObject","url":"https:\/\/dialnexa.com\/blogs\/wp-content\/uploads\/2025\/10\/cropped-cropped-favicon-300x300-1.png","caption":"DialNexa"},"image":{"@id":"https:\/\/dialnexa.com\/blogs\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/dialnexa.com\/blogs\/#\/schema\/person\/efd0425858bfec05c7d9af5467f426dd","name":"Aditya Kamat","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/2bac6093f2c106601f2620c4742408b2309ce68a14e346271eeff423712019cb?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2bac6093f2c106601f2620c4742408b2309ce68a14e346271eeff423712019cb?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2bac6093f2c106601f2620c4742408b2309ce68a14e346271eeff423712019cb?s=96&d=mm&r=g","caption":"Swapnil Rajawat"},"jobTitle":"Co-Founder","description":"Co-Founder of DialNexa. Expert in voice AI, conversational technology, and enterprise telephony. Building the future of AI-powered customer engagement.","url":"https:\/\/dialnexa.com","worksFor":{"@id":"https:\/\/dialnexa.com\/blogs\/#organization"}}]}},"_links":{"self":[{"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/posts\/6866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/comments?post=6866"}],"version-history":[{"count":1,"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/posts\/6866\/revisions"}],"predecessor-version":[{"id":6872,"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/posts\/6866\/revisions\/6872"}],"wp:attachment":[{"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/media?parent=6866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/categories?post=6866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dialnexa.com\/blogs\/wp-json\/wp\/v2\/tags?post=6866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}