MÓDULO 4 · LANGCHAIN FUNDAMENTOS · 30 MIN

Prompt templates y output parsers

Un output parser trabaja en los dos extremos de la cadena. Por detrás convierte el texto del modelo en un objeto de Python; por delante, vía get_format_instructions(), escribe dentro del prompt las reglas de formato que el modelo tiene que seguir. Si solo lo usas como filtro de salida, estás usando la mitad de la pieza.
01 — Entrada
La plantilla: variables y roles
ConstructorQué produceCuándo
from_template("...{var}")Un único mensaje de usuarioPruebas rápidas
from_messages([...])Lista de pares (rol, contenido)Separa el rol permanente de la petición variable

La plantilla no llama a nada, así que puedes comprobarla en frío antes de gastar un solo token:

template.format_messages(profesion="Ingeniero", pais="Japón")

Si ahí ya sale mal, el modelo no tiene la culpa.

02 — El circuito
El parser escribe en el prompt

Este es el punto que la guía enseña de pasada. El parser no espera al final: participa antes de que el modelo genere nada.

Ida parser→ prompt→ modelo get_format_instructions() devuelve texto con el esquema esperado, y ese texto entra en la plantilla como una variable más.
Vuelta modelo→ parser→ dict El modelo responde ya en el formato que se le pidió, así que el parser no tiene que pelearse con el texto.

Hay dos maneras de inyectar esas instrucciones, y solo una es cómoda:

# a mano, en cada invoke — se olvida
cadena.invoke({"profesion": "...", "format_instructions": parser.get_format_instructions()})

# fijado de una vez en la plantilla
prompt = prompt.partial(format_instructions=parser.get_format_instructions())
// esas instrucciones son tokens de entrada que pagas en cada llamada: imprímelas al menos una vez
03 — Salida
De string a estructura
ParserDevuelveCuándo
StrOutputParserstrLa salida es prosa para un humano
JsonOutputParserdictNecesitas indexar campos: perfil["nombre"]
PydanticOutputParserinstancia del modeloQuieres que los tipos se validen de verdad

La diferencia entre las dos últimas filas es la que va a morderte. JsonOutputParser te da un diccionario con lo que el modelo haya escrito; PydanticOutputParser construye y valida una instancia. No son lo mismo aunque les pases la misma clase.

Auditoría Dos cosas del material no aguantan la comprobación. Una: la guía importa from langchain_core.pydantic_v1 import BaseModel, Field; ese módulo era un puente hacia Pydantic 1 y desapareció con LangChain 0.3 (septiembre de 2024), cuando el framework migró a Pydantic 2 — hoy se importa directamente from pydantic import ... (verificado en el anuncio oficial de la v0.3 el 2026-08-30). Dos: la guía escribe el comentario «inyectamos las instrucciones automáticamente» justo encima de un código donde se pasan a mano en el invoke.

Y la duda de fondo: la guía dice que un esquema Pydantic estricto sirve para «forzar las claves correctas», pero JsonOutputParser devuelve un dict, no una instancia de Perfil. Pide un perfil con edad declarada «entre 25 y 50», mira qué dice type(perfil) y comprueba si algo rechaza una edad fuera de rango. Si nada la rechaza, ¿qué está forzando exactamente el esquema — la validación, o solo el texto de las instrucciones?
Para hacer
Léete tu propio prompt

Imprime parser.get_format_instructions() antes de invocar nada y léelo entero: es literalmente parte de tu prompt. Después repite la misma cadena cambiando JsonOutputParser por PydanticOutputParser y compara type() del resultado.