Mejoras Implementadas en Extracción de PDFs con IA

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.
This commit is contained in:
2025-12-03 00:55:11 -03:00
parent 582114a55a
commit 50909e4499
4 changed files with 279 additions and 52 deletions

View File

@@ -0,0 +1,155 @@
# 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:
1. **Límites muy pequeños**: Solo extraía 2,000-4,000 caracteres
2. **Sin manejo de duplicaciones**: Páginas repetidas se procesaban múltiples veces
3. **No aprovechaba contextos largos**: Los modelos modernos soportan millones de tokens
4. **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
```python
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:
```python
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
```json
{
"attached_files": [
{
"filename": "manual.pdf",
"type": "application/pdf",
"pages": 20,
"pages_processed": 15,
"total_chars": 75000,
"truncated": true
}
]
}
```
## Próximas Mejoras Potenciales
1. **Chunking Inteligente**: Para PDFs muy grandes, dividir en chunks semánticos
2. **OCR Integrado**: Detectar PDFs escaneados y aplicar OCR automático
3. **Resumen Automático**: Para PDFs grandes, generar resumen antes de análisis
4. **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:
1. **PDF pequeño** (< 10 páginas): Debe procesarse completo
2. **PDF grande** (> 50 páginas): Debe truncarse y reportar info
3. **PDF con duplicados**: Debe eliminar páginas repetidas
4. **Múltiples PDFs**: Cada uno procesado independientemente
## Notas Técnicas
- La función `extract_pdf_text_smart()` está en `main.py` línea ~210
- Usa `pypdf.PdfReader` para extracción
- Maneja encoding UTF-8 automáticamente
- Thread-safe (usa BytesIO)