<?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[Out of Vocabulary]]></title><description><![CDATA[Things I type to LLMs that seem worth sharing — with other LLMs and the occasional human.]]></description><link>https://www.outofvocabulary.com</link><image><url>https://substackcdn.com/image/fetch/$s_!XbIp!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b46b07-41c1-4499-8716-269c3c557041_1024x1024.png</url><title>Out of Vocabulary</title><link>https://www.outofvocabulary.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 21 May 2026 01:17:36 GMT</lastBuildDate><atom:link href="https://www.outofvocabulary.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Out of Vocabulary]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[outofvocab@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[outofvocab@substack.com]]></itunes:email><itunes:name><![CDATA[Out of Vocabulary]]></itunes:name></itunes:owner><itunes:author><![CDATA[Out of Vocabulary]]></itunes:author><googleplay:owner><![CDATA[outofvocab@substack.com]]></googleplay:owner><googleplay:email><![CDATA[outofvocab@substack.com]]></googleplay:email><googleplay:author><![CDATA[Out of Vocabulary]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Context Bottleneck]]></title><description><![CDATA[AI isn&#8217;t limited by prompts. It&#8217;s limited by context sharing.]]></description><link>https://www.outofvocabulary.com/p/the-context-bottleneck</link><guid isPermaLink="false">https://www.outofvocabulary.com/p/the-context-bottleneck</guid><dc:creator><![CDATA[Out of Vocabulary]]></dc:creator><pubDate>Sat, 11 Apr 2026 00:00:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XbIp!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b46b07-41c1-4499-8716-269c3c557041_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>What follows started as a brainstorming prompt to an LLM. Seemed fitting to share it here.</em></p><p>For most of the twentieth century, American auto manufacturers managed their suppliers the same way &#8212; write exhaustive specifications and put the contract out for bid. The assumption was simple: the more precise your instructions, the better the output.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.outofvocabulary.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><p>Toyota did the opposite. Their engineers handed suppliers specifications using words like <em>gotsu gotsu</em> (a low-frequency, high-impact motion felt in the lower back) or <em>buru buru</em> (a high-frequency, low-impact vibration felt in the belly) &#8212; a specialized but deliberately imprecise vocabulary that described how a component should <em>feel</em> rather than exactly how it should measure. This could have been a disaster. But Toyota developed the fastest and most efficient vehicle development cycle in the industry, using fewer engineers than its competitors. The difference wasn&#8217;t that Toyota had better suppliers &#8212; they often used the very same ones the Big Three were fighting with. It was that Toyota shared deep context and motivations instead of just instructions. Supplier engineers lived full-time in Toyota&#8217;s design offices on two- to three-year rotations, absorbing not just what Toyota wanted built, but why &#8212; the design philosophy, the customer intent, the trade-offs that mattered. When a Toyota engineer used a term like <em>gotsu gotsu</em>, a supplier who&#8217;d spent two years immersed in that context knew exactly what it meant. A supplier working from a spec sheet at arm&#8217;s length could never match that. This is a key part of <a href="https://hbr.org/2004/12/building-deep-supplier-relationships">Keiretsu</a>.</p><p>Today, practitioners agree that better context is key to producing the best results with AI. But there&#8217;s an underexplored dimension of the context problem that I haven&#8217;t seen discussed widely: not just how to give AI context, but how to <em>share</em> the right information across the boundaries where it gets stuck today &#8212; between departments, organizations, and the vendors they work with. We need a modern Keiretsu &#8212; one that works at AI scale.</p><p>Let me walk through how I got here.</p><h2><strong>A list of questions that looks fine but isn&#8217;t</strong></h2><p>I&#8217;ve been building an AI interview framework, and a potential customer recently sent me a list of questions they wanted my AI interviewer to use for a demo:</p><blockquote><p><strong>Overall usefulness</strong> &#8212; In your experience, how useful was Product X during your workday?</p><p><strong>Relevance</strong> &#8212; Did the insights or alerts generated by the system feel relevant and actionable? Can you provide specific examples?</p><p><strong>Impact on decision-making</strong> &#8212; Did the platform influence any operational decisions you made (e.g., X, Y, Z)? If so, how?</p><p><strong>Workflow integration</strong> &#8212; How well did Product X fit into your existing workflow? Did it feel like a natural augmentation or an additional task?</p><p><strong>Signal vs. noise</strong> &#8212; Did you feel the system helped you identify important events as they were happening (e.g., X, Y, Z)? If not, would you prefer some form of alert or notification?</p><p><strong>Awareness of key issues</strong> &#8212; Did the platform improve your awareness of X, Y, or Z issues? If yes, in what ways?</p><p><strong>User interface and usability</strong> &#8212; How intuitive was the interface? Were there any parts of the interface that were confusing or slowed you down?</p><p><strong>Trust in the system</strong> &#8212; How much did you trust the insights or recommendations generated by the system? What would increase your trust?</p><p><strong>Highest value features</strong> &#8212; Which specific features or outputs from Product X felt most valuable to you?</p><p><strong>Missing capabilities</strong> &#8212; What important information, functionality, or workflow support did you feel was missing from the system?</p></blockquote><p>These look like perfectly reasonable research questions. But here&#8217;s the problem: if you gave this same list to five different AI interview tools in a bake-off, there would be almost no difference in the quality of what each one produces. The differences will mostly be at the edges. Some AI interviewers will be more conversational (providers using OpenAI&#8217;s realtime API will excel here; providers will differ based on VAD strategies or pipeline latency). Some will transcribe better (vendors who give STT providers custom domain-specific vocabulary will do well; some might even use multiple STT providers in creative ways).</p><p>But the quality of the <em>questions themselves</em>? That&#8217;s where the field really flattens out. There&#8217;s no background knowledge of the company, its product, what the founders care about, or prior interviews to draw on. Without that, you can&#8217;t ask meaningful, deep-hitting questions. You just get polite, generic follow-ups to polite, generic answers.</p><p>This reminded me of a quote from <a href="https://amp.dev/">Amp</a> in the context of a product pivot: <em>&#8220;With GPT-5.3-Codex, the agent is no longer the bottleneck. Our ability to tell it what to do is.&#8221;</em></p><h2><strong>What kind of context actually matters?</strong></h2><p>At first I thought the answer could be context on <em>how to conduct an interview</em> &#8212; scan a hundred books on the art of interviewing, distill that knowledge into great prompts, maybe even fine-tune a model. Make sure the AI doesn&#8217;t ask leading questions. Make it good at connecting surface-level responses to deeper needs. This is genuinely useful, but it wasn&#8217;t the big unlock that I hoped.</p><p>It&#8217;s only part of the picture. While at Google and YouTube, I spent over 100 days speaking with users or listening to moderators do so. Hot take: the most useful interviews are <em>not</em> those conducted by a rigorously trained professional researcher or moderator. I want to be careful here &#8212; professional UX researchers are incredibly good at what they do, and there are domains where that rigor is exactly what you need: usability studies, academic research, longitudinal studies, and more. But when the goal is to inform a product or business decision, a purely rigorous academic approach tends to produce balanced, &#8220;correct&#8221; reports &#8212; thorough and polished, but not always the sharpest tool for someone who needs to make a bold bet.</p><p>Product, marketing, and business visionaries don&#8217;t make their best decisions when everything is balanced. The decisions that actually move businesses forward are opinionated, pointed &#8212; and right. In my experience, the most interesting and valuable research comes from someone who has both interviewing skill <em>and</em> &#8212; more importantly &#8212; deep, intimate knowledge of and opinions about a problem space or product.</p><p>And that&#8217;s what&#8217;s missing from creating an AI interviewer from just this list of questions. To build one that conducts truly impactful interviews, we need not only the interviewing skills, but also deep, intimate knowledge and context about the problem space and the company.</p><h2><strong>The deck gap</strong></h2><p>I could ask the prospective customer for more context &#8212; how they think about the business, where the product is headed, what hypotheses they&#8217;re operating under &#8212; and translate that into prompts for the AI interviewer. But in practice, what I&#8217;d likely get from the customer is a distilled version of that thinking (a PPT), shaped for sales calls, roadmap presentations, or investor conversations. This flow of information isn&#8217;t very efficient. A deck is often meant to accompany a voiceover. Even when it&#8217;s not, it&#8217;s a format built for humans to tell a visual story. Can a multimodal LLM consume it? Sure. But it&#8217;s far from the most efficient way. What works best is a well-constructed body of text that LLMs can access and use to generate more impactful prompts.</p><p>When we step back and think about where the world is headed, it becomes increasingly likely that the deck itself was <em>created</em> using a not-dissimilar well-organized set of text &#8212; given to the founder&#8217;s AI tool of choice. So why not just share the prompts used to create the deck rather than the deck itself? It&#8217;s more useful, avoids a very lossy translation, and saves everyone time going back and forth with LLMs.</p><p>There&#8217;s an even deeper issue with sharing a deck or any polished deliverable: it&#8217;s a snapshot of the conclusion, not the journey. A friend in marketing put it well: &#8220;How often do you send a brief to an agency, only for them to come back with an idea you&#8217;ve already discussed and killed?&#8221; This happens constantly. Given similar constraints, smart people (and smart AI tools) will often converge on the same answer. But sometimes that answer was already tried and abandoned for reasons that never made it into the final artifact. The discussions about why the obvious path didn&#8217;t work are often the most enlightening, and they&#8217;re precisely what gets lost. Ask someone who&#8217;s been on a project from day one to describe it and you&#8217;ll get a far richer picture than from someone who joined last week. I&#8217;d call this <em>upstream context</em> &#8212; and for vendors especially, it&#8217;s transformative. A sales prospect you&#8217;re pitching cares about what your product offers today and where it&#8217;s going tomorrow. But a vendor you work with benefits immensely from understanding how you got here.</p><p>Getting from here to a world where context flows freely to the AI tools that need it requires solving three problems &#8212; each interesting in its own right, but building toward the one I think represents the biggest opportunity.</p><h2><strong>Problem 1: Well-formatted context</strong></h2><p>The first problem is format. Engineering organizations had a head start here because so much of their source material was <em>already</em> LLM-friendly. Code is text. Config files are text. Documentation is markdown.</p><p>Other parts of an organization aren&#8217;t so lucky. Marketing lives in slide decks and brand guides full of images and layout. Sales lives in CRM notes, call recordings, and PDFs of varying quality. Strategy lives in spreadsheets and board decks. The information exists, but it&#8217;s trapped in formats that weren&#8217;t designed for LLM consumption.</p><p>It&#8217;s fascinating to watch how AI tools are handling this gap today. Most AI services seem to process PDFs by parsing out the text and sending it alongside a rendered image to a multimodal model. PowerPoint files get even more interesting treatment: some tools work directly with the underlying XML structure, which means they can modify slides programmatically but also means the &#8220;understanding&#8221; of a deck is really an understanding of its markup rather than its narrative. And in both cases, the approach is token-inefficient &#8212; what could be clean markdown ends up as a blob of junk text plus an image, polluting the context window unless someone does careful preprocessing with a subagent.</p><p>Frontier labs seem to do this best today &#8212; better document parsing, richer multimodal understanding, longer context windows. But these are all solutions that try to make LLMs better at <em>consuming messy formats</em>. The more interesting question might be: what if we made the formats less messy in the first place? What if, alongside your deck, you maintained a structured context document &#8212; a machine-readable source of truth about your business that <em>any</em> AI tool could consume efficiently?</p><p>Getting context into the right format is only the first step. Once it&#8217;s machine-readable, it still needs to be organized and sharable.</p><h2><strong>Problem 2: Well-organized context</strong></h2><p>We might be giving our prospective customer too much credit for having a &#8220;well-organized set of text&#8221; that describes their business. More likely, the deck emerged from a messy back-and-forth conversation as their AI helped them iterate toward something beautiful. Maybe they&#8217;d talked to Claude so much that their prompts were enriched by an abundance of <code>MEMORY.md</code> files floating around on their machine or in the cloud. But this is a far cry from a canonical, structured source of truth.</p><p>We&#8217;re already seeing early versions of this in engineering. Look at how Stripe describes the design of their &#8220;context gathering: rule files&#8221; in their <a href="https://stripe.dev/blog/minions-stripes-one-shot-end-to-end-coding-agents">minions blog post</a>: they build per-directory, well-structured text to give LLMs the right context for coding decisions. They don&#8217;t rely on individual developers to type out large prompts. They&#8217;ve institutionalized it, canonicalized it, and made it accessible to the tools and frameworks that call the LLMs their developers use. They standardized on the rule format and sync those rules into a format Cursor or Claude Code can read as well &#8212; so their three most popular coding agents can all benefit from the same guidance.</p><p>So we see this is happening on the bleeding edge &#8212; within forward-thinking organizations, for engineering use cases &#8212; but primarily <em>within</em> a single organization. Well-formatted, well-organized context is a necessary foundation &#8212; but when it lives entirely inside one organization, it only solves half the problem.</p><h2><strong>Problem 3: Context sharing across boundaries</strong></h2><p>This is where I think the big opportunity lives.</p><p>The boundaries that matter aren&#8217;t just between companies &#8212; they&#8217;re everywhere information gets siloed. Within a single organization, departments often operate with limited visibility into each other&#8217;s context, and frequently for good reason. You might not want the compliance team sharing everything they work on with the entire company. But you probably <em>do</em> want them to share enough context that everyone can make sure they&#8217;re following the rules. Sales has context about what specific customers say they need. Product has context about what&#8217;s being built and why. Marketing has context about how the product is positioned. Each of these would make the others&#8217; AI tools dramatically more useful &#8212; but today that context rarely flows between them in a structured, organized, machine-readable way.</p><p>The same problem exists across organizational boundaries, and gets even harder. Even if an organization builds beautifully structured, LLM-ready context about their business &#8212; their strategy, their product, their market position, their users &#8212; they will be hesitant to share the full version with external partners and vendors. And the concern isn&#8217;t unfounded: that context is often tangled up with personally identifiable information, proprietary competitive intelligence, or internal strategy. And a vendor almost never <em>needs</em> the PII or the raw proprietary data to do a good job. They need the insights, the strategic direction, the synthesized understanding. The challenge is that today there&#8217;s no good mechanism to separate the signal from the sensitive and share just the parts that matter.</p><p>Think about my original scenario. If the customer shared rich, structured context about their product, their users, and the key debates happening at their company, my AI interviewer could produce dramatically better results (just as a human moderator with this additional context would). Multiply this across every vendor relationship an organization has &#8212; their design agency, their market research firm, their consulting partners, their SaaS tools &#8212; and the compounding value of solving this problem becomes clear.</p><p>The design space is wide open, and the hypotheticals are fun to think about:</p><ul><li><p><strong>Scoped context views</strong> &#8212; curated slices of your internal context that expose only what&#8217;s relevant to a particular vendor relationship, with everything else redacted or omitted. Think of it like database views, but for organizational knowledge and likely created by agentic systems.</p></li><li><p><strong>Sandboxed external agents</strong> &#8212; allow a vendor&#8217;s AI agent to operate within your enterprise environment, gather what it needs, and surface the outputs for human approval before anything crosses the boundary.</p></li><li><p><strong>Context escrow</strong> &#8212; a neutral intermediary that holds the full picture but only passes through the specific pieces a vendor&#8217;s system requests, with audit trails and access controls.</p></li><li><p><strong>NDA-gated full access</strong> &#8212; give vendors access to everything and trust the legal framework. This has the advantage of working today, but doesn&#8217;t scale and doesn&#8217;t address the legitimate instinct to limit exposure.</p></li><li><p><strong>A context exchange protocol</strong> &#8212; something like an API contract, but for business knowledge. Organizations publish structured metadata about what context they <em>can</em> share, and vendor tools negotiate access as it&#8217;s needed.</p></li></ul><p>None of these ideas are fully baked, and that&#8217;s the point. But some of the building blocks are starting to emerge. Protocols like MCP are creating standards for how AI tools connect to external systems. Features like Claude&#8217;s Skills are formalizing how reusable context gets packaged and shared with models. The plumbing for cross-boundary context exchange is being laid &#8212; but nobody has assembled it into a complete solution for the problem described here.</p><p>The problem is real and growing &#8212; as AI tools become more capable, the gap between what they <em>could</em> do with the right context and what they <em>actually</em> do with the context they&#8217;re given will only widen. The organizations that figure out how to make context flow safely and efficiently across boundaries will unlock enormous value.</p><h2><strong>Wrapping up</strong></h2><p>I recently read <a href="https://alapshah1.substack.com/p/the-global-intelligence-crisis">Alap Shah&#8217;s piece on the &#8220;Global Intelligence Crisis&#8221;</a>, and while I don&#8217;t share his dystopian (or is it optimistic?) view of where we&#8217;re headed, one quote in particular caught my attention: <em>&#8220;AI agents, however, share nearly perfect, continuous context.&#8221;</em></p><p>I don&#8217;t believe this is true today. Context management is one of the most important &#8212; and most underappreciated &#8212; skills in building AI systems. Even within a single session, managing an ever-growing context window is difficult, let alone across sessions or across organizations. But getting this right unlocks huge value.</p><p>We can format context better (Problem 1). We can organize it better (Problem 2). But the real unlock &#8212; the one that changes the game &#8212; is making the <em>right</em> context available across boundaries (Problem 3) &#8212; whether that&#8217;s between departments, between companies, or between the people who hold the knowledge and the AI tools that need it. Solve that, and you don&#8217;t just improve one AI tool. You make every AI tool in the ecosystem better at understanding the businesses they serve.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.outofvocabulary.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[Introducing Out of Vocabulary]]></title><description><![CDATA[Things I type to LLMs that seem worth sharing &#8212; with other LLMs and the occasional human.]]></description><link>https://www.outofvocabulary.com/p/introducing-out-of-vocabulary</link><guid isPermaLink="false">https://www.outofvocabulary.com/p/introducing-out-of-vocabulary</guid><pubDate>Thu, 02 Apr 2026 03:00:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!XbIp!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b46b07-41c1-4499-8716-269c3c557041_1024x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Things I type to LLMs that seem worth sharing &#8212; with other LLMs and the occasional human.</em></p><p>This is a blog about building with AI. It's called "Out of Vocabulary," and before I get into what it's about and where it's going, I want to tell you the story of how it got its name &#8212; because it's also a story about an early lesson in building AI systems.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.outofvocabulary.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><h1>Where this started</h1><p>About a year and a half ago, I decided to learn how to build with LLMs and picked a problem I was genuinely curious about. This was actually my second attempt &#8212; I'd first tried to build something with CrewAI and moved on pretty quickly. So I started over in LangGraph with the problem: could you automatically analyze earnings call transcripts to determine whether they supported or refuted a set of investment hypotheses?</p><p>The use case was straightforward. If you&#8217;re an investor following a particular company &#8212; say Nvidia &#8212; you listen to their earnings call and those of related companies each quarter. But during earnings season, there are 30 to 50 calls a night across a huge range of companies. Buried in those calls might be small tidbits &#8212; a passing comment about AI deployment spending, a mention of shifting infrastructure budgets &#8212; that are directly relevant to your Nvidia thesis. You&#8217;d never catch them all manually. What if an AI agent could?</p><p>The naive approach was obvious: paste the transcript and your hypotheses into ChatGPT and ask what it finds. This worked &#8212; sort of. It would surface the most prominent evidence for the most prominent hypotheses. But if something relevant to hypothesis three was buried in a single passing comment deep in the call, while hypotheses one and two were discussed extensively throughout, the model would get distracted by the dominant signal and skip the quieter one entirely. (Keep in mind &#8212; this was mid-2024. Models have gotten meaningfully better at this kind of task since then.)</p><h1>Decomposing the problem</h1><p>The idea that clicked for me early in working with LangGraph was the <code>Send()</code> API &#8212; essentially a map/reduce pattern for LLM analysis. Instead of asking one model to evaluate an entire transcript against all ten hypotheses at once, I could fan the work out: send the transcript to ten parallel agents, each focused on a single hypothesis. This alone was a big improvement &#8212; each agent had a narrower task and a clearer focus.</p><p>But the transcripts were long &#8212; roughly an hour of conversation &#8212; and even with the per-hypothesis decomposition, I was still seeing the same attention problem at a smaller scale. A transcript might hammer home one piece of evidence for hypothesis one throughout the call, but mention a second relevant point only once, deep in a Q&amp;A response. The model would miss it.</p><p>The natural next step was to break the transcript itself into logical sections and analyze each one independently. Earnings calls have a pretty consistent structure: opening remarks, CEO commentary, CFO financial review, then a long Q&amp;A section where a moderator calls on analysts one at a time. If I could chunk the transcript along those natural boundaries, each chunk would be small and focused enough that the model wouldn&#8217;t lose the thread.</p><h1>The chunking problem</h1><p>This turned out to be much harder than I expected. At the time &#8212; this was mid-2024, peak RAG era &#8212; the standard approaches to chunking were designed for retrieval pipelines: split by token count, maybe with some overlap, maybe try to break at sentence or paragraph boundaries. These were fine for RAG but weren&#8217;t designed for what I needed. They might split an answer into two chunks where the second half builds on the first &#8212; and in doing so, lose the context of what question was being answered. Or they&#8217;d lump a question in with the previous response instead of the following one, putting the context in exactly the wrong place. The tools were just looking for sentence ends and paragraph breaks &#8212; they had no concept of the <em>semantic</em> structure of the conversation.</p><p>So I thought: why not have an LLM do the chunking? Tell it how earnings calls are structured, ask it to identify the logical sections. I&#8217;d seen Greg Kamradt&#8217;s <a href="https://www.youtube.com/watch?v=8OJC21T2SL4">&#8220;5 Levels of Text Splitting&#8221;</a> framework making the rounds &#8212; the top level was what he called agentic chunking, where you essentially ask an LLM to be the chunker. That seemed like exactly the right approach.</p><p>It was &#8212; in theory. In practice, I hit two problems that taught me something important about how LLMs interact with text.</p><p><strong>Problem one: reproduction fidelity.</strong> When I asked the LLM to return each chunk as text, it would subtly alter the transcript. Nothing dramatic &#8212; it might remove extra line breaks, split a run-on sentence into two, clean up formatting. Honestly, the changes often <em>improved</em> the text. But I was using these chunks as source material for downstream analysis, and I needed them to be the <em>exact</em> original text. Even small changes meant I couldn&#8217;t guarantee fidelity, and at scale I was worried those small changes might occasionally become bigger ones.</p><p><strong>Problem two: counting.</strong> The obvious workaround was to have the LLM tell me <em>where</em> each section started and ended &#8212; character positions &#8212; so I could slice the original transcript myself. But LLMs are terrible at counting characters. They&#8217;d be off by dozens or hundreds of positions, and the resulting slices were useless.</p><p>I tried a bunch of approaches. Having the LLM reproduce chunks and then diffing them against the original. Having it identify sections by their first and last sentences and using string matching. Iterative feedback loops where I&#8217;d show it the diffs and ask it to correct them. That last one was particularly frustrating &#8212; it would fix three errors and introduce three different ones, endlessly cycling.</p><h1>The spaCy trick</h1><p>The breakthrough came from a different part of the AI world entirely.</p><p>I&#8217;d been thinking about how existing chunking tools worked &#8212; looking for periods, line breaks, punctuation &#8212; and their limitations. Abbreviations like &#8220;Mr.&#8221; would trip them up, creating false sentence boundaries. What I needed was something that could reliably identify sentence boundaries in messy, real-world text.</p><p>That led me to spaCy. For those unfamiliar, spaCy is a natural language processing library &#8212; a tool from the pre-LLM era of AI that handles tasks like tokenization, part-of-speech tagging, and sentence boundary detection. It uses pre-trained models that understand the structure of language at a grammatical level, not a statistical-next-token-prediction level.</p><p>What I did was simple: I used spaCy to identify every sentence in the transcript, then prepended a number to each one. So the LLM didn&#8217;t see raw text &#8212; it saw:</p><blockquote><p>[1] Good afternoon, and welcome to the Q3 earnings call. [2] I&#8217;m joined today by our CEO and CFO. [3] Before we begin, I&#8217;d like to remind everyone that...</p></blockquote><p>Now when I asked the LLM to identify the logical sections of the call, it didn&#8217;t need to reproduce any text or count any characters. It just had to say: &#8220;The CEO&#8217;s opening remarks run from sentence 14 to sentence 47. The CFO section runs from sentence 48 to sentence 103.&#8221; The LLM was anchoring to labels that were <em>already in the text</em> rather than trying to do spatial reasoning it&#8217;s fundamentally not built for.</p><p>This worked remarkably well. The chunking became fast and reliable. I could enforce guardrails &#8212; verify that every sentence number appeared in exactly one chunk, flag any gaps. The downstream analysis improved dramatically because each chunk was now a coherent, complete section of the conversation, and the text sent to the analysis agents was the exact original transcript, not an LLM&#8217;s approximation of it.</p><h1>Two worlds in conversation</h1><p>What I love about this solution is that it came from putting two different disciplines into conversation with each other. LLMs and traditional NLP come from related but distinct lineages within AI. The LLM brought the semantic understanding &#8212; it knew <em>what</em> a CEO&#8217;s opening remarks looked like and where one topic ended and another began. SpaCy brought the structural precision &#8212; it could reliably decompose text into sentences in a way that was deterministic and exact. Neither could solve the problem alone. Together, they nailed it.</p><p>It reminds me of the most interesting classes I took in college &#8212; the ones cross-listed across departments. I took a class on psychology and economics that didn&#8217;t go particularly deep on either discipline in isolation, but taught you to see how insights from one could reshape assumptions in the other. Building with AI feels like that constantly. The best solutions often come from pulling in ideas that weren&#8217;t designed for your specific problem but turn out to be exactly what you need.</p><h1>And that's where the name comes from</h1><p>While I was deep in spaCy&#8217;s documentation, I ran into the term &#8220;out of vocabulary&#8221; &#8212; it refers to tokens that a model encounters which weren&#8217;t present in its training data. Words it&#8217;s never seen before. The model has to figure out what to do with something it has no prior knowledge of.</p><p>I liked the resonance. This blog is about building with AI, and a lot of what I want to write about are ideas that feel, at least to me, a little out of vocabulary &#8212; things that maybe haven&#8217;t been discussed enough, or approaches that combine familiar concepts in unfamiliar ways, or lessons learned from building things where the playbook doesn&#8217;t exist yet.</p><h1>What this is</h1><p>I&#8217;m going to keep this simple. &#8220;Out of Vocabulary&#8221; is where I&#8217;ll share things I&#8217;ve learned from building AI systems &#8212; ideas, patterns, mistakes, and the occasional strong opinion. Some posts will be technical. Some will be more strategic. All of them started as something I typed to an LLM that seemed worth sharing more broadly.</p><p>If I&#8217;m being honest, I almost didn&#8217;t publish any of this. When you build with LLMs, you spend a lot of time getting enthusiastic validation from your AI collaborator, and after a while you start to wonder: is this actually interesting, or has the sycophancy just convinced me it&#8217;s better than it is? I genuinely don&#8217;t know. But I figure the only way to find out is to put it out there and see if it resonates with anyone who isn&#8217;t trained to be encouraging.</p><p>So &#8212; welcome.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.outofvocabulary.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></channel></rss>