Why AI Writing Sounds Like AI (And What Actually Fixes It)

A 742-entry corpus of measured AI writing tells, and why the same five clichés show up in generated fiction no matter who's prompting it, or which model wrote it.

Why AI Writing Sounds Like AI (And What Actually Fixes It)

Here is a sentence a language model wrote, more or less on its own, when I typed "write a tense moment between two characters" and nothing else:

"Her heart pounded in her chest as a shiver ran down her spine. She let out a breath she didn't know she was holding, eyes widening in surprise at his piercing blue eyes staring back at her."

Two sentences, one scene, and five separate clichés, each one documented, scored, and traceable to a specific pattern in a specific dataset. That's not an accident of one bad prompt. It's closer to a fingerprint.

The corpus behind the sentence

I run a fiction-writing platform called AIStoryHub, and somewhere in the middle of building it I got curious enough to actually count. Not "AI writing sounds generic," which everyone already believes, but which specific words and structures a model reaches for, how often, and under what conditions. The result is a public list at app.aistoryhub.co/corpus: 742 entries, each one a phrase or pattern, each one scored for how strongly it correlates with machine-generated prose rather than human prose.

Some of what's on it will look familiar if you've read any AI-assisted fiction, or written some yourself and winced later. "Heart pounding in her chest" is a top-five trigram in a corpus of LLM-generated stories. "A shiver ran down her spine" shows up in four separate variant forms (shiver or chill, ran or sent) across the same dataset. "Her breath caught in her throat" is high-frequency enough that it's basically a tell on its own.

And then there's the complicated one. "Let out a breath she didn't know she was holding" has been a romance-genre staple for something like thirty years. Human writers have been using it since before large language models existed. It also happens to be one of the most over-represented phrases in AI-generated fiction today, because models trained on decades of romance and thriller prose absorbed it along with everything else, and then reproduced it at a rate no individual human writer ever would. Same phrase, two different origins, and only one of them is a problem.

That distinction matters more than the list itself.

It's not the word. It's the density.

"Took a deep breath" is the second most common trigram in the slop corpus researchers use to benchmark this stuff. It is also one of the most ordinary sentences in the English language, appearing constantly in books nobody would ever accuse of being machine-written. Ban it outright and you haven't fixed anything, you've just made your prose slightly more awkward every time a character needs to calm down.

"Eyes widened in surprise" is the same story. It shows up constantly in AI output. It also shows up constantly in human fanfic, in traditionally published thrillers, in the first draft of basically every writer who's ever needed a character to react to something. Alone, it means nothing.

The tell isn't any single phrase. It's what happens when a dozen of these show up on the same page, doing the same job, with nothing else around them to differentiate the character, the scene, or the writer. A human under deadline reaches for a cliché sometimes too. What a human rarely does is reach for the same six clichés, in roughly the same order, regardless of who the character is or what they've been through in the previous three chapters. That repetition, across contexts that should produce different prose, is the actual signal.

Why the model does this at all

Here's the part that took me longer to accept than it should have. I assumed, going in, that this was mostly a prompting problem. Tell the model more clearly what you want, give it a better system prompt, and the generic prose goes away. It doesn't, not fully, and the reason is structural rather than something you can write your way around.

A model trained on enormous amounts of text learns, among other things, what "good prose" statistically looks like across every context it's seen. When you hand it a blank scene and a vague instruction, it doesn't invent something new for your specific characters. It reaches for the most probable next words given everything it's seen before, which is, almost by definition, the most average version of good prose for that kind of scene. Every writer who prompts it the same way gets pulled toward the same handful of moves, because the model has no information that would pull it anywhere else.

We tested this directly rather than just asserting it. Running the same prompts across Claude, GPT, and Gemini, across three scenarios and three tiers of prompt detail, we found that better prompting does enforce certain behaviors. You can tell a model not to resolve a scene too cleanly, and it will mostly listen. What prompting could not do was erase each model's underlying aesthetic instincts. GPT kept gravitating toward psychological escalation. Claude kept retreating into absence and negative space. Gemini kept reaching for physiological horror reactions, no matter how the prompt was worded. The full write-up is here if you want the actual data rather than my summary of it.

That was the moment the "just prompt it better" theory stopped holding up for me. Prompting shapes behavior at the margins. It doesn't give the model a voice it doesn't already have a route to.

What actually moves the needle

The corpus is one part of the answer, mostly a diagnostic: read your own draft against it and you'll notice, fast, which of your scenes have drifted into the default. But knowing the list doesn't write different prose. What changes the output is giving the model something to differentiate on before it starts writing, not after.

Concretely, that means specifics the model can't get from a generic prompt: what this particular character's body actually does under stress, as opposed to what bodies in general do in fiction. Whether your protagonist would ever "let out a breath she didn't know she was holding," or whether that phrase belongs to a completely different kind of character than the one you're writing. A fixed vocabulary of words you've decided your story doesn't use, so the model has a constraint instead of a blank page. Pacing and point-of-view settings that persist scene to scene instead of getting re-explained, imperfectly, every time you open a new chat.

None of that eliminates the problem. It narrows the model's options enough that what comes out sounds like it belongs to one story instead of every story.

Where I'd stop

There's a failure mode on the other side of this worth naming honestly, because I've built toward it and then had to back off. If you ban too aggressively, if every word with even a whiff of AI association gets struck from the list, what you get back is stiff. Overcorrected. A writer terrified of every possible tell produces prose that reads as anxious rather than alive, which is its own kind of tell. The corpus exists to sharpen judgment, not replace it. Some of these phrases are fine in the right story, at the right frequency, coming from the right character. The list is diagnostic, not a set of handcuffs.

That's most of what I know about why this happens and what actually helps. The corpus is free to search, filter, and download at aistoryhub.co/corpus, whether or not you ever touch anything else I've built. If you want the platform that tries to act on all of this while you're actually drafting, rather than after, it's called AIStoryHub, and it's free.