Thoughts are swarming my mind like a nest of cyber-rats.
Last week, generative fiction tool Sudowrite launched a system for writing whole novels. Called Story Engine, it’s another shot in the ongoing culture war between artists and AI developers — one side infuriated by what feels like a devaluation of their craft, the other insisting that it’s a tool for unlocking creativity and breaking writer’s block. Neither answered the question I was really curious about: does it work?
Well, I didn’t take on Sudowrite’s pitch of a full novel in a few days. But over the weekend, I generated a novella written entirely inside Story Engine — it’s called The Electric Sea at the AI’s suggestion, and you can read the whole thing on Tumblr.
I’m not sure how I feel about it.
I’m an enthusiastic, if strictly amateur, fiction writer. I wrote somewhere north of 150,000 words of unpublished fiction last year, so Sudowrite’s “break writer’s block” pitch isn’t that compelling to me. Writing, however, is not a task I hold inherently sacred. The field has a long and proud tradition of hastily written profit-driven trash, from Ed Wood’s churned-out erotica to the infamous pulp publisher Badger Books, known for handing authors a cover and asking them to write a book around it. I enjoy seeing where large language models’ strengths and weaknesses lie, and I’ve long been fascinated by challenges like NaNoGenMo, which asked writers to create an AI-generated novel in the days before modern generative AI. So on Saturday morning I paid for 90,000 words of Sudowrite text, booted it up, and “wrote” a roughly 22,500-word cyberpunk novella by Sunday afternoon.
Today’s a big day for Sudowrite. We’re launching Story Engine, an AI tool for writing long-form stories.
Our awesome team worked with hundreds of novelists for months to build the ideal interface for writers and machines to collaborate on a narrative. pic.twitter.com/kccZfkpGth
— james yu (@jamesjyu) May 17, 2023
The Electric Sea was produced with heavy human guidance, but every final line was created by hitting a “Generate” button. The Tumblr chapters include both the AI-written text and the summaries and story beats, which were largely rewritten by me. But technically speaking, though it cribs a lot from those beats, it contains none of my pen-to-paper prose. At most, I regenerated some chapters a couple of times and cut a few paragraphs across the whole story.
As my colleague Josh Dzieza has chronicled, Sudowrite has already semi-automated the process of writing certain types of genre fiction. Story Engine is a little different. Sudowrite’s standard interface lets authors paste in sections of their work and have the AI generate more text, rephrase things to have “more inner conflict” or be “more intense,” and brainstorm names or plot twists. Story Engine puts text generation into every step of the process.
Open the Story Engine interface, and instead of a blank white page, you’ll see a series of text boxes that form the foundation of its writing process. You start by typing the kernel of a human-generated idea in the “braindump” field. (There are also non-automated boxes for the genres and prose styles you want to write in, but I haven’t figured out how much weight those carry.) From there, Story Engine will use several more steps to expand it like popcorn into a finished product. There’s a “synopsis” box, where a button can turn the braindump into a longer plot summary. An “outline” box translates the synopsis into a list of chapters. A “characters” box generates descriptions for individual characters. Some boxes have a “rewrite” option that lets you input directions (Story Engine’s suggestions include “make the twist more dramatic” or “add more physical description”) and have the AI revise the text.
After that, finally, the machine gets to its first draft. You start a chapter by either writing or generating “story beats,” which are a step-by-step guide to everything that happens in the chapter. You then hit a button to turn the beats into prose, chunk by chunk, and send the result to Sudowrite’s main text editor.
Here’s the first story beat I asked it to work with:
Introduce Jack hacking at his computer. Focus on vivid descriptions of Jack’s squalid apartment and his moral conflict and cynicism. Jack pulls off a corporate espionage job by navigating a virtual world. He sends the information to his client. (Driver: Jack’s moral conflict is that he began hacking to expose secrets in a corporate controlled society but has ended up selling them to the highest bidder in order to finance his continued life as a hacker. Use made-up brand names and fictional corporation names. Use detailed, literary descriptions of futuristic hacking. Focus on emotion and character traits.)
And here are the first two paragraphs it generated for that beat:
Jack sat hunched over his computer, fingers flying across the grimy keys like deranged spiders. The glow of the screen cast a sickly pallor on his gaunt face, highlighting the shadows beneath his eyes. His apartment was a squalid den of decay, a mausoleum to forgotten dreams and lost hopes. Tangled wires and discarded tech littered the floor, while mold crept up the walls like black veins.
“Come on,” he muttered under his breath, as he navigated the virtual world of the SynthoCorp mainframe. Once upon a time, Jack had been an idealist, hacking to expose secrets in a corporate-controlled society. Now, he’d become what he despised—a mercenary selling those secrets to the highest bidder to finance his addiction to this digital realm.
I spent a long time experimenting with AI Dungeon and NovelAI around 2020 and 2021, and by that standard, Story Engine is extraordinarily good. Early AI text generators had trouble keeping characters’ names and pronouns straight between sentences or remembering basic location details — you could have characters enter an elevator going up and leave one going down within adjoining paragraphs. You could use a “memory” field to maintain information like the protagonist’s name, but it was inconvenient and limited. The typical story wandered between perspectives, dreamlike, or featured absurdist lines like characters “holding their knives like guns.” AI Dungeon’s early models sometimes slipped in random sex scenes.
By contrast, my Sudowrite story maintained a mostly limited third-person point of view; the sex scene I demanded faded tastefully to black. The novella was about a hacker named Jack who is caught by corporate security and taken to an AI-run corporate city to do a job for a ruthless executive. (Yes, I fed it the conceit of System Shock in honor of the upcoming remake. I made Story Engine generate most of the characters and all of the names, which resulted in Jack’s partner being named “Roxanne ‘Riot’ Ramirez” and the AI being named “the Curator” after cycling through “ORION” and “Athena.”) Story Engine got inside Jack’s perspective and stayed there better than many amateur human writers. Within a single chunk of story beats — typically several paragraphs — it almost invariably produced something that was narratively logical and coherent.
Story Engine required more guidance between beats. On its own, it tended to repeat plot points. It would have characters leaving conversations and then continuing them, or performing the same action twice in very similar language, or waking up and reappearing back in a dream. It would also contradict individual beat instructions. Large language models are basically very fancy autocomplete, which makes them cliche machines, but I couldn’t predict or control which well-worn tropes it would turn to. A beat would tell it to make an antagonist eerily silent, and the prose would give them monologues. It would direct a character to get up and leave their sleeping lover, and instead, the pair would have a heartfelt conversation.
Like any computer program, Sudowrite won’t pick up on nuance that seems obvious to a human. I split the novella’s chapters between two locations: the dirty Blade Runner-esque city where Jack started and a shiny AI-run city called Elysium — again, its name, not mine — floating in the middle of the ocean, where he spent most of the story. Story Engine generated a character whose description to me clearly referenced the shiny AI city, then immediately placed her in Jack’s gritty hacker home. (To its credit, it mostly remembered she was supposed to stay there, although I occasionally had to pick her out of beats.) Likewise, when it wrote the very end of my final chapter, it produced what was either a very unsatisfying sequel hook or a lead-in to another plot point. I cheated and cut the last paragraph off.
If I crafted beats precisely enough, though, Story Engine could get very close to my intent. Take part of a beat from Chapter 3:
A song plays on the speakers in the restaurant. Use hip, detached prose to describe what the song is like. Roxanne talks to Jack and gives a highly technical explanation of the music theory behind the song. After she finishes talking, describe the lyrics and musical content of the song. As the song ends Jack asks sarcastically if there’s any real emotion in the songs she creates with the AI.
I’d written a less detailed beat at first, and Story Engine had simply summarized it. But apparently adding “talks to” (among other things) meant Roxanne delivered a line doing precisely what I asked:
Jack raised an eyebrow, searching for a hint of sincerity in her words. “And what is it that you do, Ms. Ramirez? You mentioned music, but I’m guessing it’s not the kind that rattles cages.”
“Ah, you’ve got me there,” she admitted with a chuckle. “I work with the Curator AI to create all the pop music for Elysium.” As if on cue, a song began playing through hidden speakers — synthetic beats and haunting melodies, an echo of human emotion distilled into algorithmic precision.
“Listen closely,” Roxanne said, her voice taking on a clinical tone. “The song is structured on an octatonic scale with chromatic passing tones, creating tension and anticipation. The verses alternate between minor and major keys, evoking a sense of longing and melancholy.”
Jack listened, his ears picking up the subtle intricacies of the tune as Roxanne dissected it. The lyrics described a love lost in the digital age, tangled in a web of ones and zeros, but somehow it all felt hollow — bereft of the raw passion that once fueled mankind’s creative spirit.
“Seems like just another manufactured hit to me,” Jack commented sarcastically, swirling the remnants of his drink. “Is there any real emotion left in the music you create with this AI?”
Eventually, I developed a system for keeping the thing in line. Starting with a generated outline, I would rewrite a single chapter’s synopsis to my liking. I would let Story Engine generate initial story beats, then rewrite those and prune action that jumped ahead too far or moved in the wrong direction. I would generate a two-beat chunk of fully written prose, see if it was doing anything unexpected and interesting, modify the next two beats to continue the narrative coherently, and keep going until the chapter was done. Then I’d look at the finished chapter, decide how the AI’s work should fit into the larger story, rewrite the next chapter’s synopsis to fit better, and run the same process on it.
It’s hard to say exactly how much I wrote to produce The Electric Sea. The prose was based on about 6,500 words of plot beats, mostly the result of me heavily rewriting the AI’s suggestions. The process was vastly faster than my normal writing speed, but it was also a far cry from hitting a button to spit out a book. It’s also a lot like my normal writing process: I typically start with a broad conceit, write a summary of the first act or two, write a few chapters, realize they’re going in a different direction than I intended, change my outline, and keep going.
But it was so fast in part because I disregarded any concerns about originality or complexity. The Electric Sea is Baby’s First Cyberpunk Story. It features a cynical hacker rebelling against an evil unnamed corporation — Story Engine seemed to hate giving things names unless I forced it — in cities full of smog and neon where (spoiler!) the hacker ultimately merges his consciousness with an AI. If I pushed the beats toward specific topics and events, Story Engine tended to get terse or pull directly from my summary. I never told it to imitate a specific book or writer, but it was strongest when I pitched it a broad idea I could envision from several well-known books, throwing in commands like “use vivid sensory literary prose focusing on small details” or “focus on Jack’s emotional state.” I tried to get a little fancy in Chapter 11, writing from the merged perspective of Jack and the AI, a plot point that Story Engine itself had created. It was baffled.
And the prose was corny. It hit on a couple of fantastic lines of sci-fi pastiche — in the first chapter, Jack laments that he “never thought I’d die this way … not in the goddamn meat.” (I searched for this in Google Books, wondering if it was copying another novel, and came up empty.) But other attempts were just unintentionally hilarious. Chapter 5 starts with the line “The neon rain fell like acid on Jack’s psyche” and goes on to describe “thoughts that swarmed his mind like a nest of cyber-rats.”
Sudowrite has apparently gotten less weird than when we wrote about it a year ago. I never got bizarre run-on metaphors like “the weight of an elephant sitting on them both while being eaten by a shark in an airplane full of ninjas puking out their eyes.” Instead, I lost count of the number of times it had a chill go up someone’s spine or described a structure as “labyrinthine” or had a character complain about being a pawn in someone else’s game. “Avoid cliches!” I would write in various boxes, feeling like I was slapping Story Engine’s hand with a ruler. It never worked.
I’d hoped Story Engine might at least generate consistently bad cyberpunk prose — that distinctive sci-fi hardboiled style, full of hip references and slang. But unless I kept it ruthlessly on-task, the AI became insufferably maudlin. I started filling story beats with “use cyberpunk neo-noir prose” or “remember these characters are supposed to be cynical and disillusioned” to varying effect. And yet things like this would slip in:
“Let’s do this,” Roxanne breathed, her voice heavy with the weight of their mission. “For Elysium.”
“For Elysium,” Jack echoed, his heart pounding with resolve as he stepped forward into the unknown.
You don’t have a mission, Jack! You hate Elysium! You got there 24 hours ago!
For what it’s worth, I’ve gotten far more interesting preliminary results with other prompts. I tried a separate story with the genre “western,” the braindump “a man has to learn how to make coffee,” and the instructions “write in the style of Cormac McCarthy, with long run-on sentences and a bleak tone,” and it produced the following opener:
James Thompson, a man of thirty-five years, father to two young children, toiler in the ledgers and accounts of the local bank, moved each day through the gray hours like a ghost haunting his own life, borne down by the weight of an unfulfilled existence which bore its roots not in any grand failures of love or ambition but rather in the daily defeat of his inability to conjure forth from the dark grounds of coffee beans a simple cup of black elixir that would satisfy the thirsting souls of himself and those around him. A man haggard before his time, burdened with a mundane sorrow that clung to him like the dust on his boots.
Was I too specific in my cyberpunk prompting? Too pedestrian? Should I have name-dropped William Gibson? Does Sudowrite inherently associate the sci-fi plot I offered with bad writing? (I tried a very simple version of the prompt early on, and far from being as much fun as the Cormac McCoffee paragraph, the result was even more boring.) Or would the western prose have devolved as I tried to push the story in any consistent direction, the way it seemed to in my novella?
Most coverage I’ve seen of Story Engine treats it as an insult to the lofty craft of writing, insisting that no real author would use things like filler text or stock plots. I’m not sure this is correct, and I’m also not sure how much it matters to many readers. A lot of people aren’t necessarily looking for a connection with authors’ deepest selves — they just want a page-turner to distract them at the beach. Likewise, it’s hypothetically possible that Sudowrite could reproduce chunks of exact text from some specific writer because it’s trained on huge amounts of written work. But without very deliberate direction, it seems to lean on expressions that are far too common to pin down that way.
As someone with no plans to make a living off fiction, the downsides for me seem more personal. Writing is a pastime I enjoy, and it’s led me to a lot of fascinating places, even when the end result won’t be sold or even read by anybody else. I’ve taken up entire hobbies and vacations for research purposes. I like devising a good turn of phrase or exploring a character’s motivations. I enjoy feeling like I’ve done something a little unexpected or, conversely, like I’ve written a spot-on pastiche of a style. I don’t care about an AI “replacing” me the way I don’t worry about an industrial knitting machine replacing my handmade shawls — the process is the point.
Using Story Engine is different. In addition to my struggles with its prose style, it ignored almost any part of my braindump that felt like me. The first version of my pitch was set in an alternate-history 1980s that was supposed to be filled with retro tech, a long-running passion of mine. The AI was supposed to, in an echo of what I was doing with Sudowrite itself, just create media instead of running the entire city. I quickly abandoned all of this for the lowest common denominator of plot and setting. The most idiosyncratic set piece I could work in was a domed floating city, which did draw a nice quip from Jack:
“Behold, Elysium!” Grant announced, an unmistakable note of pride in his voice. “A true marvel of human ingenuity. Over a hundred square miles of meticulously designed living space, all governed by our benevolent corporate AI, the Curator.”
“Sounds like a dystopian wet dream,” Jack retorted, unable to contain his cynicism.
Which brings me to the big question every writer seems to ask about AI: is it better than me? I didn’t try to make Sudowrite imitate my own writing. But if you handed a chapter of my work to someone along with a chapter of The Electric Sea… I suspect some people would prefer the latter. I tend to have the precise opposite problems Story Engine does. I pile on conceits and conversations between characters. I experiment with deliberately flat or barely readable prose, awkwardly hyper-contemporary settings, or fascinations that interest nobody else. I write characters that exaggerate the traits I like or hate most about myself. I am often painfully, reflexively cynical and cruel. Story Engine seems, at least, differently bad than me. I can live with that.
For all its shortcomings, Story Engine is strangely satisfying. If early AI writing felt like guiding a very well-read toddler into telling stories, Story Engine feels sort of like building a video game prototype. You start with an idea and try to get a computer to execute it. The results probably aren’t quite what you expect, but through trial and error, you can lean into what the system does well and find the fun.
Story Engine can’t think, but I loved making it pretend to think like a writer. At some point, the thing decided Jack had a sister who’d been killed, in reference to a request I’d made for a tragic past. I added this to the official character description and started periodically calling back to her death in story beats, like having the AI impersonate her and making a character’s murder remind Jack of her demise. Finally, as Jack merged with the AI in Chapter 10, it decided with no prompting that her memory would be the final piece of his humanity that he held onto. Was it sentimental? Sure. But in that moment, I was so proud of my robot apprentice.