agentic.dev

Structured Output from LLMs: JSON Mode, Tool Use and Schema Validation

Published 2026-02-21

Structured Output from LLMs: JSON Mode, Tool Use and Schema Validation

As I've been working with large language models (LLMs) over the past year, I've noticed a significant shift in how we interact with these models. Gone are the days of treating LLMs as simple text generators; today, we're leveraging them to produce structured output that can be easily consumed by downstream applications. However, this shift has also introduced new challenges, particularly when it comes to ensuring the accuracy and consistency of the output. In this article, I'll explore the opportunities and tradeoffs of using LLMs to generate structured output, with a focus on JSON mode, tool use, and schema validation. I'll also provide specific examples and code snippets to illustrate the concepts and make them more concrete.

Introduction to JSON Mode

One of the most significant advancements in LLMs is the introduction of JSON mode, which allows models to generate output in a structured JSON format. This is a game-changer for applications that require machine-readable output, such as data integration, API design, and automated testing. With JSON mode, LLMs can produce output that is easily parseable and consumable by other systems, eliminating the need for manual data processing and reducing the risk of errors.

Tooling for LLMs

While JSON mode is a powerful feature, it's only one part of the equation. To get the most out of LLMs, we need to pair them with the right tooling. This includes libraries and frameworks that can help us interact with the models, process the output, and validate the results.

One of the most popular tooling options for LLMs is the Hugging Face Transformers library. This library provides a simple and intuitive API for working with LLMs, including support for JSON mode. With Transformers, we can easily load pre-trained models, generate output, and process the results.

Here's an example code snippet that demonstrates how to use the Transformers library to generate JSON output:

import json from transformers import pipeline

Load the pre-trained model

model = pipeline("text-generation", model="t5-base")

Define the input prompt

prompt = "Generate a list of product recommendations for a user who likes hiking"

Generate the output

output = model(prompt, output_format="json")

Print the output

print(json.dumps(output, indent=2))
This code snippet loads a pre-trained T5 model, defines an input prompt, generates the output in JSON format, and prints the result.

Schema Validation

While JSON mode and tooling are essential for working with LLMs, they're only half the battle. To ensure that the output is accurate and consistent, we need to validate it against a schema. This is particularly important in applications where data quality is critical, such as data integration, API design, and automated testing.

One of the most popular schema validation libraries is JSON Schema. This library provides a simple and intuitive API for defining schemas and validating JSON data against them.

Here's an example code snippet that demonstrates how to use JSON Schema to validate the output:

import json from jsonschema import validate

Define the schema

schema = { "type": "object", "properties": { "products": { "type": "array", "items": { "type": "object", "properties": { "name": {"type": "string"}, "price": {"type": "number"}, "rating": {"type": "number"} }, "required": ["name", "price", "rating"] } } }, "required": ["products"] }

Load the output

output = json.loads(''' { "products": [ { "name": "Product A", "price": 19.99, "rating": 4.5 }, { "name": "Product B", "price": 29.99, "rating": 4.2 }, { "name": "Product C", "price": 39.99, "rating": 4.8 } ] } ''')

Validate the output

validate(instance=output, schema=schema)
This code snippet defines a schema for the output, loads the output, and validates it against the schema. If the output is valid, the code will execute without errors; otherwise, it will raise a validation error.

Real-World Applications

While the concepts and techniques I've discussed so far are essential for working with LLMs, they're only useful if we can apply them to real-world applications. In this section, I'll explore some examples of how we can use LLMs to generate structured output in real-world scenarios.

One example is data integration. Suppose we're building a data pipeline that needs to integrate data from multiple sources, including APIs, databases, and files. We can use LLMs to generate JSON output that describes the data schema, including the fields, data types, and relationships between them. This output can then be used to configure the data pipeline and ensure that the data is properly integrated.

Another example is API design. Suppose we're building a RESTful API that needs to expose a set of endpoints for creating, reading, updating, and deleting resources. We can use LLMs to generate JSON output that describes the API schema, including the endpoints, request and response formats, and error handling. This output can then be used to generate API documentation, configure API gateways, and implement API clients.

Key Takeaways

  • Use JSON mode to generate structured output: JSON mode is a powerful feature that allows LLMs to generate output in a structured JSON format. This output is easily parseable and consumable by other systems, making it a breeze to integrate with downstream applications.
  • Pair LLMs with the right tooling: Tooling options like the Hugging Face Transformers library provide a simple and intuitive API for working with LLMs, including support for JSON mode. These libraries can help us interact with the models, process the output, and validate the results.
  • Validate output against a schema: Schema validation is critical for ensuring that the output is accurate and consistent. Libraries like JSON Schema provide a simple and intuitive API for defining schemas and validating JSON data against them.

  • Published on agentic.dev.