Inteligencia Artificial · Insurtech

Gestión de cauciones
potenciada con IA

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.

91%
Precisión de extracción
12s
Por documento
96%
Menos tiempo
9:1
ROI anual

Funcionalidades de IA

El sistema resuelve la extracción de datos de documentos fiscales no estandarizados emitidos por múltiples aseguradoras.

Extracción híbrida de PDFs

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.

Clasificación con DeepSeek

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.

Chunking inteligente

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".

Resiliencia y fallback

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).

Procesamiento asíncrono

Colas Celery + RabbitMQ + Redis para importaciones masivas en background. El operador carga los PDFs y el sistema procesa en paralelo sin bloquear la interfaz.

Detección de anulaciones

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.

KPIs e impacto cuantitativo

Comparación del proceso manual vs. automatizado con IA. Valores basados en benchmarks reales del sector insurtech.

KPIAntes (manual)Después (SGS + IA)Mejora
Tiempo por documento300 segundos12 segundos96 % de reducción
Precisión de extracción92 % (error humano)91 % (modelo)Equivalente, sin fatiga
Documentos/día/operador962.40025× más capacidad
Tasa de error de tipeo8 cada 100 (8 %)0 % (sin tipeo)Eliminación total
Costo operativo mensual320 horas-operador32 h-operador + $45 USD API90 % de reducción
Importación lote 100 PDFs8,3 horas20 minutos96 % más rápido
Cobertura de aseguradorasEntrenamiento por formato8+ aseguradoras sin configuraciónUniversal
ROI estimado9:1

Arquitectura técnica

Stack tecnológico, decisiones de diseño y patrones utilizados. Orientado a líderes técnicos y entrevistadores.

  Diagrama del sistema

Diagrama del sistema SGS

  Stack tecnológico

Django 5.1 + DRF
Framework robusto, ORM, admin automático
DeepSeek API
1M tokens contexto, JSON nativo
Ollama (local)
Fallback offline sin costo
PostgreSQL
Integridad transaccional, JSON nativo
Celery + Redis + RabbitMQ
Procesamiento asíncrono masivo
Google Cloud Storage
Escalabilidad para PDFs
PyMuPDF + pdfplumber
Layout + tablas + OCR (Tesseract)
pandas + openpyxl
Importación desde Excel
SendGrid
Notificaciones transaccionales
Sentry SDK
Monitoreo de errores en producción
Gunicorn + Nginx
Servidor WSGI + reverse proxy SSL
AdminLTE + Bootstrap 4
UI responsive reutilizable

  Pipeline de extracción híbrida

Python
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

  Estrategia de reintentos y manejo de errores

Python
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)

  Prompt engineering: respuesta JSON estructurada

Python
# 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": ""
    }
  ]
}

Imágenes del proyecto

¿Querés conocer más?

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.