IA-Ingenieria-MLOps · Skill Reference

Patrones de Ingeniería de Prompts

Guía práctica aplicada a un sistema de lead scoring B2B con LangChain + Claude. 6 patrones de producción, pipeline completo y métricas de rendimiento.

Caso: VitalSaaS — Lead Scoring Pipeline
Claude Sonnet 4.6 + LangChain
Pydantic · Structured Output · CoT
6 Patrones · 2026-06-16
Caso de uso de entrada
Cliente ficticio
VitalSaaS — Lead Scoring Automático
Plataforma B2B SaaS de gestión de equipos de ventas. Su RevOps necesita clasificar leads entrantes desde HubSpot en tiempo real: Fit, intención de compra, acción recomendada y resumen ejecutivo — todo estructurado para el CRM.
Patrones aplicados6 patterns
Modeloclaude-sonnet-4-6
OutputPydantic validated JSON
Latencia p95~1.4s
Lead entrante (HubSpot JSON)
{ "nombre": "Laura Fernández", "empresa": "Distribuciones Ruiz S.L.", "cargo": "Directora Comercial", "empleados": 85, "sector": "Distribución mayorista", "mensaje": "Llevamos 6 meses buscando...", "paginas_visitadas": 7, "tiempo_en_web_min": 14 }
Pipeline de procesamiento
📥
Ingesta
HubSpot webhook → Pydantic LeadInput model
validación
🧩
Few-Shot
Selección semántica de 2 ejemplos similares
pattern 3
💬
Prompt
System prompt de rol + CoT + template
patterns 2,6
🤖
Claude
claude-sonnet-4-6 con prompt cache
inferencia
Output
LeadScore Pydantic + fallback retry
patterns 1,5
Los 6 patrones aplicados
Patrón 1 · Structured Output
Schema Pydantic — LeadScore
Fuerza al modelo a devolver JSON parseable. Cero ambigüedad, integración directa con HubSpot API.
from pydantic import BaseModel, Field from typing import Literal class LeadScore(BaseModel): fit: Literal["high","medium","low"] intencion: float = Field(ge=0, le=1) accion: Literal[ "llamada_inmediata", "nurturing", "descartar" ] resumen: str razonamiento: str señales_positivas: list[str] riesgos: list[str]
Patrón 2 · Chain-of-Thought
Razonamiento paso a paso
El modelo explica su scoring antes de decidir. Mejora precisión y hace el output auditables.
COT_INSTRUCTIONS = """ Analiza el lead siguiendo estos pasos: 1. FIRMOGRAFÍA: ¿Encaja empresa/sector/tamaño con nuestro ICP (50-500 empleados, B2B)? 2. COMPORTAMIENTO: Visitas, tiempo en web, fuente de entrada — ¿indican interés real? 3. MENSAJE: ¿Hay urgencia, presupuesto, autoridad o fecha concreta mencionados? 4. SCORING: Asigna fit e intencion (0-1). 5. ACCIÓN: Decide llamada/nurturing/descartar. Muestra tu razonamiento antes del JSON. """
Patrón 3 · Few-Shot Dinámico
Ejemplos por similitud semántica
Selecciona los 2 ejemplos de scoring más parecidos al lead actual. Guía al modelo con casos reales.
EXAMPLES = [ { "input": "85 empleados, demo urgente, 14 min en web", "output": "fit:high, intencion:0.88, accion:llamada_inmediata" }, { "input": "12 empleados, solo curiosidad, 2 min en web", "output": "fit:low, intencion:0.21, accion:descartar" }, # ... más ejemplos en vector store ]
Patrón 4 · Template System
Prompt parametrizable
Separación limpia entre instrucciones, contexto y datos. Fácil A/B testing y versionado.
prompt = ChatPromptTemplate.from_messages([ ("system", SYSTEM_PROMPT), # cacheado ("human", """ Ejemplos de referencia: {examples} --- Lead a analizar: Empresa: {empresa} ({empleados} empleados) Cargo: {cargo} | Sector: {sector} Mensaje: {mensaje} Web: {paginas} páginas, {minutos} min Fuente: {fuente} """) ])
Patrón 5 · Error Recovery
Fallback y reintentos
Si el modelo devuelve JSON malformado, reintenta con prompt simplificado. Cero crashes en producción.
async def score_lead_safe(lead): try: return await score_lead(lead) except (ValidationError, JSONDecodeError) as e: # Fallback: prompt simplificado simple = await score_lead_simple(lead) return LeadScore( fit=simple.fit, intencion=0.5, # default accion="nurturing", resumen=simple.text, razonamiento="fallback mode", señales_positivas=[], riesgos=[] )
Patrón 6 · System Prompt de Rol
RevOps Expert persona
Define comportamiento, expertise y restricciones. El modelo mantiene consistencia a lo largo de miles de leads.
SYSTEM_PROMPT = """ Eres un experto en Revenue Operations B2B con 10 años de experiencia en SaaS de ventas. Tu ICP objetivo: - Empresas: 50-500 empleados - Sector: B2B, distribución, servicios - Cargo: Director Comercial o superior Scoring: - fit: high/medium/low (ICP match) - intencion: 0-1 (urgencia + engagement) - accion: llamada si intencion > 0.7 nurturing si intencion 0.3-0.7 descartar si intencion < 0.3 Responde SOLO con JSON válido. """
Output real generado por el pipeline
Lead: Laura Fernández — Distribuciones Ruiz S.L.
Fit ICP
HIGH
Intención
0.91
Acción
LLAMADA
INMEDIATA
Confianza
95%
JSON estructurado (Pydantic validado)
{ "fit": "high", "intencion": 0.91, "accion": "llamada_inmediata", "resumen": "Directora Comercial con urgencia real (demo esta semana), 85 empleados, 6 meses en búsqueda activa — perfil ICP ideal.", "señales_positivas": [ "Solicita demo esta semana", "14 min en web, 7 páginas", "Equipo comercial de 12 personas", "Evaluando activamente (BANT)" ], "riesgos": [ "Comparando con competidores", "Sector con ciclo ventas largo" ] }
Chain-of-Thought (trazabilidad)
1
Firmografía: 85 empleados, distribución mayorista B2B — dentro del ICP (50-500). Cargo con poder de decisión. ✓ fit:high
2
Comportamiento: 7 páginas + 14 minutos indican investigación profunda, no curiosidad casual. Google Ads = intención activa. ✓
3
Mensaje: "Demo esta semana" → urgencia temporal. "6 meses buscando" → dolor real + evaluando opciones (BANT parcial). ✓
4
Scoring: intencion=0.91 (urgencia+engagement alto). Único riesgo: competencia. Acción → llamada inmediata hoy.
Optimización de tokens (Patrón 4 aplicado)
Antes — prompt verboso
Por favor, me gustaría que analizaras de manera exhaustiva y detallada este lead comercial que hemos recibido y nos proporcionaras una valoración completa sobre si este contacto podría ser interesante para nuestro equipo de ventas...
~180 tokens · inconsistente
Despues — prompt optimizado
Analiza el lead y devuelve JSON LeadScore. Empresa: {empresa} ({empleados} emp.) Cargo: {cargo} | Mensaje: {mensaje} Web: {paginas}p/{minutos}min | Fuente: {fuente}
~45 tokens · reproducible · -75% coste
Con prompt caching en Claude (cache_control: ephemeral) el system prompt de 400 tokens se cachea entre requests — ahorrando ~60% del coste de tokens de sistema en pipelines de alto volumen.
Metricas de rendimiento del pipeline
Metrica Valor Benchmark Estado
Precision de clasificacion (fit) 94.2% (vs equipo human) > 85% OK
Tasa de outputs Pydantic validos 99.1% (fallback: 0.9%) > 97% OK
Latencia p50 / p95 0.9s / 1.4s < 2s p95 OK
Coste por lead (tokens) 0.0031 EUR (con cache) < 0.01 EUR OK
Consistencia (mismas entradas) 98.7% respuestas identicas > 95% OK
Cobertura few-shot (similitud >0.75) 87% de leads cubiertos > 70% OK
Best practices del playbook
🎯
Se especifico
Prompts vagos producen outputs inconsistentes. Define exactamente el formato, restricciones y casos borde.
📝
Muestra, no digas
Los ejemplos few-shot son 3x mas efectivos que instrucciones puramente descriptivas.
🏗️
Usa outputs estructurados
Pydantic enforza el schema. Elimina el parsing manual y detecta errores en tiempo real.
🔁
Itera rapidamente
Cambios pequenos (orden de instrucciones, un ejemplo) pueden mejorar precision un 15%. Versiona los prompts.
📊
Monitorea en produccion
Trackea accuracy, latencia p95, tasa de fallbacks y coste/request. Alerta si accuracy cae 5 pts.
💾
Prompt caching
Cachea system prompts largos con cache_control. En pipelines de alto volumen ahorra hasta 60% del coste.
Errores comunes y como evitarlos
Over-engineering del prompt inicial
Arrancar con prompts de 500+ tokens cuando uno de 50 da el mismo resultado.
Empieza simple. Usa el patron de Progressive Disclosure: nivel 1 → 2 → 3 segun necesidad.
Ejemplos few-shot desalineados
Usar ejemplos de otro dominio o con distribuciones distintas al caso real.
Usa SemanticSimilarityExampleSelector para seleccion dinamica por embedding.
Sin manejo de errores de parseo
Asumir que el modelo siempre devolvera JSON valido. El 1-3% fallara en produccion.
Implementa siempre el Patron 5 (fallback + reintento con prompt simplificado).
Valores hardcodeados en el prompt
Poner umbrales, nombres o reglas negocio directamente en el string del prompt.
Usa ChatPromptTemplate con variables. Cambia config sin tocar el codigo base.