Generative systems get interesting after the first impressive output.
The first image, paragraph, mockup, song clip, or synthetic row usually proves the model can produce something. That is useful, but it is a low bar. The product question starts after that: what shape should the output have, what counts as acceptable variation, who reviews it, what should be impossible, and what evidence do we keep when the system surprises us?
I think this is where a lot of generative AI demos lose the plot. They show range when the product needs control. Range is fun during exploration. Control is what lets somebody use the system twice.
Diffusion models make this easy to see because they literally start with noise. The model denoises toward a distribution learned from training data, guided by text, conditioning inputs, classifier guidance, masks, seeds, and sampler settings. The user sees an image arrive. The system sees a stack of constraints pushing randomness into a useful shape.
Text generation has the same problem with different machinery. Temperature, system instructions, schemas, retrieval context, tool results, examples, and output validators all act like constraints. They do not make the model boring. They make the output usable.
creativity is bounded motion
When somebody asks for a “creative” AI feature, I want to know which parts are allowed to move.
For an image generator, maybe the composition can vary but the product color cannot. Maybe the background can change but the logo placement cannot. Maybe a storyboard can explore mood, but the character sheet has to remain consistent across scenes. In those cases, free generation is the wrong mental model. The better model is controlled variation.
For a writing system, maybe the examples can change but the claims must come from cited sources. Maybe tone can flex but the legal disclaimer must stay intact. Maybe the assistant can summarize support tickets, but it cannot invent a refund policy or promise a timeline. The generated text is not a blank page. It is a draft inside a set of obligations.
That sounds obvious until the first version of the product ships with a single prompt and a save button. Then the same feature has to answer product questions it was never designed to handle:
- Which fields are locked?
- Which fields can be regenerated independently?
- Which constraints came from the user, the brand system, the policy layer, or the surrounding document?
- What happens when the user asks for something outside the allowed range?
- Can we reproduce the output later?
If those questions do not have a place in the design, the model becomes the place where every decision hides.
constraints are product material
Constraints should not live only in a prompt string. Prompts are too easy to treat like a magic paragraph. A production generative system usually needs constraints represented as data.
For an image workflow, I would rather see something like this than a loose prompt builder:
type ImageGenerationRequest = {
subject: string
intent: "thumbnail" | "hero" | "diagram" | "product_mockup"
lockedElements: Array<{
kind: "logo" | "color" | "text" | "composition" | "character"
rule: string
}>
allowedVariation: {
palette?: string[]
camera?: string[]
styleReferences?: string[]
seed?: number
}
reviewRules: string[]
}
That type will not save the product by itself. The useful part is that it forces the team to name the moving pieces. Once those pieces are named, you can inspect them, test them, and explain them to a reviewer.
The same pattern applies to text. A customer-facing generator should know the difference between source facts, user preferences, required clauses, and generated connective tissue. A synthetic data generator should know which label distribution it is trying to match and which slices are intentionally overrepresented. A code generator should know which APIs are allowed and which files are out of scope.
The constraint model is part of the product. It deserves the same review as the interface.
sampling is not policy
Temperature and top-p are useful controls, but they are not policy. Lowering temperature can reduce visible weirdness, but it does not tell the system which facts matter, which claims need sources, or which outputs should be rejected. Raising temperature can create variety, but it does not make the variety good.
This matters because teams sometimes tune sampling parameters as if they are solving product quality. They are usually solving texture.
For image models, a seed can make a result reproducible. A negative prompt can steer away from obvious failures. A mask can localize edits. Guidance scale can change how tightly the model follows the prompt. Those are real controls, but none of them answer whether the output is acceptable for the use case.
An acceptance rule sounds more boring:
- The generated product image cannot alter the product geometry.
- The generated diagram must preserve all labels from the source sketch.
- The generated support reply must cite the policy article it uses.
- The generated dataset must keep train and eval examples separated by source document.
- The generated summary must include uncertainty when the input conflict is unresolved.
Those are better controls because they can fail. A parameter can be adjusted forever. A rule can say no.
review paths should match risk
Not every generated output needs the same review path. A background texture for a personal note can be regenerated until it feels right. A customer email, a medical image explanation, a compliance summary, or an adversarial eval set needs a different amount of friction.
The review path should follow the cost of being wrong.
Low-risk generation can optimize for speed. Give the user previews, variants, undo, and local editing controls. Keep the system responsive and avoid pretending every output needs ceremony.
Medium-risk generation needs traceability. Show the inputs that shaped the output. Keep the seed or model version when reproducibility matters. Let the reviewer see which constraints were applied and which ones were ignored.
High-risk generation needs separation between proposal and acceptance. The model can draft, segment, classify, or compose, but another step has to decide whether the output can move forward. That step might be deterministic validation, human review, a second model with a narrow rubric, or a domain-specific checker.
The annoying part is that risk changes inside the same product. A marketing image generator might be low risk for a mood board and high risk for a final ad using a protected brand asset. A code generator might be low risk in a scratch file and high risk when it touches authentication. A synthetic data tool might be low risk for UI demos and high risk when eval results decide whether a model ships.
That means review cannot be bolted on at the end. The workflow needs enough state to route the output based on what it is being used for.
failure often looks polished
Generative failures are irritating because they are often attractive. The image is sharp. The paragraph reads cleanly. The code compiles. The synthetic examples look plausible. The problem is that the output violated a constraint the system never made explicit.
For images, that might be a product detail that changed, a face that drifted between frames, a diagram that swapped label positions, or a chart that looks official but encodes nonsense. For text, it might be a confident citation to the wrong source, a summary that smooths over a disagreement, or a policy answer that sounds helpful while promising something the company cannot do.
The review loop has to look past surface quality. I would rather inspect boring artifacts:
- original input
- generated output
- model and version
- seed or sampling settings when available
- constraints requested
- constraints checked
- reviewer decision
- reason for rejection
That record is not glamorous. It is how the team learns whether failures cluster around prompt ambiguity, missing constraints, weak validators, bad retrieval, model drift, or reviewers accepting outputs too casually.
Without that record, every bad generation becomes an anecdote.
generated output needs an edit model
A lot of generative products treat regeneration as the main correction mechanism. That is fine for a toy. It is frustrating in real work.
When a user says, “keep this part but fix that part,” the system needs an edit model. In image tools, that might mean masks, layers, object references, region-level regeneration, locked text, or a retained seed. In writing tools, it might mean paragraph-level regeneration, source pinning, protected terms, and comments that survive another pass.
This is one reason constraints should be visible. If the user cannot tell what the system is trying to preserve, they cannot give useful feedback. They end up bargaining with the model through longer and longer prompts.
Good editing controls reduce prompt negotiation. They let the user say:
- keep the structure
- change the tone
- preserve the facts
- replace only this section
- try a different visual style
- keep the subject position
That is still generation, but it behaves more like a tool than a slot machine.
what i would measure
I would not start with a single “quality” score. Quality is too vague. I would split measurement by the kind of constraint the system claims to honor.
For a writing generator, that might include source faithfulness, required-field inclusion, prohibited-claim rate, edit distance after human review, and reviewer rejection reasons. For image generation, I would look at prompt adherence, identity consistency, text rendering failures, protected asset drift, regeneration count, and how often users abandon the output after several attempts.
For synthetic data, I would care about label validity, slice coverage, duplicate leakage, train-eval contamination, and whether models trained on the generated examples improve on the target slice without regressing elsewhere.
The metric should connect to a failure the team can act on. If reviewers keep rejecting outputs because the model changes locked product details, the next fix is probably constraint representation or image conditioning. If users regenerate ten times and choose none, the problem might be the prompt UI, default style, or an output space that is too wide. If synthetic examples improve headline accuracy while hurting adversarial holdouts, the generator is teaching the model shortcuts.
Useful measurement makes the next engineering decision smaller.
the part i keep coming back to
Generative AI is strongest when the system knows what should stay still.
That is the part people skip when they talk about creativity as if it means unconstrained output. Most useful creative work has a brief, a medium, a client, a style, a deadline, a review path, and a reason the work exists. Generative systems need the same pressure.
The model can bring variation. The product has to bring boundaries. Without boundaries, generation becomes a pile of plausible artifacts that are hard to reproduce, hard to evaluate, and hard to trust.
With boundaries, the output has somewhere to land.
Related posts

About Jeremy London
Engineering leader and builder in Denver. I write about AI platforms, agents, security, reliability, homelab infrastructure, and the parts of engineering work that have to survive production.