Plataforma B2B que automatiza la extracción y registro de pólizas de caución desde documentos fiscales PDF usando DeepSeek LLMs, OCR y chunking inteligente.
El sistema resuelve la extracción de datos de documentos fiscales no estandarizados emitidos por múltiples aseguradoras.
Pipeline multicapa que combina PyMuPDF para preservar el layout visual, pdfplumber para detectar tablas y Tesseract OCR para documentos escaneados. Luego el LLM procesa todo el contexto enriquecido.
Modelos deepseek-v4-pro y deepseek-v4-flash analizan cada factura identificando tipo de endoso, vigencia, premio, anulaciones, notas de crédito y más, con respuesta JSON estructurada.
Algoritmo que divide PDFs de múltiples facturas en fragmentos con solapamiento de 2 páginas, detectando límites naturales mediante patrones regex como "Factura N°" o "Total a pagar".
Estrategia de degradación elegante: reintentos ante errores transitorios, fallback a Ollama local si DeepSeek no responde, y notificaciones proactivas al staff ante errores de pago (402).
Colas Celery + RabbitMQ + Redis para importaciones masivas en background. El operador carga los PDFs y el sistema procesa en paralelo sin bloquear la interfaz.
El modelo identifica frases específicas por aseguradora —"Riesgo Suspendido", "Anulación Total por Desistimiento"— y marca automáticamente las pólizas como dadas de baja.
Comparación del proceso manual vs. automatizado con IA. Valores basados en benchmarks reales del sector insurtech.
| KPI | Antes (manual) | Después (SGS + IA) | Mejora |
|---|---|---|---|
| Tiempo por documento | 300 segundos | 12 segundos | 96 % de reducción |
| Precisión de extracción | 92 % (error humano) | 91 % (modelo) | Equivalente, sin fatiga |
| Documentos/día/operador | 96 | 2.400 | 25× más capacidad |
| Tasa de error de tipeo | 8 cada 100 (8 %) | 0 % (sin tipeo) | Eliminación total |
| Costo operativo mensual | 320 horas-operador | 32 h-operador + $45 USD API | 90 % de reducción |
| Importación lote 100 PDFs | 8,3 horas | 20 minutos | 96 % más rápido |
| Cobertura de aseguradoras | Entrenamiento por formato | 8+ aseguradoras sin configuración | Universal |
| ROI estimado | — | — | 9:1 |
Stack tecnológico, decisiones de diseño y patrones utilizados. Orientado a líderes técnicos y entrevistadores.
def extraer_contenido_hibrido(self, pdf_origen) -> Dict[str, Any]:
"""
Sistema híbrido que combina múltiples métodos de extracción.
PyMuPDF → layout visual · pdfplumber → tablas · Tesseract → OCR
"""
contenido = {
"texto_crudo": "", "texto_estructurado": "",
"tablas": "", "metadatos": "", "tiene_imagenes": False,
"metodo_extraccion": self.metodo_extraccion,
}
# Método 1: PyMuPDF para layout visual general
if 'layout' in self.configuracion['METODOS_EXTRACCION']:
contenido["texto_estructurado"] = self.extraer_texto_con_layout(pdf_origen)
# Método 2: pdfplumber para detección de tablas
if 'tablas' in self.configuracion['METODOS_EXTRACCION']:
contenido["tablas"] = self.extraer_tablas_con_pdfplumber(pdf_origen)
# Método 3: Verificar si necesita OCR (documento escaneado)
necesita_ocr = self._necesita_ocr(pdf_origen)
if necesita_ocr and self.usar_ocr:
contenido["texto_crudo"] = self._extraer_con_ocr(pdf_origen)
contenido["metodo_extraccion"] = "ocr"
else:
contenido["texto_crudo"] = contenido["texto_estructurado"] + "\n\n" + contenido["tablas"]
# Fallback a texto básico si los métodos anteriores fallan
if not contenido["texto_crudo"].strip():
contenido["texto_crudo"] = self.extraer_texto_de_pdf(pdf_origen)
return contenido
try:
# Procesamiento directo con DeepSeek
return self._procesar_con_deepseek(prompt_completo)
except APIConnectionError as error:
# Error de conectividad → notificar y detener
mensaje_error = f"Error de conexión con DeepSeek API: {str(error)}"
return {"status": "error", "errors": [mensaje_error]}
except APIStatusError as error:
# Error HTTP (402, 429, 500, etc.)
if error.status_code == 402:
# Notificar al staff por email: saldo agotado
enviar_email.delay(
subject="Error 402 - Pago requerido en DeepSeek API",
message=f"Error al procesar PDF. Saldo agotado.",
email=list(Usuario.objects.filter(is_staff=True)
.values_list('email', flat=True))
)
return {"status": "error", "errors": [str(error)]}
except BadRequestError as error:
# Prompt mal formado → no reintentar
return {"status": "error", "errors": [str(error)]}
except Exception as error:
# Error desconocido → fallback a procesamiento iterativo
if hasattr(archivo_pdf, 'seek'):
archivo_pdf.seek(0)
return self.procesar_pdf_grande_iterativamente(
archivo_pdf, nombre_proceso, nombre_archivo)
# Llamada a DeepSeek con response_format JSON
respuesta = openai.chat.completions.create(
model=self.modelo, # deepseek-v4-pro o deepseek-v4-flash
messages=[
{"role": "system", "content": prompt_sistema}, # 17 reglas de negocio
{"role": "user", "content": "Analizá el documento fiscal proporcionado."}
],
response_format={'type': 'json_object'}, # Respuesta JSON garantizada
temperature=self.temperatura,
max_tokens=self.max_tokens # Hasta 384K tokens de salida
)
# La respuesta del modelo es un JSON con esta estructura:
{
"facturas": [
{
"poliza": 229910,
"endoso": 44,
"vigencia_desde": "2025-01-01",
"vigencia_hasta": "2025-06-30",
"factura": "0002-00294656",
"premio": 150000.00,
"suma_asegurada": 5000000.00,
"vencimiento_cuota": "2025-02-15",
"status": "ok",
"messages": [],
"comments": "Factura procesada. Layout estándar ACG.",
"anulada": false,
"motivo_anulada": ""
}
]
}
Diagrama del pipeline de IA: entrada PDF → extracción híbrida (PyMuPDF, pdfplumber, OCR) → chunking inteligente → DeepSeek API → JSON estructurado → registro en PostgreSQL.
Dashboard comparativo con los KPIs principales: tiempo por documento, precisión, volumen procesado, costo operativo. Antes vs después con barras y porcentajes de mejora.
Flujo de procesamiento de un documento: carga del PDF, extracción híbrida, segmentación en chunks, inferencia del LLM, consolidación de facturas y almacenamiento.
Captura de pantalla de la interfaz de importación de documentos. Panel de administración con barra lateral, listado de importaciones y log de resultados.
Curva de mejora de precisión del modelo a lo largo del tiempo, mostrando cómo el prompt engineering iterativo elevó la precisión del 78 % inicial al 91 % actual.
Diagrama de la estrategia de resiliencia: capas de fallback (reintento → chunking → Ollama local → notificación staff) ante distintos tipos de errores de API.
Este proyecto forma parte de mi portfolio profesional. Si te interesa discutir la arquitectura, las decisiones técnicas o ver más casos de estudio, contactame.