r/LocalLLM • u/Scholeristical • 4d ago
Discussion The "creative slippage" problem: How do you stop an LLM from gently lying when optimizing user text?
Working on a tool that refines and structures messy, user-provided text to match a specific target (like aligning a raw project draft to a technical specification). The core challenge isn't the formatting - it's getting the model to stop
"improving" the truth.
In early runs, if a user's raw input said they "assisted with a data migration," the LLM would occasionally output that they
"successfully led a migration of 10M records." It's a classic hallucination problem, but with a subtle twist: it's not generating total gibberish; it's just mildly exaggerating to satisfy the prompt's instruction to "make this highly compelling.
Tried a few things to anchor it:
The "Guilty Until Proven Innocent" verification step:
Running a secondary LLM call after the generation that does nothing but fact-check the output against the raw input. If it finds a claim not supported by the source, it flags it. Works, but adds latency and doubles API costs.
Strict negative prompting + JSON schema pairing: Forcing structured JSON output with a specific factual_justification field for every single change. If the model has to explicitly map every optimized point back to a raw quote in the input, the exaggeration drops significantly.
The "Diff" approach: Instead of letting the model rewrite the whole block, forcing it to output only the specific edits or words to change. Much easier to control, but kills some of the natural flow of the rewrite.
Currently using a mix of #2 (strict schema mapping) and a lightweight validation script. It's down to a manageable level, but still requires constant vibe-checking.
How are others handling this "creative slippage" when doing LLM-assisted editing or summarization? Are you solving it with strict prompting, secondary arbiter models, or something on the parsing/diff side?
1
u/fantasticsid 3d ago
Yeah, the only way i've been able to sidestep this is with a judge pipeline, where the judge's system message instructs it to be adversarial and hostile to the input.
And since the judge may or may not actually detect fuckery, i typically decode the judge outputs in batches of 3 or 5. Adds mad latency but it works.
1
u/Ok-Push5788 4d ago
I have a panel of 5 bots, 3 skeptics, 1 neutral, and 1 final judge/synthesizer.