Sobre mí

Diseño la arquitectura, la construyo y publico cómo la medí.

Construyo sistemas donde un fallo cuesta dinero o cuesta multa: facturación electrónica ante SUNAT, pasarelas de pago, libros contables y conciliación. Sobre esa base sumo IA cuando la mejora es medible, y publico la condición en la que medí cada cifra.

Diseño y construyo sistemas donde el fallo tiene consecuencia fiscal o legal: facturación electrónica ante SUNAT, pasarelas de pago, libros contables y conciliación.

Trabajo desde Lima y dirijo el equipo técnico de una agencia de nueve personas.

Cada cifra de esta página lleva su condición de medición y su fuente.

6años de desarrollo
2años de IA en producción
50+proyectos entregados
45+clientes
20+sistemas en producción
9personas en el equipo
Cómo trabajo

Cuatro reglas que no negocio

Mido antes de afirmar

Por qué

Cada cifra que publico viene con la condición en la que se midió. Un recall@10 sin decir sobre qué gold set no es un dato, es una opinión.

Documento dónde se rompe

Por qué

Todo sistema tiene un punto de fallo. El del pronóstico está en 510 productos y está calculado, no estimado. Prefiero decirlo yo antes de que lo descubra el cliente.

Dejo escritas mis equivocaciones

Por qué

Estimé 25 segundos y medí 39.17. Apostaba por gradient boosting y ganó AR(1). La diferencia entre estimar y medir es el trabajo.

Elijo por costo, no por moda

Por qué

Descarté CloudWatch porque a esa cardinalidad costaba 44 USD al mes. La concurrencia quedó en 8 porque la cuota de la cuenta era 10, no porque 8 fuera óptimo.

Lo que no sé hacer

Prefiero que me descarten por lo que falta antes que quedar en evidencia en una entrevista técnica.

Lo que uso
  • AWS
  • Python, TypeScript
  • FastAPI, Next.js, React
  • BM25 y búsqueda vectorial, RRF
  • Step Functions, Lambda, S3
  • DynamoDB, PostgreSQL, Prisma
  • CDK
  • pytest, vitest
  • TensorFlow, MediaPipe
No lo he usado
  • Azure, Google Cloud
  • Databricks
  • Snowflake
  • Microsoft Fabric
  • Unity Catalog
  • MLflow
  • OCR y extracción de documentos
  • Go
  • Spec Driven Development formal
Todas las mediciones

Ocho cifras, cada una con la condición en la que se tomó y la fuente que la respalda o la que le falta.

Medidas, fuente sin publicar07
Medida, fuente sin publicar: la corrida de evaluación con jina-embeddings-v30.862Aporte de la vectorial
Medida, fuente sin publicar: definición de las herramientas8Herramientas MCP
Medida, fuente sin publicar: esquema OpenAPI13Rutas FastAPI
Medida, fuente sin publicar: logs del antes y el después707.5 msSnapshot en handler
Medida, fuente sin publicar: definición del estado Map8Concurrencia Map
Medida, fuente sin publicar: el cálculo de costo44 USDCloudWatch descartado
Medida, fuente sin publicar: salida de la suite E2E53End to end de ADM
Por verificar03
Por verificar: la corrida de evaluación2Violaciones del gold set
Por verificar: salida de las dos suites392 + 77Tests del RAG
Por verificar: notebook de validación0.1711Gradient boosting
La condición de cada sonda
Aporte de la vectorial
Recall de la búsqueda aislada del piso determinista, con el embebedor real. Con el de juguete daba 0.759: la diferencia es lo único que prueba que la mitad semántica no es decoración ↗
Violaciones del gold set
Con el embebedor real. Preguntar por papaya, que no está en el catálogo, devuelve fichas de papa: 0.6444 contra 0.6656, dos centésimas. Ningún umbral las separa sin matar las preguntas agregadassin resolver en recuperación ↗
Herramientas MCP
Servidor MCP en producción del sistema RAG ↗
Rutas FastAPI
La misma superficie, expuesta por HTTP ↗
Tests del RAG
392 en pytest, 77 en vitestfalta cobertura ↗
Gradient boosting
Misma validación walk-forward. Perdió contra AR(1)declarar la métrica ↗
Snapshot en handler
Antes de moverlo fuera. Después: 1.78 ms ↗
Concurrencia Map
La cuota de la cuenta era 10 ↗
CloudWatch descartado
Al mes, a esa cardinalidad. Se eligió DynamoDB ↗
End to end de ADM
Sobre 543 tests y 29 servicios de dominio ↗
Dónde se rompe

Los límites tienen la misma jerarquía que los resultados.

Medida, fuente sin publicar: la corrida de evaluación con el embebedor realSistema RAG

Papaya devuelve papa, y no lo arreglé en recuperación

Dónde y por qué

Preguntar por un producto que no está en el catálogo devuelve el más parecido por nombre. Papaya puntúa 0.6444 y papa 0.6656: dos centésimas. Probé el umbral obvio y no funciona, porque cualquier corte que las separe mata las preguntas agregadas, que puntúan 0.5151. Lo resolví avisando al modelo desde el filtro léxico, que ya sabía que ninguna palabra coincidía con el catálogo. La evaluación sigue reportando las dos violaciones: no relajé el gold set.

Medida, fuente sin publicar: cálculo del tamaño de estadoPronóstico en AWS

Se rompe a los 510 productos

Dónde y por qué

514 bytes por elemento del Map contra el tope de 256 KB de estado de Step Functions. Sobre ese número hay que paginar el Map o mover la carga a S3.

Medida, fuente sin publicar: el gold set completoSistema RAG

El recall@10 vale dentro del dominio indexado

Dónde y por qué

El gold set son 32 casos que redacté yo sobre 73 productos y 537 fechas. Es una muestra pequeña y de autor único: sirve para detectar regresiones, no para afirmar que el sistema generaliza.

Medida, fuente sin publicar: tabla de códigos y su manejoOrquestadorADM

SUNAT entre 100 y 1999 es inconcluso

Dónde y por qué

No se puede saber si el comprobante quedó registrado. La regla es no reemitir y esperar la consulta de estado, porque reemitir duplica el correlativo.

Por verificar: nada hasta verificarloPaquete de despliegue

El paquete de despliegue, sin publicar

Dónde y por qué

207.6 MB contra un límite de 250 MB. Retenido hasta confirmar si esa cifra es el paquete comprimido o el descomprimido, porque el límite de Lambda aplica al descomprimido. Se corrige o sale de la lista, pero no se publica a medias.