Este documento simula el comportamiento interno del sistema ante 6 escenarios distintos, analizando la toma de decisiones, la trazabilidad del dato y detectando áreas de mejora.
- Entrada: PDF generado por software contable (nativo).
- Flujo:
- Pre-procesamiento:
is_digital_pdfdetecta caracteres. Usapdfplumber. - Clasificación: El modelo ML identifica "factura" con confianza 0.99.
- ¿Cómo se genera el 0.99?: Al ser texto digital nativo, el
TfidfVectorizerdetecta bigramas exactos como"Folio Fiscal"o"Sello Digital". El clasificador SVM (SVC) mapea este vector a una zona de máxima certeza. Gracias al Escalado de Platt (probability=True), la distancia al hiperplano se traduce en una probabilidad logística casi perfecta (0.99).
- ¿Cómo se genera el 0.99?: Al ser texto digital nativo, el
- Extracción:
- RFC: Encontrado por Regex.
- Monto: Encontrado por Regex.
- Proveedor: Identificado por spaCy NER.
- Pre-procesamiento:
- Trazabilidad:
"traceability": { "rfc": "regex", "proveedor": "spacy_ner", "monto_total": "regex" }
- Resultado: Éxito total.
- Entrada: Foto de un recibo impreso de transferencia bancaria.
- Flujo:
- Pre-procesamiento: No hay texto seleccionable. Activa PaddleOCR.
- Limpieza:
correct_ocr_errorscambia "O" por "0" en montos. - Clasificación: Keywords encuentran "SPEI" y "referencia". Tipo: "comprobante".
- Extracción: Regex no encuentra el RFC por ruido en el escaneo. Se llama a Ollama.
- Trazabilidad:
"traceability": { "rfc": "llm", "monto_total": "regex", "_extraction_method": "ocr" }
- Resultado: Datos recuperados gracias al fallback de IA.
- Entrada: Factura extranjera o con diseño personalizado.
- Flujo:
- Extracción: Regex falla al identificar quién es el emisor y quién el receptor por la posición inusual de las etiquetas.
- Decisión: El sistema detecta ambigüedad y envía el texto a Ollama (Llama3) con el prompt de contexto.
- Trazabilidad:
"traceability": { "emisor": "llm_inference", "receptor": "llm_inference" }
- Resultado: Extracción exitosa mediante inferencia semántica.
- Entrada: PDF escaneado a 72dpi, muy borroso.
- Flujo:
- OCR: PaddleOCR genera texto con muchas "alucinaciones" (ej. "T0TAL" en vez de "TOTAL").
- Validación: El monto extraído no es un número válido.
validate_fieldsdevuelvevalid: false.
- Hallazgo: El sistema actual no intenta re-procesar con filtros de imagen.
- Mejora sugerida: Implementar una capa de pre-procesamiento de imagen (OpenCV) para mejorar el contraste antes del OCR si la confianza inicial es baja (< 0.6).
- Entrada: Una carta de agradecimiento que incluye un RFC pero no es una factura.
- Flujo:
- Clasificación: El modelo ML da una confianza baja (0.35) para todos los tipos.
- Extracción: Extrae el RFC (porque la regex lo encuentra), pero al no tener tipo definido, la validación de negocio podría fallar.
- Hallazgo: El sistema extrae datos de cualquier cosa que parezca una factura.
- Mejora sugerida: Implementar un "Threshold de Confianza" en la clasificación. Si es < 0.5, rechazar el documento antes de gastar recursos en extracción de campos.
- Entrada: Documento que menciona un RFC de un tercero (ej. "Enviado por logística S.A. de C.V. RFC: XXXX") además del Emisor y Receptor.
- Flujo:
- Regex: Encuentra 3 RFCs distintos. ¿Cuál elige?
- Lógica actual: Toma el primero que encuentra.
- Hallazgo: Riesgo de asignar el RFC de la empresa de logística como el emisor de la factura.
- Mejora sugerida: Mejorar la lógica de
extract_fieldspara que, si hay > 2 RFCs, se fuerce siempre la consulta al LLM para que este determine el "rol" de cada RFC basándose en el lenguaje circundante.
El sistema genera una "huella digital" de la extracción en el objeto de salida:
_extraction_method: "digital" (rápido/exacto) o "ocr" (procesamiento pesado)._ocr_confidence: Valor del motor de visión (PaddleOCR).sourcepor campo:regex: Alta confianza técnica.spacy_ner: Confianza estadística/lingüística.llm: Confianza semántica (inferencia consciente).
Este diseño permite que el usuario humano sepa cuándo debe revisar un dato con mayor atención (especialmente si la fuente es llm o ocr con baja confianza).