Resultados estructurados en Amazon Bedrock: respuestas de IA que cumplen con los esquemas

Hoy anunciamos resultados estructurados en Amazon Bedrock, una capacidad que transforma fundamentalmente la forma en que se pueden obtener respuestas JSON validadas a partir de modelos básicos mediante decodificación restringida para el cumplimiento del esquema.

Esto representa un cambio de paradigma en el desarrollo de aplicaciones de IA. En lugar de validar las respuestas JSON y escribir una lógica alternativa para cuando fallen, puede pasar directamente a construir con los datos. Con resultados estructurados, puede crear canales de datos de validación cero que confíen en los resultados del modelo, sistemas agentes confiables que llamen con confianza a funciones externas y arquitecturas de aplicaciones simplificadas sin lógica de reintento.

En esta publicación, exploramos los desafíos de la generación JSON tradicional y cómo los resultados estructurados los resuelven. Cubrimos los dos mecanismos principales (formato de salida de esquema JSON y uso estricto de herramientas) junto con detalles de implementación, mejores prácticas y ejemplos prácticos de código. Ya sea que esté creando canales de extracción de datos, flujos de trabajo agentes o API impulsadas por IA, aprenderá a utilizar resultados estructurados para crear aplicaciones confiables y listas para producción. Nuestro cuaderno complementario Jupyter proporciona ejemplos prácticos de cada característica que se trata aquí.

El problema de la generación JSON tradicional

Durante años, obtener datos estructurados a partir de modelos de lenguaje significó elaborar indicaciones detalladas, esperar lo mejor y construir sistemas elaborados de manejo de errores. Incluso con indicaciones cuidadosas, los desarrolladores se encuentran habitualmente con:

Errores de análisis: sintaxis JSON no válida que interrumpe las llamadas json.loads(). Campos faltantes: puntos de datos requeridos ausentes en las respuestas. Faltas de tipos: cadenas donde se esperan números enteros, interrumpiendo el procesamiento posterior. Violaciones de esquema: respuestas que técnicamente analizan pero no coinciden con su modelo de datos.

En los sistemas de producción, estas fallas se agravan. Una única respuesta con formato incorrecto puede transmitirse en cascada a través de su canalización, lo que requiere reintentos que aumentan la latencia y los costos. Para flujos de trabajo agentes donde los modelos llaman a herramientas, los parámetros no válidos pueden interrumpir por completo las llamadas a funciones.

Considere un sistema de reserva que requiera pasajeros: int. Sin la aplicación del esquema, el modelo podría devolver pasajeros: "dos" o pasajeros: "2": JSON sintácticamente válido, pero semánticamente incorrecto para la firma de su función.

¿Qué cambia con los resultados estructurados?

Los resultados estructurados en Amazon Bedrock no son una mejora incremental: es un cambio fundamental del formato de resultados probabilístico al determinista. Mediante la decodificación restringida, Amazon Bedrock restringe las respuestas del modelo para que se ajusten al esquema JSON especificado. Están disponibles dos mecanismos complementarios:

Característica Propósito Caso de uso Formato de salida de esquema JSON Controlar el formato de respuesta del modelo Extracción de datos, generación de informes, respuestas API Uso estricto de herramientas Validación de parámetros de herramientas Flujos de trabajo agentes, llamada de funciones, automatización de varios pasos

Estas funciones se pueden utilizar de forma independiente o conjunta, lo que le brinda un control preciso sobre lo que genera el modelo y cómo llama a sus funciones.

Qué ofrecen los resultados estructurados:

Siempre válido: no más errores JSON.parse() ni excepciones de análisis Tipo seguro: los tipos de campo se aplican y los campos obligatorios siempre están presentes Confiable: no se necesitan reintentos en caso de violaciones del esquema Listo para producción: implemente con confianza a escala empresarial

Cómo funcionan los resultados estructurados

Los resultados estructurados utilizan muestreo restringido con artefactos gramaticales compilados. Esto es lo que sucede cuando realiza una solicitud:

Validación de esquema: Amazon Bedrock valida su esquema JSON con el subconjunto JSON Schema Draft 2020-12 compatible. Compilación de gramática: para esquemas nuevos, Amazon Bedrock compila una gramática (la primera solicitud puede tardar más). Almacenamiento en caché: las gramáticas compiladas se almacenan en caché durante 24 horas, lo que agiliza las solicitudes posteriores. Generación restringida: el modelo genera tokens que producen JSON válido que coincide con su esquema.

Consideraciones de rendimiento:

Latencia de la primera solicitud: la compilación inicial puede agregar latencia a los nuevos esquemas. Rendimiento en caché: las solicitudes posteriores con esquemas idénticos tienen una sobrecarga mínima. Alcance de la caché: las gramáticas se almacenan en caché por cuenta durante 24 horas desde el primer acceso.

Cambiar la estructura del esquema JSON o el esquema de entrada de una herramienta invalida el caché, pero cambiar solo los campos de nombre o descripción no.

Comenzando con resultados estructurados

El siguiente ejemplo demuestra resultados estructurados con la API de Converse:

import boto3 import json # Inicialice el cliente Bedrock Runtime bedrock_runtime = boto3.client( service_name="bedrock-runtime", region_name="us-east-1" # Elija su región preferida) # Defina su esquema JSON extract_schema = { "type": "object", "properties": { "name": {"type": "string", "description": "Customer name"}, "email": {"type": "string", "description": "Dirección de correo electrónico del cliente"}, "plan_interest": {"type": "string", "description": "Plan de producto de interés"}, "demo_requested": {"type": "boolean", "description": "Si se solicitó una demostración"} }, "required": ["name", "email", "plan_interest", "demo_requested"], "additionalProperties": False } # Realizar la solicitud con estructura salidas respuesta = bedrock_runtime.converse( modelId="us.anthropic.claude-opus-4-5-20251101-v1:0", mensajes=[ { "role": "user", "content": [ { "text": "Extraiga la información clave de este correo electrónico: John Smith (john@example.com) está interesado en nuestro plan Enterprise y quiere programar una demostración para el próximo martes a las 2 p.m." } ] } ], inferenceConfig={ "maxTokens": 1024 }, outputConfig={ "textFormat": { "type": "json_schema", "structure": { "jsonSchema": { "schema": json.dumps(extraction_schema), "name": "lead_extraction", "description": "Extraer información de clientes potenciales de los correos electrónicos de los clientes" } } } } ) # Analizar la respuesta JSON compatible con el esquema resultado = json.loads(respuesta["salida"]["mensaje"]["contenido"][0]["texto"]) print(json.dumps(resultado, sangría=2))

Producción:

{ "nombre": "John Smith", "correo electrónico": "john@example.com", "plan_interest": "Empresa", "demo_requested": verdadero }

La respuesta se ajusta a su esquema; no se requiere validación adicional.

Requisitos y mejores prácticas

Para utilizar productos estructurados de manera efectiva, siga estas pautas:

Establezca propiedades adicionales: falso en todos los objetos. Esto es necesario para que funcionen los resultados estructurados. Sin él, su esquema no será aceptado.

{ "tipo": "objeto", "properties": { "nombre": {"tipo": "cadena"} }, "requerido": ["nombre"], "additionalProperties": false }

Utilice nombres y descripciones de campos descriptivos. Los modelos utilizan nombres de propiedades y descripciones para comprender qué datos extraer. Los nombres claros como customer_email superan a los nombres genéricos como field1. Utilice enumeración para valores restringidos. Cuando un campo tiene un conjunto limitado de valores válidos, utilice enum para restringir las opciones. Esto mejora la precisión y produce valores válidos. Comience con lo básico y luego agregue complejidad. Comience con los campos mínimos requeridos y agregue complejidad gradualmente. Los esquemas básicos se compilan más rápido y son más fáciles de mantener. Reutilice esquemas para beneficiarse del almacenamiento en caché. Estructura tu aplicación para reutilizar esquemas en todas las solicitudes. El caché gramatical de 24 horas mejora significativamente el rendimiento de consultas repetidas. Marque stopReason en cada respuesta. Dos escenarios pueden producir respuestas no conformes: rechazos (cuando el modelo rechaza por razones de seguridad) y límites de tokens (cuando se alcanza max_tokens antes de completarse). Maneje ambos casos en su código. Pruebe con datos realistas antes de la implementación. Valide sus esquemas con entradas representativas de la producción. Los casos extremos en datos reales a menudo revelan problemas de diseño de esquemas.

Funciones de esquema JSON compatibles:

Todos los tipos básicos: objeto, matriz, cadena, entero, número, booleano, enumeración nula (solo cadenas, números, bools o nulos) const, anyOf, allOf (con limitaciones) $ref, $def y definiciones (solo referencias internas) Formatos de cadena: fecha-hora, hora, fecha, duración, correo electrónico, nombre de host, uri, ipv4, ipv6, uuid Array minItems (solo valores 0 y 1)

No compatible:

Esquemas recursivos Referencias $ref externas Restricciones numéricas (mínimo, máximo, múltipleOf) Restricciones de cadena (minLength, maxLength) propiedades adicionales establecidas en cualquier valor que no sea falso

Uso estricto de herramientas para flujos de trabajo agentes

Al crear aplicaciones donde los modelos llaman a herramientas, establezca estricto: verdadero en la definición de su herramienta para restringir los parámetros de la herramienta para que coincidan exactamente con su esquema de entrada:

importar boto3 importar json bedrock_runtime = boto3.client('bedrock-runtime', region_name="us-east-1") respuesta = bedrock_runtime.converse( modelId="us.anthropic.claude-opus-4-5-20251101-v1:0", mensajes=[ { "role": "user", "content": [{"text": "¿Cómo está el clima en San Francisco?"}] } ], inferenceConfig={"maxTokens": 1024}, toolConfig={ "tools": [ { "toolSpec": { "name": "get_weather", "description": "Obtener el clima actual para una ubicación específica", "strict": True, # Habilitar el modo estricto "inputSchema": { "json": { "type": "object", "properties": { "location": { "type": "string", "description": "La ciudad y estado, por ejemplo, San Francisco, CA" }, "unidad": { "tipo": "cadena", "enum": ["celsius", "fahrenheit"], "descripción": "Unidad de temperatura" } }, "required": ["ubicación", "unidad"], "additionalProperties": False } } } } ] } ) # Las entradas de la herramienta se ajustan al esquema de content_block en respuesta["salida"]["mensaje"]["contenido"]: si "toolUse" en content_block: tool_input = content_block["toolUse"]["input"] print(f"Herramienta: {content_block['toolUse']['name']}") print(f"Entrada: {json.dumps(tool_input, indent=2)}")

Con salidas estructuradas estrictas: verdaderas, se restringe la salida de modo que:

El campo de ubicación es siempre una cadena. El campo de unidad siempre es Celsius o Fahrenheit. No aparecen campos inesperados en la entrada.

Aplicaciones prácticas en todas las industrias

El cuaderno demuestra casos de uso que abarcan industrias:

Servicios financieros: extraiga datos estructurados de informes de ganancias, solicitudes de préstamos y documentos de cumplimiento. Con resultados estructurados, todos los campos obligatorios están presentes y escritos correctamente para el procesamiento posterior. Atención médica: analice las notas clínicas en registros estructurados que cumplan con los esquemas. Extraiga información del paciente, diagnósticos y planes de tratamiento en JSON validado para la integración de EHR. Comercio electrónico: cree canales confiables de enriquecimiento del catálogo de productos. Extraiga especificaciones, categorías y atributos de descripciones de productos con resultados consistentes y confiables. Legal: analice contratos y extraiga términos, partes, fechas y obligaciones clave en formatos estructurados adecuados para sistemas de gestión de contratos. Servicio al cliente: cree sistemas inteligentes de enrutamiento y respuesta de tickets donde las intenciones, sentimientos y entidades extraídas coincidan con el modelo de datos de su aplicación.

Elegir el enfoque correcto

Nuestras pruebas revelaron patrones claros sobre cuándo utilizar cada función:

Utilice el formato de salida del esquema JSON cuando:

Necesita la respuesta del modelo en una estructura específica. Construir canales de extracción de datos. Generar respuestas listas para API. Crear informes o resúmenes estructurados.

Utilice un uso estricto de herramientas cuando:

Construir sistemas agentes que llamen a funciones externas Implementar flujos de trabajo de varios pasos con cadenas de herramientas Requerir tipos de parámetros validados para llamadas de funciones Conectar IA a bases de datos, API o servicios externos

Utilice ambos juntos cuando:

Crear agentes complejos que necesitan llamadas de herramientas validadas y respuestas finales estructuradas. Crear sistemas donde los resultados de las herramientas intermedias se alimentan de resultados estructurados. Implementar flujos de trabajo empresariales que requieren el cumplimiento del esquema de un extremo a otro.

Comparación de API: Converse en comparación con InvokeModel

Tanto la API de Converse como la API de InvokeModel admiten salidas estructuradas, con formatos de parámetros ligeramente diferentes:

Aspecto API de Converse InvokeModel (Anthropic Claude) InvokeModel (modelos de peso abierto) Ubicación del esquemaoutputConfig.textFormatoutput_config.formatresponse_formatHerramienta de marca estrictatoolSpec.strict herramientas[].herramientas estrictas[].function.strict Formato de esquema Cadena JSON en jsonSchema.schema Objeto JSON en esquema Objeto JSON en json_schema.schema Ideal para flujos de trabajo conversacionales Inferencia de un solo turno (Claude) Inferencia de un solo turno (peso abierto)

Nota: La API InvokeModel utiliza diferentes nombres de campos de solicitud según el tipo de modelo. Para los modelos Anthropic Claude, utilice output_config.format para las salidas del esquema JSON. Para modelos de peso abierto, utilice Response_format en su lugar.

Elija la API de Converse para conversaciones de varios turnos y la API de InvokeModel cuando necesite acceso directo al modelo con formatos de solicitud específicos del proveedor.

Modelos compatibles y disponibilidad

Los resultados estructurados generalmente están disponibles en todas las regiones comerciales de AWS para proveedores de modelos seleccionados de Amazon Bedrock:

Antrópico DeepSeek Google MiniMax Mistral AI Moonshot AI NVIDIA OpenAI Qwen

La característica funciona perfectamente con:

Inferencia entre regiones: utilice resultados estructurados en todas las regiones de AWS sin configuración adicional Inferencia por lotes: procese grandes volúmenes con resultados compatibles con el esquema Transmisión: transmita respuestas estructuradas con ConverseStream o InvokeModelWithResponseStream

Conclusión

En esta publicación, descubrió cómo los resultados estructurados en Amazon Bedrock reducen la incertidumbre del JSON generado por IA a través de respuestas validadas y compatibles con el esquema. Al utilizar el formato de salida JSON Schema y el uso estricto de herramientas, puede crear canales de extracción de datos confiables, flujos de trabajo de agente sólidos y aplicaciones de IA listas para producción, sin lógica de validación o análisis personalizado. Ya sea que esté extrayendo datos de documentos, creando automatización inteligente o creando API impulsadas por IA, los resultados estructurados brindan la confiabilidad que sus aplicaciones exigen.

Los resultados estructurados ahora están disponibles de forma generalizada en Amazon Bedrock. Para utilizar resultados estructurados con las API de Converse, actualice al último SDK de AWS. Para obtener más información, consulte la documentación de Amazon Bedrock y explore nuestro cuaderno de muestra.

¿Qué flujos de trabajo podrían desbloquear JSON validado y compatible con el esquema en su organización? El cuaderno proporciona todo lo que necesita para averiguarlo.

Sobre los autores

Jeffrey Zeng

Jeffrey Zeng es arquitecto de soluciones especializado a nivel mundial para IA generativa en AWS y lidera modelos de terceros en Amazon Bedrock. Se centra en la codificación agente y los flujos de trabajo, y tiene experiencia práctica ayudando a los clientes a crear e implementar soluciones de IA desde la prueba de concepto hasta la producción.

jonathan evans

Jonathan Evans es arquitecto de soluciones mundiales para IA generativa en AWS, donde ayuda a los clientes a aprovechar tecnologías de IA de vanguardia con modelos de Anthropic Claude en Amazon Bedrock, para resolver desafíos comerciales complejos. Con experiencia en ingeniería de IA/ML y experiencia práctica en el soporte de flujos de trabajo de aprendizaje automático en la nube, a Jonathan le apasiona hacer que la IA avanzada sea accesible e impactante para organizaciones de todos los tamaños.