The Divergence Loop: Finding the Creativity in AI Models
Part 1 of 2
Introduction
Over the past few weeks, I’ve been working on an offshoot of CODEYWOOD using a smaller model (Gemma 4) on my local machine.
My obsession has been around the origination of creative story ideas. The general understanding people have is that “AI is bad a writing,” however as I explored in a previous piece, this is largely due to AI reaching for the Peak Average in its responses.
Most of my work to-date has always been using the best of the frontier models, currently Claude Opus 4.7/Sonnet 4.6, and pushing those models to deliver creative writing through techniques such as writer personas and writers’ room rounds in CODEYWOOD. Through this I’ve been able to get bursts of interesting, creative ideas which I can then draw inspiration from, but I’ve yet to see an end-to-end, idea-to-screenplay result generated by AI that I’ve really been impressed by.
This made me curious about using local models to see if aiming for quantity could deliver results where aiming for quality has failed. In working with a local model (Gemma 4 30B q4) I hit on a key insight to how I’ll approach working with AI in general moving forward:
Finding: Frontier models share the same structural issues as smaller models, but they are able to better hide their flaws through sheer intelligence, while with smaller models you can diagnose those problems laid bare.
Working through the process locally with Gemma 4 has helped me develop a process I’ve been calling a DIVERGENCE ENGINE - here’s what it entails.
The Divergence Engine & Understanding How LLMs Actually Work
I’ve written a lot about battling with AI’s “centroids” or the tendency for AI to drift to certain defaults that are part of its training. Its core preferences, if you want to think of it that way.
My primary approach had been to create personas, which I’d been testing extensively with Claude, to force the model to push in different directions to where its centroid-defaults were pulling it.
I recently discovered this study, Identity as Attractor, that goes deep on a kind of forensic science approach to the LLMs asking similar questions to what I had been asking through an experimental approach.
It made me realize I haven’t been writing personas (in the marketing sense – how people think and understand information) as much as I’d been writing cognitive cores.
Cognitive cores essentially tell an AI model “what to do” rather than “who you are”
I was finding that my Claude personas were not working as well on Gemma 4 (from a drop it in and go perspective) because Gemma’s default attractors were more pronounced. Gemma’s less robust capabilities meant it wasn’t able to keep the persona “in mind” through the process, and it was just creating noise and confusion.
This forced me to break down the process in detail to understand what is really happening in the underlying mechanics of the LLM, so that I could be more surgical in how I tried to fix the problems.
Here’s where my current understanding is, based on my progress towards the goal of getting the model to be both original and coherent.
The Divergence Loop
My problem was: Gemma kept choosing the same ‘default’ ideas and concepts.
My insight is: Gemma is better at suggesting options than choosing them.
There’s a Stanford study that has stuck in my mind, which found that you can get better creative results from AI simply by suggesting:
“Generate 5 jokes about coffee and their corresponding probabilities”
I started doing that with loglines. Rather than 1 logline, have Gemma generate 10 or 20 loglines, and immediately you see more interesting results as it starts to have to reach further and further from its centroid defaults to find a distinct new answer.
That’s still not enough though, to really push the model into new creative spaces, which led me back to formalize what my personas were doing.
The Attractor Basin
My personas were actually setting a new ‘attractor basin.’ Replacing the AI’s defaults with a robust new set of values as its starting point.
In other words, if you tell AI that it must “never write about dairy products” it makes it less likely that the first thing it will reach for is “This is a story about cheese”
Through lots of testing, my personas are pretty good at setting a new attractor basin as the starting point. This attractor basin tends to hold with a robust model like Claude, but it tends to slip or get overloaded with a smaller model like Gemma. If it slips, you end up getting Gemma’s defaults again. If it gets overloaded, you get a mish-mash of ideas and concepts and the writing stops making sense as it loses internal cohesion.
So I had to come up with a few techniques to keep it productively divergent until the Convergence Loop when we can use Gemma’s naturally normative properties to our advantage.
The Naming Problem and Random Seeding
One very annoying and intractable problem with LLMs, large and small, is that they all pick the same names:
Elias Thorne, Mara Voss, Silas Vane, …
If you’ve asked AI to generate more than a handful of stories, then you’ll be aware of the names it keeps returning to when asked to come up with its own ideas.
This is one of many examples where just asking AI to create more options doesn’t tend to solve the problem. Create 20 names, and you’ll still get the same 20 names.
It’s the most obvious tip of the centroid default iceberg. If you see recurring names, you should also assume there are recurrent themes and concepts lurking underneath the writing.
As I mentioned, the personas alone were not enough to crack this, but I eventually found a technique in random seeding.
Random seeding is taking a large (encyclopedic) amount of reference information and programmatically selecting a small excerpt to pass to the AI to use as background grounding for your creative work.
I ended up with a fairly extensive process to solve naming, but the random seeding portion worked like this:
I extracted a list of 170+ countries and asked ChatGPT to expand that out into a list of cultures. For each country, find 1-2 current cultures, 1-2 historical cultures and 1-2 pre-historical cultures.
Using that source of 1500+ cultures, I have a script (no AI) select 3 cultures at random that will be used as the basis of the background lore and naming for the story. (Of course you can be more selective here depending on your specific needs, but I’m going as broad as possible)
And that solved naming.
Basically, the process is understood as giving the AI choices that it wouldn’t otherwise choose itself.
Or as Claude chose to call it:
Programmatic Divergence Pressure
You can’t ask the AI to just pick 3 cultures, because it will tend to pick from the same handful of cultures. You can’t give it the full list of cultures, because it will still gravitate towards specific cultures on that list (Gemma kept choosing ‘Byzantine’ and ‘Tibetian Buddhist’), so you need to literally hand it a constrained list of things it wouldn’t normally choose.
Divergence Pressure
Random seeding is an option input, but like in the Stanford study, the keep mechanism here is prompting for divergence. Or simply put:
Don’t ask for (1) when you can ask for (20)
Every step of the way, I’m prompting for much more content than I need. Lots of loglines. Too many tropes and anti-tropes. Too many characters.
This is where it’s nice to have a local model, because I’m not worried about token limits.
At this step we’re basically laying out a universe of possibilities that we’ll need to start to select from and refine down.
One way I visualized it was to think: the perfect story is inside the AI model, I just have to get it to put it down on the table.
Of course, you can’t just keep exponentially diverging at every step. You’ll quickly reach billions of possibilities. Which leads to the final part of the Divergence Loop…
Random Selection
Once we have 20 loglines, we need to move forward with 5 of them. Once we have 40 tropes and anti-tropes, we need 6-10 of those.
With choices like this, I’m not using AI at all. Again, because it will gravitate to the same kinds of preferences. Instead it’s entirely random, or I’ll weight it will an automated scorecard ranking.
Then pass that selection into the top of the loop and you’re ready for the next stage of divergent exploration.
That’s probably as much as you want to read right now, so I’ll explain Part 2: The Convergence Loop, in my next post.







