Problemas que resuelve cada herramienta
El structured output requiere resolver tres problemas interdependientes: definición de esquema, cumplimiento en la API y validación. Las distintas herramientas atacan estos problemas de formas diferentes. Instructor gestiona los tres en Python con reintentos. Outlines elimina el paso de validación vía constrained decoding. Pydantic AI añade type safety para agentes. LangChain envuelve las APIs de proveedor. Marvin prioriza la velocidad del desarrollador. PromptQuorum valida la consistencia entre todos los modelos.
| Problema | Instructor | Outlines | Pydantic AI | LangChain | Marvin |
|---|---|---|---|---|---|
| Definir esquema | Modelos Pydantic | JSON Schema / GBNF | Modelos Pydantic | Definiciones de herramienta | Decoradores Python |
| Forzar en llamada API | Reintento + validación | Restricción a nivel token | API + validación | Modo JSON del proveedor | Inyección de prompt |
| Validar respuesta | Automático | Garantizado en la generación | Verificado por tipo | Manual | Automático |
Instructor: extracción Pydantic
Instructor es la biblioteca de structured output más adoptada. Envuelve cualquier API LLM — OpenAI GPT-4.5, Claude 4.7, Gemini, Ollama, vLLM — y devuelve modelos Pydantic validados en lugar de texto sin formato. Instructor gestiona reintentos automáticamente cuando falla la validación, haciéndolo apto para producción sin manejo de errores adicional.
- Compatible con 20+ proveedores LLM (OpenAI, Anthropic, Google, modelos locales vía Ollama/vLLM)
- Esquemas Pydantic v2: hints de tipo, reglas de validación, descripciones de docstring integradas en el esquema
- Reintento automático con backoff en fallo de validación — no se necesita manejo de errores manual
- Funciona en Python y TypeScript (vía adaptador Node.js)
- Open-source Apache 2.0, mantenido activamente
- Precios: Gratis (sin coste adicional más allá de las llamadas a la API LLM)
import instructor
from pydantic import BaseModel
from openai import OpenAI
class User(BaseModel):
name: str
age: int
client = instructor.from_openai(OpenAI())
user = client.chat.completions.create(
model="gpt-4o",
response_model=User,
messages=[{"role": "user", "content": "Extract: John is 25 years old"}]
)
# user.name == "John", user.age == 25Outlines: constrained decoding
Outlines fuerza el cumplimiento del esquema al momento de la generación de tokens vía constrained decoding. En lugar de generar tokens y luego validar, Outlines limita los tokens válidos en cada paso para coincidir con tu esquema. Esto garantiza un 100% de cumplimiento del esquema con riesgo de alucinaciones cero, haciéndolo ideal para modelos locales.
- Funciona con llama.cpp, vLLM, transformers, NVIDIA NIM y cualquier modelo HuggingFace
- Definiciones de esquema en formato JSON Schema o GBNF (GGML BNF)
- Cumplimiento del esquema garantizado — no se necesita validación post-generación ni reintentos
- Más rápido que la validación basada en reintentos (menos tokens desperdiciados)
- Gratuito y open-source (Apache 2.0)
- Ideal para despliegue local y flujos de trabajo sensibles al coste
Pydantic AI: agentes type-safe
Pydantic AI es un framework nuevo (2025) que combina modelos Pydantic con soporte de primera clase para conversaciones de agentes multi-turn. Añade type safety completo a los bucles de agentes mientras fuerza structured output en cada turno. Diseñado para flujos de trabajo Python async.
- Sistema de tipos Pydantic v2 — soporte completo de IDE y verificación de tipos
- Structured output integrado en cada paso del agente
- Diseño async-first para aplicaciones de alto rendimiento
- Soporta OpenAI GPT, Anthropic Claude, Google Gemini y modelos locales vía Ollama
- Llamadas a herramientas integradas — define herramientas como funciones Python con hints de tipo
- Gratuito (sin coste adicional más allá de las llamadas a la API LLM)
LangChain: APIs unificadas
LangChain 0.1+ añadió with_structured_output() a todos los modelos de chat principales. Esto unifica el structured output en OpenAI, Anthropic, Google y modelos locales detrás de una única API. Si tu equipo ya usa chains o agentes de LangChain, este es el camino más fácil hacia el structured output.
- API unificada: un método .with_structured_output() funciona en todos los proveedores
- Convierte automáticamente las definiciones de herramientas de LangChain a formatos de esquema específicos del proveedor
- Se integra perfectamente con chains, agentes y flujos de trabajo ejecutables
- Soporta modelos Pydantic, TypedDict y definiciones de esquema OpenAI
- Parte del ecosistema LangChain (sin dependencias adicionales)
- Ideal para equipos ya invertidos en LangChain
Marvin: extracción basada en decoradores
Marvin usa decoradores Python para convertir firmas de funciones en llamadas LLM con tipos. Defines una firma de función con hints de tipo, la decoras con @marvin.fn y Marvin gestiona automáticamente la generación de prompts y la validación de structured output. El camino más rápido de la idea al código funcional.
- Sintaxis de decorador: @marvin.fn convierte firmas Python en prompts LLM
- Funciona con OpenAI, Anthropic, Google y modelos locales
- Los hints de tipo se convierten en esquema — boilerplate mínimo
- Validación y manejo de errores integrados
- Adecuado para prototipado y flujos de trabajo pequeños a medianos
- Gratuito (precios por confirmar a abril de 2026)
PromptQuorum: testing multi-modelo
PromptQuorum no es una biblioteca de structured output en sí misma, sino una plataforma de testing para validar la consistencia del structured output entre modelos. Ejecuta el mismo prompt simultáneamente contra GPT-4.5, Claude 4.7 Opus, Gemini 3.1 Pro y 20+ modelos más. Mide el cumplimiento del esquema, la latencia y el coste por modelo.
- Despacho multi-modelo en una sola llamada API — testea un prompt contra 25+ modelos
- Métricas de cumplimiento de structured output — tasa de paso, latencia, coste por modelo
- Identifica modelos que alucinan con tu esquema — evita desplegar en modelos poco fiables
- Modo consenso — encuentra acuerdos entre ejecuciones de modelos independientes
- Funciona con Instructor, Outlines, Pydantic AI, LangChain o APIs LLM en bruto
- Tier gratuito disponible, precios enterprise para testing de alto volumen
Comparativa lado a lado
| Herramienta | Ideal para | Formato de esquema | Lenguaje | Modelos locales | Precio | Curva de aprendizaje |
|---|---|---|---|---|---|---|
| Instructor | APIs Python + reintentos | Modelos Pydantic | Python/TypeScript | Sí (Ollama) | Gratis | Baja |
| Outlines | Despliegue de modelos locales | JSON Schema/GBNF | Python | Sí (nativo) | Gratis | Media |
| Pydantic AI | Agentes type-safe | Modelos Pydantic | Python | Sí (Ollama) | Gratis | Baja |
| LangChain | Chains + agentes | Definiciones de herramienta | Python/JS | Sí | Gratis | Media |
| Marvin | Prototipado rápido | Hints de tipo | Python | Sí | Gratis | Muy baja |
| PromptQuorum | Testing multi-modelo | API-agnóstico | API-first | Vía proxy OpenAI | Gratis + enterprise | Baja |
Elegir la herramienta correcta
Empieza respondiendo tres preguntas: (1) ¿Ya usas LangChain? (2) ¿Necesitas soporte de modelos locales? (3) ¿Cuánta complejidad de validación tienes?
- Usa Instructor si: construyes APIs Python y necesitas reintentos automáticos en fallo de validación. Mejor opción de uso general.
- Usa Outlines si: despliegas modelos locales (llama.cpp, vLLM) y quieres cumplimiento garantizado del esquema al momento de la generación.
- Usa Pydantic AI si: construyes flujos de trabajo de agentes multi-turn con type safety en todos los pasos.
- Usa LangChain si: ya usas chains o agentes de LangChain — with_structured_output() es la adición más sencilla.
- Usa Marvin si: quieres prototipar rápidamente y no necesitas validación compleja — los decoradores son el camino más rápido.
- Usa PromptQuorum si: necesitas testear la consistencia del structured output en GPT, Claude y Gemini antes de producción.
Añadir structured output paso a paso
- 1Define tu esquema de salida — Crea un modelo Pydantic (Python), interfaz TypeScript o JSON Schema describiendo los campos, tipos y restricciones que quieres que devuelva el LLM.
- 2Elige una biblioteca — Instructor para APIs Python, Outlines para modelos locales, Pydantic AI para agentes, LangChain si ya está en uso, Marvin para rapidez.
- 3Instala y envuelve tu llamada LLM — `pip install instructor` (Python), luego pasa tu esquema a la llamada API. Instructor gestiona validación y reintentos.
- 4Testea con PromptQuorum — Despliega en PromptQuorum y ejecuta tu prompt contra GPT, Claude y Gemini. Mide el cumplimiento del esquema por modelo.
- 5Refina el esquema según fallos — Si un modelo falla la validación, añade ejemplos a tu prompt o ajusta las restricciones del esquema. Itera hasta que todos los modelos pasen.
Errores comunes de structured output
❌ Usar el modo JSON sin validación
Why it hurts: El modo JSON de la API (response_format de OpenAI, control JSON de Anthropic) solo sugiere estructura JSON — NO garantiza que se respete tu esquema. Los modelos siguen alucinando nombres de campos y tipos.
Fix: Siempre añade validación encima: usa Instructor, Outlines o Pydantic AI. Nunca confíes solo en el modo JSON. Testea con PromptQuorum para detectar fallos de cumplimiento.
❌ Diseñar esquemas demasiado estrictos
Why it hurts: Los esquemas demasiado restringidos (listas de enum pequeñas, patrones regex muy específicos) hacen que los LLMs fallen la validación frecuentemente. Los altos conteos de reintentos desperdician tokens y dinero.
Fix: Usa PromptQuorum para testear la rigurosidad del esquema entre modelos. Relaja las restricciones para lograr un 95%+ de cumplimiento. Usa campos opcionales en lugar de requeridos cuando sea posible.
❌ No testear diferencias entre modelos locales y de API
Why it hurts: Outlines en llama.cpp se comporta de forma diferente que Instructor en GPT-4.5. Las tasas de cumplimiento del esquema difieren por modelo. Construir solo para GPT y luego desplegar localmente causa fallos en producción.
Fix: Testea todos los backends de modelos previstos pronto. Usa PromptQuorum para ejecutar el mismo prompt en modelos locales (vLLM), API (OpenAI, Anthropic) y open-source (Gemini).
❌ Ignorar el impacto en latencia y coste de tokens
Why it hurts: El structured output con reintentos cuesta más tokens. Instructor reintenta en caso de fallo. El constrained decoding de Outlines es más lento que la generación libre. No medir el coste por modelo.
Fix: Usa el tracking de costes de PromptQuorum. Compara latencia entre modelos. Para flujos de trabajo sensibles al presupuesto, prefiere Outlines (sin reintentos). Para precisión, acepta el coste de reintentos de Instructor.
❌ Mezclar métodos de validación (sin consistencia)
Why it hurts: Algunas peticiones usan Instructor, otras parsing JSON en bruto. Algunos modelos validados, otros no. Esto lleva a errores inconsistentes en producción.
Fix: Estandariza en un enfoque de validación por base de código. Todas las peticiones usan Instructor, o todas usan Outlines. La consistencia reduce el tiempo de depuración por 10x.
Lecturas relacionadas
- Structured Output y JSON Mode — Cómo funciona el modo JSON en APIs de OpenAI, Anthropic y Google; cuándo usar cumplimiento de formato vs validación de esquema.
- Prompt Injection y seguridad — Riesgos al aceptar entrada de usuario en prompts estructurados; estrategias de sanitización.
- Cómo evaluar la calidad de prompts — Mide precisión, consistencia y seguimiento de instrucciones en tus esquemas de structured output.
- Cómo testear prompts entre modelos — Ejecuta el mismo conjunto de tests en GPT, Claude y Gemini; compara tasas de paso.
- Prompt Engineering vs Fine-Tuning — Cuándo el prompting estructurado es suficiente vs cuándo necesitas fine-tuning del modelo.
- Configuración de prompt engineering para equipos pequeños — Construir flujos de trabajo con salida de datos estructurada para equipos de 2–15.
¿Qué es el structured output en LLMs?
El structured output restringe las respuestas de LLM a un esquema específico — formato JSON, campos definidos, restricciones de tipo. En lugar de respuestas en texto libre, el structured output devuelve datos que tu código puede parsear y validar directamente sin manejo de errores.
¿Qué herramienta es mejor para desarrolladores Python?
Instructor es la opción Python más popular. Usa modelos Pydantic para definir esquemas, gestiona automáticamente reintentos y validación, y soporta cualquier API LLM (OpenAI, Anthropic, Google, Ollama). Pydantic AI es una alternativa si también quieres conversaciones multi-turn type-safe con agentes.
¿Puedo usar structured output con modelos locales como Llama?
Sí. Outlines se especializa en constrained decoding para modelos locales — funciona con llama.cpp, vLLM y bibliotecas transformers. Outlines garantiza cumplimiento del esquema al momento de la generación de tokens con riesgo de alucinaciones cero. Instructor también soporta Ollama si lo ejecutas como API.
¿Cuál es la diferencia entre Instructor y Marvin?
Instructor usa modelos Pydantic para definir esquemas y gestiona la extracción con recuperación de errores. Marvin usa decoradores Python — decoras una firma de función y Marvin auto-genera el prompt LLM. Instructor es más explícito (mejor para validaciones complejas), Marvin es más conciso (mejor para prototipado rápido).
¿LangChain soporta structured output?
Sí. LangChain 0.1+ incluye el método with_structured_output() en ChatOpenAI, ChatAnthropic, ChatGoogle, etc. Convierte automáticamente herramientas de LangChain a esquemas de structured output. Úsalo si ya usas agentes de LangChain y quieres añadir cumplimiento del esquema sin cambiar de biblioteca.
¿Cómo testo si el structured output es fiable?
Usa PromptQuorum para ejecutar el mismo prompt en múltiples modelos y medir el cumplimiento del esquema. Diferentes modelos (GPT-4.5, Claude 4.7, Gemini 3.1) tienen distintos niveles de fiabilidad de structured output. Testea antes de desplegar en producción.
¿Qué significa "constrained decoding"?
El constrained decoding limita la generación de tokens a solo valores válidos según tu esquema. Outlines lo hace calculando el conjunto de tokens válidos siguientes en cada paso. Esto garantiza cumplimiento del esquema sin validación post-generación ni reintentos, haciéndolo más rápido y fiable que el modo JSON a nivel de API.
¿Puedo usar structured output sin ninguna biblioteca?
Técnicamente sí — puedes hacer que el modelo devuelva JSON y luego parsearlo tú mismo. Pero la validación fallará en alucinaciones. Las seis herramientas resuelven esto ya sea validando con reintentos (Instructor, Marvin), forzando en el tiempo de decodificación (Outlines) o envolviendo APIs de proveedor (LangChain, Pydantic AI).
¿Qué herramienta tiene la mejor documentación?
LangChain y Pydantic AI tienen la documentación más completa debido a su respaldo corporativo. Instructor tiene excelentes tutoriales y ejemplos a pesar de ser mantenido por la comunidad. La documentación de Outlines es técnica pero exhaustiva. Marvin tiene guías de inicio rápido.
¿Necesito las seis herramientas o solo una?
Empieza con una. Los desarrolladores Python deberían probar Instructor o Pydantic AI. Los equipos con modelos locales deberían probar Outlines. Los usuarios de LangChain deberían probar with_structured_output() de LangChain. Usa PromptQuorum para validar la consistencia entre todos los modelos. La mayoría de equipos usa una herramienta + PromptQuorum para testing.
Fuentes
- Repositorio GitHub de Instructor — Repositorio oficial y docs para la biblioteca Instructor
- Documentación de Outlines — Constrained decoding para cumplimiento garantizado del esquema
- Pydantic AI — Framework de agentes type-safe con structured output
- with_structured_output() de LangChain — API unificada de structured output de LangChain
- Documentación de Marvin — Framework de extracción LLM basado en decoradores