Los tickets son una pesadilla para los ordenadores: cada tienda usa un formato diferente, las fuentes varían, el papel se deforma. El OCR clásico te da el texto; la parte difícil es extraer significado estructurado de él.
El pipeline
- Preprocesamiento de imagen: corrección de perspectiva, mejora de contraste, binarización
- Tesseract OCR para extracción de texto bruto
- LangChain + GPT-4o-mini para extraer campos estructurados
- Validación y normalización de esquema JSON
El paso del LLM es la idea clave: en lugar de escribir patrones regex frágiles para cada formato de ticket, describes el esquema que quieres y dejas que el modelo descubra dónde están los campos.
schema = {
"merchant": "string",
"date": "ISO 8601 date",
"total": "number",
"items": [{"name": "string", "price": "number"}]
}
result = chain.invoke({
"ocr_text": raw_text,
"schema": json.dumps(schema)
})
Precisión y casos límite
En un conjunto de prueba de 200 tickets reales, la precisión de extracción de campos fue del 94% para el nombre del comercio, 97% para el total y 89% para las líneas individuales. Los fallos fueron sobre todo tickets manuscritos y papel muy arrugado — áreas donde el preprocesamiento todavía necesita trabajo.
La combinación de preprocesamiento determinista y extracción probabilística es más robusta que cualquiera de los dos enfoques por separado.