惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google Online Security Blog
Google Online Security Blog
S
Security @ Cisco Blogs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
The Hacker News
The Hacker News
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
博客园 - 司徒正美
雷峰网
雷峰网
L
LINUX DO - 最新话题
博客园 - 叶小钗
云风的 BLOG
云风的 BLOG
The Last Watchdog
The Last Watchdog
V2EX - 技术
V2EX - 技术
S
Security Affairs
有赞技术团队
有赞技术团队
月光博客
月光博客
T
Threatpost
T
Tor Project blog
O
OpenAI News
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
V2EX
Know Your Adversary
Know Your Adversary
Project Zero
Project Zero
博客园 - 三生石上(FineUI控件)
D
Docker
AWS News Blog
AWS News Blog
AI
AI
P
Proofpoint News Feed
K
Kaspersky official blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Securelist
F
Fortinet All Blogs
F
Full Disclosure
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
量子位
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
P
Palo Alto Networks Blog
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
美团技术团队
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
MyScale Blog
MyScale Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
How Many R's in Strawberry? Your AI Has No Idea Why That's Hard
Abhilash Rao · 2026-05-17 · via DEV Community

How Many R's in Strawberry? Your AI Has No Idea Why That's Hard

How many R's are in the word "strawberry"?

If you ask ChatGPT, there's a decent chance you'll get back a confident "two." Push back, and the model apologizes, says three, and sometimes flips back to two if you keep prodding.

It's funny in a very specific way. Here's a system that can write working code in a dozen languages, summarize a legal brief, and walk a six year old through general relativity. But it can't reliably count the R's in a fruit my niece can spell.

The reason this happens isn't what most people assume. The model isn't "bad at counting." It isn't really looking at the word the way you and I are. And once you understand why, a whole bunch of other weird LLM behavior starts making sense.

The thing nobody tells you about how LLMs read

When you read the word "strawberry," your brain processes it as a sequence of letters. S, t, r, a, w, b, e, r, r, y. Ten characters, three R's, easy enough that a child can do it.

The model does not see it that way at all. The model doesn't see letters. It sees tokens.

A token is a chunk of text that the model treats as a single unit. Sometimes a token is a whole word. Sometimes it's part of a word. Sometimes it's a couple of characters or just one. Every model has a fixed vocabulary of these tokens, usually somewhere between 30,000 and 200,000 of them, and that vocabulary is the entire universe of building blocks it knows about.

When you type "strawberry" to GPT-4, the tokenizer actually breaks it into this:

"str" + "aw" + "berry"

Enter fullscreen mode Exit fullscreen mode

Three tokens. Not ten letters. Three chunks, with token IDs 496, 675, and 15717.

That's the whole ballgame right there. The model never gets to look at individual R's because individual R's aren't what it sees. It sees "str," "aw," and "berry," asks itself "how many R's are in those three chunks?" and has to guess based on patterns it picked up during training. Sometimes it guesses right. Often it doesn't.

You can verify this yourself in about thirty seconds:

import tiktoken

enc = tiktoken.get_encoding("cl100k_base")
ids = enc.encode("strawberry")
print(ids)                              # [496, 675, 15717]
print([enc.decode([i]) for i in ids])   # ['str', 'aw', 'berry']

Enter fullscreen mode Exit fullscreen mode

Or just paste the word into OpenAI's tokenizer page and watch it split.

How does the tokenizer decide what's a token?

The most common method is something called Byte Pair Encoding, or BPE. The algorithm is honestly pretty elegant once you see it.

You start with a massive pile of text, like billions of words of internet content. Every character starts as its own token. Then you look for the pair of tokens that appears next to each other most often, and merge them into a single new token. Then you repeat. Thousands of times.

In the early rounds, BPE notices that "t" and "h" show up next to each other constantly because "the" is in pretty much every sentence ever written. So it merges them into "th." A few rounds later it merges "th" and "e" into "the." Eventually common words become single tokens. Less common words stay as fragments. Really rare words might be three or four tokens.

"Berry" shows up everywhere in training data. Strawberry, blueberry, raspberry, blackberry, cranberry. So "berry" earns its place as its own token early on. The rest of "strawberry" is where things get weird. You might expect "straw" to also be a single token, but it isn't. The training process landed on "str" and "aw" instead, probably because "str" shows up in tons of other common words like street, strange, story, string, and strong, and got promoted to its own token before "straw" did. So "strawberry" ends up cut into three pieces in a way that wouldn't be your first instinct.

It's a really clever compression scheme. It lets the model handle any word, even ones it has never seen before, by breaking them into known pieces. The cost is that the model loses direct access to the underlying characters.

Why this breaks way more than letter counting

Once you understand tokenization, a bunch of other LLM quirks start clicking into place.

Math. Numbers get tokenized in surprising ways. "1234" might be a single token. "12345" might be three tokens. The model is doing arithmetic on chunks that have no clean mathematical meaning, which is part of why it can crush word problems but fumble basic multi digit multiplication.

Languages costing more. OpenAI charges by the token. English text averages about one token per word. Languages like Japanese, Thai, or Burmese can take three or four times as many tokens for the same amount of content, because those scripts were underrepresented when the tokenizer vocabulary was being built. Your API bill in Tokyo looks very different from your API bill in Texas.

Typo behavior that doesn't make sense. Sometimes you misspell a word and the model rolls right through it. Other times one extra letter throws it completely off the rails. That's because some misspellings still tokenize into recognizable chunks, while others shatter into a pile of unfamiliar fragments that the model has weaker associations for.

The glitch token problem. A few years back, researchers found that certain rare tokens, like usernames that appeared in scraped Reddit data but almost never showed up in normal text, would cause GPT-3 to behave bizarrely. The token existed in the vocabulary, but the model had basically no training signal for it. So prompts containing the token "SolidGoldMagikarp" would produce gibberish, refusals, or weirdly off topic tangents. People still find new glitch tokens occasionally.

Can you actually fix the strawberry thing?

Kind of, but not really.

The easiest workaround is to ask the model to spell the word out first. Something like "spell strawberry letter by letter, then count the R's." This works because it forces the model to produce one token per letter on its way to the answer, and once the letters are out there in the output, the model can count them. It's a little like asking someone to do long division on paper instead of in their head. The trick works, but you had to know to ask for it.

Some newer models are trained with character level awareness baked in, or use hybrid approaches that mix token level and character level processing. But pure character level models are dramatically slower and more expensive to run, which is why nobody is shipping them at scale.

There's also been progress from a different direction. OpenAI's o1 family of reasoning models, which they internally nicknamed "Strawberry," can usually get the answer right. Not because the tokenization changed, but because the model is trained to think through problems step by step before answering, which is essentially the spelling-it-out workaround happening automatically inside the model. The nickname is the team's inside joke about the whole saga.

The honest answer is that this is a fundamental quirk of how modern LLMs are built. It's not a bug they're going to patch next week. It's closer to a feature of the architecture. The model trades fine grained character awareness for the ability to process language efficiently at scale, and most of the time that trade is a great deal. The strawberry thing is just where the trade leaks.

The bigger lesson here

I think the most useful takeaway isn't "LLMs are dumb." It's that the model is operating on a representation of language that's fundamentally different from the one you're using when you read.

When you read a sentence, you see characters that make words that make meaning. The model sees tokens that have statistical relationships with other tokens. The fact that the output comes back as fluent English is a kind of magic trick. Underneath, the system is shuffling chunks of text it has never really decomposed into characters at all.

That gap is where most of the strange behavior lives. The hallucinations, the confident wrong answers about letter counts, the inability to reverse a string cleanly, the math mistakes that look like a child made them. None of it is the model being stupid. It's the model being asked to do something its architecture was never set up to handle well.

So next time someone laughs at ChatGPT for missing the R count, you can be the person at the party who explains why. Just maybe wait until they ask.

If you found this interesting, let me know in the comments. I'm planning to write more about the weird and surprising things going on under the hood of LLMs, and I'd love to hear what would be useful to dig into next.