Skip to main content

Constrained Decoding & Structured Outputs

A hardware and algorithmic constraint on token generation by language models at the inference level, mathematically ensuring 100% compliance with JSON Schema or Zod types.

1. Concept Overview & Systemic Problem

Integrating language models into production software has long resembled walking through a minefield:

  • The backend expects strict JSON with an array of users for database storage.
  • The model generates data well, but at the 45th user, it unexpectedly decides to write: ...and 15 more users following the same pattern.
  • The backend crashes with SyntaxError: Unexpected token, the transaction rolls back, and the user sees a white screen of death (500 Internal Server Error).

Constrained Decoding & Structured Outputs have permanently eliminated this issue. Now, data schema compliance is guaranteed not by a "polite request in the prompt," but by a mathematical constraint on token selection at each inference step.

2. Architectural Taxonomy & Mental Model

┌─────────────────────────────────────────────────────────────┐
│                 FINITE STATE MACHINE DECODING               │
├─────────────────────────────────────────────────────────────┤
│ 1. Schema Input (Zod / JSON Schema):                        │
│    `{ age: number, status: "pending" | "done" }`            │
├─────────────────────────────────────────────────────────────┤
│                          │                                  │
│                          ▼ Compiled to State Machine (FSM)  │
├─────────────────────────────────────────────────────────────┤
│ 2. Token Logit Masking Step-by-Step:                        │
│    • State 0: ALLOWED ONLY: `{"age":`                       │
│    • State 1: ALLOWED ONLY digits: `[0-9]`                  │
│      (If the model wants to generate the letter "A" — its logit=-∞)│
│    • State 2: ALLOWED ONLY: `,"status":`                    │
│    • State 3: ALLOWED ONLY: `"pending"` or `"done"`         │
│    • State 4: ALLOWED ONLY: `}`                             │
├─────────────────────────────────────────────────────────────┤
│ 3. 100% Guaranteed Valid JSON Output Ready for Database!    │
└─────────────────────────────────────────────────────────────┘

3. Technical Pipeline & Internal Mechanics

01. Typed Content Generation with Zod in Next.js

Using the built-in AI SDK library (Vercel):

import { generateObject } from 'ai';
import { z } from 'zod';

const { object } = await generateObject({
  model: openai('gpt-4o'),
  schema: z.object({
    recipeName: z.string(),
    ingredients: z.array(z.object({ item: z.string(), grams: z.number().positive() })),
    cookingMinutes: z.number().int()
  }),
  prompt: 'Generate a borscht recipe'
});
// TypeScript guarantees the type `object`, no manual `JSON.parse` needed!

02. Generating SQL Queries Without Syntax Errors

The model is constrained by the grammar of the PostgreSQL SQL dialect. It physically cannot generate a query with an unclosed parenthesis or incorrect keyword.

4. Production Engineering Scenarios

01. Typed Content Generation with Zod in Next.js

Using the built-in AI SDK library (Vercel):

import { generateObject } from 'ai';
import { z } from 'zod';

const { object } = await generateObject({
  model: openai('gpt-4o'),
  schema: z.object({
    recipeName: z.string(),
    ingredients: z.array(z.object({ item: z.string(), grams: z.number().positive() })),
    cookingMinutes: z.number().int()
  }),
  prompt: 'Generate a borscht recipe'
});
// TypeScript guarantees the type `object`, no manual `JSON.parse` needed!

02. Generating SQL Queries Without Syntax Errors

The model is constrained by the grammar of the PostgreSQL SQL dialect. It physically cannot generate a query with an unclosed parenthesis or incorrect keyword.

03. Validating API Responses Against JSON Schema

Implementing a middleware that validates API responses against a predefined JSON Schema ensures that all outgoing data adheres to expected formats, preventing runtime errors in client applications.

5. Pitfalls, Common Mistakes & Security

  • Risk of Infinite Loops (Deadlock Rejection): If the schema requires a number, but the model, based on its internal logic, wants to write text, it may get stuck generating infinite spaces or commas allowed by the grammar. Always limit the maximum number of tokens.
  • Syntax != Semantic Correctness: Structured output guarantees that the age field will be a number, but does not ensure that this number will not be -500 or 15000. Semantic validation must be supplemented with business rules.
/ Frequently Asked QuestionsSchema.org FAQPage

FAQ: Constrained Decoding & Structured Outputs

LLMs generate tokens probabilistically. Even with a temperature of 0.0, under high load or unexpected characters, the model might prepend text ('Here is your JSON:') or omit a quote, breaking `JSON.parse()` on the backend.
/ Internal links
All terms