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.
| Constructor | Qué produce | Cuándo |
|---|---|---|
from_template("...{var}") | Un único mensaje de usuario | Pruebas 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.
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.
get_format_instructions() devuelve texto con el esquema esperado, y ese texto entra en la plantilla como una variable más.
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
| Parser | Devuelve | Cuándo |
|---|---|---|
StrOutputParser | str | La salida es prosa para un humano |
JsonOutputParser | dict | Necesitas indexar campos: perfil["nombre"] |
PydanticOutputParser | instancia del modelo | Quieres 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.
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.
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?
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.