Blog

2026-05-06 · 2 min

LLMs en producción: lecciones del mundo real

pythonllmsproducción

Cuando empecé a integrar LLMs en pipelines de datos en 2022, casi toda la documentación asumía que ibas a hacer un chatbot demo. Los casos de uso reales —procesamiento de documentos a escala, extracción estructurada, pipelines con reintentos y validación— tenían muy poco material.

Estas son las tres lecciones que más me costaron aprender.

1. El prompt es código

Trata tus prompts como tratas tu código: versionados, testeados, revisados. Un prompt que "funcionó en dev" puede comportarse diferente en producción por cambios mínimos en los datos de entrada.

Lo que funciona:

# Guarda prompts como templates con variables explícitas
EXTRACTION_PROMPT = """
Extrae los siguientes campos del texto en JSON válido:
- fecha (formato YYYY-MM-DD)
- monto (número, sin símbolo de moneda)
- concepto (string)

Texto:
{text}

Responde únicamente con el JSON, sin explicaciones.
"""

Lo que no funciona: prompts inline hardcodeados en medio de la lógica de negocio.

2. Valida la salida siempre

Los LLMs no garantizan formato. Aunque el modelo "casi siempre" devuelve JSON válido, ese 2% de errores va a dañar tu pipeline en producción.

from pydantic import BaseModel
import json

class ExtractionResult(BaseModel):
    fecha: str
    monto: float
    concepto: str

def parse_llm_output(raw: str) -> ExtractionResult:
    try:
        data = json.loads(raw.strip())
        return ExtractionResult(**data)
    except Exception as e:
        raise ValueError(f"LLM output inválido: {raw!r}") from e

Pydantic + manejo explícito de errores es lo mínimo. Para casos críticos, agrega reintentos con prompt corregido.

3. Mide todo

Latencia, costo por llamada, tasa de errores de validación, uso de tokens. Sin métricas no puedes optimizar.

Con Dagster, esto es natural: cada asset tiene su propio scope de logging y puedes agregar métricas custom por run. En otros contextos, un simple wrapper con logging estructurado es suficiente para empezar.


Hay mucho más que decir sobre caching semántico, selección de modelos por tarea, y manejo de rate limits. Lo dejo para el siguiente post.

// Deja un comentario