Respuestas estructuradas en LLMs para agentes

Clase 10 de 26Curso para Crear Agentes de AI con LangGraph

Resumen

Controlar cómo responde un large language model es clave para construir agentes que tomen decisiones con seguridad. Pasar de texto libre a respuestas estructuradas permite evaluar, guardar y accionar sobre datos concretos como nombre, email, teléfono, tono y sentimiento, reduciendo impredecibilidad y costos.

¿Por qué estructurar respuestas de un large language model?

Estructurar la salida transforma un mensaje impredecible en un objeto controlado. En lugar de depender del tono, longitud o adherencia variable al prompt y a la temperatura, se fuerza al modelo a devolver un JSON con un schema claro para operar en código y en el lang graph del agente.

  • Evaluación programática: extraer nombre, email, teléfono, tono o sentimiento para usarlos como variables.
  • Decisiones de agente: con datos consistentes, un nodo puede ramificar o reevaluar.
  • Más que chat: el modelo ya no conversa, actúa como extractor.

¿Qué aporta el structured output frente a JSON mode?

La salida estructurada resuelve la necesidad de “responder en JSON” sin depender del antiguo JSON mode.

  • Integraciones en LangChain con múltiples modelos y soporte de salida estructurada.
  • Ejemplo citado: “Entropic” con tool chain, tool coding, salida estructurada y multimodal.
  • JSON mode ya no es central cuando se usa structured output.

¿Cómo implementar un extractor con structured output?

El flujo parte de un schema y un system prompt. Se define una clase Pydantic, se activa el structured output del modelo y se envía el historial para que el LLM devuelva un objeto validado.

  • Definir clase contact info con campos como name, email, phone, tone e age.
  • Usar Pydantic en Python para que el schema se traduzca a lo que la API necesita.
  • Indicar en la descripción cómo evaluar variables, por ejemplo tone en un rango 0–100 o sentimiento categórico.
  • Enviar un system prompt: el modelo debe “extraer información de la conversación” siguiendo el schema.
  • Enviar mensajes como tuplas tipo system y usuario, con todo el historial cuando se requiera.
  • La respuesta llega como objeto Pydantic, listo para hacer acceso directo a campos.

¿Qué errores comunes y cómo mitigarlos?

Al estructurar, emergen fallos típicos que se corrigen con prompt y validación.

  • Alucinación de datos: puede inventar “age”. Pedir explícitamente “si no encuentras, no inventes”.
  • Validaciones estrictas: si un campo es entero y no hay dato, se rompe. Ponerlo como string o usar fallback temporal.
  • Sentimiento/tono ambiguo: aclarar escalas o enums en descripciones.
  • Mensajes genéricos del modelo: recordar que aquí no se busca chat, sino extracción.

¿Cómo integrar el extractor en un agente con memoria compartida?

Se agrega un nodo extractor con structured output y se mantiene el nodo conversacional estándar. El extractor lee el historial, extrae datos clave y los guarda en la memoria para que el siguiente nodo los use en su prompt.

  • Instanciar un LLM con structured output (se mostró con “Claude”) solo en el nodo extractor.
  • Mantener el LLM conversacional normal en el nodo de conversación.
  • Lógica de disparo: si customer name es none o si el historial supera >10 mensajes, volver a extraer.
  • Guardar en estado compartido: customer name, email, phone, age.
  • Inyectar memoria en el system prompt del nodo conversacional de forma dinámica, con fallback si falta información.
  • Optimizar costos: evitar llamadas si ya se obtuvo el dato y el historial no cambió.
  • Si no hay “información relevante”, instruir al nodo de conversación a seguir el flujo normal, no a consultar la base vectorial.

¿Qué habilidades y keywords se practican?

El ejercicio refuerza técnicas de prompting y diseño de agentes con salida sólida y reusable.

  • Prompting: buen system prompt y reglas de no invención.
  • Técnicas: zero shot, few shot, chain of thought cuando aplique.
  • Schema design: Pydantic, tipos, rangos y descripciones claras.
  • Memoria compartida: actualización de estado y uso en prompts.
  • Control de flujo: condiciones por tamaño de historial y reextracción.
  • Integraciones: LangChain, chat models, salida estructurada, opciones locales como Ollama o Hugging Face.
  • Ecosistema: JSON Schema, API, Python, “Claude”, “OpenAI”, “Cloudflare”.

¿Te gustaría ver más patrones de extracción y prompts dinámicos para tus agentes? Comparte tus dudas y casos en los comentarios.