<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matt Duffin</title>
    <description>The latest articles on DEV Community by Matt Duffin (@rare_matt).</description>
    <link>https://dev.to/rare_matt</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4238054%2F9ac44c38-4b8d-491e-a160-3c3a7578b536.png</url>
      <title>DEV Community: Matt Duffin</title>
      <link>https://dev.to/rare_matt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rare_matt"/>
    <language>en</language>
    <item>
      <title>Google Decisions API vs Jev: Which is Better?</title>
      <dc:creator>Matt Duffin</dc:creator>
      <pubDate>Thu, 12 Nov 2026 23:42:49 +0000</pubDate>
      <link>https://dev.to/rare_matt/google-decisions-api-vs-jev-which-is-better-212d</link>
      <guid>https://dev.to/rare_matt/google-decisions-api-vs-jev-which-is-better-212d</guid>
      <description>&lt;p&gt;Google just launched a direct rival to the fastest model in my &lt;a href="https://dev.to/rare_matt/zero-shot-classification-jev-vs-llm-vs-hugging-face-5h68"&gt;zero shot classification&lt;/a&gt; test. &lt;/p&gt;

&lt;p&gt;Considering Google's track record with AI (not the greatest), I wanted to see how their new "System One" model stacked up.&lt;/p&gt;

&lt;p&gt;So in this article, I ran the new Google Decisions API through the same 200 customer messages as my previous article. &lt;/p&gt;

&lt;p&gt;TLDR: They're about the same, but Jev wins on speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Google Decisions API?
&lt;/h2&gt;

&lt;p&gt;The Google Decisions API is a Gemini API endpoint that answers fixed questions about an input instead of writing text. You send text, images, audio, video, or a PDF with a list of questions, and it returns an answer and a confidence score for each one.&lt;/p&gt;

&lt;p&gt;It &lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/" rel="noopener noreferrer"&gt;launched on 11 November 2026&lt;/a&gt; and runs on a new model, Gemini Decision 1 (&lt;code&gt;gemini-decision-1&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;It matters to me because of my work building &lt;a href="https://heymatey.com.au" rel="noopener noreferrer"&gt;chatbots and agents&lt;/a&gt; for online stores. When every shopper message gets sorted before anything else happens, a model that only makes decisions (and makes them fast) is usually the right tool for that step.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does the Google Decisions API work?
&lt;/h2&gt;

&lt;p&gt;The Google Decisions API takes one shared input and up to 1,000 questions, and scores every question in a single pass. Each question is one of three types:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;noul&lt;/code&gt;&lt;/strong&gt; is a yes or no question. It returns the probability that the answer is yes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;choice&lt;/code&gt;&lt;/strong&gt; picks one option from a list of 2 to 255. It returns the winner and a probability for every option.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;score&lt;/code&gt;&lt;/strong&gt; rates the input on an ordered scale. It returns a weighted score and a probability for each level.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those names look familiar, Jev uses exactly the same three question types with the same names.&lt;/p&gt;

&lt;p&gt;Zero shot classification is one &lt;code&gt;choice&lt;/code&gt; question. This is the call I used in the test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;GoogleGenAI&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;'@google/genai'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;ai&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GoogleGenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'v1beta'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decisions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'gemini-decision-1'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'choice'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'Which label best fits this customer message to a bank?'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;criteria&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'atm support'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'request refund'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// one key per label&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Google Decisions API pricing
&lt;/h2&gt;

&lt;p&gt;Google Decisions API pricing is US$0.10 per million input tokens, with no charge for output tokens. There's also a no-cost tier in Google AI Studio for prototyping.&lt;/p&gt;

&lt;p&gt;Here is how Gemini Decision 1 and Jev compare on paper, from &lt;a href="https://aistudio.google.com/docs/decisions-api" rel="noopener noreferrer"&gt;Google's Decisions API documentation&lt;/a&gt; and &lt;a href="https://docs.typesafe.ai/models" rel="noopener noreferrer"&gt;TypeSafe's model page&lt;/a&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gemini Decision 1&lt;/th&gt;
&lt;th&gt;Jev 1.14&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price per million input tokens&lt;/td&gt;
&lt;td&gt;US$0.10&lt;/td&gt;
&lt;td&gt;US$0.042&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output tokens&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Question types&lt;/td&gt;
&lt;td&gt;noul, choice, score&lt;/td&gt;
&lt;td&gt;noul, choice, score, box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inputs&lt;/td&gt;
&lt;td&gt;Text, images, audio, video, PDFs&lt;/td&gt;
&lt;td&gt;Text, images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context per request&lt;/td&gt;
&lt;td&gt;262,144 tokens&lt;/td&gt;
&lt;td&gt;64,000 tokens (262,000 with long context on)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Jev is less than half the price per token, but the two APIs count tokens differently. For the same message and the same ten labels, Google billed 152 tokens a request and TypeSafe billed 375 (I have no idea why). Both came to about $0.015 per 1,000 messages. &lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Google Decisions API vs Jev
&lt;/h2&gt;

&lt;p&gt;I tested the Google Decisions API on the same 200 customer messages as last time: banking support messages from the public Banking77 set, 10 labels, 20 messages each. Every model got the label names and nothing else.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkfq172afibci78e3x9jq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkfq172afibci78e3x9jq.png" alt="Bar chart of zero shot classification accuracy: Claude Opus 5.5 95%, Claude Haiku 5.5 93%, Gemini Decision 1 92.5%, Jev 92%, bart-large-mnli 73.5%" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;Median time&lt;/th&gt;
&lt;th&gt;Cost per 1,000 messages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemini Decision 1&lt;/td&gt;
&lt;td&gt;92.5%&lt;/td&gt;
&lt;td&gt;511 ms&lt;/td&gt;
&lt;td&gt;US$0.015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;92.0%&lt;/td&gt;
&lt;td&gt;226 ms&lt;/td&gt;
&lt;td&gt;US$0.016&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 5.5&lt;/td&gt;
&lt;td&gt;93.0%&lt;/td&gt;
&lt;td&gt;1,211 ms&lt;/td&gt;
&lt;td&gt;US$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;td&gt;95.0%&lt;/td&gt;
&lt;td&gt;1,926 ms&lt;/td&gt;
&lt;td&gt;US$1.96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bart-large-mnli&lt;/td&gt;
&lt;td&gt;73.5%&lt;/td&gt;
&lt;td&gt;1,264 ms&lt;/td&gt;
&lt;td&gt;Free (own machine)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy was a tie.&lt;/strong&gt; Gemini Decision 1 got 185 of 200 right and Jev got 184. Twelve of Gemini's 15 misses were the same messages Jev missed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jev was more than twice as fast.&lt;/strong&gt; Jev answered in 226 ms and Gemini Decision 1 in 511 ms. Google's article quotes 150 to 250 ms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both left the LLMs behind on speed and cost.&lt;/strong&gt; Claude Haiku 5.5 took 1.2 seconds, and Claude Opus 5.5 cost over 100 times more per message&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlsjz3yzr2ueql53klc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlsjz3yzr2ueql53klc0.png" alt="Bar chart of median time to classify one message: Jev 226 ms, Gemini Decision 1 511 ms, Claude Haiku 5.5 1,211 ms, bart-large-mnli 1,264 ms, Claude Opus 5.5 1,926 ms" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I ran every message twice. Gemini Decision 1 gave the same answer both times on all 200, and Jev changed one.&lt;/p&gt;

&lt;p&gt;Then I gave both models one tuning round. I wrote a one-line description for each label and tested on 200 fresh messages neither model had seen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnlbn4gsqxhg3lm0snoas.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnlbn4gsqxhg3lm0snoas.png" alt="Bar chart of accuracy on 200 fresh messages: Gemini Decision 1 went from 93.5% to 99% with label descriptions, Jev went from 93% to 99%" width="799" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Both models finished on 99%. Gemini Decision 1 went from 93.5% to 99%, and Jev went from 93% to 99%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations of the Google Decisions API
&lt;/h2&gt;

&lt;p&gt;The main limitations of the Google Decisions API are that it is literally brand new, and that a &lt;code&gt;choice&lt;/code&gt; question always picks something. Google's documentation lists these as well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is in beta.&lt;/strong&gt; The Decisions API is only on the Gemini Developer API (&lt;code&gt;v1beta&lt;/code&gt;), with Google Cloud support still to come&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A choice question never says "none of these".&lt;/strong&gt; Probability is always spread across your options, so you need a confidence threshold or an "other" option&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No batch mode or context caching.&lt;/strong&gt; Repeated input is billed in full on every request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Questions are text only.&lt;/strong&gt; You can send media as the input, but not inside a question&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my test, its misses came from overlapping label names. It filed "Which ATM's will accept my card?" under &lt;code&gt;card acceptance&lt;/code&gt; when the dataset says &lt;code&gt;atm support&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The confidence score caught most of them. Twelve of its 15 misses had a confidence below 0.8, and it was right on 145 of the 148 answers at 0.8 or higher.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you use the Google Decisions API or Jev?
&lt;/h2&gt;

&lt;p&gt;Use the Google Decisions API or Jev based on speed and input type, because accuracy and cost were level in this test.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use the Google Decisions API&lt;/strong&gt; when you already build on Gemini, when you need to classify audio, video, or PDFs, or when you want the no-cost tier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Jev&lt;/strong&gt; when response time matters most. It was more than twice as fast from Australia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use an LLM&lt;/strong&gt; when you need the highest accuracy from label names alone and can wait a second or two.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whichever you choose, write a description for every label. That one change took both decision models from 93% to 99%.&lt;/p&gt;

</description>
      <category>google</category>
      <category>decisionmodels</category>
      <category>modelrouting</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Update: Google just released their very own Decisions API. I will have to check how it goes against Jev for zero-shot work. 

https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/</title>
      <dc:creator>Matt Duffin</dc:creator>
      <pubDate>Thu, 12 Nov 2026 08:59:07 +0000</pubDate>
      <link>https://dev.to/rare_matt/update-google-just-released-their-very-own-decisions-api-i-will-have-to-check-how-it-goes-against-24mj</link>
      <guid>https://dev.to/rare_matt/update-google-just-released-their-very-own-decisions-api-i-will-have-to-check-how-it-goes-against-24mj</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/rare_matt/zero-shot-classification-jev-vs-llm-vs-hugging-face-5h68" class="crayons-story__hidden-navigation-link"&gt;Zero Shot Classification: Jev vs LLM vs Hugging Face&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/rare_matt" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4238054%2F9ac44c38-4b8d-491e-a160-3c3a7578b536.png" alt="rare_matt profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/rare_matt" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Matt Duffin
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Matt Duffin
                
                
              
              &lt;div id="story-author-preview-content-5019670" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/rare_matt" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4238054%2F9ac44c38-4b8d-491e-a160-3c3a7578b536.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Matt Duffin&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/rare_matt/zero-shot-classification-jev-vs-llm-vs-hugging-face-5h68" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 12&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/rare_matt/zero-shot-classification-jev-vs-llm-vs-hugging-face-5h68" id="article-link-5019670"&gt;
          Zero Shot Classification: Jev vs LLM vs Hugging Face
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/zeroshotclassification"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;zeroshotclassification&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/jev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;jev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/systemone"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;systemone&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/typesafe"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;typesafe&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/rare_matt/zero-shot-classification-jev-vs-llm-vs-hugging-face-5h68" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/rare_matt/zero-shot-classification-jev-vs-llm-vs-hugging-face-5h68#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              1&lt;span class="hidden s:inline"&gt;&amp;nbsp;comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
          
          &lt;div class="only-sidebar-menu-item trusted-visible-block print-hidden align-center"&gt;
                
                    
                
          &lt;/div&gt;

        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;/div&gt;



&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fstorage.googleapis.com%2Fgweb-uniblog-publish-prod%2Fimages%2Fgemini__decisions__blog-header_2784x1566.width-1300.png" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://blog.google/innovation-and-ai/technology/developers-tools/gemini-decisions-api/" rel="noopener noreferrer" class="c-link"&gt;
            Gemini Decisions API: Fast multimodal decisions
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Meet the Gemini Decisions API, powered by our state-of-the-art model Gemini Decision for fast, calibrated multimodal decisions.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.google%2Fstatic%2Fblogv2%2Fimages%2Ffavicon.ico%3Fversion%3Dpr20261029-2131"&gt;
          blog.google
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>api</category>
      <category>google</category>
      <category>llm</category>
    </item>
    <item>
      <title>Zero Shot Classification: Jev vs LLM vs Hugging Face</title>
      <dc:creator>Matt Duffin</dc:creator>
      <pubDate>Thu, 12 Nov 2026 00:03:33 +0000</pubDate>
      <link>https://dev.to/rare_matt/zero-shot-classification-jev-vs-llm-vs-hugging-face-5h68</link>
      <guid>https://dev.to/rare_matt/zero-shot-classification-jev-vs-llm-vs-hugging-face-5h68</guid>
      <description>&lt;p&gt;I tested three ways to do zero shot classification on 200 real customer messages. &lt;/p&gt;

&lt;p&gt;This article covers how each of the three methods work, how they compare on accuracy, speed, and cost, and which one best fits your application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is zero shot classification?
&lt;/h2&gt;

&lt;p&gt;Zero shot classification is when you give an AI model an input and a list of label names, and it picks the best fit with no training data and no examples.&lt;/p&gt;

&lt;p&gt;Say a customer writes "Do you know the closest ATM?" and your labels are &lt;code&gt;atm support&lt;/code&gt;, &lt;code&gt;lost or stolen card&lt;/code&gt;, and &lt;code&gt;request refund&lt;/code&gt;. A zero-shot classification model picks &lt;code&gt;atm support&lt;/code&gt; without ever seeing a labelled example.&lt;/p&gt;

&lt;p&gt;I personally work on zero shot classification every day building AI agents for online stores, and it's far from a waste of time. Online shoppers who experience a high quality chat experience &lt;a href="https://heymatey.com.au/blog/ecommerce-chatbot-statistics" rel="noopener noreferrer"&gt;spend significantly more money&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  3 ways to do zero shot classification
&lt;/h2&gt;

&lt;p&gt;There are three common ways to do zero-shot text classification today: small open-source models, large language models (LLMs), and System One models. All three take the same input (a piece of text and a list of labels). System One models like Jev are the new kids on the block.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A Hugging Face zero shot classification model
&lt;/h3&gt;

&lt;p&gt;The Hugging Face zero-shot classification pipeline with &lt;a href="https://huggingface.co/facebook/bart-large-mnli" rel="noopener noreferrer"&gt;facebook/bart-large-mnli&lt;/a&gt; is what most existing tutorials use. It turns each label into a sentence ("This example is atm support.") and checks whether the text backs that sentence up. It's free and runs on your own machine - which is a major drawcard.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;'@huggingface/transformers'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;classify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'zero-shot-classification'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Xenova/bart-large-mnli'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;classify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// the top label&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Zero shot classification with an LLM
&lt;/h3&gt;

&lt;p&gt;Zero-shot classification with an LLM is a prompt: here is the message, here are the labels, pick one. I tested Claude Opus 5.5 and Claude Haiku 5.5, and limited the answer to the label list so the model could not invent a new label. It's worth mentioning that this method doesn't always work as LLMs tend to get chatty, especially when something goes wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'claude-haiku-5-5'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sb"&gt;`Pick the one label that best fits the message.\n${labels.join('\n')}`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;output_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'json_schema'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;labelSchema&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. A System One model
&lt;/h3&gt;

&lt;p&gt;A &lt;a href="https://docs.typesafe.ai/concepts/system-one" rel="noopener noreferrer"&gt;System One model&lt;/a&gt; is built to make fast decisions instead of writing text. Typesafe's Jev takes the message and one multiple-choice question, then returns the chosen label with a confidence score (from zero to one) for every option.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// options = { 'atm support': null, 'request refund': null, ... }&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;answers&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;systemOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;questions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Which label best fits this message?'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing zero shot classification
&lt;/h2&gt;

&lt;p&gt;I tested all three methods on the same 200 customer messages from &lt;a href="https://huggingface.co/datasets/PolyAI/banking77" rel="noopener noreferrer"&gt;Banking77&lt;/a&gt;, a public set of banking support messages. I picked 10 labels at random, took 20 messages for each, and gave every model the label names and nothing else.&lt;/p&gt;

&lt;p&gt;It's worth mentioning that I'm no machine learning engineer. I first learned to code by &lt;a href="https://dev.to/create_matt/10-things-i-learned-building-a-nextjs-app-with-no-experience-3c56"&gt;building a Next.js app&lt;/a&gt; with no experience. Each setup here is one you can easily copy yourself.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcge7oupj2p5x7qmctu4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcge7oupj2p5x7qmctu4k.png" alt="Bar chart of zero-shot classification accuracy: Claude Opus 5.5 95%, Claude Haiku 5.5 93%, Jev 92%, bart-large-mnli 73.5%" width="799" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;Median time&lt;/th&gt;
&lt;th&gt;Cost per 1,000 messages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;bart-large-mnli&lt;/td&gt;
&lt;td&gt;73.5%&lt;/td&gt;
&lt;td&gt;1,264 ms&lt;/td&gt;
&lt;td&gt;Free (own machine)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 5.5&lt;/td&gt;
&lt;td&gt;93.0%&lt;/td&gt;
&lt;td&gt;1,211 ms&lt;/td&gt;
&lt;td&gt;US$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;td&gt;95.0%&lt;/td&gt;
&lt;td&gt;1,926 ms&lt;/td&gt;
&lt;td&gt;US$1.96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jev&lt;/td&gt;
&lt;td&gt;92.0%&lt;/td&gt;
&lt;td&gt;226 ms&lt;/td&gt;
&lt;td&gt;US$0.016&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three things stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The LLMs were the most accurate.&lt;/strong&gt; Claude Opus 5.5 got 190 of 200 right, and Claude Haiku 5.5 got 186&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jev was the fastest and the cheapest to call.&lt;/strong&gt; It answered in 226 ms, about five times faster than Haiku and eight times faster than Opus, while scoring 92%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The tutorial model trailed by about 20 points.&lt;/strong&gt; bart-large-mnli scored 73.5% and took 1.3 seconds a message on my own machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxqlmbij6vk4jq7hf3h5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxqlmbij6vk4jq7hf3h5v.png" alt="Bar chart of median time to classify one message: Jev 226 ms, Claude Haiku 5.5 1,211 ms, bart-large-mnli 1,264 ms, Claude Opus 5.5 1,926 ms" width="799" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I also ran every message twice to see whether the answers held. bart-large-mnli changed none of its 200 answers, Jev and Opus changed one each, and Haiku changed three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations of zero shot classification
&lt;/h2&gt;

&lt;p&gt;The main limitation of zero-shot classification is that the model only has your label names to go on. When two labels overlap, or a name is vague, the model guesses.&lt;/p&gt;

&lt;p&gt;This exact limitation showed up in two places during my tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overlapping labels.&lt;/strong&gt; bart-large-mnli got all 20 &lt;code&gt;atm support&lt;/code&gt; messages wrong. It filed "Which ATMs accept this card?" under &lt;code&gt;card acceptance&lt;/code&gt;, which is a fair reading of those two names&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Labels that hide their meaning.&lt;/strong&gt; Every model put "Are my friends able to top up my account?" under &lt;code&gt;receiving money&lt;/code&gt;. The dataset files it under &lt;code&gt;topping up by card&lt;/code&gt;. The same six messages caught Opus, Haiku, and Jev&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither is really the model's fault, and both are fixable. To prove this I ran a single tuning round on Jev. I checked the misses, wrote a one-line description for each label, and tested it on 200 fresh messages it hadn't seen yet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60upv4d7c2qfz69yfcmy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F60upv4d7c2qfz69yfcmy.png" alt="Bar chart of Jev accuracy on 200 fresh messages: 93% with label names only, 99% with one-line label descriptions" width="799" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jev went from 93% to 99%, reaching LLM-level accuracy at a fraction of the time and cost, after one round of tuning.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose the right zero shot classification method for your application
&lt;/h2&gt;

&lt;p&gt;Choose your zero-shot classification method by what your application needs most: privacy, accuracy, or speed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use bart-large-mnli&lt;/strong&gt; when the data cannot leave your machine or the budget is zero. Expect to check its work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use an LLM&lt;/strong&gt; when accuracy matters most and a second or two per message is fine. Claude Haiku 5.5 scored 93% for five US cents per 1,000 messages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a System One model like Jev&lt;/strong&gt; when classification sits in front of every request, like routing live chat. Allow for one or two tuning rounds on your labels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Train your own model&lt;/strong&gt; when you have thousands of labelled examples and the labels never change. This comparison of &lt;a href="https://dev.to/natan_vidra/zero-shot-vs-fine-tuned-models-which-should-you-use-15ob"&gt;zero-shot vs fine-tuned models&lt;/a&gt; covers when that is worth it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whichever you choose, test it on your own messages first. Two hundred is enough to show where your labels overlap.&lt;/p&gt;

&lt;p&gt;UPDATE: Google released their own decisions API the day after I wrote this article. Here's what happened when I compared the &lt;a href="https://dev.to/rare_matt/google-decisions-api-vs-jev-which-is-better-212d"&gt;Google Decisions API vs Jev&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>zeroshotclassification</category>
      <category>jev</category>
      <category>systemone</category>
      <category>typesafe</category>
    </item>
  </channel>
</rss>
