Skip to content

Creating Consistent Characters with AI

I wrote a children’s book. Yes, I did and I will tell you more about that when the time comes. Up until recently I have been facing the challenge of illustrating it, and that’s where this blog post really started.

The story’s fine, actually I have had some good feedback from a couple of young readers. As you may imagine, I think the story comes to life a bit more when there are illustrations that capture the action of the book. The problem is the girl on the cover, my main character called María, has to be the same girl thirty-odd pages later, and getting an AI model to agree to that turns out to be the whole game.

You can see a video version of this blog below:

The word out there is that you ask the model to save your character to its memory, because that “helps keep everything consistent moving forward.” Easier said than done. In practice you end up pasting the full appearance description in again anyway, because sometimes the model drops a detail, and better safe than sorry.

Sit with that for a second. “Save it to memory so it stays consistent” and “re-type the whole description every time because memory doesn’t hold” cannot both be advice. One of them is load-bearing, and it’s the second one. The first is a comfort blanket.

There is no character

Here’s what’s actually happening when your character drifts between images. Nothing. The model isn’t losing track of her. There was never a “her” to lose track of.

An image model doesn’t hold a character between generations. Each image is a fresh sample, conditioned on whatever you handed it this time. Stop describing her and, as far as the model is concerned, she never existed. It’s the machine equivalent of the thing infants haven’t developed yet — object permanence, the understanding that a thing persists when you stop looking at it. The model never got there and never will. Every generation is the first time it has ever seen your character.

Which reframes the whole task. Consistency was never a prompt-quality problem. A better description doesn’t give the model memory; it just weights the dice slightly differently on each roll. You can write the most exquisite character sheet in the English language and still get a different face on page nine, because the words are re-interpreted from scratch every single time. The character lives in your head — a place the model cannot reach.

So stop trying to describe your way to consistency. It’s the wrong instrument.

References are the polaroids

The fix is to hand the model the face, not a description of it. Think of it as the man in Memento: no capacity to form new memories, so he tattoos the facts on his skin and keeps a stack of polaroids to know who anyone is. A reference image is the polaroid. Not “warm brown eyes, shoulder-length dark waves” — that describes a thousand faces — but the face itself, handed back as ground truth on every generation. A turnaround sheet describes exactly one girl.

That single shift is what moved my hit rate from “roll the dice and inpaint the misses” to something I’d actually put on a cover. So here is the workflow I now use — in ChatGPT, because that’s where I’ve been doing this — stripped of ceremony.


The workflow, step by step

Step 1 — Write the character lock in a file, not the chat

Don’t trust the memory toggle. Keep one plain-text block per character in a doc you own, and paste it at the top of every image request. This is your source of truth; the chat window is disposable.

CHARACTER: María, 9, curious and determined
FACE: round, warm brown eyes, light-brown skin, freckles across nose
HAIR: dark brown, shoulder-length, loose waves, side parting
BUILD: small for her age, upright posture
WARDROBE (committed): mustard-yellow raincoat, navy trousers,
white trainers with red laces, small canvas satchel
PALETTE: mustard / navy / warm neutrals
DO NOT: change coat colour, add a hat, alter hair length

The DO NOT line matters more than you’d think — it’s where you catch the model’s favourite improvisations before they happen.

Step 2 — Write a separate style lock

Keep the look in its own block, apart from the character. You’ll reuse it on every page and across future projects, and separating the two means you can restyle without redefining the girl.

STYLE: children's picture-book illustration, watercolour with
coloured-pencil linework; soft granulated washes, visible pencil
texture, gentle diffuse light, warm muted palette, generous
negative space. NOT photorealistic, NOT 3D, NOT vector-flat.

One trap to avoid: don’t write “Pixar style” or any studio name. It’s an IP liability the moment you’re selling the book, and it drifts anyway — the model’s idea of “Pixar” wanders between generations. Describe the properties you want, never someone else’s trademark.

Step 3 — Generate the reference anchors first

Before any scene, make the polaroids. Ask ChatGPT for a turnaround and an expression sheet, then keep the outputs as canonical files.

[paste STYLE LOCK] [paste CHARACTER LOCK]
Produce a 3:2 character sheet: six head-and-shoulders portraits of
María in a grid, consistent face and hair throughout, neutral
background. Emotions left→right, top row: curious, delighted,
uncertain; bottom row: focused, tired, triumphant.
Same rendering across all six.

Do the same for a turnaround (front, 3/4, profile, back). These images — not the text — are what you’ll attach from now on.

Step 4 — Compose each scene from the locks, and attach the anchors

Every scene request is the same recipe: style lock, then character lock, then the scene beat, then upload the reference image. And set the aspect ratio in the prompt — don’t generate a square and rescue it later with generative fill, which invents fresh, inconsistent detail at the edges.

[paste STYLE LOCK] [paste CHARACTER LOCK: MARÍA]
SCENE 4 — 3:2 landscape. María crouches on a windy hilltop watching
a sparrow tilt into the wind, satchel slipping off one shoulder.
Late-afternoon side light, grass bending, a sense of motion.
María's face, hair, and mustard raincoat exactly as the reference.
Composition: María lower-left third, sparrow upper-right, open sky.

Step 5 — Two characters in one frame

This is where models misbehave: put two people close together and they average the faces into one. Attach both anchor sets, inject both locks, and state the spatial relationship explicitly.

[paste STYLE LOCK] [paste CHARACTER LOCK: MARÍA] [paste CHARACTER LOCK: BERTA]
SCENE — María (child, mustard raincoat) stands to the LEFT, looking
up at Berta Zerón (adult pilot, leather flight jacket, short dark
hair) to the RIGHT. Keep faces and heights distinct; do not merge
features. Hangar interior, warm light.

Keep your cast separable by silhouette, palette, and scale. If two characters read alike, the model will blend them — no prompt saves you from that; distinct design does.

What not to do

  • Don’t rely on the memory toggle. Hold the spec in a file you control.
  • Don’t name a studio style. Describe properties.
  • Don’t fix aspect ratio after the fact. Set it at generation.
  • Don’t describe two characters and hope. Attach both references and place them explicitly.

Where this is heading

None of this is magic, and agents don’t make it magic. An agent is simply the thing that finally holds the state I’ve been carrying in my head and my scattered docs. It keeps the locks as files, compiles every scene prompt from them so the character can’t quietly mutate, attaches the right references without me remembering to, and runs the drift check before I see the image — instead of me squinting at a spread wondering when the coat changed colour. Just to give you a taster, on the left you can see the cover of my book.

Look closely and my manual ChatGPT routine is that agent’s job description, performed by hand, one anxious prompt at a time. Automating it isn’t a leap in capability. It’s mostly a refusal — refusing to keep the character anywhere a process can’t enforce it.

That’s the quiet lesson buried under a project about a cartoon girl and a sparrow. The tools got good enough that the bottleneck moved. It’s no longer can the model draw her — it’s where does she live between drawings. Answer that honestly and the drift problem mostly dissolves. Dodge it, and you’ll be re-typing her description forever, wondering why she keeps becoming someone else.

The model has no object permanence. That job is mine now — so I’ve stopped handing it to a chatbot’s memory and hoping.


RogueLoop. Where AI meets real-world innovation.