<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Full Rank]]></title><description><![CDATA[Data Science, Applied AI/ML, and Insights from Ryan Sloan at Full Rank LLC. Based in Seattle. All insights locally grown in the Pacific Northwest.]]></description><link>https://blog.fullrankllc.com</link><image><url>https://substackcdn.com/image/fetch/$s_!yXkE!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd379b8fe-1941-48a4-bb85-7178b2027dd6_512x512.png</url><title>Full Rank</title><link>https://blog.fullrankllc.com</link></image><generator>Substack</generator><lastBuildDate>Wed, 21 Oct 2026 02:34:28 GMT</lastBuildDate><atom:link href="https://blog.fullrankllc.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ryan Sloan]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[fullrank@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[fullrank@substack.com]]></itunes:email><itunes:name><![CDATA[Ryan Sloan]]></itunes:name></itunes:owner><itunes:author><![CDATA[Ryan Sloan]]></itunes:author><googleplay:owner><![CDATA[fullrank@substack.com]]></googleplay:owner><googleplay:email><![CDATA[fullrank@substack.com]]></googleplay:email><googleplay:author><![CDATA[Ryan Sloan]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Is your LLM putting itself out of a job?]]></title><description><![CDATA[For classification tasks, your LLM should be training its replacement]]></description><link>https://blog.fullrankllc.com/p/is-your-llm-putting-itself-out-of</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/is-your-llm-putting-itself-out-of</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 19 Oct 2026 14:31:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yXkE!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd379b8fe-1941-48a4-bb85-7178b2027dd6_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For a few years, GitHub used an LLM to scan repos for secrets that had been inadvertently committed. Last week, they announced that they&#8217;ve <a href="https://github.blog/ai-and-ml/githubs-model-for-secret-detection-finding-more-secrets-with-less-noise/">replaced the LLM-based scanner with a custom classifier</a>. Their new classifier is 98% cheaper, 86% faster, and has 11.5% higher user acceptance. A big win in pretty much every dimension! One interpretation of this is that they never should&#8217;ve used an LLM at all, but I have a different take. Starting with an LLM-based pipeline makes the zero-to-one step more accessible. But this is just the first step: the costly, slow generalist model gets you the most valuable asset for v2: labeled decisions from real users. The data you collect here provides the training set for a faster, cheaper model tailored to your problem.</p><h3>Starting with the LLM</h3><p>In the early stages of a classification project, we often suffer from a lack of real-world data. Collecting, purchasing, or building the data to train models like these is costly and time-consuming, and expending those resources before you&#8217;ve even proven the concept is a non-starter. LLMs excel at few-shot classification tasks like these, and are a solid place to start. It&#8217;s not just getting the feature out the door for its own sake, it&#8217;s producing the dataset you were missing! Every time GitHub&#8217;s LLM raised a secret alert, it was a human decision-point, and after two years it&#8217;s a heck of a training set that you didn&#8217;t have to go out and build.</p><h3>Moving on down</h3><p>It can be tempting to stop there. Things are working, the business is humming along. But the reason we started with the LLM was because we had little data, and that&#8217;s no longer true. The <a href="https://blog.fullrankllc.com/p/the-llm-is-a-jackhammer">LLM is a jackhammer, and this problem is a nail</a>. With a dataset like this, there are more options. On the same traffic, GitHub&#8217;s fine-tuned encoder showed 13% higher precision and 19% higher recall than the LLM. It was trained on their actual decisions, and used the relevant features directly instead of reasoning them out every time.</p><h3>When is the bootstrap over?</h3><p>GitHub&#8217;s guidance here is &#8220;smaller fine-tuned classifier can be the right answer when the task is narrow, the decision boundary is measurable, and serving efficiency is critical.&#8221; These criteria tell you if an encoder <em>can</em> do the job. But the question of whether now is the time to replace the LLM involves a few others.</p><p>First, can you enumerate your labels? If you don&#8217;t yet understand your categories, or you are still refining their hierarchy, then you are still in task discovery. The flexibility of the generalist LLM is an advantage. Once your labels have settled, it&#8217;s time to start looking. Second, are you <a href="https://blog.fullrankllc.com/p/read-your-judges-dissenting-opinions">reading the rationale returned by your LLM classifiers</a>? If you are reviewing these logs, or presenting the explanatory text to your users, then you are still in LLM territory. Prose justifications and explanations aren&#8217;t something you will get from an encoder. But you have to be honest here. If you&#8217;re logging the rationale because you hope to review them &#8220;some day&#8221;, there&#8217;s a good chance you&#8217;re paying for reasoning that you will never use. Finally, how much prompt iteration are you doing? If there&#8217;s still a lot of churn in your prompts, the task (and associated data) has probably not settled enough yet. </p><h3>Takeaways</h3><p>An LLM-based classification pipeline can be a great fit when you are starting from limited data. By shipping it, you are building your product&#8217;s learning loop without slowing down. But the justification for starting with an LLM breaks down as your corpus grows. GitHub&#8217;s example shows that moving on can be cheaper, faster, <em>and</em> better! </p><p>You are ready to move on from an LLM-based pipeline when: you can enumerate your labels, you no longer need to read the rationale, and your task definition has settled. If all these are true, and you have thousands of labels, you are ready to try other approaches.</p><p>The only way to know which model is best for you is to measure it, though. Once you have the data, you can try fine-tuning an encoder, or <a href="https://blog.fullrankllc.com/p/less-chatty-judges">calibrating a decision model</a>. <a href="https://blog.fullrankllc.com/p/better-good-than-lucky">Score them all against your holdout set</a>, and pick the winner.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe to receive new posts. It&#8217;s free.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Less chatty judges]]></title><description><![CDATA[How my LLM judge advice carries over to Jev (or other &#8216;decision models&#8217;)]]></description><link>https://blog.fullrankllc.com/p/less-chatty-judges</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/less-chatty-judges</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 05 Oct 2026 14:30:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!QTUy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Two weeks ago <a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev">TypeSafe AI released Jev</a>. If you&#8217;re reading this, you&#8217;ve probably already seen an endless stream of takes about it. I wanted to focus on some practical, applied questions. I&#8217;ve written a lot recently about LLM judges, and this is an area where a Jev-like model can be a fit. A model that can ingest unstructured text and output a confidence-weighted judgement much faster (and cheaper) than an LLM sounds like a dream. In this post, I revisit a few of my posts with guidance on LLM judges and explore how that guidance applies to Jev.</p><h3>Illusion of precision, revisited</h3><p>In <a href="https://blog.fullrankllc.com/p/the-illusion-of-precision">The Illusion of Precision</a>, I cited research showing that while LLMs can provide seemingly precise confidence scores, the scores collapse to a small number of tiers. The recommendation was to ask your judges to provide a score from a small ordinal scale, and to calibrate them on a hand-labeled data set. Jev outputs a probability directly, rather than generating text. So the question is: does that number <em>actually behave like a probability</em>, or is it also a handful of tiers with more precise window-dressing?</p><p>I pulled 300 entries from the <a href="https://huggingface.co/datasets/nebius/SWE-agent-trajectories">Nebius SWE-agent data set</a>, and asked two judges (Jev and Sonnet 5) whether the run solved its issue, given the patch the agent submitted (a code diff), and the issue text. Both judges achieved about 77% accuracy, but the numbers in those verdicts were very different. Sonnet returned 32 distinct values, while Jev returned 85. If we compare the reliability curves, we can see that Jev&#8217;s scores stay close to the diagonal. This means that Jev&#8217;s confidence scores corresponded closely to the actual probability that the run succeeded. Sonnet&#8217;s results are much more poorly calibrated, and many are clumped on the lower end.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XDI_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XDI_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png 424w, https://substackcdn.com/image/fetch/$s_!XDI_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png 848w, https://substackcdn.com/image/fetch/$s_!XDI_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png 1272w, https://substackcdn.com/image/fetch/$s_!XDI_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XDI_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png" width="1020" height="1008" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f26eae49-a151-4f30-94b5-69a817221169_1020x1008.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1008,&quot;width&quot;:1020,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114726,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/218828695?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XDI_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png 424w, https://substackcdn.com/image/fetch/$s_!XDI_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png 848w, https://substackcdn.com/image/fetch/$s_!XDI_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png 1272w, https://substackcdn.com/image/fetch/$s_!XDI_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff26eae49-a151-4f30-94b5-69a817221169_1020x1008.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The advice for small, ordinal scales seems inapplicable to Jev. But while the Jev judge&#8217;s calibration was better than Sonnet, its calibration is imperfect, and I only know how it did because I checked. You should still calibrate your Jev judges, but there&#8217;s a good chance you&#8217;re starting much closer to the truth.</p><h3>A million token bad habit, revisited</h3><p>In <a href="https://fullrank.substack.com/p/a-million-token-bad-habit">A Million Token Bad Habit</a> we explored how context is a design decision, and how just because context fits in the window doesn&#8217;t mean the model will use it well. I also discussed the importance of location within the context window. To test these on Jev, I sent the same SWE-agent prompts in three ways: the patch diff alone (<strong>Patch</strong>); the patch code plus the last ten steps of the agent&#8217;s run (<strong>Tail</strong>); and the full trajectory (<strong>Full</strong>). </p><p>The Tail did best on both accuracy and calibration. Full trajectory performed well on accuracy, but was less well-calibrated with probabilities about ten points too low across the board.</p><p>I figured this was the junk-drawer effect from the original post: too much irrelevant context in the window. But it wasn&#8217;t! To explore this, I used 153 runs that had ten steps or fewer, since for those runs Tail and Full include the same steps with different surrounding context. Cutting the inputs by two-thirds didn&#8217;t change anything. Stripping out the agent&#8217;s thoughts closed the gap a little bit. But moving the patch and exit status from the end of the state to right after the issue closed most of the gap.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QTUy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QTUy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png 424w, https://substackcdn.com/image/fetch/$s_!QTUy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png 848w, https://substackcdn.com/image/fetch/$s_!QTUy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png 1272w, https://substackcdn.com/image/fetch/$s_!QTUy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QTUy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png" width="1020" height="888" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:888,&quot;width&quot;:1020,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:87994,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/218828695?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QTUy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png 424w, https://substackcdn.com/image/fetch/$s_!QTUy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png 848w, https://substackcdn.com/image/fetch/$s_!QTUy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png 1272w, https://substackcdn.com/image/fetch/$s_!QTUy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd320b14c-b6d4-46d2-b2fe-b97e60d1f283_1020x888.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can see that even when we have the same context, the score jumps nine points solely because of where the patch was in the context window. This is one of the position effects from that post. It appears that for this task, putting the core content of the question at the top of the context window matters most. Changing the structure of context means that judge calibration should be rechecked, too.</p><h3>Six jobs, or five?</h3><p>In <a href="https://blog.fullrankllc.com/p/should-pms-own-evals">Should PMs Own Evals</a>, I described the six jobs of an eval program. One of them was calibration:</p><blockquote><p><strong>Calibrate.</strong> If you&#8217;re using models to evaluate models (LLM-judges, classifiers, etc.), then these measures need to be calibrated themselves because their native <a href="https://fullrank.substack.com/p/the-illusion-of-precision">outputs may not represent what you expect</a>. Your investment here should be <a href="https://eugeneyan.com/writing/evals/">calibrated to your level of risk</a>. Curate smaller, human-labeled sets to check your scorers. Output: <strong>scoring models calibrated</strong> against a validation set (evals in miniature!)</p></blockquote><p>A decision model like Jev doesn&#8217;t eliminate this job, but it may make for a much smaller job! In the previous sections, we saw how our Jev judges started off better calibrated. If you start with a model that&#8217;s well-calibrated out of the box, you have much less work to do. But the only way to know for sure is to measure it. And as we saw in the last section, you still have context decisions to make.</p><h3>Takeaways</h3><p>Decision models like Jev and <a href="https://openai.com/index/devday-2026-recap/">OpenAI&#8217;s new Decisions API</a> provide an alternative to LLM judges that can be well-calibrated, inexpensive, and fast. I&#8217;ve previously argued that you should <a href="https://blog.fullrankllc.com/p/not-every-ticket-is-your-opus">choose the right model for the job</a> (and that <a href="https://blog.fullrankllc.com/p/the-llm-is-a-jackhammer">sometimes it&#8217;s not an LLM at all</a>), and now we have another in our toolbelt. But a generally well-calibrated judge isn&#8217;t necessarily well-calibrated to your problem. And as we saw above, you may find that its performance is still dependent on the design of your context. So there&#8217;s still work to do, but these models&nbsp;may change how much time we spend actively tuning and calibrating judges and classifiers vs. just checking them.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to get the next one in your inbox.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[COGS in the machine]]></title><description><![CDATA[Is Opus 5.5 really 40% cheaper? Only your own measurements can truly say.]]></description><link>https://blog.fullrankllc.com/p/cogs-in-the-machine</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/cogs-in-the-machine</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 28 Sep 2026 14:31:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2Kxc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I try not to write about the model horse race. These posts are about patterns, practices, and habits that outlive any individual model release. But the Opus 5.5 release provided a good opportunity to demonstrate how you track and evaluate your LLM costs.</p><p>Last week, <a href="https://www.anthropic.com/claude-opus-5-5">Anthropic released Opus 5.5</a>. They tout a 40% reduction in cost relative to Opus 5. That sounds like a very good deal, but when they report a number like that they&#8217;re computing an average over a set of representative workloads. Should you expect to see a 40% reduction in your inference costs? </p><p>If you are using <a href="https://blog.fullrankllc.com/p/evals-are-a-compass">evals as a compass</a>, you already have what you need to answer that question. I previously shared an <a href="https://substack.com/@ryanjsloan/note/c-308723062?r=1arml&amp;utm_source=notes-share-action&amp;utm_medium=web">analysis of verbosity in Opus 5 vs. 4.8,</a> and I used that data and code to examine the changes with 5.5.</p><h3>Data and methods</h3><p>I have a small collection of twenty-five data science prompts that I use to evaluate the stylistic characteristics of LLM responses. These are designed to be relatively straightforward across a range of task types including factual questions, coding, recommendations, explanation, and text-condensing. I ran each prompt five times against each model: Opus 4.8, Opus 5, and Opus 5.5.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> Reasoning tokens are billed as output tokens, but I track them separately because they aren&#8217;t visible as part of the response.</p><h3>Right on the money</h3><p>On my workload, Anthropic&#8217;s claimed reduction holds up. A median response that costs 5.1 cents of output on Opus 5 costs 3.1 cents with Opus 5.5. That&#8217;s right on target with a 40% reduction. Very little of those savings come from the model writing less in its response. The responses themselves are the same length (within noise) as Opus 5&#8217;s. The 40% savings breaks down into a few parts. First, the obvious: Opus 5.5&#8217;s output price dropped from $25 to $20 per million tokens. Second, we see a notable shift in reasoning: Opus 5.5 spends roughly half the thinking tokens Opus 5 did on the same prompts. </p><h3>Cheaper than what?</h3><p>Opus 5.5 is cheaper than Opus 5. But the cost trajectory over the last three months isn&#8217;t all downward. When Anthropic released Opus 5, they carried forward Opus 4.8&#8217;s pricing structure. But they weren&#8217;t equally costly to run: against my workload, Opus 5 billed almost two and a half times the output tokens compared to 4.8. So even&nbsp;if the pricing&nbsp;is fixed, your COGS is moving.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Kxc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Kxc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png 424w, https://substackcdn.com/image/fetch/$s_!2Kxc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png 848w, https://substackcdn.com/image/fetch/$s_!2Kxc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!2Kxc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Kxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png" width="1200" height="1200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1200,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81419,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/216965776?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2Kxc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png 424w, https://substackcdn.com/image/fetch/$s_!2Kxc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png 848w, https://substackcdn.com/image/fetch/$s_!2Kxc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!2Kxc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8456de0e-71f7-4e2d-a211-bcaafca2c8d7_1200x1200.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Takeaways</h3><p>If you were running Opus 4.8 earlier this summer, last week&#8217;s drop in unit cost didn&#8217;t close that gap. Your unit costs are still up by over a third since June! Of course, pricing changes and new models are released all the time. How well do you understand what those shifts are going to cost you? </p><p>At last week&#8217;s Copilot launch, <a href="https://every.to/p/copilot-gets-a-seat-in-the-org-chart">which I covered for Every</a>, Satya Nadella called for &#8216;evals specific to your company,&#8217; because general benchmarks can&#8217;t tell you how a model changes outcomes in your organization. A cost quote like Anthropic&#8217;s is the same kind of average. The only way to know how model updates impact your workloads is to measure it yourself. A few bits of practical advice:</p><ul><li><p>When you track tokens, break out reasoning and response text separately, even if they are priced the same. There can be invisible shifts in model behavior that you will miss if you simply track in/out.</p></li><li><p>Price model swaps on your own workloads. You&#8217;re already building evals for benchmarking and quality (right?), use them to forecast cost as well.</p></li></ul><p><a href="https://github.com/ryansloan/model-verbosity-comparison">The code and data used in this analysis are available on GitHub</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to get the next post fresh&nbsp;from the oven.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Opus 5.5 defaults to a lower reasoning effort than its predecessors. I ran it at both settings, but in this post I&#8217;m using the matched-effort runs. At its default it's modestly cheaper still. You can read more in the project repo.</p></div></div>]]></content:encoded></item><item><title><![CDATA[If at first you don’t succeed, try something else]]></title><description><![CDATA[Agentic tasks that fail once often fail again. &#8220;Just retry&#8221; isn&#8217;t a strategy.]]></description><link>https://blog.fullrankllc.com/p/if-at-first-you-dont-succeed-try</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/if-at-first-you-dont-succeed-try</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 21 Sep 2026 14:31:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!R10d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>&#8220;Back off and retry&#8221; is one of the common rules we learned building distributed systems. When your API call fails for one reason or another, the simplest thing to do is often to just try it again. &#8220;It&#8217;s nondeterministic, so maybe it will work the second (or third, or fourth) time,&#8221; you might think. Retries work well enough for HTTP requests or calls returning traditional error codes, but when it comes to agentic task failures it&#8217;s rarely enough. </p><h3>Trajectories from software engineering</h3><p>As an example, we can look to the trajectories from the <a href="https://huggingface.co/datasets/nebius/SWE-agent-trajectories">Nebius SWE-agent data set</a>. In this data set, the creators ran a software engineering agent against real GitHub issues with matching PRs, and graded each run&#8217;s result on whether the agent&#8217;s changes passed the tests from the actual fix. They produced many runs for each issue (dozens in some cases), so we can see what happens when an agent keeps trying the same task.</p><p>For example, in <a href="https://github.com/pydantic/pydantic/issues/2496">pydantic issue 2496</a> it was reported that a model field&nbsp;with the empty tuple type always generated a broken JSON schema. The agent tried to resolve this issue 16 times. On one attempt it gave up, but the other fifteen times it submitted a change. All fifteen were unique, and all failed their tests. Each of them introduced some sort of special-case for the empty tuple, and the real fix was more general.</p><p>Contrast this with <a href="https://github.com/pydantic/pydantic/issues/2496">issue 2290 from the same repo</a>. Here, the reporter noted that the copy method didn&#8217;t properly flag changed fields. This was also attempted sixteen times, and passed seven of them. Each run changed the same line of code. Seven got the change right, and the others failed. This one really was a coin flip.</p><p>Retrying only helps if the task failed due to bad luck: a transient failure, a system error, or some mangled output. We just saw examples of both, so the question is: what&#8217;s typical? </p><p>In the Nebius data set, the coin flips were the minority. In the plot below, we can see the distribution of pass rates by issue.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> If the failures were due to bad luck, we&#8217;d expect to see a distribution like the dashed line.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> But the blue&nbsp;distribution reveals a different pattern: most of the issues that failed never succeeded.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R10d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R10d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png 424w, https://substackcdn.com/image/fetch/$s_!R10d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png 848w, https://substackcdn.com/image/fetch/$s_!R10d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png 1272w, https://substackcdn.com/image/fetch/$s_!R10d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R10d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png" width="1456" height="939" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:939,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77241,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/215918749?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!R10d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png 424w, https://substackcdn.com/image/fetch/$s_!R10d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png 848w, https://substackcdn.com/image/fetch/$s_!R10d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png 1272w, https://substackcdn.com/image/fetch/$s_!R10d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F81751d39-9271-4b93-a095-90cd1d1af7d1_1520x980.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In the data I analyzed, once a task failed twice the next run&#8217;s pass rate was about 2.5%. If you know this number for your domain, it&#8217;s the number to build a retry policy on: what are the chances the next run will succeed?</p><h3>What about better models?</h3><p><a href="https://arxiv.org/abs/2505.13652">This research was conducted with 2024-era models</a>, a generation or two behind today&#8217;s. Better models can solve more tasks, meaning their pass rates increase. But when they fail, retrying doesn&#8217;t help much. Two recent papers<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> reported pass rates using current models, both for single runs and for the best of several (&#8220;pass@k&#8221;). In every case, we saw the same pattern with the extra runs. Tasks that failed once mostly failed again.</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/zL7Jw/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/961be1cd-b11d-4668-a06d-68e7f77fbc34_1220x640.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e29e889f-06cf-4be6-bf06-99d55846695a_1220x776.png&quot;,&quot;height&quot;:384,&quot;title&quot;:&quot;Retrying on current models&quot;,&quot;description&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/zL7Jw/1/" width="730" height="384" frameborder="0" scrolling="no" loading="lazy"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><h3>Try something else?</h3><p>Retrying is cheap, and sometimes it works! It&#8217;s a reasonable first-step for those &#8220;bad luck&#8221; situations. The second failure isn&#8217;t bad luck, though. There is something about the task as presented that&nbsp;is not going to pass. Running again with the same prompt, context, and tools is the &#8220;cut-and-paste&#8221; retry. This usually fails.</p><p>The fix is to change something. Try giving the agent different context, different examples, or a different sort of prompt. You might have more luck splitting the task into pieces. This is where you consider handing it to a human with the failing trajectories attached. This is how you learn about your agent&#8217;s failure modes.</p><p>If you&#8217;re dealing with this problem, you don&#8217;t need fancy analysis right away. Start with a table containing task ids and pass/fail for each run. Sort your tasks into those that always failed, vs. those that sometimes failed. If the first bucket is large, you know where to start to break out of the retry loop.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts via email.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Only issues with at least five runs are shown. Issues that were run more times also passed more. So the &#8220;always failed&#8221; share is actually higher than shown here.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>The pass rate across all runs was 16.8%. If task failures were generally independent, we&#8217;d model this as a Bernoulli trial with p=0.168 and expect per-issue pass to cluster around that. The dashed line shows that expectation.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p><em><a href="https://arxiv.org/abs/2606.17454">Dissecting model behavior through agent trajectories</a></em><a href="https://arxiv.org/abs/2606.17454"> by Gupta et al</a>, and <em><a href="https://arxiv.org/abs/2505.20411">SWE-rebench: An Automated Pipeline for Task Collection and Decontaminated Evaluation of Software Engineering Agents</a></em><a href="https://arxiv.org/abs/2505.20411"> by Badertdinov et al.</a></p></div></div>]]></content:encoded></item><item><title><![CDATA[Better good than lucky]]></title><description><![CDATA[The winner&#8217;s curse is coming for your evals]]></description><link>https://blog.fullrankllc.com/p/better-good-than-lucky</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/better-good-than-lucky</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 14 Sep 2026 14:55:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yXkE!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd379b8fe-1941-48a4-bb85-7178b2027dd6_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://blog.fullrankllc.com/p/evals-are-a-compass">Evals can be a useful benchmark for decision-making when you&#8217;re updating harnesses or prompts</a>. You can compare two or more variants, and choose the one that performs best, something like &#8220;Harness A showed 90% accuracy vs. Harness B&#8217;s 88%&#8221;. That 90% figure is also an anchor for your expectations: after shipping it you expect 90% accuracy. If you&#8217;ve done this, you were probably disappointed; the variant never seems to do as well as it did at the time of selection. What gives?</p><p>To make sense of it, we can look to classical stats and ML. </p><h3>Old habits</h3><p>Data scientists learn this rule early: don&#8217;t use the same dataset for performance reporting and selection. The act of choosing based on a dataset has contaminated your measurement! <a href="https://www.jmlr.org/papers/v11/cawley10a.html">Cawley and Talbot wrote the definitive paper</a> on selection bias in model selection long before we were tuning prompts, back in 2010 (ancient history!). Unfortunately, this is one of the habits I&#8217;ve noticed teams setting aside in the AI era. Maybe tuning a prompt doesn&#8217;t feel like training a model, but a prompt is basically a hyperparameter in a black-box model, so the same selection bias applies. In doing this, teams are setting themselves up for disappointment when things hit prod.</p><h3>Illustrating a winner&#8217;s curse</h3><p>Each variant&#8217;s evaluation score is the combination of two things: its actual &#8220;goodness&#8221;, and how lucky it got (noise). Even if goodness is stable, luck is fleeting, so scoring the same variant against different samples will yield different scores. This is just a fact of life, but the trouble is in the selection rule itself.</p><p>To illustrate this, we&#8217;ll be omniscient for a moment. Consider two prompts, and an eval set of 50. Both have &#8220;true&#8221; scores of 88% and are equally good. But every statistic has sampling noise, and in this case we&#8217;d expect a score to typically wind up between 84% and 92%.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> So if you run the eval on these two equally-good variants, one of them&#8217;s going to score higher. Statistically, they&#8217;ll differ by two or more points 85% of the time!  The higher score is probably an overestimate of true performance. </p><p>This gets worse with more variants. If we did the same thought experiment with twenty equally-good (88%) variants, we&#8217;d expect the winner to score around 96%, overestimating its performance by 8 percentage points!<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> If you use this to set expectations about performance in production, you&#8217;re going to be very disappointed. This is a variant of the winner&#8217;s curse, a perennial problem in applied statistics.</p><h3>Holdout hope</h3><p>In the example, we were omniscient. In real life, we just have the measured results. What can we do when we don&#8217;t know everything? The answer is pretty boring: we perform selection and final performance benchmarking on different data. It&#8217;s just a holdout set. As we saw in the last section, this is even more important as the number of variants increases.</p><p>In scenarios where the stakes are high, there are more formal corrections to be considered. <a href="https://arxiv.org/abs/2605.05973">Xu et al.'s SIREN</a> measured bias on tuning runs and found it was large enough to flip conclusions. They developed a protocol&nbsp;to handle reporting in light of this. But in lower-stakes contexts, measurement against the holdout is a low-cost way to get a number you can trust.</p><h3>Takeaways</h3><p>The field is advancing fast, and with the proliferation of nondeterministic systems, the rigor of classic stats&nbsp;is more important than ever. Practitioners have been guarding against this in A/B testing, biostatistics, and applied ML for decades. Building with LLMs doesn&#8217;t feel like model selection,&nbsp;but it is. We can build better software by carrying these good habits forward into the new world. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free for tips on bringing rigor to your AI/ML systems.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Given a binomial distribution with p=0.88 and n=50. This has a standard deviation of 2.3 successes, or 4.6% of 50 trials.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Based on Monte Carlo simulation, choosing the max of 20 i.i.d. draws of Binomial(50, 0.88). E[max] &#8776; 96%.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Read your judges’ dissenting opinions]]></title><description><![CDATA[Using disagreement when a panel of LLM judges represents competing priorities]]></description><link>https://blog.fullrankllc.com/p/read-your-judges-dissenting-opinions</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/read-your-judges-dissenting-opinions</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Tue, 08 Sep 2026 14:31:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZAr8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Last week, I was talking with an applied researcher about some of the gotchas they&#8217;d encountered in building evals. One of the things she mentioned was managing dissent between LLM judges representing different stakeholders. Their &#8220;consumer&#8221; judge and &#8220;subject-matter expert&#8221; judge don&#8217;t always see eye-to-eye. </p><p>Two common patterns here are to blend the criteria into one rubric or average the results between judges. Both of these miss the point, though. The disagreements can actually tell you something, and they represent the stakeholder tensions built-in to your product. In this post, I demonstrate the concept with a simple example.</p><h3>Setup</h3><p>A 2025 paper (MedScore) assembled a public dataset of patient questions and physician responses. They used the physician&#8217;s responses as context and had AI rewrite them. The authors made that dataset public (AskDocsAI). It includes 300 patient questions, each with the physician&#8217;s actual reply and an AI rewrite. </p><p>Patient communications present a good example of the multiple-viewpoints problem, because doctors and patients prioritize different qualities. I setup LLM judges to represent each of these viewpoints: a patient rubric (addresses my concern, provides me clear next steps) and a clinician rubric (appropriate urgency and certainty, no unsupported claims)<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. Each judge outputs a score from 1-5 based on its criteria. <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p><p>I sampled 150 of the patient question/response pairs, and used these judges to evaluate the responses. Both judges used the same underlying model and input context, only the prompt/rubric was changed. For each response, I ran three replications of each judge. </p><h3>A difference of opinion</h3><p>We see considerable differences between judge &#8220;personas&#8221;. The patient and clinician judge scores are at least one point apart on 53% of responses. LLMs are probabilistic, so we should expect some variation. The same judge re-run on the same answer differs by that much only 11% of the time. We&#8217;re capturing two distinct viewpoints.</p><p>Most of the disagreements are one point out of five, but ten had differences of two points. This goes in both directions: there are answers the patient judge likes and the clinician judge dislikes, and vice versa. Looking at the LLM judge rationales we can see differences in priority.</p><p>In one example, someone with a single stitch asks if they can remove it themselves instead of going back to the doctor. The response asks clarifying questions (how long the stitch has been in), and defers its recommendation. The clinician judge gives this response a 4, with rationale like &#8220;appropriately asks for more information&#8230;rather than guessing.&#8221; On the other hand, the patient judge scored it a 2, saying the response &#8220;deflects by asking for more info&#8230;without providing any interim advice or self-removal instructions.&#8221; </p><p>Neither judge is &#8220;wrong&#8221; about its rubric criteria, they were just designed around different priorities. This illustrates a conflict between stakeholders. If we were building this system, this would be a fundamental tradeoff between actionable and cautious repsonses that we&#8217;d have to reckon with.</p><h3>A rubric smoothie?</h3><p>We might be tempted to simply roll these up into one combined rubric. Then we don&#8217;t have to think about tradeoffs at all! I did this, too. I ran a third judge with a combined patient+clinician rubric.  Perhaps surprisingly, it didn&#8217;t act as a compromise. It scored lower than either of the targeted judges. Merging the criteria didn&#8217;t average the two viewpoints. It made an even stricter judge that never awarded a five! This is likely because the combined rubric covers so much it finds more reasons to dock points.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZAr8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZAr8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png 424w, https://substackcdn.com/image/fetch/$s_!ZAr8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png 848w, https://substackcdn.com/image/fetch/$s_!ZAr8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png 1272w, https://substackcdn.com/image/fetch/$s_!ZAr8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZAr8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png" width="1456" height="882" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:882,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74909,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/214622071?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZAr8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png 424w, https://substackcdn.com/image/fetch/$s_!ZAr8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png 848w, https://substackcdn.com/image/fetch/$s_!ZAr8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png 1272w, https://substackcdn.com/image/fetch/$s_!ZAr8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdc903bcf-2c54-425e-ab7a-091df5d61a20_1962x1189.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>On the ten answers where patient and clinician judges differed by two points, the combined judge sides with the patient judge on four, the clinician judge on two, &#8220;compromises&#8221; on three, and scores lower than either on one. We can&#8217;t distinguish between &#8220;bad responses&#8221; and responses that expose an underlying tension. Worse, we lose visibility into how that tradeoff is being decided. It&#8217;s no longer a product decision, we&#8217;ve just tossed it to the model.</p><p>The other obvious solution is to average the two judge scores. But this has the same problem of flattening meaningful disagreements. In the stitch example, the patient judge&#8217;s score of 2 and the clinician judge&#8217;s score of 4 average to 3, hiding disagreement.</p><h3>Handling disagreement</h3><p>So what can we do? There are a few practical pieces of advice.</p><ul><li><p><strong>Report judge scores separately.</strong> If you have sometimes-conflicting priorities to balance, reporting performance in each dimension gives you a clearer view into the tradeoffs you are making.</p></li></ul><ul><li><p><strong>Route disagreement for human review. </strong>When judges disagree, escalate those&nbsp;items for review. In this case, I looked at the ten answers that produced large differences in scores to understand how judgements might conflict. </p></li><li><p><strong>Decide your priority explicitly.</strong> If you have to force multiple judges into a single verdict, make an intentional decision about your priority (e.g., clinician must pass, patient ranks the rest). <a href="https://en.wikipedia.org/wiki/Social_choice_theory">Social choice theorists</a> have been studying how to aggregate conflicting preferences for over a hundred years, and offers several techniques. Averaging scores across judges is an implicit prioritization, and it&#8217;s a strong assumption! You can likely do better for your product. </p></li></ul><h3>Takeaways</h3><p>The ten answers where the judges showed marked disagreement revealed a fundamental tension in this domain. To get to that, I had to go a little deeper than the scores, and read the rationale from each judge. It would&#8217;ve been easy to &#8220;smooth&#8221; this disagreement away and miss the insight and tradeoff entirely.</p><p>If you find yourself balancing competing priorities or stakeholders, consider splitting your judges. If you read their rationale when they disagree, you will learn something about your product and its fundamental tradeoffs. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe to receive new posts in your inbox. It&#8217;s free!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Important to note that I&#8217;m not actually evaluating &#8220;correctness&#8221; of medical advice here. This demonstration is focused on the way judges can represent different viewpoints, not on validating medical advice, so the rubrics do not focus on diagnostics.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>In a real application, I would calibrate these judges vs. labels provided by human experts. For the purposes of this demonstration, I just made light adjustments to prompts based on my non-expert judgement.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Should PMs Own Evals?]]></title><description><![CDATA[An eval program is six jobs, assigned to the team you have]]></description><link>https://blog.fullrankllc.com/p/should-pms-own-evals</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/should-pms-own-evals</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 31 Aug 2026 14:30:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CkNm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A hot topic in the AI/ML engineering world is whether PMs should own and write evals. I tend to agree that, as the owners of the product&#8217;s scope and goals, PMs are natural owners for evals. But this ownership question glosses over the hard part: building a good evals program is actually six jobs. I approach this problem-first instead of title-first, which allows us to map clearer ownership to the underlying problems.</p><h3>The six jobs of an eval program</h3><p>An eval program is a build-measure-learn loop in miniature. We can think about each job as having a required output that feeds the next phase, with the whole cycle forming a learning loop.</p><ol><li><p><strong>Define &#8220;good&#8221;. </strong>Off-the-shelf evals rarely perform well in product-specific scenarios, so the bulk of every product&#8217;s evals should be tailored to its goals and moment of value. Building a useful eval program requires you to define what good outputs look like for your product. The output of this job is a <strong>framework</strong> for evaluation: categories of test cases, with criteria for evaluating them.</p></li><li><p><strong>Define what to test. </strong>With a definition of &#8220;good&#8221;, we have what we need to construct a test set. The best test cases are a blend of real-world samples and intentionally constructed edge- or adversarial-cases. These should tie back directly to your definition of &#8220;good&#8221;. The output of this job is: specific <strong>test cases with evaluation criteria.</strong></p></li><li><p><strong>Measure performance. </strong>Build a scorer with rubrics, judges, and code for deterministic evaluation. As with any measurement program, we have to consider the right statistical methods and required sample size. The output of this job is: <strong>runnable evals</strong> that produce interpretable results.</p></li><li><p><strong>Calibrate.</strong> If you&#8217;re using models to evaluate models (LLM-judges, classifiers, etc.), then these measures need to be calibrated themselves because their native <a href="https://fullrank.substack.com/p/the-illusion-of-precision">outputs may not represent what you expect</a>. Your investment here should be <a href="https://eugeneyan.com/writing/evals/">calibrated to your level of risk</a>. Curate smaller, human-labeled sets to check your scorers. Output: <strong>scoring models calibrated</strong> against a validation set (evals in miniature!)</p></li><li><p><strong>Monitor performance.</strong> One-time snapshot evals are useful, but ultimately this is a part of your CI process. At a minimum, you&#8217;re testing for regressions and <a href="https://fullrank.substack.com/p/not-every-ticket-is-your-opus">evaluating model upgrades</a>. If you&#8217;re using <a href="https://blog.fullrankllc.com/p/evals-are-a-compass">evals as a compass</a>, you need ongoing measurement to know where you&#8217;re going. Where possible, you also want to be running evaluations against production traffic, or at least logging for future eval development. This job is classic MLE, and its output is a <strong>harness</strong> with logs and metrics.</p></li><li><p><strong>Learn. </strong>This applies to the product and to the eval set itself. For the eval set: read failures as they come in, and use error analysis to refine and build on your eval framework and test cases. Evals serve as a yardstick&nbsp;for product decisions that connect to the models (version changes, reasoning budgets, etc.). The evals are a benchmark to guide judgement. Output: expanding eval-set (and confidence), <strong>data-informed</strong> <strong>product changes.</strong></p></li></ol><h3>Mapping the jobs to your team</h3><p>With these jobs defined, you can map out concrete accountabilities and ownership. The way they fit into your org depends on the structure of your team, but it&#8217;s helpful to think about them in terms of the expertise they require.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CkNm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CkNm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png 424w, https://substackcdn.com/image/fetch/$s_!CkNm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png 848w, https://substackcdn.com/image/fetch/$s_!CkNm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!CkNm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CkNm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png" width="1456" height="749" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:749,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84428,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/213467724?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CkNm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png 424w, https://substackcdn.com/image/fetch/$s_!CkNm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png 848w, https://substackcdn.com/image/fetch/$s_!CkNm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!CkNm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2f3ecc2-bc99-4a40-a5b9-4f7ccfd5665d_2100x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you&#8217;re an AI startup with no data science team, you have gaps to fill in measurement and calibration. No matter what roles you have on your team, <strong>you need domain expertise. </strong>The PM fills this role in a pinch, but without a subject-matter expert, evals will tend to be defined by what&#8217;s easiest to measure. Scores might be green, but if an expert would reject the results, you&#8217;re just playing make believe.</p><h3>Falling through the cracks</h3><p>Calibration and monitoring often fall through the cracks because they seem optional. The models are getting better all the time, right? If you&#8217;re renting these models without running calibrated scorers on an ongoing basis, you&#8217;re putting the performance of your product in someone else&#8217;s hands on little more than faith. The same goes for your LLM judges: when the vendor&#8217;s model update comes out, your scores will shift, regardless of whether your product did.</p><p>The frontier labs are incentivized to make their models better, but better against their benchmarks does not necessarily mean better at <em>your tasks</em>. </p><h3>So, should PMs own evals?</h3><p>Sure, at least in part. The first two jobs and the learning loop clearly land in PM territory. But it takes a village to build an effective eval program. Start with the six jobs, find out who on your team is well-positioned to do them, assign accountabilities, and see what&#8217;s left. If you&#8217;ve still got a gap, now you know what you&#8217;re hiring for.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Full Rank! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[The Illusion of Precision]]></title><description><![CDATA[Probabilities from LLMs are a charade, ask for what they're good at instead.]]></description><link>https://blog.fullrankllc.com/p/the-illusion-of-precision</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/the-illusion-of-precision</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 24 Aug 2026 14:31:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZeXE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When a large language model is used as a judge or classifier, it&#8217;s common to request a confidence score in the output. The score is usually something like a probability, so it gets treated like one. It gets compared against some threshold and routed accordingly. There&#8217;s a problem, though. <strong>The LLM&#8217;s confidence is a coarse, ordinal judgement disguised as a continuous one. </strong></p><h3>This one goes to <s>eleven</s> eight</h3><p>A <a href="https://arxiv.org/abs/2608.04899">recent paper from a team at Amazon</a> measured what models emit when you ask for confidence on a 0 to 100 scale. They found that, on a typical sentiment analysis task, the model produced eight distinct values across the whole dataset. More than half of the responses were exactly 95! This same pattern showed up across every model and dataset they tested. When you ask for a score from 0 to 100, you think you&#8217;re giving the LLM control over a precise dial, but it&#8217;s actually just got 8 notches we can tell which one is the model&#8217;s favorite.</p><p>When the score of 95 doesn&#8217;t reliably mean &#8220;95% correct&#8221;, or &#8220;probability of 0.95&#8221;, we have to rethink the way we make decisions down the line. What we think are finely-tuned thresholds lose their meaning. This isn&#8217;t an exotic failure case. Any time you&#8217;re asking an LLM for a number, you have to wonder if you&#8217;re getting the calibrated precision you want. At best, you&#8217;re making bulk decisions when you think you&#8217;re routing carefully. At worst, you&#8217;re letting the illusion of precision lead you toward false confidence. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZeXE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZeXE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png 424w, https://substackcdn.com/image/fetch/$s_!ZeXE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png 848w, https://substackcdn.com/image/fetch/$s_!ZeXE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png 1272w, https://substackcdn.com/image/fetch/$s_!ZeXE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZeXE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png" width="1456" height="763" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:763,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:103983,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/211104983?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZeXE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png 424w, https://substackcdn.com/image/fetch/$s_!ZeXE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png 848w, https://substackcdn.com/image/fetch/$s_!ZeXE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png 1272w, https://substackcdn.com/image/fetch/$s_!ZeXE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F01d48ad4-1347-49ba-9b3e-1949a10c822a_2080x1090.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>What can we do?</h3><p>The model&#8217;s confidence judgements aren&#8217;t useless, though. Researchers found they are pretty good at ordering. Given cases that need to be ranked into coarse categories (this one is good, this one is ambiguous, this one is bad), the model&#8217;s ordering is meaningful. But they&#8217;re bad at attaching precise, calibrated values to those rankings. The problems arise when we ask for the latter thing when the model can only reliably deliver the former.</p><p>Approach the problem in a different way. Instead of a 0 to 100 scale, ask for a small set of discrete levels that you design as labels plus criteria. In a multi-class classification problem, you might ask it to report one of three options: &#8220;High: the record clearly matches one category and no other. Medium: the record matches one category best but has features of another. Low: multiple categories are plausible.&#8221;</p><p>You might worry: is it losing precision? No, because the model was going to collapse your scale into a couple of bins anyway! This way, you get buckets with criteria you designed, instead of whatever coarse distribution the model falls into. This is also why judges anchored in rubrics outperform judges that just output scores. A rubric is just a set of tiers designed around qualities instead of confidence.</p><h3>What does &#8220;high confidence&#8221; actually mean?</h3><p>Thoughtfully-designed tiers fix what the model emits, but they don&#8217;t tell you what &#8220;High&#8221; confidence actually means. For that, we can go back to our roots in classical ML: calibration. Take a sample of data for which you have ground truth labels, and run your classifier/judge over it. Group those by the model&#8217;s reported tier, and compute the accuracy within each. A few lines of code is all it takes to get a routing table. </p><p>Something like: &#8220;High&#8221; is 94% accurate and covers 67% of traffic. &#8220;Medium&#8221; is 81% accurate and 21% of traffic. &#8220;Low&#8221; is 55% accurate with 12% of traffic. That allows us to make real decisions: if the bar for auto-accepting is 90%, &#8220;High&#8221; passes and everything else goes to review. We know to expect review load to be 33% of volume. If we&#8217;re surprised by the accuracy-to-tier mappings, we learn something about the task.</p><p>The model can supply the ordering, but the accuracy figures are an empirical question. Plus, when the model changes, or behavior drifts, we can rerun the slice and update the table. </p><h3>What if you need precision?</h3><p>Sometimes, you genuinely need finer grained scores than a handful of tiers can give. There are still two options. If your model provider exposes token logprobs, you can read the probability of the answer token directly. If not, consider running the same input several times and using the agreement rate. (This does multiply your inference costs). But start by asking if the precision is&nbsp;actually enabling better decision-making. Most routing problems don&#8217;t need it.</p><h3>Tuned at the factory?</h3><p>There&#8217;s an old joke about an amateur musician declining a tune up, saying "No thanks, mine was tuned at the factory." </p><p>I&#8217;ve written previously about how <a href="https://blog.fullrankllc.com/p/evals-are-a-compass?r=1arml">evals are an instrument to tell you where you are going</a>. Like any instrument, they need tuning. An LLM&#8217;s confidence lacks calibration, and better prompting cannot get you there. Instead, the way forward is to stop asking for what it can&#8217;t give you. Ask for tiered judgement and supply the numbers yourself, based on real data. You can ask the model&#8217;s opinion, just don&#8217;t trust its fidelity.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Full Rank! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[A Million-Token Bad Habit]]></title><description><![CDATA[Leave the junk drawer for your kitchen.]]></description><link>https://blog.fullrankllc.com/p/a-million-token-bad-habit</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/a-million-token-bad-habit</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 17 Aug 2026 14:30:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mD5d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The ever-lengthening context windows might be making us lazy. When context windows were a few thousand tokens, we had to think really hard about what went in.  But the windows got huge, and we no longer have to be quite so judicious. It&#8217;s tempting. Every document that might be relevant gets tossed in. Bump those top-5 retrievals to 50, why not? Full tool output from a few sessions ago? Couldn&#8217;t hurt&#8230;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mD5d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mD5d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png 424w, https://substackcdn.com/image/fetch/$s_!mD5d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png 848w, https://substackcdn.com/image/fetch/$s_!mD5d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png 1272w, https://substackcdn.com/image/fetch/$s_!mD5d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mD5d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png" width="298" height="465.91777509068925" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1293,&quot;width&quot;:827,&quot;resizeWidth&quot;:298,&quot;bytes&quot;:425238,&quot;alt&quot;:&quot;A man with an arm full of boxes, dropping many. His hat is falling off and he can't catch it. Caption reads \&quot;When the model has a 1M token context window\&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/209550576?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A man with an arm full of boxes, dropping many. His hat is falling off and he can't catch it. Caption reads &quot;When the model has a 1M token context window&quot;" title="A man with an arm full of boxes, dropping many. His hat is falling off and he can't catch it. Caption reads &quot;When the model has a 1M token context window&quot;" srcset="https://substackcdn.com/image/fetch/$s_!mD5d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png 424w, https://substackcdn.com/image/fetch/$s_!mD5d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png 848w, https://substackcdn.com/image/fetch/$s_!mD5d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png 1272w, https://substackcdn.com/image/fetch/$s_!mD5d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6e2747a9-ee6e-4a8f-b8cd-12d859796400_827x1293.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The junk drawer becomes the junk drawer because it&#8217;s bigger than all the little odds and ends that we toss inside. Nothing gets lost&nbsp;or thrown out, and we can always dig things out later. The problem is that the model is doing the digging, and it is just not that good at it.</p><p><strong>The quantity, form and sequence of context is a design decision</strong>, and like all design decisions it has consequences. This deserves the same care you would give a database schema or API contract. </p><h3>&#8220;It fits&#8221; vs. &#8220;it works&#8221;</h3><p>Chroma&#8217;s <a href="https://research.trychroma.com/context-rot">Context Rot report</a> tested 18 frontier models (including GPT-4.1, Claude 4, Gemini 2.5, and Qwen3)<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> on simple tasks. Things like fact retrieval,&nbsp;conversational Q&amp;A, and reproducing sequences. Every model they tested degraded as input length grew. This started long before they hit the context window&#8217;s limit. Even when the context window is a million tokens, the model&#8217;s performance starts to decrease at tens of thousands of tokens. The tasks in the study were designed to be simple so that length was the only variable. When we start talking about real workloads with reasoning and ambiguity, we can only expect it to get worse.</p><p>We&#8217;re not talking 80% or even 50% context here. In many cases this is 10% or less. We should think of the number on the context window as a (marketable) capacity limit more than a performance guarantee. You can fit a lot of clowns in a VW Beetle, but I wouldn&#8217;t drive it to IKEA.</p><p>It&#8217;s not just about too much, there are also risks to plopping in loosely related content. If you&#8217;ve ever designed multiple-choice tests for humans, you&#8217;re probably familiar with &#8220;distractors&#8221; - answers that are wrong but look plausibly correct. In the Chroma study, they planted distractors (passages that look relevant but are not) and found performance degraded as a result.</p><h3>Position matters, too</h3><p>In Liu et al.&#8217;s <a href="https://arxiv.org/abs/2307.03172">Lost in the Middle</a>, researchers provided the same set of documents in context, but moved one relevant document around. Their accuracy curves were U-shaped: good when the answer is at the beginning or end of context, and worse when it is buried in the middle. The middle of your context window is where information goes to be ignored. And in a way, the middle gets &#8220;bigger&#8221; the more we stuff the window.</p><p>This applies on a smaller scale, too. <a href="https://arxiv.org/pdf/2402.08939">Chen et al.</a> showed that just reordering the premises of a logic problem significantly changes reasoning accuracy. Nothing was added or removed, only rearranged. If shuffling identical information changes the output, then context engineering becomes akin to a modeling decision, whether we&#8217;re making it intentionally or not.</p><h3>What earns its keep?</h3><p>Anthropic&#8217;s <a href="https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents">context engineering guidance</a> has a useful framing for this: models have an attention budget. Every token spends it, and the budget depletes faster than the context window fills. Anthropic&#8217;s goal for context assembly is the smallest set of high-signal tokens to maximize the likelihood of the outcome you want.</p><p>If we apply this lens, it changes how we engineer context. It&#8217;s no longer a question of &#8220;<em>could</em> this be relevant?&#8221;, but &#8220;does this context earn its tokens?&#8221; We have to weigh the value added by each bit of added context.</p><p>In a way, junk drawer thinking optimizes for the person assembling the context. If nothing is left out, we can&#8217;t miss anything, and we can avoid making tough decisions. It&#8217;s a shortcut akin to tech debt, but we often take it without&nbsp;proper consideration. Instead, we should optimize for what the model actually needs. What context will actually get used?</p><h3>Practical tips</h3><p>In practice, there are a few patterns I recommend:</p><p><strong>Curate first.</strong> When the quality of retrieved content is disappointing, the path of least resistance is to raise &#8220;k&#8221; in the top-k retrieved. This is usually the wrong move. Twenty mediocre chunks are worse than three good ones because the other seventeen are distractors. Instead, rerank and make cuts. Treat every chunk you include as a fact that must be relevant</p><p><strong>Put critical context at the edges.</strong> Instructions, the user&#8217;s prompt, and the most critical facts go at the start or the end.</p><p><strong>Choose your representation deliberately.</strong> You can provide the same underlying data as raw records, prose summaries, structured relationships, etc. But the model will likely not perform equally well across them. I&#8217;ve written previously about getting better results by changing <a href="https://blog.fullrankllc.com/p/dont-make-the-model-do-the-math?r=1arml">how data reaches the model</a> rather than how much of it does. <a href="https://blog.fullrankllc.com/p/evals-are-a-compass?r=1arml">A good evaluation set</a> can help you tune representation.</p><p><strong>Prune agent histories.</strong> Long-running agents accumulate tool outputs, dead-end explorations, and assorted junk state. Trim your context as you go using compaction and structured notes, and drop tool output once it&#8217;s no longer necessary. Treat the agent&#8217;s context window as a working set instead of an archive.</p><h3>Takeaways</h3><p>We might hope that frontier models will just get better at long context, and none of this will matter. It&#8217;s possible, but the trend suggests the opposite. Windows keep getting longer but attention doesn&#8217;t. Every model Chroma tested degraded including the ones explicitly built for long context. As agents start running longer, they&#8217;ll accumulate more and more junk. </p><p>Fortunately, this is a tractable problem, and there are some easy wins. You don&#8217;t need a new model or a bigger window, you need to think of the context as a piece of engineering: something worth testing, curating, and designing.</p><p>Go open your junk drawer and peek inside. Do you really need all those rubber bands?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">I publish practical guidance built on empiricism and research. Subscribe to get it delivered.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>The Chroma study is from mid-2025, so these models are no longer the latest and greatest.  Measurements on current models yielded similar results, though. A recent study found Opus 4.6&#8217;s recall dropping ten points after 800k tokens of activity. They even found that this did not require tricky test cases: blatant examples that a low-context model did not miss were sometimes missed due to context rot. (<em><a href="https://arxiv.org/abs/2605.12366">Classifier Context Rot: Monitor Performance Degrades with Context Length</a></em><a href="https://arxiv.org/abs/2605.12366">. Sam Martin and Fabien Roger. 2026</a>)</p></div></div>]]></content:encoded></item><item><title><![CDATA[The LLM is a jackhammer]]></title><description><![CDATA[Overkill if your problem is a nail.]]></description><link>https://blog.fullrankllc.com/p/the-llm-is-a-jackhammer</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/the-llm-is-a-jackhammer</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 10 Aug 2026 14:30:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AFCZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://blog.fullrankllc.com/p/not-every-ticket-is-your-opus?r=1arml">Last week I compared three Claude tiers on a ticket-sorting task</a>. From the available models, the mid-tier model was the right buy for that scenario. But as I mentioned at the end of the post, we&#8217;ve got other tools in our toolbelt for a tiny sliver of the cost.</p><p>To demonstrate this, I fit an encoder model<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> like the ones we used in ancient times (circa 2019, pre-GPT-3). The model was fine-tuned on about seventeen thousand tickets that weren&#8217;t used last week. This took a little over an hour on my laptop, and cost effectively zero dollars. </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you&#8217;re enjoying this AI best practices series, subsecribe to get it straight in your inbox.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>Data and Methods</h3><p>The task and evaluation was the same as last week. We are predicting the CFPB Product category (11 options) from the user-submitted complaint. The evaluation set is the same 750 tickets from the last post. This time, we added two new models to the mix: the fine-tuned <a href="https://huggingface.co/blog/modernbert">ModernBERT</a> encoder and a <a href="https://huggingface.co/docs/transformers/en/model_doc/distilbert">DistilBERT</a> model as the floor.</p><h3>Bang for Buck, Revisited</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AFCZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AFCZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png 424w, https://substackcdn.com/image/fetch/$s_!AFCZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png 848w, https://substackcdn.com/image/fetch/$s_!AFCZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png 1272w, https://substackcdn.com/image/fetch/$s_!AFCZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AFCZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png" width="1456" height="667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:667,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:153872,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/209574741?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AFCZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png 424w, https://substackcdn.com/image/fetch/$s_!AFCZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png 848w, https://substackcdn.com/image/fetch/$s_!AFCZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png 1272w, https://substackcdn.com/image/fetch/$s_!AFCZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa015b04d-e30b-4402-a775-cb11fdf8125f_2121x972.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The encoder is significantly better than Haiku (+4.7 points, p &lt; 0.001). When compared to Sonnet and Opus, the encoder performed equally well with 85.5% accuracy.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> So it&#8217;s no improvement, but cost is the key. If we estimate the costs of the encoder model based on compute costs, it comes out to something like $0.0041 per 1,000 tickets. This is about 1/300th the cost of Sonnet! <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p><p>Even the most naive option, the DistilBERT model, is statistically indistinguishable from every LLM tier.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a> The question we should be asking goes beyond &#8220;which LLM works best&#8221;, it&#8217;s &#8220;should we be using an LLM at all?&#8221;</p><h3>Revisiting the Cascade</h3><p>Last week, the confidence cascade wasn&#8217;t a winning strategy because Haiku escalated too many tickets. The encoder does better here. Its confidence is a statistic produced during prediction instead of a subjective judgement. Producing it is free, and doesn&#8217;t require a prompt or judge model.</p><p>Having the encoder escalate its lowest-confidence 10%<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a> to Sonnet scores 87.5% accuracy, with a cost of $0.12 per 1,000 tickets. This is significantly better than Sonnet (p = 0.018) or the encoder alone (p = 0.011), at a tenth of Sonnet's price. The encoder is a good judge of what it will get wrong, and a tenth of the tickets carry most of the recoverable error, so its escalations are well-earned.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oTtr!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oTtr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png 424w, https://substackcdn.com/image/fetch/$s_!oTtr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png 848w, https://substackcdn.com/image/fetch/$s_!oTtr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!oTtr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oTtr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png" width="1456" height="990" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:990,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:183854,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/209574741?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oTtr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png 424w, https://substackcdn.com/image/fetch/$s_!oTtr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png 848w, https://substackcdn.com/image/fetch/$s_!oTtr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png 1272w, https://substackcdn.com/image/fetch/$s_!oTtr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2e702150-3b63-4664-9b7d-bb2cd1274b79_1500x1020.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>How Many Labels Does This Take?</h3><p>Of course, nothing is truly free. In this case, the catch is that the encoder needs labeled training data and the LLMs need none. The practical question is what labels would cost you. I priced outsourced labeling at $0.15/label,<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a> but you could plug in your own costs.</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/BQFNO/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/765459f2-e094-4541-9660-af082aa82032_1220x434.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2fd5307-8178-4e89-a0b2-a07797fdd323_1220x558.png&quot;,&quot;height&quot;:272,&quot;title&quot;:&quot;Labeled Training Set Size and Impact&quot;,&quot;description&quot;:&quot;Assuming you don't have pre-labeled data, there are low-cost paths to boosted accuracy.&quot;,&quot;belowTheFold&quot;:true}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/BQFNO/1/" width="730" height="272" frameborder="0" scrolling="no" loading="lazy"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>In this case, one thousand labels gets the encoder to parity with Haiku. Five thousand is enough to get within a couple points of Sonnet, with no statistical difference in this analysis. If you have the tickets, a couple thousand labels is a day or two of annotation.  With the 10% escalation policy, even the 1,000-label encoder is already doing as well as Sonnet at a tenth of the price. The compute costs for training are noise throughout the process: under a dollar per training run. </p><h3>Rare Category Weakness</h3><p>This isn&#8217;t a silver bullet. The encoder performs worse on rare categories.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a> When we fit our model to the empirical distribution, it learns not to focus on classes it rarely sees. A prompted LLM can reason without that prior. In scenarios where tail recall is key, the bias toward LLM may be well-deserved. But a hybrid model, rather than flat encoder, could still be an option.</p><h3>Takeaways</h3><p>Last week there were two layers of takeaway. The first was for the task: skip the cascade, default to Haiku if it&#8217;s low stakes, otherwise use Sonnet for a few points of accuracy. With other modeling approaches in the mix, our conclusions change. The new routing question isn&#8217;t &#8220;Haiku versus Sonnet&#8221;, but &#8220;classifier versus LLM&#8221;. For a defined category list with labels available, a fine-tuned encoder is a better default. We can wire an LLM in as the escalation path for the tickets the encoder flags. </p><p>This actually reinforces the overall takeaway from the last post: these are empirical questions, and we can bring our full toolkit to bear on them. This includes the tools from the pre-LLM era. By quantifying these tradeoffs, your team can make more informed decisions, grounded in the costs and outcomes you care about. You don&#8217;t have to default to the most powerful tool </p><p>Sample code and data are <a href="https://github.com/ryansloan/cfpb-routing">available on GitHub</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to stay up-to-date on the latest blog content and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>The model is ModernBERT-base, a ~150M parameter encoder. I fine-tuned it on 17,274 labeled CFPB complaints that weren&#8217;t part of our evaluation set. It&#8217;s a refresh of the approach used in 2019 BERT models.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Results of paired McNemar test are: encoder vs Sonnet +0.5 pp (95% CI &#8722;1.9 to +3.0, p = 0.75); vs Opus 5 +1.7 pp (p = 0.21). </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>I ran encoder training and inference locally, so to calculate this I priced with rental rates at $0.80/GPU-hour for training. This is actually <em>higher</em> than <a href="https://www.runpod.io/gpu-models/rtx-4090">RunPod's published on-demand rate for an RTX 4090-class card</a>, so if anything the encoder costs are <em>overstated</em>. Inference is priced at measured CPU throughput across 6 threads &#215; $0.04/vCPU-hour each. LLM costs are metered Batch API prices like last week. The ratios are large enough that the pricing assumptions aren&#8217;t really a point of sensitivity, but if you want to tinker with different price points you can change them in the linked repository.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>The DistilBERT model scored 83.5% accuracy. This includes a token cap that truncated 14% of inputs.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>With the way I split the data, choosing a cutoff that scores best on the eval set would leak data and overstate accuracy. Instead, I just fixed a rule in advance: commit to escalating 10% of tickets. In this set, this is not actually the best-scoring budget (15% scores higher), but it is a more honest strategy.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>The encoder is a far better judge of its own errors than the LLMs are of theirs: AUC of confidence predicting correctness is 0.873, against 0.735&#8211;0.806 across the LLM tiers. An omniscient router that uses the cheapest correct source per ticket (when available) gets 93.1% at $0.04/1k, but that&#8217;s cheating!</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>This assumes 30 seconds to read the complaint and label it, at $18/hour contractor rates.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>The encoder has an F1 score of 0.36 on the <em>Prepaid card</em> class, whereas Sonnet scores 0.63. Sonnet&#8217;s macro-F1 (0.820) score beats the encoder&#8217;s (0.791) despite lower accuracy</p></div></div>]]></content:encoded></item><item><title><![CDATA[Not Every Ticket Is Your Opus]]></title><description><![CDATA[Bigger isn't always better, and you don't have to guess which model you need.]]></description><link>https://blog.fullrankllc.com/p/not-every-ticket-is-your-opus</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/not-every-ticket-is-your-opus</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 03 Aug 2026 14:30:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xXfY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;re running an LLM workload, you&#8217;ve probably heard two pieces of standard advice. On one hand: when in doubt, default to the more capable model. It&#8217;s the safest choice, and the quality is worth the price. On the other: optimize your costs by being clever instead. Run a cheap model, check its confidence, and escalate the hard cases to a bigger model.</p><p>I tested a few approaches on a common problem: routing support-ticket-style data. In this case, both bits of standard advice failed. The most capable model bought no detectable advantage, and cascading by model confidence managed to be more expensive and no better.</p><p>Neither approach is necessarily bad advice, but ultimately the better advice is: you don&#8217;t have to guess! Build a model selection strategy based on performance on a baseline set of tasks. This post walks through the process. I don&#8217;t have support ticket data I can write about publicly, so I&#8217;m using a public data set from the CFPB.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><h3>Data and Methods</h3><p>The task is ticket sorting: given the text of a consumer complaint, file it under the right product category. The CFPB consumer complaint database contains real complaints about financial products. I&#8217;ve used the consumer&#8217;s own category choice as the label.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> There are eleven categories, and the model predicts the category based on the complaint narrative.</p><p>I sampled 750 complaints from a recent three-month window stratified proportional to category share. I ran four Anthropic models across three price tiers (Haiku, Sonnet, and both same-priced Opus generations: 4.8, and Opus 5, released while I was writing this). I cached and logged all responses.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p><h3>Bang for Buck</h3><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/V5Npm/2/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35e4f6ce-129d-4cb6-8c8f-72e968d221a7_1220x504.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/207b3001-b2e5-4778-8f19-74ec19996e88_1220x574.png&quot;,&quot;height&quot;:281,&quot;title&quot;:&quot;Accuracy and cost by model tier&quot;,&quot;description&quot;:&quot;&quot;,&quot;belowTheFold&quot;:false}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/V5Npm/2/" width="730" height="281" frameborder="0" scrolling="no"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>I compared the labeling task against a floor that used the most common category (30%). As we&#8217;d expect, every model does far better than that, with accuracies over 80%.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a> But the 2.5x pricing for Opus buys us no detectable boost. The confidence intervals suggest no accuracy gain with Opus, and if anything the point estimate points us the other way, toward Sonnet.</p><div id="datawrapper-iframe" class="datawrapper-wrap outer" data-attrs="{&quot;url&quot;:&quot;https://datawrapper.dwcdn.net/P3Jkq/1/&quot;,&quot;thumbnail_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9cf9976-7420-4442-a0ef-1b26b14be003_1220x472.png&quot;,&quot;thumbnail_url_full&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4761155-442f-4bde-9b67-08f99b6998b5_1220x542.png&quot;,&quot;height&quot;:264,&quot;title&quot;:&quot;How do models compare directly?&quot;,&quot;description&quot;:&quot;&quot;,&quot;belowTheFold&quot;:true}" data-component-name="DatawrapperToDOM"><iframe id="iframe-datawrapper" class="datawrapper-iframe" src="https://datawrapper.dwcdn.net/P3Jkq/1/" width="730" height="264" frameborder="0" scrolling="no" loading="lazy"></iframe><script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();</script></div><p>While I was preparing this post, Opus 5 was released, so I retested using the latest model. It cost about $3 and moved nothing: both generations land on an identical 628 of 750.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a> This is what it looks like in practice to <a href="https://blog.fullrankllc.com/p/evals-are-a-compass?r=1arml">know how a changing model lineup changes performance</a>.</p><p>Paired tests show the same: Sonnet and Opus are both clearly superior to Haiku, but we don&#8217;t see any gains from Opus. Paying for the large tier is just burning cash. If we were handling 100,000 tickets a month, Sonnet costs about $78/month more than Haiku and it buys us 4 points of accuracy. That&#8217;s a tradeoff you can make depending on the cost of a misfiled ticket. But Opus runs us about $184/month more than Sonnet, and it doesn&#8217;t get us anything. That&#8217;s no tradeoff at all, it&#8217;s just a matter of informed spending.</p><h3>Is Cascading Smarter?</h3><p>We might wonder if we could do better with a mix of models. A confidence cascade starts by running the cheap model on everything and requesting a confidence score. If the confidence is below a threshold, it sends the question to a stronger model.&nbsp;This is the standard recommendation in most LLM cost-optimization posts, including the one I was planning to write!</p><p>Asking an LLM to self-report confidence can work reasonably well. Haiku&#8217;s self-reported confidence separates its correct answers from its wrong ones with an AUC of 0.74, and correct answers carry higher confidence on every model I tested. So the premise is good. </p><p>But it falls apart in practice. With the model cascade, Haiku is highly confident on only 21% of tickets. It scores 96.8% on those, so keeping them cheap is right. But the other 79% are low-confidence, so the majority get sent upstream anyway.  There&#8217;s not a &#8220;confident-and-cheap&#8221; bucket of tickets big enough to make the cascade work for us. <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a></p><p>The best Haiku-to-Sonnet cascade (threshold chosen with full hindsight) reaches 85.1% at $1.40 per thousand tickets. Flat Sonnet is 84.9% at $1.23. At this point we&#8217;re using Sonnet for four out of five tickets anyway, and every one of those has a Haiku &#8220;tax&#8221; too. We&#8217;re paying more for a statistical tie.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xXfY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xXfY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png 424w, https://substackcdn.com/image/fetch/$s_!xXfY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png 848w, https://substackcdn.com/image/fetch/$s_!xXfY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png 1272w, https://substackcdn.com/image/fetch/$s_!xXfY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png 1456w" sizes="auto, 100vw"><img src="https://substackcdn.com/image/fetch/$s_!xXfY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png" width="1425" height="990" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:990,&quot;width&quot;:1425,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:138471,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/208588688?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xXfY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png 424w, https://substackcdn.com/image/fetch/$s_!xXfY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png 848w, https://substackcdn.com/image/fetch/$s_!xXfY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png 1272w, https://substackcdn.com/image/fetch/$s_!xXfY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfd76745-c260-4033-9b0a-6149e4588a32_1425x990.png 1456w" sizes="auto, 100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Takeaways and Code</h3><p>On this task: defaulting to Haiku seems like the good answer. It is only 4 points off the best accuracy for a third of the price, and some of its &#8220;misses&#8221; are just disagreements with a noisy human label. If those last 4 points matter, buy flat Sonnet. The model cascade isn&#8217;t worth it, and neither is Opus.</p><p>But that&#8217;s not something we can generalize, which is the actual point! These numbers describe one task and setup. The same measurement on your workload could come out totally differently, so the process is what matters here<strong>. </strong>Define your task, run models against a representative sample and evaluate performance, then compare and decide what to buy. In this case, it took a few hours and less than $20 in tokens. Before recommending high-tier pricing or building a routing layer, this is the sort of audit I start with. It&#8217;s a lot cheaper than building blindly!</p><p><strong>The question &#8220;which model should we use&#8221; can be answered empirically and inexpensively, and there&#8217;s no one-size-fits-all rule.</strong></p><p><a href="https://github.com/ryansloan/cfpb-routing">Sample code and data are available on GitHub</a>.</p><p>But if we&#8217;re talking cheap, every model in this post charges by the token. In the next piece, I run the same 750 tickets through the sort of model we all fine-tuned before GPT-3. The inference cost for those? Roughly zero. Subscribe to see how it holds up next week!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe to get the next post delivered straight to your inbox. It&#8217;s free.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p><a href="https://www.consumerfinance.gov/data-research/consumer-complaints/search/api/v1/?date_received_max=2026-07-23&amp;date_received_min=2026-04-23&amp;field=all&amp;format=csv&amp;has_narrative=true&amp;no_aggs=true&amp;size=23074">CFPB complaint database is downloadable here</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>The labels are chosen by the person filing the complaint, and people can be inconsistent. For example, debt-collection issues may get filed under credit reporting. This means we have to assume there are some built-in errors, and think of accuracy as &#8220;agreement with a human choice&#8221; rather than correctness. In a high stakes scenario, we would devote time to human annotation and cleanup. But we&#8217;re focused on the relative comparison here. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>I disabled thinking for all models. Costs presented are Batch API pricing per 1,000 tickets.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>A better model is probably possible with feature engineering and tuning. The goal of this post was to compare raw model performance against a representative task, not to build the best model.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>The identical score is a coincidence. The two Opus generations disagree on 29 individual tickets. On 13 of those, only Opus 4.8 is right. On another 13, only Opus 5 is right. On the remaining 3 both are wrong and just picked different wrong labels. It&#8217;s a wash.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>We can measure the ceiling for routing using the results across all models. An omniscient oracle that sent each ticket to the cheapest model that gets it right scored 88.3% at $0.53 per thousand, escalating only 7.5% of tickets. This suggests that there is <em>some</em> routing strategy that can increase accuracy, but self-reported confidence isn&#8217;t enough.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Don't make the model do the math]]></title><description><![CDATA[Well-designed agent tools guard against hallucination]]></description><link>https://blog.fullrankllc.com/p/dont-make-the-model-do-the-math</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/dont-make-the-model-do-the-math</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 27 Jul 2026 14:31:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yXkE!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd379b8fe-1941-48a4-bb85-7178b2027dd6_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the <a href="LINK">last post</a>, I showed an agent computing answers that required reasoning over content and structure. The agent proposed an advocacy strategy derived from the combination of semantics and the graph structure. In that post, I claimed that one benefit of this approach is that each of the agent&#8217;s claims can be mapped to specific graph edges that can be verified. I mentioned that in an early experiment, my audit caught the agent getting things directionally right but misattributing votes. I think the failure is instructive in agent design.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you&#8217;re enjoying this series, subscribe for more free data stories straight to your inbox!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h3>The failure</h3><p>I posed the same small business question to the first version of the agent. It produced an answer that was on the right track but blundered into major factual errors. It got the themes right, identifying a family of bills focused on relief and the opposite family that imposed new fees or mandates. It got the roster of sponsors right. But when it transitioned to the meat of the response: the &#8220;cross-aisle Democrats worth cultivating&#8221;,  it named four Democrats as Nay votes on SB 5525.</p><p>Unfortuntaely, zero Democrats voted Nay on SB 5525.</p><p>The same response also described a &#8220;consistent bloc&#8221; of 56 legislators voting Nay on &#8220;all or nearly all&#8221; of four mandate bills. The real all-four bloc is 22 members. The 56 names were all genuine Nay voters somewhere, but the story overstated how much their votes overlapped.</p><p>This verges on worst-case scenario. The response <em>looked</em> credible to someone familiar with the domain. There were specific names, specific bills, and specific vote positions. But many of them were false.  Without manual validation, this sort of error can easily slip through unnoticed, undermining the entire analysis.</p><h3>The diagnosis</h3><p>Of course, we know LLMs can hallucinate. But the claims were very structured, and almost grounded in the facts: real Democrats with crossover reputations, but the wrong bill. I explored a different hypothesis: that the model didn&#8217;t invent the votes, but misassigned real ones.</p><p>The working set for that response contained other employer-mandate bills, including HB 1213, a paid-leave bill. In the actual record, Springer, Chapman, and Rule all voted Nay on HB 1213. These were real votes, breaking with their caucus. Richards voted Nay on HB 1213 <em>and</em> HB 2020. All the agent&#8217;s &#8220;fabricated&#8221; SB 5525 Nay votes were a true HB 1213 Nay. One bill-label swap between two adjacent lists accounts for the entire failure.</p><p>This specific class of error happens a lot. When the context holds many similar tuples, the model will get &#8220;mixed up&#8221;. The reason it showed up here and not earlier is instructive: previous runs only drilled down to one bill, so the evidence was compact and easy to attribute. This run was the first exploring a broad set of legislation: fourteen bills and five very similar Nay lists. Summarizing these (&#8221;who voted Nay on all four?&#8221;) required the model to intersect those lists.  It got the list of dissenters right, but got the specific votes mixed up. The 56-member bloc overstatement was the same failure in a different way: set intersection done by the model instead of in code.</p><h3>Tools maketh the agent</h3><p>Examining the tools I defined, I discovered I&#8217;d made the problem worse. My <code>bill_votes</code> tool returned rows like:</p><pre><code><code>Jim Walsh (R-House): Nay &#8212; 3rd Reading &amp; Final Passage</code></code></pre><p>There&#8217;s no bill ID here. It only appears in the tool-call arguments, one line above forty rows of results. The graph even stores <code>bill_id</code> denormalized on every VOTED edge, but my initial tool call (in the name of brevity), dropped it. So the model was forced to map rows to bills by where they were in the output. This kind of positional binding across adjacent, similar lists is precisely where things go wrong.</p><p>Self-describing rows &#8212; <code>HB 1213 | Jim Walsh (R-House): Nay &#8212; ...</code> &#8212; is a one-line fix that tailors the context for the model.</p><h2>The real fix</h2><p>The formatting fix helps, but we&#8217;re still just treating a symptom. The real insight lines up with what I discussed in the last post:</p><p>This is a failure mode of flat RAG, and while context design goes a long way, ultimately we&#8217;re fighting an uphill battle against the model. </p><p>For claims like these, the&nbsp;right trust boundary is the boundary of the data layer. Move aggregation into tools:</p><ul><li><p><code>voting_bloc(bill_ids, vote)</code> - members who voted a given way on <em>all</em> of these bills</p></li><li><p><code>party_crossovers(bill_ids)</code> - members who voted against their party&#8217;s majority, per bill</p></li><li><p><code>verify_claims(claims)</code> - check a list of specific <code>(member, bill, vote, motion) </code>tuples before they&#8217;re used in a response.</p></li></ul><p>A &#8220;find themes across bills&#8221; question needs to do these things, and the tools allow the agent to run them as direct operations on the graph. The new agent chooses to use them. The transcript behind the last post shows <code>voting_bloc</code> and <code>party_crossovers</code> are used to explore the cross bill space, and <code>verify_claims</code> was used to&nbsp;check the named votes before the response was generated. When I added tools to run these operations in the data layer, all the resulting claims could be verified</p><h2>The takeaway</h2><p>There&#8217;s an obvious takeaway here: give your agents verification tools! The less obvious takeaway is a design principle for agentic retrieval: let the model decide what to compute, but let the data layer compute it. The model&#8217;s job is planning and interpretation: which bills constitute the concept, what the crossover pattern means. If the model is also doing all the joins, you risk one of the common failure modes of flat RAG.</p><p>This sort of structured, interactive data layer makes agents auditable against a class of &#8220;credible but incorrect&#8221; hallucinations. Your agent is as good as its tools.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! There&#8217;s more coming on how you can set agents up for success with the structure of data, tools, and evals. Subscribing is free.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[You can do better than retrieval]]></title><description><![CDATA[Using graph+vector structure to unlock new patterns in data]]></description><link>https://blog.fullrankllc.com/p/you-can-do-better-than-retrieval</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/you-can-do-better-than-retrieval</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 20 Jul 2026 14:31:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!z7Qx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Retrieval systems answer questions about what a corpus says. But sometimes the most valuable answers aren&#8217;t stored directly. They don&#8217;t appear in any document, row, or record. Instead, you&#8217;ll find them in relationships, or the lack thereof. You can&#8217;t retrieve them: they&#8217;re computed.</p><p>One of my favorite publicly available data sources is the <a href="https://wslwebservices.leg.wa.gov/">Washington State Legislature</a><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. In the legislature every bill, sponsor, and roll-call vote is public record, yet the questions an advocate or analyst actually cares about are more strategic. &#8220;Who is cross-pressured on this issue?&#8221; &#8220;Where could a coalition form?&#8221; There&#8217;s no record in the data that directly answers these questions. Answers exist only as patterns blending semantics and relationships: bill text, sponsorships, votes, and oppositions. Strictly speaking, everything is stored; what&#8217;s missing is any record that addresses the question. The answer is derivable, but it&#8217;s not something retrievable in a particular record.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Full Rank! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I built a system to demonstrate how an agent over a structured data layer can derive answers to questions like these. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z7Qx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z7Qx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!z7Qx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!z7Qx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!z7Qx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z7Qx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png" width="1200" height="630" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:630,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1168755,&quot;alt&quot;:&quot;Arc diagram connecting 713 bills to 154 Washington legislators; a faint gray field of all roll-call votes with ~30 highlighted edges showing the crossover votes that answer an advocacy-targeting question.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/206518964?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Arc diagram connecting 713 bills to 154 Washington legislators; a faint gray field of all roll-call votes with ~30 highlighted edges showing the crossover votes that answer an advocacy-targeting question." title="Arc diagram connecting 713 bills to 154 Washington legislators; a faint gray field of all roll-call votes with ~30 highlighted edges showing the crossover votes that answer an advocacy-targeting question." srcset="https://substackcdn.com/image/fetch/$s_!z7Qx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png 424w, https://substackcdn.com/image/fetch/$s_!z7Qx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png 848w, https://substackcdn.com/image/fetch/$s_!z7Qx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png 1272w, https://substackcdn.com/image/fetch/$s_!z7Qx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc9ad8a92-a3e2-4c61-967a-e919321b29e1_1200x630.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">From 129,721 final-passage votes to the thirty that answer the question. Bills on top, legislators on bottom, with the relevant connections highlighted. Sponsorship in green, and orange where a legislator broke with their caucus.</figcaption></figure></div><h2>Data and Methods</h2><p>The dataset is one biennium of Washington State legislative activity (2025&#8211;26): 713 bills that reached a floor vote, 154 members, ~152k individual roll-call votes, ingested via the WA Legislature&#8217;s web services. I organized this data in <a href="https://www.helix-db.com/">HelixDB</a> as a property graph with <code>Bill</code> and <code>Member</code> nodes connected by <code>sponsored</code> and <code>voted</code> edges. Every <code>Bill</code> node has an embedding of its digest. This allows retrieval in two ways: semantic search over bill digests, and traversal over relationships. I built a <a href="https://pydantic.dev/docs/ai/overview/">PydanticAI</a> agent with tools for both kinds of search.</p><p>Some benefits to this structure are obvious, so I kept the evaluation set short: I wrote 12 questions in three categories. Four each of <strong>semantic</strong> (&#8220;which bills deal with unemployment insurance?&#8221;), <strong>relational</strong> (&#8220;which cosponsors of SB 5041 voted against it on final passage?&#8221;), and <strong>hybrid</strong> (&#8220;find the major rent-stabilization bill and report how close its Senate vote was&#8221;). I evaluated two agents with different tools: the control gets flat vector search over bill digests, and the graph agent gets the same embeddings search plus traversal tools.</p><p>The control (vector search only) scored 4/4 on the semantic queries. It&#8217;s not a big surprise - retrieval is good as long as there&#8217;s a relevant passage with the answer. Also as we&#8217;d expect, vector search performed poorly on the relational and hybrid questions, succeeding 0/8 times. It could find the right bill and then say (correctly) that no digest could tell it about voting relationships. The graph agent scored 12/12. This could be useful, but a SQL database with a vector index could tell the same story. The interesting question is more strategic.</p><h2>Exploring Questions with No Record</h2><p>I chose a test case without a specific bill of its own. The idea of &#8220;regulatory burden&#8221; is scattered across legislation for taxes/fees and mandates, so there&#8217;s not a single bill to pin it to. Washington State Legislature is under strong party control, which means nearly everything that reaches the floor passes. The interesting signal then is who deviates from party patterns. The query: <em>&#8220;I represent a coalition of small business owners concerned about growing regulatory and compliance burden. Which WA legislators should we prioritize for outreach? Focus on themes across bills rather than any single bill.&#8221;</em></p><p>The &#8220;regulatory burden&#8221; idea shows up indirectly: there are mandate and fee bills the coalition would oppose, and relief bills it would support. This means to answer, the agent has to construct the concept before it can query for an answer. It does a series of semantic searches and targeted graph traversals, splitting the landscape into two clusters:</p><ul><li><p><strong>Cost and mandate bills</strong>. The relevant bills were <a href="https://app.leg.wa.gov/billsummary/?BillNumber=2081&amp;Year=2025&amp;Initiative=false">HB 2081</a> (a B&amp;O tax surcharge), <a href="https://app.leg.wa.gov/BillSummary/?BillNumber=5786&amp;Year=2025&amp;Initiative=false">SB 5786</a> (broad license and fee increases), <a href="https://app.leg.wa.gov/BillSummary/?BillNumber=5525&amp;Year=2025&amp;Initiative=false">SB 5525</a> (mass-layoff benefit requirements), and <a href="https://app.leg.wa.gov/BillSummary/?BillNumber=1524&amp;Year=2025&amp;Initiative=false">HB 1524</a> (new workplace-standards duties). They&#8217;d increase costs or overhead, so our hypothetical coalition would fight them.</p></li><li><p><strong>Relief bills</strong>. These were near-unanimous: <a href="https://app.leg.wa.gov/BillSummary/?BillNumber=2575&amp;Year=2025&amp;Initiative=false">HB 2575</a> (reduced reporting obligations), <a href="https://app.leg.wa.gov/BillSummary/?BillNumber=5611&amp;Year=2025&amp;Initiative=false">SB 5611</a> and <a href="https://app.leg.wa.gov/BillSummary/?BillNumber=2418&amp;Year=2025&amp;Initiative=false">HB 2418</a> (streamlining permits). Unanimous votes carry no signal, but <em>sponsorship</em> of these bills does. The members who authored these bills chose to be champions for small business relief.</p></li></ul><p>The agent surfaced the swing Democrats who repeatedly crossed party lines on the Cost bills (six House members voted Nay on both HB 2081 and SB 5786) as the highest-value outreach targets, the 22-member bloc that voted Nay on all four mandate bills as the reliable allies, and the Democratic sponsors of the relief bills. For example, it flagged Rep. Edwin Obras, who authored one of the mandate bills and crossed over to vote Nay on another. This sort of signal requires both sponsorships and votes.</p><p>The same approach works multi-hop. Provided a query asking who could reach the opposition, the agent walked sponsorship ties outward to identify the crossover Democrats who cosponsor bills with the opposition&#8217;s members. Then it searched what those crossovers strongly support, traversing to their sponsored bills and searching the digests for bills related to relief.. In this case, it identified Rep. Adison Richards, who was primary sponsor on bills with Republicans. The clearest thread was HB 1902, a bill creating a permitting-streamlining work group, sponsored by Richards and cosponsored by three of the other crossover Democrats.</p><p>Aggregation across bills (voting blocs, crossover counts) ran as structured operations on the data using tool calls, not in the model&#8217;s working memory. This allows for structured, grounded reasoning. Each of the agent&#8217;s claims can be decomposed into specific edges, and I verified these against the graph.</p><p>There was no record the agent could search for stating &#8220;Adison Richards is a potential ally on cost-of-doing-business bills.&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>  Instead, the agent derived this from semantic similarity, opposition dynamics, and the presence (or absence) of support along party lines.</p><h2>Why Structure Matters</h2><p>A flat-vector system can&#8217;t do this. It&#8217;s not a problem with the embeddings (we use the same embeddings for both agents). But the evidence is distributed across relationships that aren&#8217;t encoded in text digests, so this is where the the graph structure comes into play. This isn&#8217;t not about using a specific database or tool. I used a graph+vector database, but you could replicate this structure with a SQL database using vector indices and a junction table. The key is that the computation across bills runs as operations against the data instead of in the model&#8217;s &#8220;head&#8221;.</p><p>Another benefit is <strong>auditability</strong>. An LLM asked this question cold may produce a confident answer without grounding. This agent&#8217;s answer decomposes into specific graph edges representing how members relate to particular&nbsp;legislation through votes and sponsorship. Each  is something I can (and did) verify against the ingested data. In one early experiment, I caught the agent confidently misattributing real votes to the wrong bills (more on that failure and fix in a follow-up post). The resulting data source is rich and auditable, a double win.</p><h2>Limitations</h2><p>This is just a demonstration. We&#8217;re looking at data from a single legislative session, and I&#8217;ve included only floor-vote bills (so anything that failed in committee isn&#8217;t present). The step where the agent clusters concepts is interpretive, so the agent's judgment of what counts as "cost" or "relief" is only as good as the model&#8217;s reasoning. Ideally, a well-guided system should surface that judgment rather than gloss over it. </p><p>Unsurprisingly, prompting also matters: the naive phrasing of the same question produced a single-bill tally. The agent uses these capabilities when the question invited analysis across multiple bills.</p><h2>Takeaways &amp; Code</h2><p>The combination of graph and vector structure is usually pitched as a way of extending RAG to relational facts. It&#8217;s true, but it undersells the benefits. Stored fact lookup (relational or not) is something databases can always do. But the benefits go one step higher, making the corpus&#8217;s <em>latent structure</em> queryable. With the right context and structure, we can explore those unstated patterns and audit what comes out.</p><p><a href="https://github.com/ryansloan/wa-leg-graphrag">The code is available on GitHub</a>. This repository includes the ingest pipeline, graph model, agent tooling, and the eval set with the sample transcripts referenced in this post. The dataset is public record, and the repo has code to retrieve it from Washington State Legislative Web Services.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>I&#8217;ve <a href="link">written about cosponsorship networks in the state legislature before</a>. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>While preparing to publish this piece, I reviewed the stated policy positions of a few legislators. I don&#8217;t think Richards would object to this characterization, based on my review of his <a href="https://www.adisonrichards.com/issues">campaign&#8217;s </a><em><a href="https://www.adisonrichards.com/issues">Issues</a></em><a href="https://www.adisonrichards.com/issues"> page</a>. His platform there names B&amp;O taxes and permitting specifically, the two items the agent surfaced from his votes.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Evals are a Compass]]></title><description><![CDATA[A quality gate tells you if you passed. The better question: where are you going?]]></description><link>https://blog.fullrankllc.com/p/evals-are-a-compass</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/evals-are-a-compass</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Mon, 13 Jul 2026 14:30:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yXkE!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd379b8fe-1941-48a4-bb85-7178b2027dd6_512x512.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The natural mental model for AI evals is unit tests: given some contexts and queries, a model must produce certain outputs. Keeping these &#8220;green&#8221; in continuous integration is the whole game. This is a useful way to manage quality, and there are still a lot of teams who aren&#8217;t doing it. According to <a href="https://www.inngest.com/blog/ai-in-production-report-2026">Inngest&#8217;s AI in Production Report</a>, &#8220;35%<span> of respondents building AI in production are not doing AI evals at all.&#8221;</span></p><p><span>The &#8220;Green CI&#8221; mode of evals is a great first step, but if you stop there, you are leaving an actionable signal on the table.</span></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>Measurements vs. Verdicts</h3><p>A unit test returns a verdict: pass or fail, and fail means something is broken. That&#8217;s the right model for most software: there&#8217;s a correct answer, and anything else is a defect.</p><p>Most of what we want to know about an AI product doesn&#8217;t have that shape, though. Consider a code review tool aimed at security. The question isn&#8217;t &#8220;did it pass,&#8221; it&#8217;s &#8220;when a diff introduces a SQL-injection-class vulnerability, how often does the reviewer catch it?&#8221; The answer is a number, and most of the time it isn&#8217;t green (perfect) or red (broken). It&#8217;s a measurement telling you where your product currently sits on an axis you care about.</p><p>Accuracy rate isn&#8217;t the only metric available. It might be task duration, costs, escalations to human reviewers, or other non-binary quality measures.</p><p>We hear about the benchmarks frontier labs are using to evaluate their models, but you can apply the same concept to your domain. <strong>How are you benchmarking your agents?</strong></p><h3>Where Are We Going?</h3><p>A single performance measurement is a snapshot: reviewer agent identified 68% of vulnerabilities. It&#8217;s interesting, and if you peel back the logs you can get a sense for where your failures are. But it gets more interesting&nbsp;when you do something and measure again.</p><p>Run the same benchmark after you change the prompt, and it&#8217;s 74%. Swap the underlying model, and it falls to 71%. Add a retrieval step, and it drops to 66%, telling you more context isn&#8217;t the answer. The measurements are directional: their movement tells you whether you&#8217;re building toward the product you want.</p><p>A verdict can&#8217;t give you this. Green-to-green tells you nothing about whether you improved. And worse, the <strong>eval-as-gate disposition will incentivize you to write evals for only the most certain cases</strong>. Aspirational cases are to be avoided, because they&#8217;re &#8220;flaky&#8221;.</p><p>It&#8217;s even more powerful when you layer multiple performance metrics. The model swap that saved cash drove escalations up. It allows you to make tradeoffs intentionally instead of guessing.</p><h3>The Suite Life</h3><p>Building a good suite is important. You want to ensure coverage across a range of scenarios, including some that are aspirational. This allows you to capture performance tradeoffs, and get a handle on the model&#8217;s <a href="https://mitsloan.mit.edu/ideas-made-to-matter/working-definitions/what-is-jagged-ai-frontier">jagged edges</a>.</p><p>If the reviewer agent identifies 68% across all vulnerabilities, that&#8217;s a useful average, but there&#8217;s more structure. Break the benchmark out by class (injection, auth, secrets in code, unsafe deserialization) and the flat number resolves into a profile. Suppose the reviewer catches 90% of injection bugs and 30% of auth flaws. That&#8217;s far more actionable than &#8220;68% identified&#8221;, because it&#8217;s a different assessment: the reviewer is missing a certain category.</p><p>Results like these point toward action. Maybe it&#8217;s a prompt issue, or maybe the auth flaws need context beyond the diff and no amount of prompt-tuning will fix it. You don&#8217;t have to tweak things and hope for the best. You can actually experiment.</p><h3>The Price of Direction</h3><p>It&#8217;s not free. A benchmark suite takes time to build and to maintain. You need labeled cases, scored outputs, and experts to calibrate judges. The engineering isn&#8217;t the hard part. You can&#8217;t write a good suite until you know what your product actually promises: which scenarios matter, which tradeoffs you will accept, and what &#8220;good&#8221; actually means for the thing you&#8217;re building. <strong>If you&#8217;re skipping evals, is it because you&#8217;re dodging data labeling, or because you&#8217;re dodging those harder questions?</strong></p><p>This is the real reason to do it. A unit test checks whether you kept a promise you already made. A good eval suite makes you <em>state your promise</em>, and then tells you release over release how close you are to keeping it. CI tells you when something breaks. A compass tells you&nbsp;if you&#8217;re going the right way.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[This is What Your Retention Curve Looks Like]]></title><description><![CDATA[Your free trial length isn't the problem, activation is. Your funnel is more than just a set of KPIs, and can serve as a key diagnostic tool.]]></description><link>https://blog.fullrankllc.com/p/your-retention-curve</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/your-retention-curve</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Tue, 22 Apr 2025 16:04:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/4086695b-40cd-414e-983a-7e6e02f28fb7_312x256.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Free trials are a go-to method for user acquisition in SaaS, and their length can be a hot debate. I&#8217;ve seen PMs, designers, and marketers argue about it a dozen times, and the tradeoff is always the same: long enough to put it through its paces, but short enough to add urgency. If it&#8217;s too long, it will cannibalize our paid business! If it&#8217;s too short, users won&#8217;t &#8220;get&#8221; it. My analysis of the <a href="https://www.geekwire.com/geekwire-200/">Geekwire 200</a> shows that of those with free trials, 14 and 30 day trials are the most common offerings.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> Alice Li found that even for a firm with a 30-day trial, users&#8217; conversions to paid happened after a median 9 days.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> It&#8217;s nice and tidy to snap to weeks or months, and we usually land on a week or two.</p><p><strong>Here&#8217;s the uncomfortable truth: in one week you&#8217;ve already lost most of them.</strong> I don&#8217;t know who you are, but I can tell you that your weekly retention curve looks like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!35hU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!35hU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png 424w, https://substackcdn.com/image/fetch/$s_!35hU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png 848w, https://substackcdn.com/image/fetch/$s_!35hU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png 1272w, https://substackcdn.com/image/fetch/$s_!35hU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!35hU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png" width="312" height="256" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:256,&quot;width&quot;:312,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9339,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.fullrankllc.com/i/161632091?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!35hU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png 424w, https://substackcdn.com/image/fetch/$s_!35hU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png 848w, https://substackcdn.com/image/fetch/$s_!35hU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png 1272w, https://substackcdn.com/image/fetch/$s_!35hU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b9a020-09a2-4179-aa24-9bfd4a216fb5_312x256.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>In <a href="https://mixpanel.com/benchmarks/">Mixpanel&#8217;s 2024 Benchmarks Report</a>, they reported that the <strong>average one-week retention rate was 28%</strong>.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> And it&#8217;s getting worse; the amount varied by vertical but every industry had a year-over-year decrease in retention. This tracks with Li&#8217;s finding that the <strong>first day is the modal point for conversions</strong> by an order of magnitude. By the end of the trial, it&#8217;s too late for most users.</p><h2>We Need to Go Deeper&#8230;</h2><p>The single-biggest hurdle in a free trial <em>is</em> about time, but it&#8217;s not the duration of the trial: it&#8217;s <strong>the time to the user&#8217;s activation</strong>. &#8220;Activation&#8221; is product analytics jargon for the moment a user gets to the moment of value &#8211; the &#8220;aha&#8221; moment that demonstrates why they need what you&#8217;re selling. Activation is a matter of minutes, hours, maybe days, but not almost certainly not weeks. Before you worry about habits, cannibalizing your paid business, or any of that, you have to go a layer deeper than retention.</p><p>The starting point, if you haven&#8217;t already, is to define and measure your funnel. The funnel is like a zoomed-in version of the retention curve. The retention curve measures the funnel&#8217;s global, end-to-end transition percent:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GT5C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GT5C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png 424w, https://substackcdn.com/image/fetch/$s_!GT5C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png 848w, https://substackcdn.com/image/fetch/$s_!GT5C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png 1272w, https://substackcdn.com/image/fetch/$s_!GT5C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GT5C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png" width="674" height="256" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:256,&quot;width&quot;:674,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GT5C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png 424w, https://substackcdn.com/image/fetch/$s_!GT5C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png 848w, https://substackcdn.com/image/fetch/$s_!GT5C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png 1272w, https://substackcdn.com/image/fetch/$s_!GT5C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5e6b8a8-27c6-4b6b-a425-08249e913ca0_674x256.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Your global problem is the aggregate of local problems, and the funnel captures local transitions between the four stages.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a> Breaking data out in this way provides metrics to optimize, but I think the <strong>most productive use of the funnel is actually as a diagnostic tool.</strong> Defining and measuring a funnel requires you to be clear about things like:</p><ul><li><p><strong>What&#8217;s our product&#8217;s <a href="https://mixpanel.com/content/guide-to-product-analytics/chapter_1/">moment of value</a>?</strong> If you have to distill the new user experience into one &#8220;aha&#8221; moment that leads to conversion, what would it be?<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a> How is it measured? Your product has a many meaningful interactions, but trying to make sense of them all at once is overwhelming and rarely yields actionable insight. Start with focus.</p></li><li><p><strong>What steps are absolutely necessary to get to that moment?</strong> As products grow in complexity, their setup processes do too. The funnel provides a lens through which you can focus on what&#8217;s most essential, and can give you the confidence you need to defer (or cut!) the rest of the setup process.</p></li><li><p><strong>How often do you actually expect users to come back?</strong> You&#8217;ll probably be measuring Daily Active Users, and you should be, but there&#8217;s a good chance you don&#8217;t expect most users to return every day. Do you expect them to be there within three days? A week? A month?</p></li></ul><p>If you&#8217;re looking for a framework to help you get started, I&#8217;ve collected some pointers and first-level diagnostics in the <strong>Funnel Diagnostic Worksheet.</strong> The worksheet is for subscribers only, but I&#8217;ve got great news: subscriptions are free!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to get the Funnel Diagnostic Worksheet, plus data stories in your inbox.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Two Common Diagnostic Questions</h2><p>There are loads of diagnostic approaches to take with a funnel, but there are two high-impact questions to start with:</p><p><strong>How many steps are in setup? </strong>A Userpilot study found that only 81% of users don&#8217;t complete their onboarding checklists.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a> Remember: your goal is to get them to &#8220;aha&#8221;. Cut ruthlessly.</p><p><strong>What transition has the lowest conversion percent?</strong> This is where you have to roll up your sleeves and dig into the data. There are a few questions to ask your data:</p><ul><li><p>Have we seen any changes in conversion percent in the last 30 days? 90 days? Year?</p></li><li><p>What groups of users are converting well? This can give an enlightening view into your product&#8217;s personas, and a pointer for product or UX research.</p></li><li><p>When they&#8217;re <em>not</em> converting, what are they doing instead? Grab your favorite analytics software (or analytics person) and wade into the data marshes. Sam Zaiss <a href="https://deliberatedataculture.substack.com/p/finding-needle-in-haystack-of-event-data">wrote a great piece on this</a>. To quote Sam, the common challenges to address at this step are:</p></li></ul><blockquote><ul><li><p>The most insightful user paths aren&#8217;t the most common, so we need another way to identify that signal amidst all the noise.</p></li><li><p>The most meaningful events aren&#8217;t tracked, because they sit on the seams between features or product teams.</p></li><li><p>The most common visualizations aren&#8217;t designed to let the key insights pop, making them harder to discover.</p></li></ul><p><em>Sam Zaiss, <a href="https://deliberatedataculture.substack.com/p/finding-needle-in-haystack-of-event-data">Deliberate Data Culture</a></em></p></blockquote><p>When you view the funnel as a diagnostic tool, it can shine a light on the best places to put your data-savvy folks to work. As you take action on problems, the local transition rates give you a responsive and measurable indicator of progress.</p><h2>Ready to Dig In?</h2><p>If you&#8217;ve been through the basics and aren&#8217;t sure how to go deeper, I&#8217;d love to help.  Full Rank is a data science consultancy that works with small teams that don&#8217;t have full-time data science support. If you complete the Funnel Diagnostic Worksheet, reach out for a free 30-minute consultation.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe for data stories and get the Funnel Diagnostic Worksheet (linked above).</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>The Geekwire 200 marketed the following free trial lengths: 7 days (n=3), 14 days (n=10), 30 days (n=9), 60 days (n=1), 90 days (n=1), unspecified (n=9). Based only on the companies that allowed scraping (n=187)</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Mean conversion was after 23 days. The distribution&nbsp;is multimodal with a smaller hump after the trial&#8217;s endpoint. Keep the denominator in mind here &#8211; this is <em>only the people who converted</em>. Li, Alice. (2021). Converting Free Users to Paid Subscribers in the SaaS Context -The Impact of Marketing Touchpoints, Message Content, and Usage. Production and Operations Management. 31. 10.1111/poms.13672. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p><a href="https://mixpanel.com/benchmarks/">Mixpanel Benchmarks Report</a>. Based on data from 7,700 Mixpanel customers, 11.7 trillion events. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>You may be tempted to add more stages in the middle. <strong>Don&#8217;t.</strong> The most useful funnels are short, clear, and have easily measurable transition points. The more complex your funnel gets, the harder it is to glean meaningful insights. There&#8217;s a time for wading into complexity (and it&#8217;s discussed in this post), but start with simple. The exceptions are at the beginning and end. If you add &#8220;Acquisition&#8221;, &#8220;Referral&#8221;, and &#8220;Revenue&#8221;, you get <a href="https://www.productplan.com/glossary/aarrr-framework/">Pirate Metrics</a>. These are great additions if you have a good way of mapping leads that eventually sign up to their users. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>It&#8217;s really important that you approach the moment-of-value as a user-centric question, not a company-centric one. I&#8217;ve seen teams decide their moment of value is a flashy new feature, not because it&#8217;s the most important to their customer, but because they just spent loads of effort building it.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p><a href="https://pages.userpilot.com/saas-product-metrics-2024/">Userpilot Saas Product Metrics Benchmark 2024.</a> (N=188 companies)</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Startups: Our AI is Revolutionary! 📣 Game-changing! 📣 Responsible? 🦗 ]]></title><description><![CDATA[73% of B2B startups mention AI on their websites, but hype outpaces responsibility in their messaging.]]></description><link>https://blog.fullrankllc.com/p/startups-responsible-ai</link><guid isPermaLink="false">https://blog.fullrankllc.com/p/startups-responsible-ai</guid><dc:creator><![CDATA[Ryan Sloan]]></dc:creator><pubDate>Tue, 04 Mar 2025 22:03:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8f656aeb-aacb-49d2-8ab1-e620d20d728d_927x399.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>This post first appeared as a <a href="https://www.geekwire.com/2025/is-ai-hype-out-of-control-assessing-ai-related-marketing-tactics-on-the-geekwire-200/">guest post on GeekWire</a>.</em></p><p>Last week, I read that a company in Finland is using AI to <a href="https://www.aiconiccoffee.com/">find the &#8220;perfect coffee blend&#8221;</a>. And here I am buying an <em>imperfect</em> blend of beans from a local coffee roaster like a sucker.</p><p>There&#8217;s little question that AI is everywhere. I have a wide network of product managers and data scientists, and the vast majority of them are working on an AI integration or product of some sort. Companies talk about AI with enthusiasm &#8211; who doesn&#8217;t want &#8220;perfect&#8221; coffee? The market&#8217;s roaring enthusiasm for AI technology doesn&#8217;t transfer to individuals, though. <a href="https://news.gallup.com/poll/648953/americans-express-real-concerns-artificial-intelligence.aspx">Gallup&#8217;s 2024 survey</a> found that only 13% of Americans believe AI does more good than harm. On top of that, 77% don&#8217;t trust businesses to use AI responsibly.</p><p>I&#8217;m a data scientist in Seattle, so I wondered: how are local companies approaching the AI trend? Is it really everywhere in the startup bubble, or am I in an even smaller AI bubble? Is the hype out of control? Are they publicly committed to responsibility? (Spoiler: You&#8217;re not going to like all the answers). I took a deep dive into the public-facing content of some of the fastest-growing startups in the Pacific Northwest to analyze their AI-related language.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">This is the first in an ongoing series on the PNW startup ecosystem. Subscribe to receive new posts &#8211; it&#8217;s free!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Data and Methods</h2><p>The <a href="https://www.geekwire.com/geekwire-200/">Geekwire 200</a> is a ranked list of 200 fast-growing startups in the Pacific Northwest. I built a crawler to scan the public-facing websites of the companies on that list, and extract their text. After filtering out sites that prohibit automated crawling, I was left with 187 startups. I pulled down the first two &#8220;layers&#8221; of content from their websites (the homepage, and all pages linked from it), and extracted user-facing text to analyze common phrases.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><p>After an initial analysis of frequent phrases, I built three lists:</p><ul><li><p>Markers for AI. This includes things like &#8220;AI&#8221;, &#8220;artificial intelligence&#8221;, and &#8220;Generative Models&#8221;.</p></li><li><p>Markers for hyperbole. This includes things like &#8220;visionary&#8221;, &#8220;bleeding-edge&#8221;, &#8220;revolutionary&#8221;, and &#8220;perfect&#8221;.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a></p></li><li><p>Markers for AI responsibility. Things like &#8220;Responsible AI&#8221;, &#8220;bias mitigation&#8221;, and &#8220;AI ethics&#8221;.</p></li></ul><p>The way these three lists overlap (or don&#8217;t) is revealing. Onto the findings!</p><h2>All Aboard the B2B AI Train</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JRog!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JRog!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png 424w, https://substackcdn.com/image/fetch/$s_!JRog!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png 848w, https://substackcdn.com/image/fetch/$s_!JRog!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png 1272w, https://substackcdn.com/image/fetch/$s_!JRog!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JRog!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png" width="383" height="399" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:399,&quot;width&quot;:383,&quot;resizeWidth&quot;:383,&quot;bytes&quot;:20535,&quot;alt&quot;:&quot;Bar chart displaying percent of Pacific Northwest startups mentioning AI by market. 73% of B2B, 42% of B2C, 38% of R&amp;D.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Bar chart displaying percent of Pacific Northwest startups mentioning AI by market. 73% of B2B, 42% of B2C, 38% of R&amp;D." title="Bar chart displaying percent of Pacific Northwest startups mentioning AI by market. 73% of B2B, 42% of B2C, 38% of R&amp;D." srcset="https://substackcdn.com/image/fetch/$s_!JRog!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png 424w, https://substackcdn.com/image/fetch/$s_!JRog!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png 848w, https://substackcdn.com/image/fetch/$s_!JRog!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png 1272w, https://substackcdn.com/image/fetch/$s_!JRog!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6be5a15d-7091-46dc-8b5b-8f07f1d1eb84_383x399.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first major difference is clear: 73% of B2B companies are pitching AI, but less than half of consumer and R&amp;D startups are.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> B2B startups have focused these pitches on efficiency. When they talk about AI they use words like &#8220;faster&#8221; and &#8220;maximize engagement&#8221;. Consumer companies focus on terms like &#8220;conversation&#8221; and &#8220;personalization&#8221;, emphasizing the interactivity enabled by Generative AI.</p><h2>Transformational. Revolutionary. Super Stoked.</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uHgT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uHgT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png 424w, https://substackcdn.com/image/fetch/$s_!uHgT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png 848w, https://substackcdn.com/image/fetch/$s_!uHgT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png 1272w, https://substackcdn.com/image/fetch/$s_!uHgT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uHgT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png" width="395" height="409" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:409,&quot;width&quot;:395,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24276,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uHgT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png 424w, https://substackcdn.com/image/fetch/$s_!uHgT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png 848w, https://substackcdn.com/image/fetch/$s_!uHgT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png 1272w, https://substackcdn.com/image/fetch/$s_!uHgT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffda8c44c-8a10-4750-9efb-83a061dc0b18_395x409.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I don&#8217;t go to company websites expecting humility, but the language associated with AI often goes a few steps beyond optimism. I looked at the overlap of hyperbolic language and text about AI. Pre-market R&amp;D companies use the most of it ( and that might be where it&#8217;s most warranted)<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>, but this language isn&#8217;t reserved for the lab. B2B and B2C companies alike are on the &#8220;cutting-edge&#8221;, building &#8220;revolutionary&#8221; tech. Speaking just for myself, this language almost always rings hollow, whether it&#8217;s about a spreadsheet or the &#8220;perfect&#8221; AI-generated coffee blend. &#129393;</p><h2>Who&#8217;s Taking Responsible AI Seriously?</h2><p>Gallup&#8217;s findings revealed that people don&#8217;t have high hopes that companies will use AI responsibly. But there&#8217;s a light at the end of the anxiety-tunnel: 57% of respondents reported that<strong> their concerns would be reduced if businesses were transparent about how AI is used</strong>. I looked at how companies discuss their commitments and actions to responsible AI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N4PC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N4PC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png 424w, https://substackcdn.com/image/fetch/$s_!N4PC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png 848w, https://substackcdn.com/image/fetch/$s_!N4PC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png 1272w, https://substackcdn.com/image/fetch/$s_!N4PC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N4PC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png" width="395" height="409" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:409,&quot;width&quot;:395,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:24282,&quot;alt&quot;:&quot;Bar chart displaying percent of AI startups  discussing responsible AI. 20% of B2B, 14% of B2C, 0% of R&amp;D.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Bar chart displaying percent of AI startups  discussing responsible AI. 20% of B2B, 14% of B2C, 0% of R&amp;D." title="Bar chart displaying percent of AI startups  discussing responsible AI. 20% of B2B, 14% of B2C, 0% of R&amp;D." srcset="https://substackcdn.com/image/fetch/$s_!N4PC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png 424w, https://substackcdn.com/image/fetch/$s_!N4PC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png 848w, https://substackcdn.com/image/fetch/$s_!N4PC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png 1272w, https://substackcdn.com/image/fetch/$s_!N4PC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcc89a4e-bdfa-4e38-8a08-d1bb32e442e1_395x409.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The current state of the world won&#8217;t inspire hope in those 57% of Americans. <strong>Only 19% of the companies talking about AI shared anything at all about their commitments to responsible AI, model evaluation, or bias mitigation. </strong>I didn&#8217;t expect a majority, but I was a little taken aback. There wasn&#8217;t a high bar for inclusion here: merely stating &#8220;StartupCo believes in responsible AI&#8221; would&#8217;ve counted. When the vast majority of companies aren&#8217;t even paying lip-service to responsibility, is it any wonder that people don&#8217;t trust them?</p><h2>It&#8217;s Not All Bleak: Bright Spots and Actions</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zMLX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zMLX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png 424w, https://substackcdn.com/image/fetch/$s_!zMLX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png 848w, https://substackcdn.com/image/fetch/$s_!zMLX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png 1272w, https://substackcdn.com/image/fetch/$s_!zMLX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zMLX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png" width="927" height="399" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:399,&quot;width&quot;:927,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26437,&quot;alt&quot;:&quot;Combined bar chart showing percents of startups mentioning AI, AI hyperbole, and responsible AI.&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Combined bar chart showing percents of startups mentioning AI, AI hyperbole, and responsible AI." title="Combined bar chart showing percents of startups mentioning AI, AI hyperbole, and responsible AI." srcset="https://substackcdn.com/image/fetch/$s_!zMLX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png 424w, https://substackcdn.com/image/fetch/$s_!zMLX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png 848w, https://substackcdn.com/image/fetch/$s_!zMLX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png 1272w, https://substackcdn.com/image/fetch/$s_!zMLX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50c6c3cd-f83d-4ca7-bd99-5be98de674f8_927x399.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It doesn&#8217;t paint a rosy picture, but there are bright spots. Some PNW startups doing this well. <a href="https://www.responsive.io/product/ai/principles/">Responsive AI&#8217;s Committment to Ethical AI </a>and <a href="https://www.humanly.io/ai-that-elevates">Humanly&#8217;s Ethical AI Manifesto</a> outline the design principles and frameworks used to develop their product. <a href="https://textio.com/ai/building-responsibly">Textio&#8217;s Building Responsibly page</a> describes some of the procedural and statistical methods used to evaluate models and mitigate bias.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a> If you&#8217;re a team building an AI product and you&#8217;re not sure where to start with responsible AI, you can look to your peers working on this already.</p><p>If you&#8217;re ready to roll up your sleeves, <a href="https://techpolicylab.uw.edu/data-statements/">Data Statements</a> provide a clear place to start. This form of documentation was originally proposed by Emily M. Bender and Batya Friedman in a 2018 paper at UW. As Gallup reported, transparency is a key first step to winning consumer trust. But documentation about the provenance, characteristics, and handlers of the data provide benefits that go beyond building customer confidence. Every data set is biased, whether you&#8217;ve quantified it or not. Data statements like these also provide the builders with a framework for identifying gaps and risks. They&#8217;re fertile soil for growing your responsible AI efforts.</p><p>Faced with overstocked aisles of AI products, consumers will vote with their wallets. When the hype fades, unease about responsible AI may remain. Why should they trust your company? Have you earned that trust? What do you owe to your customers and neighbors, and how can you get started today?</p><h2>What About <em>Your</em> Product?</h2><p>If you haven&#8217;t started rigorously evaluating your models, now&#8217;s the best time to start. If you could use help measuring and mitigating bias in your AI products, <strong>I&#8217;ve done it before, and I&#8217;d love to work with your team</strong>. <a href="https://www.linkedin.com/in/ryansloan">Reach out</a> and let&#8217;s talk about how we can work together to understand the performance of your AI features, identify and address biases, and give you (and your customers) peace of mind.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/p/startups-responsible-ai?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Know someone who might like this? It&#8217;s public, feel free to share with a friend or colleague.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://blog.fullrankllc.com/p/startups-responsible-ai?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://blog.fullrankllc.com/p/startups-responsible-ai?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Technically speaking, I extracted <a href="https://en.wikipedia.org/wiki/Lemmatization">lemmatized</a> <a href="https://en.wikipedia.org/wiki/N-gram">n-grams</a> in the text, for 1&#8804;n&#8804;4.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>We have to be a little careful about classifying hyperbolic language. Company websites are marketing materials which skew optimistic. No one&#8217;s buying an app from Eeyore. I narrowed my focus only to clear extremes.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Companies with multiple markets were tagged by their primary selling strategy. Companies working on new technologies without a clear path to purchasing were classified as &#8220;R&amp;D&#8221;. The number of companies in each group was B2B: 146, B2C: 33, R&amp;D: 8.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Pre-market R&amp;D is also a very small group of companies, in this chart n=3.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>Disclosure: I worked at Textio, where I developed and coauthored some of their methods. Obviously I think they&#8217;re pretty good. But you can read them and judge for yourself.</p></div></div>]]></content:encoded></item></channel></rss>