<?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 Full Rank LLC. 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>Sat, 05 Sep 2026 05:16:01 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[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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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="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="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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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"><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>