He mejorado significativamente el sistema de extracción de texto de PDFs para el análisis con IA. Aquí están los cambios principales:
🎯 Problemas Resueltos
Límites muy pequeños → Aumentados significativamente según capacidad del modelo
No extraía todo el documento → Ahora procesa hasta 100k caracteres
Duplicación de contenido → Detecta y elimina páginas repetidas
Sin información de estado → Reporta páginas procesadas, truncado, etc.
4.6 KiB
4.6 KiB
Mejoras en la Extracción de PDFs con IA
Versión Backend: 1.0.95
Problema Original
El sistema tenía limitaciones al procesar PDFs con IA:
- Límites muy pequeños: Solo extraía 2,000-4,000 caracteres
- Sin manejo de duplicaciones: Páginas repetidas se procesaban múltiples veces
- No aprovechaba contextos largos: Los modelos modernos soportan millones de tokens
- Falta de información: No reportaba páginas procesadas o si el contenido fue truncado
Solución Implementada
1. Función Centralizada de Extracción
Nueva función extract_pdf_text_smart() que:
- ✅ Extrae texto de forma inteligente
- ✅ Detecta y evita páginas duplicadas
- ✅ Maneja límites configurables
- ✅ Reporta estadísticas completas (páginas, caracteres, truncado)
- ✅ Manejo robusto de errores
pdf_result = extract_pdf_text_smart(pdf_content, max_chars=50000)
# Retorna:
# {
# 'text': '...',
# 'pages': 10,
# 'pages_processed': 9, # Si una página estaba duplicada
# 'total_chars': 45000,
# 'truncated': False,
# 'success': True
# }
2. Límites Optimizados por Caso de Uso
| Endpoint | Límite Anterior | Límite Nuevo | Modelo Objetivo |
|---|---|---|---|
/api/analyze-image (OpenAI) |
4,000 chars | 30,000 chars | GPT-4 (128k tokens) |
/api/analyze-image (Gemini) |
4,000 chars | 100,000 chars | Gemini 1.5/2.0 (2M tokens) |
/api/ai/chat-assistant |
2,000 chars | 50,000 chars | Equilibrado para contexto |
3. Detección de Duplicaciones
El sistema ahora verifica si el contenido de una página ya existe antes de agregarlo:
if page_text.strip() not in full_text:
full_text += f"\n--- Página {page_num}/{total_pages} ---\n{page_text.strip()}\n"
Esto previene:
- PDFs con páginas idénticas repetidas
- Documentos mal generados con contenido duplicado
- Uso innecesario de tokens en el análisis IA
4. Información Mejorada
El sistema ahora reporta:
- Páginas totales: Total de páginas en el PDF
- Páginas procesadas: Páginas únicas con contenido
- Caracteres totales: Tamaño real del texto extraído
- Indicador de truncado: Si el PDF fue limitado
Ejemplo de output:
📄 PDF procesado: manual-vehiculo.pdf - 87450 caracteres, 8/10 páginas (TRUNCADO)
Capacidades de Contexto por Modelo
OpenAI GPT-4
- Contexto: ~128,000 tokens (~500,000 caracteres)
- Límite aplicado: 30,000 caracteres
- Razón: Balance entre contexto útil y costo
Gemini 1.5/2.0 Pro
- Contexto: 2,000,000 tokens (~8,000,000 caracteres)
- Límite aplicado: 100,000 caracteres
- Razón: Aprovechar contexto masivo sin sobrecargar
Chat Assistant
- Límite: 50,000 caracteres
- Razón: Incluye historial + contexto de fotos + PDF
Casos de Uso Soportados
✅ PDFs Pequeños (1-5 páginas)
Extracción completa sin truncado
✅ PDFs Medianos (5-20 páginas)
Extracción completa o parcial según contenido
✅ PDFs Grandes (20+ páginas)
Extracción inteligente con truncado después de límite
✅ PDFs con Páginas Duplicadas
Detección automática y eliminación
✅ Múltiples PDFs en Chat
Cada uno procesado independientemente con su límite
Indicadores de Estado
En Logs del Servidor
📄 PDF procesado: documento.pdf - 25000 caracteres, 10/10 páginas
📄 PDF procesado: manual.pdf - 50000 caracteres, 15/20 páginas (TRUNCADO)
En Respuesta al Cliente
{
"attached_files": [
{
"filename": "manual.pdf",
"type": "application/pdf",
"pages": 20,
"pages_processed": 15,
"total_chars": 75000,
"truncated": true
}
]
}
Próximas Mejoras Potenciales
- Chunking Inteligente: Para PDFs muy grandes, dividir en chunks semánticos
- OCR Integrado: Detectar PDFs escaneados y aplicar OCR automático
- Resumen Automático: Para PDFs grandes, generar resumen antes de análisis
- Cache de Extracciones: Guardar texto extraído en DB para reutilización
Migración
No requiere migración de base de datos. Los cambios son retrocompatibles.
Testing
Para probar las mejoras:
- PDF pequeño (< 10 páginas): Debe procesarse completo
- PDF grande (> 50 páginas): Debe truncarse y reportar info
- PDF con duplicados: Debe eliminar páginas repetidas
- Múltiples PDFs: Cada uno procesado independientemente
Notas Técnicas
- La función
extract_pdf_text_smart()está enmain.pylínea ~210 - Usa
pypdf.PdfReaderpara extracción - Maneja encoding UTF-8 automáticamente
- Thread-safe (usa BytesIO)