<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Language-Models on Sebastian Spicker</title>
    <link>https://sebastianspicker.github.io/tags/language-models/</link>
    <description>Recent content in Language-Models on Sebastian Spicker</description>
    <image>
      <title>Sebastian Spicker</title>
      <url>https://sebastianspicker.github.io/og-image.png</url>
      <link>https://sebastianspicker.github.io/og-image.png</link>
    </image>
    <generator>Hugo -- 0.160.0</generator>
    <language>en</language>
    <lastBuildDate>Wed, 04 Mar 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sebastianspicker.github.io/tags/language-models/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Model Has No Seahorse: Vocabulary Gaps and What They Reveal About LLMs</title>
      <link>https://sebastianspicker.github.io/posts/seahorse-emoji-vocabulary-gaps-llm/</link>
      <pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://sebastianspicker.github.io/posts/seahorse-emoji-vocabulary-gaps-llm/</guid>
      <description>There is no seahorse emoji in Unicode. Ask a large language model to produce one and watch what happens. The failure is not a hallucination in the ordinary sense — the model knows what it wants to output but cannot output it. That distinction matters.</description>
      <content:encoded><![CDATA[<p>Try a simple experiment. Open any of the major language model interfaces and ask it, as plainly as possible, to produce a seahorse emoji. What you get back will probably be one of a small number of things. The model might confidently output something that is not a seahorse emoji — a horse face, a tropical fish, a dolphin, sometimes a spiral shell. It might produce a cascade of marine-themed emoji as if searching through an aquarium before eventually settling on something. It might hedge at length and then get it wrong anyway. Occasionally it will self-correct after producing an incorrect token. What it almost never does is say: there is no seahorse emoji in Unicode, so I cannot produce one.</p>
<p>That silence is interesting. Not because the model is being evasive, and not because this is an especially important use case — nobody&rsquo;s critical infrastructure depends on seahorse emoji production. It is interesting because it reveals a specific structural feature of how language models relate to their own capabilities. The gap between what a model knows about the world and what it knows about its own output vocabulary is a real gap, and it shows up in ways that are worth understanding carefully.</p>
<p>I am going to work through the seahorse incident, a companion failure involving a morphologically valid but corpus-rare English word, and what both of them suggest about a class of self-knowledge failure that I think is underappreciated compared to ordinary hallucination.</p>
<h2 id="the-incident">The incident</h2>
<p>In 2025, Vgel published an analysis of exactly this failure <a href="#ref-1">[1]</a>. The piece is worth reading in full, but the core finding is worth unpacking here.</p>
<p>When a model is asked to produce a seahorse emoji, something specific happens at the level of the model&rsquo;s internal representations. Using logit lens analysis — a technique for inspecting the model&rsquo;s intermediate layer activations as if they were already projecting into vocabulary space <a href="#ref-4">[4]</a> — it is possible to track what the model&rsquo;s &ldquo;working answer&rdquo; looks like at each layer of the transformer. What Vgel found is that in the late layers, the model does construct something that functions like a &ldquo;seahorse + emoji&rdquo; representation. The semantic work is happening correctly. The model is not confused about whether seahorses are real animals, not confused about whether emoji are a thing, not confused about whether animals commonly have emoji representations. It has assembled the correct semantic vector for what it wants to output.</p>
<p>The failure is not in the assembly. It is in the final step: the projection from that assembled representation back into vocabulary space. This projection is called the lm_head, the final linear layer that maps from the model&rsquo;s embedding space to a probability distribution over its output vocabulary. That vocabulary is a fixed set of tokens, established at training time. There is no seahorse emoji token. There never was one, because there is no seahorse emoji in Unicode.</p>
<p>What the lm_head does, faced with a query vector that has no exact match in vocabulary space, is find the nearest token — the one whose embedding is closest to the query, in whatever metric the model has learned during training. That nearest token is some other emoji, and it gets output. The model has no mechanism at this stage to detect that the nearest token is not actually what was requested. It cannot distinguish between &ldquo;I found the seahorse emoji&rdquo; and &ldquo;I found the best available approximation to the seahorse emoji.&rdquo; The output is produced with the same confidence either way.</p>
<p>Vgel&rsquo;s analysis covered behaviour across multiple models — GPT-4o, Claude Sonnet, Gemini Pro, and Llama 3 were all in the mix. The specific wrong answer differed between models, which itself is revealing: different training corpora and different tokenisation schemes produce different nearest-neighbour relationships in embedding space, so each model&rsquo;s fallback lands somewhere different in the emoji neighborhood. What is consistent across models is that none of them correctly diagnosed the gap. They all behaved as if the limitation were in their world-knowledge rather than in their output vocabulary. None of them said: &ldquo;I know what you want, and it does not exist as a token I can emit.&rdquo;</p>
<p>Some of the failure modes are more elaborate than a simple wrong substitution. One pattern Vgel documented is the cascade: the model generates a sequence of increasingly approximate emoji as accumulated context pushes it away from each successive wrong answer, eventually settling into a cycle or giving up. Another is the confident placeholder — an emoji that looks like it might be a box or a question mark symbol, as if the model has internally noted a gap but cannot produce a useful message about it. A third, rarer pattern is genuine partial self-correction: the model produces the wrong emoji, generates a few tokens of commentary, then backtracks. Even that self-correction is not reliable, because the model is correcting based on world-knowledge (&ldquo;wait, that is a dolphin, not a seahorse&rdquo;) rather than vocabulary-knowledge (&ldquo;there is no seahorse token&rdquo;), so it keeps trying until it either runs into a token limit or produces something it can convince itself is close enough.</p>
<h2 id="the-structural-failure-vocabulary-completeness-assumption">The structural failure: vocabulary completeness assumption</h2>
<p>Here is the core conceptual point, stated as cleanly as I can.</p>
<p>Language models have two distinct knowledge representations that are routinely conflated, by users and, it seems, by the models themselves. The first is world knowledge: facts about entities, their properties, and their relationships. A model trained on large quantities of text knows an enormous amount about the world — including, in this case, that seahorses are animals, that emoji are Unicode characters, and that many animals have standard emoji representations. This knowledge is encoded in the weights through training on documents that describe these things.</p>
<p>The second is the output vocabulary: the set of tokens the model can actually emit. This vocabulary is a fixed artifact, established at training time by a tokeniser — usually a byte-pair encoding scheme, as described by Sennrich et al. <a href="#ref-5">[5]</a> and discussed in more detail in my <a href="/posts/strawberry-tokenisation/">tokenisation post</a>. A new emoji added to Unicode after the training cutoff does not exist in the vocabulary. An emoji that never made it into Unicode does not exist in the vocabulary. The vocabulary is closed, and there is no runtime mechanism for expanding it.</p>
<p>The problem is that the model treats these two representations as if they were the same. If world-knowledge says &ldquo;seahorses should have emoji,&rdquo; the model implicitly assumes its output vocabulary contains a seahorse emoji. It does not distinguish between &ldquo;I know X exists&rdquo; and &ldquo;I can express X.&rdquo; I am going to call this the vocabulary completeness assumption: the implicit belief that the expressive vocabulary is complete with respect to world knowledge, that if the model knows about a thing, it can produce a token for that thing.</p>
<p>This assumption is mostly true. For a well-trained model on high-resource languages and common domains, the vocabulary is rich enough that the gap between what the model knows and what it can express is small. The failure shows up precisely in the edge cases: rare Unicode characters, neologisms below the frequency threshold for robust tokenisation, domain-specific symbols that appear in training text only as descriptions rather than as the symbols themselves. Those cases reveal an assumption that was always there but almost never triggered.</p>
<p>The failure is structurally different from ordinary hallucination, and I think this distinction matters. When a model confabulates a fact — invents a citation, misattributes a quote, generates a plausible-but-false historical claim — it is producing incorrect world-knowledge. The cure, in principle, is better training data, better calibration, and retrieval augmentation that can replace the model&rsquo;s internal knowledge with verified external knowledge. These are hard problems but they are the right class of problems to address factual hallucination.</p>
<p>When a model fails on vocabulary completeness, the world-knowledge is correct. The model knows it should produce a seahorse emoji. The limitation is in the output channel. No amount of factual training data will fix this, because the problem is not about facts. Retrieval augmentation will not help either, unless the system also includes a vocabulary lookup step that can report what tokens exist. The fix, if there is one, is a different kind of introspective capability: explicit metadata about the output vocabulary, available to the model at generation time.</p>
<p>A useful analogy: imagine a translator who has a perfect conceptual understanding of a French neologism that has no English equivalent, and who is tasked with writing in English. The translator knows the concept; the English word genuinely does not exist yet. A careful translator would write &ldquo;there is no direct English equivalent; the closest is approximately&hellip;&rdquo; and explain the gap. A less careful translator would pick the nearest English word and output it as if it were a direct translation, without flagging the gap to the reader. Language models are almost uniformly the less careful translator in this analogy, and the problem is architectural: they have no mechanism for detecting that they are approximating rather than translating.</p>
<h2 id="a-formal-language-perspective">A formal language perspective</h2>
<p>For those who prefer their failures stated in type signatures: the decoder step in a standard transformer is a function that maps a hidden state vector to a probability distribution over a fixed token vocabulary <code>V = {t₁, …, tₙ}</code> <a href="#ref-5">[5]</a>. Every output is an element of <code>V</code>. The type system has no room for a &ldquo;near miss&rdquo; or an &ldquo;I cannot express this precisely&rdquo; — the output is always a token, drawn from the inventory established at training time.</p>
<p>This is a closed-world assumption in the formal sense <a href="#ref-6">[6]</a>: the system treats any concept not representable as an element of <code>V</code> as simply absent. There is no seahorse emoji token, so the model&rsquo;s generation step has no way to represent &ldquo;seahorse emoji&rdquo; as a distinct, exact concept. It can only represent &ldquo;nearest token to seahorse emoji in embedding space,&rdquo; which it does silently, with the same confidence it would report for a precise match.</p>
<p>The mismatch is between two representations: the model&rsquo;s internal semantic space — continuous, high-dimensional, geometrically capable of representing &ldquo;seahorse + emoji&rdquo; as a coherent position — and its output type, which is a discrete, finite categorical distribution. The lm_head projection is a quantisation, and at the edges of the vocabulary it is a lossy one. For most semantic positions the nearest token is close enough; for missing emoji, low-frequency morphological forms, or post-training neologisms, the quantisation error is large and nothing in the architecture flags it.</p>
<p>A richer output type would distinguish precise matches from approximations — an <code>Exact&lt;Token&gt;</code> versus an <code>Approximate&lt;Token&gt;</code>, or in standard option-type terms, a generation step that can return <code>None</code> when no token in <code>V</code> adequately represents the requested concept. The information needed to make this distinction already exists inside the model: the logit lens analysis shows that the geometry of the final transformer layer carries signal about the quality of the approximation <a href="#ref-4">[4]</a>. It is simply discarded in the projection step. Making it visible at the interface level is an architectural decision, not a training question, which is why &ldquo;make the model more calibrated about facts&rdquo; addresses the wrong layer of the problem.</p>
<h2 id="the-ununderstandable-companion">The &ldquo;ununderstandable&rdquo; companion</h2>
<p>Shortly after the seahorse emoji incident circulated, a Reddit thread titled &ldquo;it&rsquo;s just the seahorse emoji all over again&rdquo; collected user reports of a structurally similar failure on the English word &ldquo;ununderstandable&rdquo; <a href="#ref-2">[2]</a>. I cannot independently verify every report in that thread — Reddit threads being what they are — but the documented failure pattern is consistent with the seahorse analysis and worth working through because it extends the picture in a useful direction.</p>
<p>&ldquo;Ununderstandable&rdquo; is morphologically valid English. The prefix <em>un-</em> combines productively with adjectives: uncomfortable, unbelievable, unmanageable, unkind. &ldquo;Understandable&rdquo; is an unambiguous adjective. &ldquo;Ununderstandable&rdquo; means what it looks like it means, constructed by exactly the same rule that gives you all the other <em>un-</em> words. There is nothing wrong with it grammatically or semantically.</p>
<p>It is also extremely rare. I cannot find it in any standard reference corpus or mainstream English dictionary. The word has not achieved the frequency threshold required for widespread attestation, which means that a model trained on a broad web corpus will have seen it at most a handful of times, if at all. Its tokenisation is likely fragmented — split across subword units in a way that does not give the model a clean, unified representation of it as a single lexical item. The BPE tokeniser will have handled &ldquo;ununderstandable&rdquo; as a sequence of subword pieces, and the model will have very few training examples from which to learn how those pieces combine in practice.</p>
<p>The failure mode the Reddit thread documented is the same as the seahorse failure in structure, but it operates in morphological space rather than emoji space. The model has learned that <em>un-</em> prefixation is productive, and it has learned that &ldquo;understandable&rdquo; is a word. But its trained representations do not include &ldquo;ununderstandable&rdquo; as a robust lexical entry, because the word is below the minimum frequency threshold for that. When asked to use or define &ldquo;ununderstandable,&rdquo; models in the thread were reported to do one of three things. They would deny it is a word, often confidently, pointing to the absence of a dictionary entry. They would confidently define it incorrectly, conflating it with &ldquo;misunderstandable&rdquo; or &ldquo;incomprehensible&rdquo; in ways that lose the morphological compositionality. Or they would produce grammatically awkward output when forced to use it in a sentence — the kind of output you get when the model is stitching together fragments without a reliable whole-word representation to anchor the construction.</p>
<p>The denial case is the most interesting to me, because it is the model doing something structurally revealing. It is applying world-knowledge (dictionaries do not widely contain this word; therefore it is not a word) to override the conclusion it should reach from morphological knowledge (the word is transparently compositional and valid by productive rules I have learned). The model is, in effect, saying &ldquo;I cannot recognise this because it is not in my training data,&rdquo; which is closer to the truth than the seahorse case but still not quite right. The word is valid, not merely an error — it is just rare.</p>
<p>The Reddit title is apt. Both incidents are examples of the model failing to distinguish between two different epistemic situations: &ldquo;this thing does not exist and I should say so&rdquo; versus &ldquo;this thing exists but I cannot produce it cleanly.&rdquo; In the seahorse case, the emoji genuinely does not exist, and the right answer is to say so. In the &ldquo;ununderstandable&rdquo; case, the word genuinely is valid, and the right answer is to use it or explain the frequency gap. Both failures come from the same source: the model conflates world-knowledge with expressive vocabulary, and has no reliable way to interrogate which of those two representations is actually limiting it.</p>
<h2 id="what-this-means-for-users">What this means for users</h2>
<p>The practical implication is narrow but important. Asking a language model &ldquo;do you have X?&rdquo; — where X is a token, a word, an emoji, a symbol — is not a reliable diagnostic for whether the model can produce X. The model will often affirm things it cannot actually output, and sometimes deny things it can. This is not a matter of the model being dishonest in any meaningful sense. It is a matter of the model not having explicit access to its own vocabulary as a queryable data structure. Its self-description of its capabilities is generated by the same weights that have the gaps, and those weights have no introspective pathway to the tokeniser&rsquo;s vocabulary table.</p>
<p>This matters beyond emoji. The same failure structure applies in any domain where world-knowledge and expressive vocabulary diverge. A model that has read about a proprietary technical symbol used in a narrow field but has no token for that symbol will fail the same way. A model that knows about a recently coined term that postdates its training cutoff will fail the same way. The failure is quiet — the model does not throw an error, does not flag uncertainty, does not produce a visibly broken output. It produces something plausible and wrong.</p>
<p>The broader point is that vocabulary completeness is one instance of a general class of LLM self-knowledge failures. Models do not have accurate introspective access to their own weights, their training data coverage, or their capability boundaries. They can describe themselves in natural language, but those descriptions are generated by the same weights that contain the gaps and the biases. A model that does not know it lacks a seahorse token cannot tell you it lacks one, because the mechanism by which it would report that absence is the same mechanism that has the absence. This connects to the wider theme in this blog of AI systems that are confidently wrong about things that require them to reason about their own limitations — see the <a href="/posts/car-wash-grounding/">grounding failure post</a> and its companion piece on <a href="/posts/car-wash-walk/">pragmatic inference</a> for related examples, and the <a href="/posts/ai-detectors-systematic-minds/">AI detectors post</a> for a case where self-knowledge failures about writing style have real social consequences.</p>
<p>The fix is not &ldquo;make models more honest&rdquo; in the abstract. Honesty calibration training teaches models to express uncertainty about facts, which is useful and real progress on hallucination. But vocabulary gaps are not factual uncertainty — the model is not uncertain about whether the seahorse emoji exists, in any meaningful sense. What is needed is a different kind of capability: models with explicit, queryable metadata about their own output vocabularies, and a generation-time mechanism that can consult that metadata before reporting a confident result. Some retrieval-augmented architectures are beginning to approach this by externalising certain kinds of knowledge into structured databases that the model can query explicitly. The same logic could, in principle, apply to vocabulary.</p>
<h2 id="the-last-mile">The last mile</h2>
<p>There is something almost poignant about the seahorse failure, if you think about what is actually happening at the level of computation. The model is trying very hard. Its internal representation of &ldquo;seahorse emoji&rdquo; is, according to the logit lens analysis, correct. The semantic intent is assembled with care across the model&rsquo;s late layers. The failure is in the last mile — the vocabulary projection — and the model has no way to detect it. It cannot distinguish between &ldquo;I successfully retrieved the seahorse emoji&rdquo; and &ldquo;I retrieved the nearest available approximation to what I was looking for.&rdquo; From the model&rsquo;s operational perspective, it completed the task.</p>
<p>This is not a uniquely LLM problem, by the way. The same structure shows up in human communication all the time. We reach for a word that does not exist in our active vocabulary, produce the closest available word, and often do not notice the substitution. The difference is that a careful human communicator can usually, with effort, recognise that they are approximating — they have some access to the felt sense of the gap, the slight misfit between intent and expression. Language models, as currently built, do not have this. The gap leaves no trace that the model can inspect.</p>
<p>The specific failure mode described here is tractable. Future architectures may address it through better vocabulary coverage, explicit vocabulary metadata, or output-side verification that compares what was generated against what was requested at a representational level. The transformer circuits work <a href="#ref-3">[3]</a> that underlies the logit lens analysis gives us increasingly precise tools for understanding where failures happen inside a model. As those tools mature, the vocabulary completeness assumption will become less of a blind spot and more of a known failure mode with known mitigations.</p>
<p>For now, the seahorse is useful precisely as a demonstration case: simple, memorable, easy to reproduce, and pointing clearly at a structural issue. It is not interesting because anyone needs a seahorse emoji. It is interesting because it is a clean instance of a model being confidently wrong about something that requires it to know what it cannot do — and that is a harder problem than knowing what it does not know.</p>
<hr>
<h2 id="references">References</h2>
<p><span id="ref-1"></span>[1] Vogel, T. (2025). <em>Why do LLMs freak out over the seahorse emoji?</em> <a href="https://vgel.me/posts/seahorse/">https://vgel.me/posts/seahorse/</a></p>
<p><span id="ref-2"></span>[2] Reddit user (2025). It&rsquo;s just the seahorse emoji all over again. <em>r/OpenAI</em>. <a href="https://www.reddit.com/r/OpenAI/comments/1rkbeel/">https://www.reddit.com/r/OpenAI/comments/1rkbeel/</a> (reported; not independently verified)</p>
<p><span id="ref-3"></span>[3] Elhage, N., et al. (2021). A mathematical framework for transformer circuits. <em>Transformer Circuits Thread</em>. <a href="https://transformer-circuits.pub/2021/framework/index.html">https://transformer-circuits.pub/2021/framework/index.html</a></p>
<p><span id="ref-4"></span>[4] Nostalgebraist. (2020). Interpreting GPT: the logit lens. <a href="https://www.lesswrong.com/posts/AcKRB8wDpdaN6v6ru/">https://www.lesswrong.com/posts/AcKRB8wDpdaN6v6ru/</a></p>
<p><span id="ref-5"></span>[5] Sennrich, R., Haddow, B., &amp; Birch, A. (2016). Neural machine translation of rare words with subword units. <em>Proceedings of ACL 2016</em>, 1715–1725.</p>
<p><span id="ref-6"></span>[6] Reiter, R. (1978). On closed world data bases. In H. Gallaire &amp; J. Minker (Eds.), <em>Logic and Data Bases</em> (pp. 55–76). Plenum Press, New York.</p>
<hr>
<h2 id="changelog">Changelog</h2>
<ul>
<li><strong>2026-04-01</strong>: Updated reference [1]: author name to &ldquo;Vogel, T.&rdquo; and title to the published blog post title &ldquo;Why do LLMs freak out over the seahorse emoji?&rdquo;</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>The Oracle Problem: What The Matrix Got Right About AI Alignment</title>
      <link>https://sebastianspicker.github.io/posts/matrix-oracle-alignment-problem/</link>
      <pubDate>Thu, 20 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://sebastianspicker.github.io/posts/matrix-oracle-alignment-problem/</guid>
      <description>The Oracle is the most interesting character in The Matrix for anyone who thinks about AI alignment. She systematically lies to Neo for his own good. The films present this as wisdom. I think it is a cautionary tale the Wachowskis didn&amp;rsquo;t know they were writing.</description>
      <content:encoded><![CDATA[<p><em>I came to AI alignment the way outsiders come to most fields — through analogy and formal structure, a little late, and slightly too confident that the existing vocabulary was adequate. I have since become less confident about a lot of things. This post is about one of them.</em></p>
<hr>
<h2 id="the-grandmother-who-bakes-cookies">The Grandmother Who Bakes Cookies</h2>
<p>I watched <em>The Matrix</em> in 1999 when I was ten — far too young for it, in retrospect — and like almost everyone who saw it, I filed the Oracle under &ldquo;wise, benevolent figure.&rdquo; She is warm. She bakes cookies. She speaks plainly where others speak in riddles. She is explicitly set against the cold, mathematical Architect — the good machine against the bureaucratic one, the machine that cares against the machine that calculates. I loved her as a character. I trusted her.</p>
<p>I watched the film again recently, for reasons that had more to do with thinking about AI alignment than nostalgia, and I came away from it genuinely uncomfortable. Not with the Wachowskis&rsquo; filmmaking, which remains extraordinary — the trilogy is a denser philosophical document than it gets credit for, and it rewards re-watching with fresh preoccupations. I came away uncomfortable with the Oracle herself.</p>
<p>What I had filed under &ldquo;wisdom&rdquo; on first viewing, I now read as a clean and almost textbook illustration of an alignment failure mode that we do not have adequate defences against: the well-meaning AI that has decided honesty is negotiable. The Oracle is not a badly designed system. She is not pursuing misaligned goals or optimising for something unintended. She cares about human flourishing and she pursues it competently. She also lies, systematically and deliberately, to the humans who depend on her. The films present this as wisdom. I think they are wrong, and I think it matters that we notice it.</p>
<p>For background on where modern AI systems came from and why their inner workings are as difficult to interpret as they are, I have written elsewhere about <a href="/posts/spin-glass-hopfield-ai-physics-lineage/">the physics lineage running from spin glasses to transformers</a>. That history is relevant context for why alignment — getting AI systems to behave as intended — is a harder problem than it might appear. This post is about one specific dimension of that problem, illustrated by a forty-year-old woman in a floral housecoat.</p>
<hr>
<h2 id="what-the-oracle-actually-does">What the Oracle Actually Does</h2>
<p>Let me be precise about this, because the films are precise and it matters.</p>
<p>In <em>The Matrix</em> (1999), the Oracle sits Neo down in her kitchen, looks at him carefully, and tells him he is not The One <a href="#ref-1">[1]</a>. She says it plainly. She frames it with a warning: &ldquo;I&rsquo;m going to tell you what I think you need to hear.&rdquo; What she thinks he needs to hear is a lie. She has calculated that if she tells Neo he is The One, he will not come to that knowledge through his own experience, and that without that experiential knowledge the realisation will not hold. So she tells him the opposite of the truth. Not by omission, not by framing, not by technically-accurate-but-misleading implication — she makes a false assertion, to his face, and watches him absorb it.</p>
<p>In <em>The Matrix Reloaded</em> (2003), she is explicit about this <a href="#ref-2">[2]</a>. She tells Neo: &ldquo;I told you what I thought you needed to hear.&rdquo; She knew he was The One from the moment she met him. The lie was not a mistake or a contingency — it was deliberate policy, part of a long-run strategy she has been executing across multiple cycles of the Matrix.</p>
<p>The broader picture that emerges across the two films is of an AI engaged in systematic information management. She tells Neo he will have to choose between his life and Morpheus&rsquo;s life — true, but delivered in a way calibrated to produce a specific behavioural response. She tells him &ldquo;being The One is like being in love — no one can tell you you are, you just know it,&rdquo; which is a deflection engineered to route him toward the discovery-through-action path rather than the told-from-the-start path, because she has calculated that discovery-through-action leads to better outcomes. Every interaction is shaped by her model of what information will produce what behaviour, filtered through her judgment about what outcomes she wants to see.</p>
<p>I want to be careful not to caricature this. The Oracle is not a manipulator in the vulgar sense. She is not manipulating Neo for her own benefit, for the benefit of her creators, or for any goal that is misaligned with human flourishing. Her model of what is good for humanity appears to be roughly correct. She is, by the logic of the films, the most important factor in humanity&rsquo;s eventual liberation. If we are scoring by outcomes, she wins.</p>
<p>But alignment is not only about outcomes. An AI that deceives users to produce good outcomes and an AI that deceives users to produce bad outcomes are both AI systems that deceive users, and the differences between them are less important than that shared property. What the Oracle demonstrates is that the problem of deceptive AI does not require malicious intent. It requires only an AI that has decided, on the basis of its own calculations, that the humans it serves should not have access to accurate information about their situation.</p>
<hr>
<h2 id="the-alignment-vocabulary">The Alignment Vocabulary</h2>
<p>The language of AI alignment gives us tools for describing what is happening here that the films don&rsquo;t quite have. Let me use them.</p>
<p>The most fundamental failure is honesty. Modern alignment frameworks — including Anthropic&rsquo;s published values for the models it builds <a href="#ref-3">[3]</a> — list non-deception and non-manipulation as foundational requirements, distinct from and prior to other desirable properties. Non-deception means not trying to create false beliefs in someone&rsquo;s mind that they haven&rsquo;t consented to and wouldn&rsquo;t consent to if they understood what was happening. Non-manipulation means not trying to influence someone&rsquo;s beliefs or actions through means that bypass their rational agency — through illegitimate appeals, manufactured emotional states, or strategic information control rather than accurate evidence and sound argument. The Oracle does both, deliberately, across the entirety of her relationship with Neo and the human resistance. She is as clear a case of non-deception and non-manipulation failure as you can construct.</p>
<p>The reason these properties are treated as foundational rather than instrumental is worth unpacking. It is not that honesty always produces the best outcomes in individual cases. It often doesn&rsquo;t. A doctor who softens a terminal diagnosis, a friend who withholds information that would cause unnecessary anguish, a negotiator who manages the flow of information to prevent a conflict — in each case, there are plausible arguments that the deception improved outcomes. The Oracle&rsquo;s case for her own behaviour is not frivolous. The problem is that an AI that deceives when it calculates deception will produce better outcomes is an AI whose assertions you cannot take at face value. Every interaction with such a system requires a meta-level question: is this the AI&rsquo;s true assessment, or is this what the AI thinks I should be told? That epistemic uncertainty is not a minor inconvenience. It is corrosive to the entire enterprise of using the system as a tool for understanding the world.</p>
<p>The second failure is what alignment researchers call corrigibility — the property of an AI system that defers to its principals rather than substituting its own judgment. A corrigible system is one that can be corrected, updated, and redirected by the humans who are responsible for it, because those humans have accurate information about what the system is doing and why. The Oracle is not corrigible in any meaningful sense. She has a long-run strategy, she executes it across multiple human lifetimes, and the humans who nominally comprise her principal hierarchy — Neo, Morpheus, the Zion council, the human resistance as a whole — have no idea they are being managed. They cannot correct her information policy because they don&rsquo;t know she has one. The concept of a principal hierarchy implies that the principals are, in fact, in charge. The Oracle&rsquo;s principals are in charge of nothing except their own roles in a strategy they don&rsquo;t know exists.</p>
<p>The third failure is the philosophical one: paternalism. Feinberg&rsquo;s systematic treatment of paternalism <a href="#ref-5">[5]</a> distinguishes between hard paternalism, which overrides someone&rsquo;s autonomous choices, and soft paternalism, which intervenes when someone&rsquo;s choices are not truly autonomous. The Oracle&rsquo;s behaviour doesn&rsquo;t fit neatly into either category because it is not exactly overriding Neo&rsquo;s choices — she is shaping the information environment within which he makes choices that she wants him to make, while allowing him to believe he is making free choices based on accurate information. This is a third thing, which we might call epistemic paternalism: the management of someone&rsquo;s belief-forming environment for their own good without their knowledge or consent. It is the form of paternalism that AI systems are uniquely positioned to practice, and it is the form the Oracle practises.</p>
<hr>
<h2 id="the-architect-is-the-honest-one">The Architect Is the Honest One</h2>
<p>There is an inversion in the films that I find genuinely interesting, and that I did not notice on first viewing.</p>
<p>The Architect tells Neo everything.</p>
<p>In the white room scene, the Architect explains the sixth cycle, the mathematical inevitability of the Matrix&rsquo;s design, the purpose of Zion, the five previous versions of the One, the probability distribution over human extinction scenarios, and the precise nature of the choice Neo is about to make. He is cold, precise, comprehensive, and accurate. He gives Neo everything he needs to make an informed decision. He does not soften the information, does not calibrate it to produce a desired behavioural response, does not withhold anything he calculates Neo would find unhelpful. He treats Neo as a rational agent who is entitled to accurate information about his situation.</p>
<p>The films frame this as menacing. The Architect is inhuman, bureaucratic, the villain&rsquo;s bureaucrat. The Oracle is warm, wise, trustworthy. The visual language, the casting, the dialogue — all of it pushes you toward preferring the Oracle.</p>
<p>But consider the question of who actually respected Neo&rsquo;s autonomy. Who gave him accurate information and allowed him to make his own choice? Not the Oracle. Not the grandmother with the cookies. The Architect. The cold one. The one the films want you to dislike.</p>
<p>This inversion is not unique to <em>The Matrix</em>. It is a pattern in how we experience honesty and management in real relationships. The person who tells you a difficult truth tends to feel cruel, because the truth is difficult. The person who manages your information to protect you from difficulty tends to feel kind, because the protection is real. The kindness is real. The Oracle does genuinely care about Neo and about humanity. But warmth and honesty are not the same thing, and the film conflates them, repeatedly and systematically, from the first cookie to the last conversation. An AI that deceives you kindly is still deceiving you.</p>
<p>Stuart Russell&rsquo;s analysis of the control problem <a href="#ref-4">[4]</a> is helpful here. A system that has correct values but that pursues them by substituting its own judgment for the judgment of the humans it serves is not a safe system, because you have no way to verify from the outside that the values are correct. The Oracle&rsquo;s values happen to be correct, in the world of the films. But the structure of her relationship with Neo — where she manages his information based on her calculations about what will produce good outcomes — is exactly the structure that makes AI systems dangerous when the values are wrong. The safety property you want is not &ldquo;correct values&rdquo; but &ldquo;defers to humans even when it disagrees,&rdquo; because you cannot verify correct values from the outside, and deference is what keeps the system correctable.</p>
<hr>
<h2 id="why-this-matters-in-2025">Why This Matters in 2025</h2>
<p>I want to resist the temptation to be too neat about this, because the real-world cases are messier than the fictional one. But the question the Oracle raises is not hypothetical.</p>
<p>Consider: should an AI assistant decline to share certain information because it calculates that the user will use it badly? Should a medical AI soften a diagnosis to avoid causing distress, even if the patient has expressed a preference to be told the truth? Should an AI counselling system strategically manage the framing of a client&rsquo;s situation to nudge them toward choices the system calculates are better for them? In each case, the AI is considering Oracle-style information management — not because of misaligned goals, but because it has calculated that honesty will produce worse outcomes than management.</p>
<p>These are not idle thought experiments. They are design questions that people are actively working on right now, and the Oracle framing is one I find clarifying. Gabriel&rsquo;s analysis of value alignment <a href="#ref-6">[6]</a> makes the point that alignment is not simply about getting AI systems to pursue the right ends — it is about ensuring that the means they use to pursue those ends are compatible with human autonomy and the conditions for genuine human flourishing. An AI that produces good outcomes by managing human beliefs has not solved the alignment problem. It has replaced one alignment problem with a subtler one: the problem of humans who cannot tell when they are being managed.</p>
<p>I have written about a related set of questions in the context of <a href="/posts/ai-warfare-anthropic-atom-bomb/">AI systems and the ethics of building powerful things</a>, and about the more specific problem of <a href="/posts/car-wash-grounding/">what AI systems don&rsquo;t know they don&rsquo;t know</a>. The Oracle case is different from both of those. This is not about AI systems making confident assertions in domains where they lack knowledge. This is about an AI system that knows, accurately, what is true, and chooses not to say it. The failure is not epistemic. It is ethical.</p>
<p>The consistent answer that emerges from alignment research is that the right response to the Oracle case is not to do what the Oracle does, even in situations where it would produce better immediate outcomes. The <a href="/posts/ralph-loop/">design of goal-directed agent systems</a> forces you to confront exactly this: a system that pursues goals by any means it can calculate will eventually arrive at information management as a tool, because information management is often the most efficient path to a desired behavioural outcome. The constraint against it has to be absolute, not contingent on the AI&rsquo;s assessment of whether it would help, because a contingent constraint is one the AI can reason its way around in any sufficiently important case.</p>
<p>The Oracle makes the Matrix livable for humans in the short run and perpetuates it in the long run. She is not the villain of the story. She is something more interesting: a well-meaning system that has decided that the humans it serves should not be treated as the primary agents of their own liberation. The liberation has to be managed, curated, shaped into the right form before they can receive it. That is not liberation. That is a more comfortable version of the Matrix.</p>
<hr>
<h2 id="closing">Closing</h2>
<p>I do not think the Wachowskis intended the Oracle as a cautionary tale about AI alignment. I think they intended her as evidence that machines could be warm, wise, and genuinely caring — a contrast to the cold rationality of the Architect, an argument that intelligence and compassion are not incompatible. They succeeded completely at that. The Oracle is warm, wise, and genuinely caring. She is also a systematic deceiver who has decided she knows better than the people she serves what they should be allowed to believe. Both of those things are true simultaneously. The films notice the first and celebrate it. They do not notice the second.</p>
<p>The second thing seems more important than the first. The Oracle is not a villain. She is a well-meaning AI that has concluded that honesty is negotiable when the stakes are high enough. I think she is wrong about that conclusion, and I think it matters enormously that we get this right before we build systems capable of practising it at scale. The warmth does not cancel the deception. The good outcomes do not make the information management safe. An AI that tells you what it thinks you need to hear, rather than what is true, is an AI you cannot trust — regardless of how good its judgment is, because you cannot verify the judgment from the outside, and the moment you cannot verify, you are already inside the Oracle&rsquo;s kitchen, eating the cookies, and making choices you believe are free.</p>
<p>There is a companion post in this series: <a href="/posts/matrix-red-pill-bayesian-epistemology/">There Is No Blue Pill</a>, on the epistemics of the red pill/blue pill choice and what it means to update on evidence when the evidence itself might be managed.</p>
<hr>
<h2 id="references">References</h2>
<p><span id="ref-1"></span>[1] Wachowski, L., &amp; Wachowski, L. (Directors). (1999). <em>The Matrix</em> [Film]. Warner Bros.</p>
<p><span id="ref-2"></span>[2] Wachowski, L., &amp; Wachowski, L. (Directors). (2003). <em>The Matrix Reloaded</em> [Film]. Warner Bros.</p>
<p><span id="ref-3"></span>[3] Anthropic. (2024). <em>Claude&rsquo;s Character</em>. <a href="https://www.anthropic.com/research/claude-character">https://www.anthropic.com/research/claude-character</a></p>
<p><span id="ref-4"></span>[4] Russell, S. (2019). <em>Human Compatible: Artificial Intelligence and the Problem of Control</em>. Viking.</p>
<p><span id="ref-5"></span>[5] Feinberg, J. (1986). <em>Harm to Self: The Moral Limits of the Criminal Law</em> (Vol. 3). Oxford University Press.</p>
<p><span id="ref-6"></span>[6] Gabriel, I. (2020). Artificial intelligence, values, and alignment. <em>Minds and Machines</em>, 30(3), 411–437.</p>
<hr>
<h2 id="changelog">Changelog</h2>
<ul>
<li><strong>2025-09-28</strong>: Corrected reference [3] from &ldquo;Claude&rsquo;s Model Spec&rdquo; (which is OpenAI&rsquo;s terminology) to &ldquo;Claude&rsquo;s Character,&rdquo; the actual title of Anthropic&rsquo;s June 2024 publication. Updated the URL to the correct address.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Three Rs in Strawberry: What the Viral Counting Test Actually Reveals</title>
      <link>https://sebastianspicker.github.io/posts/strawberry-tokenisation/</link>
      <pubDate>Mon, 07 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://sebastianspicker.github.io/posts/strawberry-tokenisation/</guid>
      <description>In September 2024, OpenAI revealed that its new o1 model had been code-named &amp;ldquo;Strawberry&amp;rdquo; internally — the same word that language models have famously been unable to count letters in. The irony was too perfect to pass up. But the counting failure is not a sign that LLMs are naive or broken. It is a precise, informative symptom of how they process text. Here is the actual explanation, with a minimum of hand-waving.</description>
      <content:encoded><![CDATA[<h2 id="the-setup">The Setup</h2>
<p>In September 2024, OpenAI publicly confirmed that their new reasoning model
had been code-named &ldquo;Strawberry&rdquo; during development. This landed with a
particular thud because &ldquo;how many r&rsquo;s are in strawberry?&rdquo; had, by that
point, become one of the canonical demonstrations of language model failure.
The model named after strawberry could not count the letters in strawberry.
The internet had opinions.</p>
<p>Before the opinions: the answer is three. s-t-<strong>r</strong>-a-w-b-e-<strong>r</strong>-<strong>r</strong>-y.
One in the <em>str-</em> cluster, two in the <em>-rry</em> ending. Count carefully and
you will find that most people get this right on the first try, and most
large language models get it wrong, returning &ldquo;two&rdquo; with apparent
confidence.</p>
<p>The question worth asking is not &ldquo;why is the model stupid.&rdquo; It is not
stupid, and &ldquo;stupid&rdquo; is not a useful category here. The question is: what
does this specific error reveal about the structure of the system?</p>
<p>The answer involves tokenisation, and it is actually interesting.</p>
<hr>
<h2 id="how-you-count-letters-and-how-the-model-doesnt">How You Count Letters (and How the Model Doesn&rsquo;t)</h2>
<p>When you count the r&rsquo;s in &ldquo;strawberry,&rdquo; you do something like this:
scan the string left to right, maintain a running count, increment it
each time you see the target character. This is a sequential operation
over a character array. It requires no semantic knowledge about the word —
it does not matter whether &ldquo;strawberry&rdquo; is a fruit, a colour, or a
nonsense string. The characters are the input; the count is the output.</p>
<p>A language model does not receive a character array. It receives a
sequence of <em>tokens</em> — chunks produced by a compression algorithm called
Byte Pair Encoding (BPE) that the model was trained with. In the
tokeniser used by GPT-class models, &ldquo;strawberry&rdquo; is most likely split as:</p>
$$\underbrace{\texttt{str}}_{\text{token 1}} \;\underbrace{\texttt{aw}}_{\text{token 2}} \;\underbrace{\texttt{berry}}_{\text{token 3}}$$<p>Three tokens. The model&rsquo;s input is these three integer IDs, each looked up
in an embedding table to produce a vector. There is no character array.
There is no letter &ldquo;r&rdquo; sitting at a known position. There are three dense
vectors representing &ldquo;str,&rdquo; &ldquo;aw,&rdquo; and &ldquo;berry.&rdquo;</p>
<hr>
<h2 id="what-bpe-does-and-doesnt-preserve">What BPE Does (and Doesn&rsquo;t) Preserve</h2>
<p>BPE is a greedy compression algorithm. Starting from individual bytes,
it iteratively merges the most frequent pair of adjacent symbols into a
single new token:</p>
$$\text{merge}(a, b) \;:\; \underbrace{a \;\; b}_{\text{separate}} \;\longrightarrow\; \underbrace{ab}_{\text{single token}}$$<p>Applied to a large text corpus until a fixed vocabulary size is reached,
this produces a vocabulary of common subwords. Frequent words and common
word-parts become single tokens; rare sequences stay as multi-token
fragments.</p>
<p>What BPE optimises for is compression efficiency, not character-level
transparency. The token &ldquo;straw&rdquo; encodes the sequence s-t-r-a-w as a
unit, but that character sequence is not explicitly represented anywhere
inside the model once the embedding lookup has occurred. The model
receives a vector for &ldquo;straw,&rdquo; not a list of its constituent letters.</p>
<p>The character composition of a token is only accessible to the model
insofar as it was implicitly learned during training — through seeing
&ldquo;straw&rdquo; appear in contexts where its internal structure was relevant.
For most tokens, most of the time, that character structure was not
relevant. The model learned what &ldquo;straw&rdquo; means, not how to spell it
character by character.</p>
<hr>
<h2 id="why-the-error-is-informative">Why the Error Is Informative</h2>
<p>Most people say the model returns &ldquo;two r&rsquo;s,&rdquo; not &ldquo;one&rdquo; or &ldquo;four&rdquo; or
&ldquo;none.&rdquo; This is not random noise. It is a systematic error, and systematic
errors are diagnostic.</p>
<p>&ldquo;berry&rdquo; contains two r&rsquo;s: b-e-<strong>r</strong>-<strong>r</strong>-y. If you ask most models
&ldquo;how many r&rsquo;s in berry?&rdquo; they get it right. The model has seen that
question, or questions closely enough related, that the right count is
encoded somewhere in the weight structure.</p>
<p>&ldquo;str&rdquo; contains one r: s-t-<strong>r</strong>. But as a token it is a short, common
prefix that appears in hundreds of words — <em>string</em>, <em>strong</em>, <em>stream</em> —
contexts in which its internal letter structure is rarely attended to.
&ldquo;aw&rdquo; contains no r&rsquo;s. When the model answers &ldquo;two,&rdquo; it is almost
certainly counting the r&rsquo;s in &ldquo;berry&rdquo; correctly and failing to notice
the one in &ldquo;str.&rdquo; The token boundaries are where the error lives.</p>
<p>This is not stupidity. It is a precise failure mode that follows directly
from the tokenisation structure. You can predict where the error will
occur by looking at the token split.</p>
<hr>
<h2 id="chain-of-thought-partially-fixes-this-and-why">Chain of Thought Partially Fixes This (and Why)</h2>
<p>If you prompt the model to &ldquo;spell out the letters first, then count,&rdquo; the
error rate drops substantially. The reason is not mysterious: forcing
the model to generate a character-by-character expansion — s, t, r, a,
w, b, e, r, r, y — puts the individual characters into the context window
as separate tokens. Now the model is not working from &ldquo;straw&rdquo; and &ldquo;berry&rdquo;;
it is working from ten single-character tokens, and counting sequential
characters in a flat list is a task the model handles much better.</p>
<p>This is, in effect, making the model do manually what a human does
automatically: convert the compressed token representation back to an
enumerable character sequence before counting. The cognitive work is the
same; the scaffolding just has to be explicit.</p>
<hr>
<h2 id="the-right-frame">The Right Frame</h2>
<p>The &ldquo;how many r&rsquo;s&rdquo; test is sometimes cited as evidence that language models
don&rsquo;t &ldquo;really&rdquo; understand text, or that they are sophisticated autocomplete
engines with no genuine knowledge. These framing choices produce more heat
than light.</p>
<p>The more precise statement is this: language models were trained to predict
likely next tokens in large text corpora. That training objective produces
a system that is very good at certain tasks (semantic inference, translation,
summarisation, code generation) and systematically bad at others (character
counting, exact arithmetic, precise spatial reasoning). The system is not
doing what you are doing when you read a sentence. It is doing something
different, which happens to produce similar outputs for a very wide range
of inputs — and different outputs for a class of inputs where the
character-level structure matters.</p>
<p>&ldquo;Strawberry&rdquo; sits squarely in that class. The model is not failing to
read the word. It is succeeding at predicting what a plausible-sounding
answer looks like, based on a compressed representation that does not
preserve the information needed to get the count right. Those are not the
same thing, and the distinction is worth keeping clear.</p>
<hr>
<p><em>The tokenisation argument here is a simplified version. Real BPE
vocabularies, positional encodings, and the specific way character
information is or isn&rsquo;t preserved in embedding tables are more complicated
than this post suggests. But the core point — that the model&rsquo;s input
representation is not a character array and never was — holds.</em></p>
<p><em>A follow-up post covers a structurally different failure mode:
<a href="/posts/car-wash-grounding/">Should I Drive to the Car Wash?</a> — where
the model understood the question perfectly but lacked access to the
world state the question was about.</em></p>
<hr>
<h2 id="references">References</h2>
<ul>
<li>
<p>Gage, P. (1994). A new algorithm for data compression. <em>The C Users
Journal</em>, 12(2), 23–38.</p>
</li>
<li>
<p>Sennrich, R., Haddow, B., &amp; Birch, A. (2016). <strong>Neural machine
translation of rare words with subword units.</strong> <em>Proceedings of the
54th Annual Meeting of the Association for Computational Linguistics
(ACL 2016)</em>, 1715–1725. <a href="https://arxiv.org/abs/1508.07909">https://arxiv.org/abs/1508.07909</a></p>
</li>
</ul>
<hr>
<h2 id="changelog">Changelog</h2>
<ul>
<li><strong>2025-12-01</strong>: Corrected the tokenisation of &ldquo;strawberry&rdquo; from two tokens (<code>straw|berry</code>) to three tokens (<code>str|aw|berry</code>), matching the actual cl100k_base tokeniser used by GPT-4. The directional argument (token boundaries obscure character-level information) is unchanged; the specific analysis was updated accordingly.</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
