Pedir JSON en el prompt genera tres problemas: prosa alrededor del objeto, comillas mal escapadas y valores de enum inventados. El parse se rompe de madrugada y quien está de guardia se entera después. Los structured outputs resuelven en la raíz: restringes la generación token a token contra un JSON Schema.

Constrained decoding

El constrained decoding restringe la salida contra el schema a nivel de cada token. OpenAI structured outputs y Anthropic tool use garantizan validez sintáctica del primero al último token. En el open-source, Outlines y las grammars de llama.cpp compilan el schema en máscaras de token y hacen lo mismo en tu infraestructura. OpenAI lo expone vía response_format con json_schema y strict: true; Anthropic fuerza la forma combinando tool definitions con tool_choice.

Diseño de schema

  • La estructura plana supera al anidamiento profundo; cada nivel extra aumenta la chance de confusión
  • Los enums sustituyen a strings libres; el modelo llena el campo ambiguo con un valor plausible y equivocado
  • Campos obligatorios explícitos y additionalProperties: false; los modelos respetan constraints mejor que instrucciones en texto

Validación semántica

El constrained decoding cubre la forma. La semántica queda de tu cuenta: una fecha de checkout anterior a la fecha de creación del pedido pasa por el schema y explota en el reporte contable. Rangos de fecha coherentes, integridad referencial y reglas de negocio quedan fuera del decoding. Una capa de validación con zod, pydantic o JSON Schema validators atrapa lo que se escapa, y sus errores alimentan el retry.

Retry con feedback

¿Falló la validación? Reenvía el prompt con el mensaje de error del validador y la salida rechazada, para que el modelo vea qué corregir. Un retry resuelve la mayoría de los casos. Tres fallos seguidos indican un prompt o schema enfermo y merecen ruta de fallback o cola humana. Sin ese límite, el loop quema tokens en un error determinístico.

Versionado

La adición de campos mantiene compatibilidad retroactiva: respuestas en cache de semanas atrás validan contra el parser nuevo. Agrega campos al final del objeto, márcalos como opcionales y promuévelos después. Un número de versión en el envelope del payload ayuda a escalonar la migración por cohortes.

Tests de borde

Los property-based tests generan prompts adversarios que sondean límites: enums vacíos, fechas límite, textos llenos de caracteres de escape. Encajalos en la suite de evals junto a las métricas de calidad. La regresión de formato es regresión.