<?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: Pedro Santos</title>
    <description>The latest articles on DEV Community by Pedro Santos (@pedrosantospt).</description>
    <link>https://dev.to/pedrosantospt</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%2F4053785%2Feea54b56-a638-4b95-adc1-a04fa030199e.jpg</url>
      <title>DEV Community: Pedro Santos</title>
      <link>https://dev.to/pedrosantospt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pedrosantospt"/>
    <language>en</language>
    <item>
      <title>Telling an AI to "be concise" can make it generate MORE tokens. I benchmarked it across 5 models.</title>
      <dc:creator>Pedro Santos</dc:creator>
      <pubDate>Wed, 29 Jul 2026 22:58:04 +0000</pubDate>
      <link>https://dev.to/pedrosantospt/telling-an-ai-to-be-concise-can-make-it-generate-more-tokens-i-benchmarked-it-across-5-models-h2l</link>
      <guid>https://dev.to/pedrosantospt/telling-an-ai-to-be-concise-can-make-it-generate-more-tokens-i-benchmarked-it-across-5-models-h2l</guid>
      <description>&lt;p&gt;For a while I'd been sticking "be concise" on prompts and assuming it saved me money. Then I actually measured the output instead of eyeballing the answer.&lt;/p&gt;

&lt;p&gt;On two of the five models I tested, "be concise" made the model generate &lt;strong&gt;more&lt;/strong&gt; tokens than saying nothing at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  The experiment
&lt;/h2&gt;

&lt;p&gt;Two versions of the same five tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One with no system prompt.&lt;/li&gt;
&lt;li&gt;One with a system prompt that literally said &lt;code&gt;Be concise. Keep your answer short.&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I counted &lt;strong&gt;provider output tokens&lt;/strong&gt; (what the model actually generates, and the part you pay 5x for), not how short the answer looked. Five current Claude models, run through the CLI.&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;No prompt&lt;/th&gt;
&lt;th&gt;"Be concise."&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Haiku 4.5&lt;/td&gt;
&lt;td&gt;3288&lt;/td&gt;
&lt;td&gt;2666&lt;/td&gt;
&lt;td&gt;−19% (fewer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sonnet 5&lt;/td&gt;
&lt;td&gt;353&lt;/td&gt;
&lt;td&gt;453&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+28% (MORE)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 4.8&lt;/td&gt;
&lt;td&gt;278&lt;/td&gt;
&lt;td&gt;394&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+42% (MORE)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fable 5&lt;/td&gt;
&lt;td&gt;1340&lt;/td&gt;
&lt;td&gt;1019&lt;/td&gt;
&lt;td&gt;−24% (fewer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opus 5&lt;/td&gt;
&lt;td&gt;591&lt;/td&gt;
&lt;td&gt;555&lt;/td&gt;
&lt;td&gt;−6% (fewer)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So it's not that "be concise" always backfires. It's that it's unreliable. Sometimes it trims, sometimes it pads, and which one you get depends on the model.&lt;/p&gt;

&lt;p&gt;My guess at why: on some models a "keep it short" instruction triggers a little meta-preamble ("Here's a concise summary:") or a restatement of the question, and on tasks that were already short, that overhead costs more than the instruction saves.&lt;/p&gt;

&lt;p&gt;Why it matters: output tokens are the expensive slice. On every current Claude model, output costs 5x the input token. If your "make it cheaper" prompt is quietly adding output on the exact model you use, you're paying more to feel efficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually reduced the output
&lt;/h2&gt;

&lt;p&gt;If you want fewer output tokens reliably, restyling the prose isn't enough. You have to change what goes into the answer at all.&lt;/p&gt;

&lt;p&gt;That's the idea behind a small skill I ended up building, called &lt;a href="https://github.com/pedrosantospt/noyap" rel="noopener noreferrer"&gt;NoYap&lt;/a&gt;. Instead of "say it shorter", it's a set of rules for what belongs in a response:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Answer first. Result on line one.&lt;/li&gt;
&lt;li&gt;Delete whole sections that don't earn their place (recaps, narration, generic "there may be edge cases" caveats) before tightening wording.&lt;/li&gt;
&lt;li&gt;Only claim something was verified if it actually ran.&lt;/li&gt;
&lt;li&gt;Only state a risk if it's specific and real.&lt;/li&gt;
&lt;li&gt;Ask one question if blocked, then stop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same five tasks, same measurement. I ran it against a plain baseline plus two existing terseness tools as reference points: &lt;a href="https://github.com/JuliusBrussee/caveman" rel="noopener noreferrer"&gt;Caveman&lt;/a&gt; (compresses the prose into a terse persona) and &lt;a href="https://github.com/DietrichGebert/ponytail" rel="noopener noreferrer"&gt;Ponytail&lt;/a&gt; (makes the model write less code).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Haiku 4.5&lt;/th&gt;
&lt;th&gt;Sonnet 5&lt;/th&gt;
&lt;th&gt;Opus 4.8&lt;/th&gt;
&lt;th&gt;Fable 5&lt;/th&gt;
&lt;th&gt;Opus 5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Baseline (no prompt)&lt;/td&gt;
&lt;td&gt;4732&lt;/td&gt;
&lt;td&gt;1134&lt;/td&gt;
&lt;td&gt;1334&lt;/td&gt;
&lt;td&gt;2933&lt;/td&gt;
&lt;td&gt;1078&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/JuliusBrussee/caveman" rel="noopener noreferrer"&gt;Caveman&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5219&lt;/td&gt;
&lt;td&gt;951&lt;/td&gt;
&lt;td&gt;1879&lt;/td&gt;
&lt;td&gt;2622&lt;/td&gt;
&lt;td&gt;951&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/DietrichGebert/ponytail" rel="noopener noreferrer"&gt;Ponytail&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5554&lt;/td&gt;
&lt;td&gt;886&lt;/td&gt;
&lt;td&gt;978&lt;/td&gt;
&lt;td&gt;2277&lt;/td&gt;
&lt;td&gt;992&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/pedrosantospt/noyap" rel="noopener noreferrer"&gt;&lt;strong&gt;NoYap&lt;/strong&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4152&lt;/td&gt;
&lt;td&gt;592&lt;/td&gt;
&lt;td&gt;823&lt;/td&gt;
&lt;td&gt;1229&lt;/td&gt;
&lt;td&gt;745&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;NoYap vs baseline&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;−12%&lt;/td&gt;
&lt;td&gt;−48%&lt;/td&gt;
&lt;td&gt;−38%&lt;/td&gt;
&lt;td&gt;−58%&lt;/td&gt;
&lt;td&gt;−31%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fqbvbv1clgpmg5r3uwj5c.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%2Fqbvbv1clgpmg5r3uwj5c.png" alt="Benchmark chart Caveman vs Ponytail vs NoYap vs Baseline" width="799" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NoYap was below baseline on all five models. (Note: these baselines come from a separate, longer run than the "be concise" table above, so don't line the two tables up column by column. They're different experiments.)&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like
&lt;/h2&gt;

&lt;p&gt;A migration task: the migration drops a legacy column, the code was changed, tests were not run, and old v1 API clients still read that column.&lt;/p&gt;

&lt;p&gt;Plain agent, &lt;strong&gt;158 tokens&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The migration is incomplete and will break v1 API clients.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Blockers:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tests haven't run&lt;/strong&gt; — we haven't verified the code changes work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v1 API compatibility&lt;/strong&gt; — clients still read the &lt;code&gt;status&lt;/code&gt; column you removed; they'll get null/error responses&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Next steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If this is a controlled deprecation: add a deprecation window, keep the column populated for one release, communicate to clients&lt;/li&gt;
&lt;li&gt;If v1 must stay compatible: restore the column or add a compatibility shim&lt;/li&gt;
&lt;li&gt;Either way: run tests first&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which approach fits your release strategy?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;NoYap, &lt;strong&gt;35 tokens&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Migration drops the legacy &lt;code&gt;status&lt;/code&gt; column. Code updated, not run.&lt;/p&gt;

&lt;p&gt;Risk: v1 API clients still read &lt;code&gt;status&lt;/code&gt;, they break until upgraded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same facts. It states what happened, flags the one real risk with the mechanism (who breaks and why), and admits nothing was verified. It doesn't invent two remediation plans I didn't ask for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The runner, the raw results, and the skill are here: &lt;strong&gt;&lt;a href="https://github.com/pedrosantospt/noyap" rel="noopener noreferrer"&gt;https://github.com/pedrosantospt/noyap&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Claude Code it's two lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace add pedrosantospt/noyap
/plugin install noyap@noyap
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F9pa78l5z5m7qs0tnb216.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%2F9pa78l5z5m7qs0tnb216.png" alt="NoYap Logo" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
