✅ 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:
155
docs/pdf-extraction-improvements.md
Normal file
155
docs/pdf-extraction-improvements.md
Normal 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)
|
||||
Reference in New Issue
Block a user