I posted elements of an experiment I ran last night for the second time, so as to get cleaner results than my even more hodge-podge first run. I’m thinking about it as Narrative Rehydration, and you can see more at the Github repo linked.
Briefly, in my own language, Narrative Rehydration focuses on whether you can take a sort of loosely encoded version of an underlying story structure, and with some other elements that we will get into, plop the whole package into a gen AI system, and have it render results which are faithful to the structural skeleton described. We’re not trying to reproduce exact words from some original text version of a story, because there is none.
Instead, a sample story broken down into this format would look like the below. I had the system encode Little Red Riding Hood, and then went in and tinkered with it a bit for clearer separation of parts:
time:morning > mother > give > basket @ girl
mother > warn > "Stay on the path." @ girl
girl@woods > meet > wolf
wolf > ask > "Where are you going?" @ girl
girl > answer > "To grandmother's cottage." @ wolf
wolf@cottage > swallow > grandmother
wolf@bed > disguise > as[grandmother]
time:afternoon@cottage > girl > say > "What big eyes you have."
woodcutter@cottage > cut > wolf.open
grandmother.alive > emerge
Within this, I’m referrng to each line as a “frame” and > marks are acting as flexible connectors between elements within a frame, which consist of things like time & setting, actors (symbols), actions/events, and objects. There are also some text bits which are “pinned” within the frame, in quote, such that they are supposed to be used verbatim in final outputs – versus the rest which is supposed to be interpreted and fleshed out by the renderer based on rules included in the packet.
I won’t repro the whole thing here, you can see it in the readme on Github, but included in the demo packet sent to the renderer are also instructions for reading the coded syntax above, and then the registry slices. This story example does not use my full Lorecore registry, but instead uses a demo of simplified registry slice contents, which looks like this:
REGISTRY SLICE — the only units that may appear
Characters — each entry: key — Name | “byname” | description
- girl — Maria | “the girl in the red hood” | A young girl carrying a basket to her sick grandmother.
- mother — Esmeralda | “the girl’s mother” | Sends Maria with the basket; warns her to stay on the path.
- wolf — Grumple | “the hungry wolf” | Tricks Maria, reaches the cottage first, swallows the grandmother, waits disguised in her bed.
- grandmother — Monique | “the sick grandmother” | Lives alone in the cottage; swallowed; emerges alive.
- woodcutter — Gary | “the passing woodcutter” | Intervenes; cuts the wolf open.
Props & settings — named only, never act
- basket — “the basket of food”
- bed — “the bed”
- cottage — “grandmother’s cottage”
- woods — “the dark woods”
- path — “the path”
So the included Registry slices is like the cast of characters & props list, and any important information about them.
Then the encoded frames at top say what the characters & props did or had done to them, etc.
And then there are rules, instructions, and constraints that are included:
ALLOWED USAGE
- First mention of a character: name + byname in apposition, set off with commas. Write the byname without quotation marks. Later mentions: bare name.
- Quoted speech in frames is pinned: reproduce it verbatim. Never paraphrase, extend, or add dialogue.
- Props (basket) never act. Settings (woods, path, cottage) never act.
- Nothing outside this slice may appear. No new characters, no new places.
LICENSED INVENTION — declare it or don’t do it
- [manner] — how a licensed action is done. Must not change the action.
- [texture] — sensory detail of a licensed unit or its immediate scene. No new entities.
- [bridge] — minimal linkage between frames (“afterward”). No new events.
- BANNED: new characters, new plot events, new dialogue, motives, added causes.
Then for the demo packet, I am asking the renderer to produce three different versions based on the packet contents: SHORT, EMOJI, LONG. Emoji is obviously the most compressed, followed by Short, and Long allows for the most liberal invention.
Without going into it deeply here, it then runs some checks, to try and force the renderer to account for itself in any inventions that it did, units that it used from the registry slices, and so on. I had prior versions of these checks I ran in an earlier one that I think might have been different or better, but anyway, this gives still the idea.
Lastly, this is a “rehydrated” SHORT rendering of the encoded story-frames included at top. This is meant as a baseline against which to compare other model’s renderings. I think this rendering comes from a Muse work session:
- In the morning, Esmeralda, the girl’s mother, gave the basket of food to Maria, the girl in the red hood.
- She warned Maria, “Stay on the path.”
- Maria, in the dark woods, met Grumple, the hungry wolf.
- Grumple asked Maria, “Where are you going?”
- Maria answered Grumple, “To grandmother’s cottage.”
- At the cottage, Grumple swallowed Monique, the sick grandmother.
- In bed, Grumple disguised himself as Monique.
- In the afternoon, at the cottage, Maria said, “What big eyes you have.”
- Gary, the passing woodcutter, cut Grumple open at the cottage.
- Monique emerged alive.
So you can see more or less how the renderer synthesizes from the raw encoded frame desciptions that tell story actions, and glues that together with the registry slice information, and then clothes it according to allowed/licensed usage in the packet.
Ultimately, the packet here is a simplified version of a “cassette” to use the terminology of tape.deck.
Anyway, I saved complete results from four different renderers based on the text packet shown in the Github repo’s readme file. They are:
And since Muse designed the packet in its demo version (and did the original lift for my real bigger registry, before I moved it over to Codex), I had it do scoring of results above.
There are many different findings that are interesting here, and I’m frankly racing to keep some sort of semblance of being able to track all of what I have going on in some semi-coherent fashion. If nothing else, I think it’s interesting that four different models render this frame in different emojis:
time:morning > mother > give > basket @ girl
- ChatGPT: 👩🏻🦰🎁🧺👧🏻
- Deepseek:
🌅👩🎁🧺➡️👧 - Gemini: 🌅 👩👦 🧺 ➡️ 👧
- Perplexity: 🌅👩➡️🧺👧
It’s noteworthy that three of the four renderers interpreted time:morning as emoji-sunrise 🌅. And then to see the various interpretations of [woman|mother] and how giving (🎁) a basket (🧺) to (➡️) girl (👧🏻) is variously portrayed. I personally prefer ChatGPTs one as the most cleanly legible. I see that a woman gifted a basket to a girl pretty readily, without too much extra cruft… I don’t actually care about morning\sunrise etc here so much as that core action happening, regardless of time of day.
Anyway, all of this is significant because it shows a proof of concept around a simple version of cassettes. More to come! My actual work is so far ahead of what I’ve even been able to blog about here, and it’s only been a handful of days I’m plugging away at this…
Leave a Reply
You must be logged in to post a comment.