I spend a lot of time on perchance and I keep seeing the same complaint: story generators open with something completely random. You type a class reunion four states away and the first paragraph is about a stopped grandfather clock in the house. You ask for a business conference and get a seized truck motor. People blame the model, or they blame perchance. It's almost never either of those. It's the instructions the creator wrote, and the memory system (or lack of one) behind them.
I've been building one of these (perchance.org/moechat) and I've torn apart a bunch of other people's generators while doing it. Below is what actually improves your generator, and at the end are the real prompts I use, ready to copy. Steal them, cut them up, whatever.
One thing before you read: perchance is just a box that sends whatever you wrote to an AI. If the output is generic, the instructions were generic. The model has no idea what your story is about unless your prompt tells it.
1. The model only knows what you tell it
A two-line instruction gets a two-line effort. Something like {story idea} write a story leaves the model with a vacuum, and it fills vacuums with RP slop: rain on a window, a clock that stopped at 3am, "something unreadable flickered in his eyes." That's not the model being bad. That's an empty/bad prompt.
If you want an anchor, anchor it. Who is in the scene, what just happened, what each person wants in the next ten seconds, what the room looks like. Concrete setup means less invented nonsense.
2. Tell it the size of the reaction
This is the biggest thing people miss and it's why so much AI RP reads like a chatbot. Models default to maximum drama. The player shrugs and gets a three paragraph monologue about betrayal.
Say it in plain words in your instructions:
1.) A smile is a smile. Silence is silence.
2.) Looking at someone is not a confession or an invitation unless someone said so.
3.) Match magnitude, not energy. Do not upgrade a shrug into a love confession.
4.) Do not recap what the player just did. They were there.
Sounds obvious. It changes everything.
3. Ban the model's favorite words
Every model has a house style and it will reach for it every time. Put an actual banned list in the prompt. Not censorship, just a filter for its own clichés. It works better than you'd think, because the model notices it's about to write one and swerves.
Words that should be illegal in RP: velvet, predator, "the air grew thick", "a ghost of a smirk", "dangerously sweet", "simmering intensity", "almost imperceptibly", "despite himself", "something unreadable flickered in his eyes", "it's not X, it's Y", "she didn't X she Y".
Also ban labelling thoughts. He thought: I shouldn't do this is bad writing. The door was still open. He could still leave. He didn't. is good writing. There's a full list in the system prompt below.
4. Stop dumping the whole chat into the prompt
This is the other half of the problem, the memory half. Two lazy approaches and both fail:
1.) Send nothing but recent messages. The character forgets a promise made twenty turns ago, or the injury, or the name.
2.) Send everything. It gets expensive, slow, and the model drowns in old chatter and starts contradicting itself.
The fix is a small file of durable facts plus keyword recall. Each fact gets a few trigger words. On every reply you scan the newest few messages, and only the facts whose trigger words show up get injected. So the AI remembers a thing exactly when the conversation is about that thing.
That's what kills "the AI forgot" and also what fixes "the AI opened with something unrelated," because the current scene stays grounded in what's actually been established.
Here's the prompt that writes those facts. You run it in the background every few replies. It reads only the new exchange and the already known facts, so it never duplicates:
(I've put it in the pastebin since the ... seems to be broken here.)
https://pastebin.com/raw/16anEEEu
The KEY bit is the part most people skip and it's the part that keeps a character consistent over a hundred turns. When something changes (the character's arm gets broken, a goal gets resolved, an item changes hands) it writes the new value with the same key and retires the old one. The AI never sees both versions and never contradicts itself.
For recall, match the trigger words against the newest few messages plus the current scene state, and cap how much gets injected. Mine is roughly six facts and 1500 characters per reply. More than that and you're back to drowning the model.
5. Keep a live scene state
Memory is about the past. The scene state is about right now, and it's the cheapest fix for the AI forgetting who's standing in the room or whose arm is broken. Run it every few replies:
https://pastebin.com/raw/ANFJCj60
Notice it's told to always write all six keys, with "none" where empty. If you let it skip keys it drops "Present" and suddenly nobody knows who's in the room.
6. Summarize as you go
Old turns still have to go somewhere. Roll them into a running summary. Keep the newest ~20-25 messages verbatim and compress everything older into bullet points. It keeps long chats coherent without ballooning the prompt.
Summarize the first {{n}} messages of the conversation (stop at the message ending with: "{{boundary}}"). Fold the earlier summary in. Terse bullet points that preserve: established facts, names, relationships and their changes, feelings, decisions, items, goals, promises, unresolved threads, and the current location/scene. Output ONLY the new summary text.
On top of the automatic summary, give the user a manual "recap the whole story" button, /sum style. Mine writes a detailed recap card in the transcript, and there's a "Remember" button that pins it into permanent lore so the cast really does know it. That's for the user who wants control. The automatic memory runs either way.
7. Fold the pinned stuff into one document
At some point you accumulate pinned lore and notes and it stops fitting. Condense it into a single reference document that's always in the prompt, with a hard token cap:
https://pastebin.com/raw/0itX2QDD
8. The actual system prompt
This is the big one. It's the instruction that goes on every request, with your cast profiles, world, and the current scene appended after it. It's built around all the points above: identity first, match the size of the reaction, ban the clichés, let the scene breathe, don't summarize the player's own action.
Two notes before you paste it. First, {{user}} is the player's name, swap in your own placeholder. Second, this prompt assumes your engine also sends the cast profiles, the world, the current scene state and the memory block as separate sections (that's what it means by CAST & PROFILES, SCENE STATE, MEMORY FILES, and <CONV>). If you just paste this alone you'll get half the benefit.
https://pastebin.com/raw/DbqYQZCZ
9. Match the user's energy
Last thing, and it's free. The model mirrors you. If the user types one flat line, you get a flat reply. If they type in a mood, they get that mood back. So give the user obvious controls instead of making them fight the model.
Length control (short / balanced / long), a "hold the scene" option so it stops trying to advance plot, and a "focus" option so they can point the camera at someone. Mine writes those straight into the per-request TASK line so they don't disturb the cached prefix.
Wrap up
If you take one thing from this: the model isn't bad, it's under-briefed. Give it a real character sheet, tell it how big a reaction should be, ban its clichés, and build a small keyword-recall memory instead of dumping the transcript. Do that and the random grandfather clocks stop.
I run all of this in my own generator, perchance.org/moechat. Go try it, rate it, or break it and tell me what breaks. If you're building your own, the prompts above are yours.

1 Comments
Primal@lemmy.world · 1 pts · 3d
Models aren't bad, they're under-briefed.
If you want to stop random details like "grandfather clocks" popping up, you need to fix your prompting system:
Give it a real character sheet - Don't just say "you are X". Give it a full, detailed definition of who it is.
Control reaction size - Tell it how much to react/emote. Otherwise it overreacts. Ban clichés - Actively blacklist the phrases and tropes you don't want it to fall back on.
Don't dump the transcript - Instead of pasting the whole chat history, build a small keyword-based memory that only recalls what's relevant.
Keep the cache clean - Put dynamic stuff like camera directions / [camera at someone] straight into the per-request TASK line, so it doesn't break your cached system prefix. Takeaway: Do those 4 things and the AI stops hallucinating random objects and stays in character.
You run this system live at perchance.org/moechat and you're inviting people to try it, rate it, and break it. Could have just said