Skip to the content.

Context

An LLM generates content that will be used or stored, and its output is sometimes wrong in ways a targeted check could catch. Verifying a specific property (grammaticality, factual match, difficulty level) is a narrower task than the open-ended generation that produced it.

Examples

The vocabulary exercises need example sentences for each word, which an LLM generates at the learner’s level, an open-ended task (the sentence must be natural, level-appropriate, and actually use the word). A generated sentence can still be wrong in a specific way: it may use the word in a different sense than the one being taught. For the Danish virker (translated as seem), a generated sentence might use virker in its other sense, work/function. A second, batched LLM call then asks one narrow question of each sentence, whether it uses the word in the intended meaning, and drops the ones that fail. Verifying that single property is far narrower than writing a good sentence from scratch.

A second pair ran on article simplification, and has since been switched off, which is what makes it worth reporting. Rewriting an article to a lower CEFR level is open-ended; whether the result is grammatical is not. A second call read each simplified title and body and returned corrections, which were applied to the text.1 Between December 2025 and April 2026 we measured what it caught: roughly 96% of title corrections and 72% of body corrections changed two characters or fewer. The check worked. What it found was not worth what it cost, and it is now disabled by default.

The two pairs differ in what happens on failure, which the pattern deliberately leaves open: an example sentence is expendable, so it is dropped and another word used, while a simplified article is the only version at that level, so the check produced a correction instead. But the retired pair carries the sharper lesson. The asymmetry that makes verification cheaper than generation says nothing about whether the errors are worth catching. That is a separate question, and only measurement answers it.

Problem

How can an unreliable generator’s mistakes be caught, when a second generator would be just as unreliable?

Forces

Solution

Use one LLM call to generate a result, then a separate, differently-prompted LLM call to check one specific property of it. This escapes the paradox for two reasons. First, verifying one property (is it grammatical? does it use the intended meaning?) has a small, well-defined answer space and a clear success criterion, so an LLM does it more reliably than the open-ended generation that produced the output. Second, because the checker is prompted differently and asked a different question, its errors are largely decorrelated from the generator’s rather than shared, so it does not simply repeat the generator’s mistakes.

Verifying is narrower than generating: a second, differently prompted LLM call verifies one property of the first call's output (is it grammatical?), a smaller task it does more reliably. The two calls feed each other: on a failed check the reason goes back to the generator, the loop of Reject and Reprompt; dropping the item or recording the verdict are the other policies.
Verifying is narrower than generating: a second, differently prompted LLM call verifies one property of the first call's output (is it grammatical?), a smaller task it does more reliably. The two calls feed each other: on a failed check the reason goes back to the generator, the loop of Reject and Reprompt; dropping the item or recording the verdict are the other policies.

A failed check still needs a policy, and the pattern does not fix one: drop the result, record the verdict, or Reject and Reprompt. Dropping is cheapest and fits where the item is expendable (the vocabulary sentences above are discarded and other words used instead). Recording the verdict alongside the output instead of acting on it is LLM Content Validation Tracking. Regenerating with the reason the check gave, within a bounded number of attempts, is Reject and Reprompt, whose loop works with any checker, an LLM included.

Consequences

Known Uses

Notes


💬 Open an issue about this pattern

  1. GrammarCorrectionService in the zeeguu/api repository. ↩