Desarrollo de páginas web y software a medida en Ecuador

jivsoft@hotmail.com +593 97 876 6762
Publicado: /

JSON perfecto o nada: cómo controlar la salida de tu LLM

Técnicas para obtener JSON válido siempre: contratos de salida, schemas, decoding restringido, reintentos inteligentes, manejo de streaming y validación automática en Laravel/n8n.

JSON perfecto o nada: cómo controlar la salida de tu LLM

JSON perfecto o nada: cómo controlar la salida de tu LLM

La diferencia entre una demo frágil y un producto fiable está en la salida estructurada. Si el modelo no devuelve JSON válido y conforme al esquema, todo lo demás se rompe.

En el post anterior habilitamos herramientas y APIs. Para orquestar acciones, el LLM debe hablar JSON impecable. Aquí tienes un compendio práctico para lograrlo en producción.

¿Por qué “JSON perfecto o nada”?

  • Automatización: convierte la respuesta en acciones reales (APIs, DB, n8n) sin parsers frágiles.
  • Observabilidad: facilita trazas, métricas y auditoría.
  • Seguridad: reduces la superficie de alucinaciones fuera de contrato.

Estrategias que funcionan (en orden de fuerza)

  1. Contratos de salida y “function calling / structured outputs”
    Si tu proveedor lo soporta, publica un schema y exige que el modelo devuelva los campos exactos. Minimiza prompts y postprocesado.
  2. JSON Schema + validación estricta
    Define tipos, obligatorios, enums y formatos (fechas ISO). Rechaza cualquier extra y devuelve errores claros al modelo para corrección.
  3. Decoding restringido (gramáticas/regex, stop sequences, temperatura baja)
    Fuerza el alfabeto/estructura permitida; temperatura 0–0.2; detén al cerrar llaves o al encontrar separadores.
  4. Plantillas robustas
    Indica “Devuelve SOLO JSON válido, sin comentarios, sin backticks” y muestra 1 ejemplo minimalista correcto.
  5. Reintentos inteligentes
    Si la validación falla, reintenta con el diff del error (“falta campo X”, “tipo Y inválido”), no rehagas todo el prompt. Máximo 1–2 reintentos.
  6. Autocorrección acotada
    Reparar problemas sintácticos triviales (comas finales, comillas escapadas) antes de reintentar; nunca inventes campos faltantes.
  7. Streaming seguro
    Acumula en buffer y solo parsea cuando braces estén balanceados. Si fragmenta, espera siguiente chunk.
  8. JSONL vs JSON
    Para listas largas, considera NDJSON (una entidad por línea) y valida item a item.
  9. Evolución de esquema
    Versiona: schema_v1, schema_v2. Mantén compatibilidad y migraciones claras.

Errores comunes (y cómo evitarlos)

  • Texto fuera del JSON (saludos, explicaciones) → “solo JSON” + función/gramática.
  • Comas finales o comillas mal escapadas → autocorrección acotada + validación.
  • Campos faltantes o tipos erróneos → difundir el error exacto y reintentar una vez.
  • Listas gigantes → usar JSONL y paginación para evitar timeouts.

Micro-workflow n8n: “JSON perfecto o reintento”

  1. Webhook → recibe {task, payload} y el schema requerido.
  2. LLM → prompt con ejemplo mínimo y regla “salida SOLO JSON”.
  3. Function → valida contra JSON Schema.
    • Si ok → continúa.
    • Si error → compone mensaje con errores exactos.
  4. LLM (retry) → reintento con los errores formateados (máx. 1).
  5. IF → si vuelve a fallar → responde “formato inválido” con guía de corrección y registra incidente.
  6. Database → guarda costo, latencia, tasa de error de JSON, diffs y versión de esquema.

Tip Laravel/PHP

  • Parsing robusto: json_validate() (PHP ≥8.3) para chequear rápido; luego json_decode(..., associative:true, flags: JSON_THROW_ON_ERROR) dentro de try/catch.
  • Validación: Validator::make($data, [...]) con reglas (required, array, date_format:Y-m-d, in:, etc.).
  • Schemas: guarda versiones en DB (schemas) y usa un validador JSON Schema en el backend si lo prefieres.
  • Tuning: fija max_tokens, baja temperatura y añade stop al cierre del objeto para limitar verborrea.

Plantilla mínima de prompt (solo JSON)

Rol: Eres un generador estricto de JSON.
Reglas:
- Devuelve SOLO JSON válido sin comentarios ni texto adicional.
- Sigue exactamente este esquema:
{
  "title": "string",
  "date_iso": "YYYY-MM-DD|null",
  "labels": ["string"]
}
Entrada:
{TEXTO}
Salida:

Conclusión

“JSON perfecto o nada” es un principio de ingeniería: contrato claro, validación, reintentos acotados y telemetría. Con esto, tus integraciones con herramientas y APIs serán predecibles y auditables.

  • JSON
  • Schemas
  • Function Calling
  • Validación
  • n8n
  • Laravel