Hackathon · Web
recibo-claro
Agente de IA que explica por qué varió un recibo de telefonía, con cada cifra anclada en código y derivación a un asesor humano cuando no puede sostener la respuesta.
- Python
- LangGraph
- LangChain
- FastAPI
- Pydantic
- Gemini
- RAG
- pgvector
- BM25
- PostgreSQL
- Supabase
- Jinja
- JWT
- Docker
- React
- TypeScript
En una mirada
- Problema · Explicar recibos a escala sin que el modelo invente una sola cifra
- Decisión · El código calcula y verifica; el modelo solo redacta
- Resultado · 0% de alucinaciones y 100% de recall de derivación en 261 casos golden
Problema y contexto
El Hackathon AI Telecom Challenge 2026 —Integratel Perú (Movistar) con la Facultad de Ingeniería de la Universidad de Lima— pedía explicar el recibo a los clientes que no entienden por qué les llegó más caro, con un requisito poco común: cero invenciones financieras comprobables en los logs de la terminal. Construí una API canal-agnóstica en Python donde el modelo generativo no calcula: recibe un conjunto de hechos ya conciliado y sellado con SHA-256, aporta solo la prosa, y cada cifra del texto la inyecta el código desde ese conjunto. Un verificador escrito en código —no un juez LLM— revisa la respuesta final y la bloquea si aparece un número sin anclar. Sobre esa base monté la orquestación con LangGraph, un protocolo de evaluación con 261 casos golden, y las capas de gobierno, observabilidad y coste que faltan cuando un agente pasa de demostración a proceso de negocio. Las métricas se miden contra un ground truth escrito por el mismo autor y el repositorio lo advierte: la única garantía estructural es la tasa de alucinación, porque el verificador compara contra los hechos del propio cliente y no contra el ground truth.
Decisiones y ejecución
- Orquesté el turno con LangGraph: un grafo que vuelve explícitas las once salidas posibles del flujo, con un checkpointer persistente para que el historial de la conversación y la histéresis de derivación sobrevivan al reinicio del proceso.
- Implementé el verificador numérico que sostiene la promesa de cero alucinaciones: extrae cada cifra del texto generado, la normaliza a tokens y la resta contra el conjunto permitido construido solo desde los hechos del cliente. Una sola cifra sin anclar bloquea la respuesta y abre la derivación.
- Diseñé el protocolo de evaluación: 261 casos golden —38 escritos a mano y el resto por muestreo estratificado reproducible por semilla, con 16 adversariales de inyección de prompt— y métricas de recuperación, alucinación y hand-off que devuelven código de salida para integrarse a un pipeline de CI.
- Construí la capa generativa sobre Gemini con un prompt de cuatro bloques fijos, diez plantillas por causa dominante y el mensaje del cliente siempre delimitado y neutralizado al final, además de una cascada de proveedores que degrada a plantilla determinística en lugar de caerse.
- Levanté el gobierno del agente: bitácora de auditoría encadenada por hash con UPDATE y DELETE bloqueados por trigger, una matriz de niveles de autenticación por canal donde WhatsApp no recibe un solo importe, y apagado forzado de la telemetría de terceros para que el contenido del turno no salga del proceso.
- Monté el RAG híbrido —catálogo por clave, preguntas frecuentes con BM25 y pgvector fusionados por RRF, casuísticas por firma causal— con un saneador que sustituye toda cifra del corpus antes de que llegue al prompt, para que el recuperador nunca pueda aportar un número ajeno al cliente.
- Calculé el coste del sistema por modelo y por camino, con precios verificados, coste unitario por respuesta y volumetría declarada, para poder elegir el modelo por un criterio explícito —humanización, velocidad, coste o control del dato— y no por intuición.
- Empaqueté la entrega para que se levante en un comando: imagen Docker multi-stage, migraciones SQL idempotentes, dataset sintético determinístico por semilla y una ruta alternativa sin Docker ni base de datos. La suite de pruebas cubre unidad, propiedad, contrato y casos golden.