Los documentos PDF, como soporte importante para el almacenamiento de información empresarial y personal, siempre han sido un reto importante en el campo del procesamiento de datos. Con la introducción del modelo Gemini 2.0 por parte de Google DeepMind, este campo está experimentando un cambio sin precedentes. En este artículo, vamos a explorar Gemini 2.0 cómo cambiar completamente el modelo de procesamiento de PDF, y a través de los ejemplos de código reales para mostrar cómo utilizar esta tecnología para hacer frente a diversos tipos de documentos PDF.
Desafíos tradicionales del procesamiento de PDF
Durante mucho tiempo, la conversión de documentos PDF en datos estructurados legibles por máquina ha sido el campo de la IA y el procesamiento de datos del "gran problema". Las soluciones tradicionales pueden dividirse a grandes rasgos en tres categorías:
- modelo integral de código abierto: A menudo se sienten abrumados por la complejidad de la maquetación y tienen dificultades para identificar con precisión tablas, gráficos y tipografía especial.
- Programa combinado multimodelopor ejemplo, el nv-ingest de NVIDIA requiere 8 servicios y múltiples GPUs para ser desplegado en Kubernetes, lo que no solo es complejo de desplegar sino también caro de programar.
- Pago por servicioEl sistema de gestión de la calidad: Aunque ofrece cierta comodidad, la precisión es incoherente cuando se trata de trazados complejos y los costes crecen exponencialmente cuando se aplican a gran escala.
Estas soluciones tienen dificultades para encontrar un equilibrio entre precisión, escalabilidad y rentabilidad, sobre todo cuando hay que procesar cientos de millones de páginas de documentos, y el coste suele ser prohibitivo.

Configuración del entorno e instalación de Gemini 2.0
Para empezar a utilizar Gemini 2.0 para procesar documentos PDF, primero debe configurar el entorno y crear un cliente de inferencia. Estos son los pasos específicos:
Instalar las bibliotecas necesarias
%pip install "google-genai>=1"
Creación de clientes y configuraciones de modelos
from google import genai
# Crear cliente
api_key = "YOUR_API_KEY" # Sustitúyela por tu clave API.
client = genai.Client(api_key=api_key)
# Define el modelo a utilizar
model_id = "gemini-2.0-flash" # Utilice también "gemini-2.0-flash-lite-preview-02-05" o "gemini-2.0-pro-exp-02-05".
Cargar y procesar archivos PDF
# Subir archivo PDF
invoice_pdf = client.files.upload(file="factura.pdf", config={'nombre_visualizacion': 'factura'})
# Ver en cuántos tokens se convierte el archivo
tamaño_archivo = client.models.count_tokens(model=model_id, contents=factura_pdf)
print(f'Fichero: {invoice_pdf.display_name} equivale a {file_size.total_tokens} tokens')
# Salida de ejemplo: Archivo: factura igual a 821 tokens
Con los pasos anteriores, hemos completado la configuración del entorno base y cargado con éxito el primer archivo PDF para su procesamiento. Cabe destacar que la API de archivos de Gemini permite almacenar hasta 20 GB de archivos por proyecto, con un máximo de 2 GB por archivo, y los archivos cargados se guardan durante 48 horas.
Práctica de extracción de datos estructurados en PDF
Gemini 2.0 una potente función es la capacidad de extraer datos estructurados de archivos PDF. A continuación mostraremos cómo utilizar el modelo Pydantic con Gemini para lograr esta función mediante ejemplos prácticos.
Definir métodos genéricos de extracción de datos
En primer lugar, definimos un método genérico para procesar archivos PDF y devolver datos estructurados:
def extraer_datos_estructurados(ruta_archivo: str, modelo: BaseModel).
# Carga de un archivo en la API de archivos
file = client.files.upload(file=ruta_archivo, config={'display_name': file_path.split('/')[-1].split('.') [0]})
# Generación de una respuesta estructurada mediante la API Gemini
prompt = f "Extraer los datos estructurados del siguiente archivo PDF"
response = client.models.generate_content(model=model_id,
contents=[prompt, file], config={'response_mime_content')
'response_schema': model})
# transforma la respuesta en un modelo Pydantic y lo devuelve
return respuesta.analizada
Caso 1: Extracción de datos de facturas
Para la clase de factura PDF, podemos definir el siguiente modelo para extraer la información clave:
from pydantic import ModeloBase, Campo
clase Artículo(BaseModel).
descripción: str = Field(descripción="La descripción del artículo")
cantidad: float = Field(description="La cantidad del artículo")
valor_bruto: float = Field(description="Valor bruto del artículo")
clase Factura(BaseModel).
"""Extraer el número de factura, la fecha y todos los elementos de la lista con la descripción, la cantidad y el valor bruto y el valor bruto total.""""
número_factura: str = Field(description="El número de factura, por ejemplo 1234567890")
date: str = Field(description="Fecha de la factura, por ejemplo 2024-01-01")
items: list[Item] = Field(description="La lista de artículos con descripción, cantidad y valor bruto")
valor_bruto_total: float = Field(description="Valor bruto total de la factura")
# Extrae los datos utilizando este modelo
result = extraer_datos_estructurados("factura.pdf", Factura)
# Salida de resultados
print(f "Factura extraída: {result.invoice_number} en {result.date} con valor bruto total {result.total_gross_worth}")
para artículo en resultado.artículos: print(f "Artículo: {artículo_valor_bruto}")
print(f "Artículo: {artículo.descripción} con cantidad {artículo.cantidad} y valor bruto {artículo.valor_bruto}")

Caso 2: Tratamiento de formularios con contenido manuscrito
Para los formularios con contenido manuscrito, también podemos definir modelos especializados:
clase Formulario(BaseModel).
"""Extraer el número de formulario, la fecha de inicio fiscal, la fecha de finalización fiscal y las obligaciones del plan de principio de año y de final de año.""""
form_number: str = Field(description="El número de formulario")
fecha_inicio: str = Field(description="Fecha de entrada en vigor")
beginning_of_year: float = Field(description="El pasivo del plan a principios de año")
end_of_year: float = Field(description="El pasivo del plan al final del año")
# Extraer datos
result = extraer_datos_estructurados("escritura_form.pdf", Formulario)
# salida resultados
print(f'Número de formulario extraído: {result.número_formulario} con fecha de inicio {result.fecha_inicio}. \nPlan pasivo inicio del año {result.inicio_del_año} y fin del año {result.fin_del_año}')
# Ejemplo de salida: Número de formulario extraído: CA530082 con fecha de inicio 02/05/2022.
# Pasivo del plan principio del año 40000,0 y final del año 55000,0
A través del ejemplo anterior, podemos ver que Gemini 2.0 puede identificar con precisión el contenido de texto del PDF, incluso el texto manuscrito, y convertirlo a un formato de datos JSON estructurado, lo que simplifica enormemente el proceso de extracción de datos.
Aplicaciones avanzadas: fragmentación de documentos y comprensión semántica
En los sistemas RAG (Retrieval Augmented Generation), la fragmentación de documentos es un paso clave además de la extracción básica de texto, y Gemini 2.0 nos permite realizar tanto el OCR como la fragmentación semántica en un solo paso.
Ejemplo de fragmentación semántica de PDF
Aquí tienes un consejo para convertir PDF a Markdown y hacer semantic chunking al mismo tiempo:
CHUNKING_PROMPT = """OCR la siguiente página en Markdown. Las tablas deben tener formato HTML.
No rodee su salida con triple backticks.
Divida el documento en secciones de aproximadamente 250 - 1000 palabras. Nuestro objetivo es
Nuestro objetivo es identificar partes de la página con el mismo tema semántico.
Estos trozos se incrustarán y se utilizarán en una canalización RAG.
Rodee los trozos con etiquetas html.""""
# utiliza esta instrucción para el procesamiento
response = cliente.modelos.generar_contenido(
model=id_modelo,
contents=[CHUNKING_PROMPT, pdf_file]
)
chunked_content = response.text
Este enfoque identifica los límites semánticos de un documento y genera trozos de texto más significativos, lo que mejora enormemente la precisión de la recuperación posterior. En comparación con la fragmentación mecánica tradicional basada en el número de caracteres, la fragmentación semántica es más capaz de mantener la coherencia y la integridad del contenido.
Extracción de datos complejos con Pydantic
Para escenarios más complejos, podemos definir modelos Pydantic anidados para manejar múltiples niveles de datos:
class Person(BaseModel): first_name: str = Field(description="El nombre de la persona")
first_name: str = Field(description="El nombre de la persona")
last_name: str = Field(description="El apellido de la persona")
last_name: str = Field(description="El apellido de la persona") last_name: str = Field(description="El apellido de la persona")
work_topics: list[Topic] = Field(description="Los campos de interés de la persona, si no se proporcionan devuelva una lista vacía")
# Generar una respuesta utilizando el modelo Persona
prompt = "Philipp Schmid es un Ingeniero Senior de Relaciones con Desarrolladores de IA en Google DeepMind trabajando en Gemini, Gemma con la misión de ayudar a cada desarrollador a construir y beneficiarse de la IA de manera responsable".
response = client.models.generate_content(
model=id_modelo,
contents=prompt,
config={'response_mime_type': 'application/json', 'response_schema': Person}
)
El SDK # convierte automáticamente la respuesta en un modelo Pydantic
philipp: Persona = respuesta.analizada
print(f "El nombre es {philipp.first_name}")
Optimización del rendimiento y buenas prácticas
Estas son algunas de las mejores prácticas para mejorar la eficacia y la precisión al procesar documentos PDF a gran escala:
Procesamiento por lotes y optimización de fichas
Si tiene que tratar un gran número de escenas PDF, puede realizar el procesamiento por lotes para mejorar la eficacia:
async def batch_process_pdfs(file_paths, model, batch_size=10):: results = [].
resultados = []
for i in range(0, len(rutas_archivo), tamaño_lote):: batch = rutas_archivo[i:i+tamaño_lote): batch = rutas_archivo[i:i
batch = rutas_archivo[i:i+tamaño_lote]: results = [] for i in range(0, len(rutas_archivo), tamaño_lote).
tasks = [extraer_datos_estructurados(ruta, modelo) para ruta en lote].
resultados_lote = await asyncio.gather(*tareas)
results.extend(resultados_lote)
print(f "Lote procesado {i//tamaño_lote + 1}/{(len(rutas_archivo)+tamaño_lote-1)//tamaño_lote}")
devolver resultados
Selección de modelos y control de costes
Seleccionar la variante de modelo adecuada a las necesidades reales puede reducir considerablemente los costes:
- Gemini 2.0 FlashLa mejor opción para situaciones de uso general, con una excelente relación calidad-precio.
- Gemini 2.0 Flash-Lite:: Ofrece una mejor relación calidad-precio para documentos sencillos
- Géminis 2.0 Pro: Maneje documentos extremadamente complejos o escenas que requieran gran precisión
A continuación se compara la eficacia de procesamiento de los distintos modelos:
modelización | Páginas PDF procesadas por dólar (conversión Markdown) |
---|---|
Gemini 2.0 Flash | Aprox. 6.000 páginas |
Gemini 2.0 Flash Lite | Aprox. 12.000 páginas |
Géminis 1.5 Flash | Aprox. 10.000 páginas |
OpenAI 4-mini | Aprox. 450 páginas |
OpenAI 4o | Alrededor de 200 páginas |
Claude antrópico-3,5 | Aprox. 100 páginas |
Tratamiento de errores y mecanismo de reintento
En un entorno de producción, es fundamental implantar mecanismos sólidos de gestión de errores:
def extraer_con_reintentos(ruta_archivo, modelo, max_reintentos=3):: for intento en rango(max_reintentos)
para intento en rango(max_reintentos).
intentar.
return extraer_datos_estructurados(ruta_archivo, modelo): for intento en rango(entradas_máx): try.
except Exception as e: if attempt == max_retries
if attempt == max_retries - 1: print(f "Error al acceder al archivo.
print(f "No se ha podido procesar {ruta_archivo} tras {máx_intentos} intentos: {e}")
return Ninguno
print(f "Intento {intento+1} fallido, reintento: {e}")
time.sleep(2 **intento) # estrategia de reintento exponencial

Optimización del tratamiento de formularios
Para los PDF que contienen formularios complejos, se pueden utilizar las siguientes palabras clave para mejorar la precisión del reconocimiento de formularios:
TABLE_EXTRACTION_PROMPT = """Extraiga todas las tablas del PDF como tablas HTML.
Conserve la estructura exacta, incluidas las celdas combinadas, los encabezados y el formato.
Cada tabla debe ser semánticamente completa y mantener las relaciones entre celdas.
Para los valores numéricos, mantenga su formato exacto como se muestra en el documento.""""
observaciones finales
A través de los métodos y el código de ejemplo presentados en este artículo, ya puede empezar a utilizar Gemini 2.0 para construir un potente sistema de procesamiento de documentos PDF. Desde la simple extracción de texto hasta el complejo análisis sintáctico de datos estructurados, pasando por el chunking semántico, Gemini 2.0 ha demostrado un rendimiento excelente y muy rentable.
Aunque todavía hay margen de mejora en áreas como el reconocimiento de recuadros delimitadores, pero a medida que la tecnología sigue evolucionando, tenemos motivos para creer que el futuro del procesamiento de PDF será más inteligente y eficaz. Para cualquier necesidad de procesamiento a gran escala de datos de documentos para particulares u organizaciones, Gemini 2.0 es sin duda un producto digno de atención y de adopción de los avances tecnológicos.