En este artículo, te mostraré cómo he creado una API para procesar automáticamente documentos PDF, Word (DOCX) y Excel utilizando inteligencia artificial a través de OpenAI. Esta solución te permitirá extraer y analizar texto de diversos formatos de documentos con la potencia de los modelos de lenguaje de OpenAI.
📄 ¿Qué hace nuestra API?
Esta API permite procesar archivos en diferentes formatos (PDF, DOCX, Excel) y utiliza la tecnología de OpenAI para analizar su contenido. Es ideal para:
- Extraer información relevante de documentos extensos
- Resumir automáticamente contenido de documentos
- Clasificar o categorizar documentos basados en su contenido
- Responder preguntas basadas en el contenido de los documentos
✨ Características principales
Nuestra API ofrece las siguientes funcionalidades:
- Soporte para múltiples formatos de archivos: Documentos PDF, Word (DOCX) y hojas de cálculo Excel (XLS/XLSX)
- Procesamiento inteligente con OpenAI: Utilizamos el modelo GPT-4 para analizar el contenido extraído
- API RESTful: Fácil de integrar en cualquier aplicación
- Implementado con FastAPI: Para un alto rendimiento y documentación automática
🛠️ Tecnologías utilizadas
Este proyecto utiliza las siguientes tecnologías y librerías:
- FastAPI: Framework moderno para crear APIs en Python
- OpenAI: Para el procesamiento y análisis de texto con IA
- PyPDF2: Para extraer texto de archivos PDF
- python-docx: Para leer documentos de Word
- pandas: Para procesar archivos Excel
- uvicorn: Servidor ASGI de alto rendimiento
💻 Código del proyecto
A continuación, veremos las partes más importantes del código de nuestra API:
import openai
import PyPDF2
import docx
import pandas as pd
from fastapi import FastAPI, File, UploadFile
from io import BytesIO
import uvicorn
# Configura tu clave API de OpenAI
openai.api_key = 'tu_clave_api' # Reemplaza 'tu_clave_api' por tu clave API de OpenAI
# Crea la aplicación FastAPI
app = FastAPI()
# Función para leer archivos PDF
def leer_pdf(file: BytesIO):
reader = PyPDF2.PdfReader(file)
texto = ""
for pagina in range(len(reader.pages)):
texto += reader.pages[pagina].extract_text()
return texto
# Función para leer archivos DOCX
def leer_docx(file: BytesIO):
doc = docx.Document(file)
texto = ""
for para in doc.paragraphs:
texto += para.text + "\n"
return texto
# Función para leer archivos Excel (solo el contenido de las celdas)
def leer_excel(file: BytesIO):
df = pd.read_excel(file)
texto = df.to_string(index=False)
return texto
# Función para procesar texto con OpenAI utilizando el endpoint de chat
def procesar_con_openai(texto):
# Llamada a la API de OpenAI para procesar el texto con un modelo de chat
response = openai.ChatCompletion.create(
model="gpt-4", # Usa el modelo adecuado, por ejemplo, "gpt-4"
messages=[
{"role": "system", "content": "Eres un asistente que ayuda a procesar documentos."},
{"role": "user", "content": texto}
],
max_tokens=1500 # Ajusta la cantidad de tokens según lo necesario
)
return response['choices'][0]['message']['content'].strip()
# Endpoint para recibir archivos y procesarlos
@app.post("/procesar_archivo/")
async def procesar_archivo(file: UploadFile = File(...)):
# Obtener el nombre del archivo y su extensión
extension = file.filename.split('.')[-1].lower()
# Leer el archivo según su tipo
contenido = await file.read()
archivo = BytesIO(contenido)
if extension == 'pdf':
texto = leer_pdf(archivo)
elif extension == 'docx':
texto = leer_docx(archivo)
elif extension in ['xls', 'xlsx']:
texto = leer_excel(archivo)
else:
return {"error": "Formato de archivo no soportado."}
# Enviar el texto a OpenAI para que lo procese
resultado = procesar_con_openai(texto)
return {"texto_procesado": resultado}
# Iniciar el servidor
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
🚀 Instalación y configuración
Para implementar este proyecto, sigue estos pasos:
1. Requisitos previos
Asegúrate de tener Python 3.8+ instalado en tu sistema. Luego, crea un archivo requirements.txt
con las siguientes dependencias:
fastapi==0.115.6
pandas==2.2.3
PyPDF2==3.0.1
uvicorn==0.34.0
openai==0.28
python-docx
python-multipart
2. Instalación de dependencias
Instala todas las dependencias necesarias con pip:
pip install -r requirements.txt
3. Configuración de OpenAI
Reemplaza 'tu_clave_api'
en el código con tu clave API real de OpenAI.
Por seguridad, es mejor usar variables de entorno para esto:
import os
from dotenv import load_dotenv
load_dotenv() # Carga variables desde .env
openai.api_key = os.getenv("OPENAI_API_KEY")
▶️ Cómo usar la API
Una vez configurado todo, puedes iniciar el servidor con:
uvicorn main:app --host localhost --port 8081 --reload
Ejemplo de uso con Python:
import requests
url = "http://localhost:8081/procesar_archivo/"
archivo = "documento_ejemplo.pdf" # Cambia esto al archivo que quieras procesar
with open(archivo, "rb") as f:
files = {"file": (archivo, f, "application/pdf")}
response = requests.post(url, files=files)
if response.status_code == 200:
resultado = response.json()
print("Texto procesado:", resultado["texto_procesado"])
else:
print(f"Error: {response.status_code}")
print(response.text)
🔍 Cómo funciona
El funcionamiento de nuestra API se puede resumir en cuatro pasos clave:
-
Recepción del archivo:
El usuario envía un archivo a través del endpoint
/procesar_archivo/
. -
Extracción de texto:
Dependiendo del formato del archivo, utilizamos diferentes bibliotecas para extraer el texto contenido:
- Para PDFs: Utilizamos PyPDF2 para extraer el texto de todas las páginas.
- Para DOCX: Utilizamos python-docx para extraer el texto de todos los párrafos.
- Para Excel: Convertimos las celdas en texto formateado usando pandas.
- Procesamiento con IA: El texto extraído se envía a OpenAI (GPT-4) para su procesamiento.
- Devolución del resultado: La API devuelve el texto procesado por la IA en formato JSON.
⚙️ Personalización
Este proyecto es altamente personalizable. Puedes adaptarlo a tus necesidades específicas:
def procesar_con_openai(texto):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "Eres un asistente especializado en resumir documentos legales. Extrae los puntos clave y resume el contenido en formato de lista."},
{"role": "user", "content": texto}
],
max_tokens=1500
)
return response['choices'][0]['message']['content'].strip()
Añadir soporte para más formatos
Puedes extender la API para soportar más formatos de archivo añadiendo nuevas funciones de lectura. Por ejemplo, para añadir soporte para archivos CSV:
def leer_csv(file: BytesIO):
df = pd.read_csv(file)
texto = df.to_string(index=False)
return texto
# Y luego en el endpoint:
elif extension == 'csv':
texto = leer_csv(archivo)
Implementar estrategias para documentos grandes
Para procesar documentos muy grandes que exceden los límites de tokens de OpenAI, puedes implementar una estrategia de fragmentación:
def procesar_documento_grande(texto, max_chunk_size=4000):
# Dividir el texto en fragmentos más pequeños
chunks = [texto[i:i+max_chunk_size] for i in range(0, len(texto), max_chunk_size)]
resultados = []
for chunk in chunks:
# Procesar cada fragmento individualmente
resultado_chunk = procesar_con_openai(chunk)
resultados.append(resultado_chunk)
# Combinar los resultados o realizar un procesamiento adicional si es necesario
resultado_final = "\n\n".join(resultados)
# Opcionalmente, hacer un resumen final de todos los fragmentos
if len(resultados) > 1:
resumen = procesar_con_openai("Resume los siguientes resultados:\n" + resultado_final)
return resumen
return resultado_final
🔒 Seguridad y buenas prácticas
Proteger la clave API
Como mencionamos anteriormente, nunca debes incluir directamente tu clave API en el código. Utiliza variables de entorno:
# Crear un archivo .env
OPENAI_API_KEY=tu_clave_api_real
# En tu código principal
import os
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
Manejar casos de error
Es importante implementar un manejo de errores adecuado para mejorar la robustez de tu API:
@app.post("/procesar_archivo/")
async def procesar_archivo(file: UploadFile = File(...)):
try:
# Verificar si se proporcionó un archivo
if not file:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="No se proporcionó ningún archivo"
)
# Verificar el tamaño del archivo (por ejemplo, límite de 10MB)
MAX_SIZE = 10 * 1024 * 1024 # 10MB
file_size = 0
contenido = BytesIO()
# Leer el archivo en chunks para controlar el tamaño
chunk = await file.read(1024)
while chunk:
file_size += len(chunk)
if file_size > MAX_SIZE:
raise HTTPException(
status_code=status.HTTP_413_REQUEST_ENTITY_TOO_LARGE,
detail=f"El tamaño del archivo excede el límite de {MAX_SIZE/1024/1024}MB"
)
contenido.write(chunk)
chunk = await file.read(1024)
contenido.seek(0)
# Verificar la extensión
extension = file.filename.split('.')[-1].lower()
if extension not in ['pdf', 'docx', 'xlsx', 'xls']:
raise HTTPException(
status_code=status.HTTP_415_UNSUPPORTED_MEDIA_TYPE,
detail=f"Formato de archivo no soportado: {extension}"
)
# Continuar con el procesamiento normal...
except Exception as e:
# Capturar cualquier otra excepción
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Error al procesar el archivo: {str(e)}"
)
🚢 Despliegue en producción
Para desplegar esta API en un entorno de producción, tienes varias opciones:
Despliegue con Docker
Puedes utilizar Docker para containerizar tu aplicación:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Para construir y ejecutar el contenedor:
docker build -t document-processor-api .
docker run -p 8000:8000 -e OPENAI_API_KEY=tu_clave_api document-processor-api
Despliegue en plataformas en la nube
Esta API se puede desplegar fácilmente en plataformas como:
- Heroku: Soporta aplicaciones Python y puede ser configurado con Procfile
- AWS Elastic Beanstalk: Soporta despliegue de contenedores Docker
- Google Cloud Run: Ideal para APIs con Docker que responden a solicitudes HTTP
- Azure App Service: Proporciona despliegue sencillo para aplicaciones Python
📝 Conclusión
Esta API de procesamiento de documentos con IA demuestra cómo podemos combinar diferentes tecnologías para crear una herramienta útil que automatice el análisis de documentos. Las posibilidades de aplicación son enormes: desde el análisis legal de contratos hasta el procesamiento de informes médicos o financieros.
El proyecto es altamente personalizable y puede adaptarse a una amplia variedad de casos de uso. Te animo a experimentar con diferentes modelos de OpenAI y personalizar las instrucciones del sistema para adaptarlas a tus necesidades específicas.
Si estás interesado en implementar esta solución o tienes preguntas sobre el proyecto, no dudes en contactarme a través de mi GitHub o LinkedIn.
"La automatización inteligente no reemplaza la inteligencia humana, sino que la potencia liberándola de tareas repetitivas para centrarse en lo verdaderamente creativo." — Jhordan Solis