Situación: Trabajas en el equipo de operaciones de una empresa mediana. Todos los días, su equipo procesa formularios de pedido de diferentes clientes B2B. Todos ellos llegan en formato PDF. Y, en teoría, todos contienen la misma información: identificación del cliente, número de orden de compra, fecha de entrega y artículos solicitados.
Sin embargo, en la práctica, cada documento tiene un aspecto ligeramente diferente: un cliente coloca el número de pedido en la esquina superior izquierda y el siguiente en la esquina inferior derecha. Algunos escriben "Número de pedido", otros usan "ID de pedido", "Referencia de pedido" o algo completamente diferente.
Para nosotros, los humanos, esto no suele ser un problema. Miramos el documento, entendemos el contexto e inmediatamente reconocemos a qué información se refiere.
Sin embargo, para los sistemas de automatización tradicionales, esto resulta difícil: una regla de expresiones regulares puede buscar específicamente "Número de pedido:". Pero, ¿qué sucede si el próximo cliente utiliza "Referencia de pedido:" en su lugar?
Ese es exactamente el problema que recreé para este artículo.
Comparamos dos enfoques diferentes para extraer datos estructurados de formularios de pedido B2B:
Un enfoque tradicional basado en reglas que utiliza pytesseract y reglas regex. Un enfoque basado en LLM que utiliza pytesseract, Ollama y LLaMA 3.
El objetivo de este artículo no es mostrar que los LLM sean generalmente mejores. No siempre lo son.
Una pregunta mucho más interesante es: ¿en qué momento los canales de extracción tradicionales comienzan a alcanzar sus límites a medida que aumenta la complejidad y el número de diseños diferentes? ¿Y cuándo puede un LLM realmente reducir el esfuerzo de mantenimiento?
Tabla de contenido
1 – Guía paso a paso
2 – Comparación directa
3 – ¿Cuándo NO deberíamos utilizar un LLM?
4 – Pensamientos finales
¿Dónde seguir aprendiendo?
1 – Guía paso a paso
Reconstruimos ambos enfoques paso a paso. Primero, creamos dos archivos PDF de muestra que contienen la misma información comercial pero con diseños diferentes. Luego, extraemos los datos una vez con un canal tradicional de OCR y expresiones regulares y una vez con un canal de OCR y LLM. Esto nos permite comparar ambos enfoques en condiciones idénticas.
El enfoque tradicional básicamente pregunta:
"¿Puedo encontrar el patrón exacto que programé?" En cambio, el enfoque basado en LLM pregunta:
"¿Puedo entender el significado de este campo en contexto?"
→ 🤓 Encuentra el código completo en GitHub Repo 🤓 ←
Antes de comenzar – Puesta en marcha
pip contra anaconda
En esta guía utilizamos pip, el administrador de paquetes estándar de Python. Esto significa que instalamos todas las bibliotecas directamente a través de la línea de comando usando pip install…. pip ya se incluye automáticamente cuando instala Python. Si conoce los tutoriales de Python que funcionan con Anaconda, esa es simplemente otra forma de lograr el mismo objetivo (usando conda install…). En el artículo "Ecosistema de análisis de datos de Python: una hoja de ruta para principiantes", puede encontrar más detalles sobre cómo comenzar a utilizar Python. Además, en un dispositivo Microsoft utilizamos el terminal CMD (tecla Windows + R > clic en cmd).
Crear y activar un nuevo entorno virtual
Cree un nuevo entorno de Python con python –m venv b2bdocumentextractor (puede cambiar el nombre) en una terminal y actívelo con b2bdocumentextractorScriptsactivate.
Opcional: verifique Python y pip
python –versión pip –versión
Deberías ver una versión de Python y pip.
Paso 1: instalar Tesseract
Tesseract es el motor de OCR. Es la herramienta que realmente lee texto de imágenes o archivos PDF escaneados mediante OCR (reconocimiento óptico de caracteres). pytesseract es solo el puente de Python hacia Tesseract. Esto significa: nuestro código Python puede comunicarse con Tesseract a través de pytesseract, pero el reconocimiento de texto real lo realiza el propio Tesseract. Sin instalar Tesseract primero, pytesseract no puede funcionar.
Primero, descargamos el último archivo .exe para w64 y ejecutamos el instalador:
GitHub – Tesseract en la UB Mannheim
Importante: Recuerde la ruta de instalación:
C:Archivos de programaTesseract-OCR
Dentro de la terminal CMD verificamos la instalación usando el siguiente comando:
"C:Archivos de programaTesseract-OCRtesseract.exe" –versión
Si todo funcionó correctamente, deberíamos ver la versión de Tesseract correspondiente.
Paso 2 – Instalar Poppler
A continuación, instalamos pdf2image. Esta es nuestra biblioteca para convertir archivos PDF en imágenes y requiere Poppler en segundo plano. Poppler es una biblioteca de renderizado de PDF de código abierto que se utiliza para mostrar archivos PDF.
Para ello descargamos la última versión de Poppler, extraemos el archivo ZIP y movemos la carpeta extraída a la unidad C:.
Lanzamientos de Windows de GitHub-Poppler
Dentro de la carpeta, haga clic en Biblioteca > bin y guarde la ruta donde almacenó la carpeta en su unidad C:. En mi máquina, se ve así:
C:Usuariosschuepoppler-26.02.0Bibliotecabin
Además, agregamos la ruta a la variable PATH para que Windows sepa dónde se encuentra Poppler.
Consejo para novatos:
Presione la tecla de Windows y busque Editar variables de entorno. Luego haga clic en Editar las variables de entorno del sistema. Luego haga clic en Variables de entorno. En Variables de usuario, seleccione la variable RUTA, haga clic en Editar, luego en Nuevo y pegue la ruta.
Ahora reinicie CMD para que se apliquen los cambios.
Paso 3: instalar las bibliotecas de Python
Ahora instalamos todas las bibliotecas de Python que necesitamos. Asegúrese de reactivar el entorno Python de antemano:
pytesseract: Instalamos esta biblioteca como puente entre Python y Tesseract. Ya instalamos Tesseract como motor de OCR, pero solo con pytesseract Python puede comunicarse con él directamente. pdf2image: pytesseract es un motor OCR, lo que significa que reconoce texto a partir de píxeles en una imagen. No puede leer estructuras PDF directamente. Por lo tanto, pdf2image realiza un paso intermedio: representa cada página PDF como una imagen, similar a una captura de pantalla, para que pytesseract pueda analizarla después. Nota: Si tuviéramos archivos PDF digitales (es decir, archivos PDF donde puede seleccionar y copiar texto), podríamos extraer el texto directamente usando bibliotecas como pdfplumber o PyMuPDF. Sin embargo, dado que asumimos que los formularios de pedido B2B suelen ser escaneados en la práctica, nos desviamos hacia pdf2image. almohada: pdf2image y pytesseract usan esta biblioteca de procesamiento de imágenes en segundo plano (no vemos directamente el uso en el código) para procesar imágenes correctamente.
fpdf2: utilizamos esta biblioteca para generar automáticamente dos archivos PDF de prueba (Diseño A y Diseño B) mediante un script para el ejemplo del artículo.
ollama: esta biblioteca permite que nuestro script Python envíe mensajes al LLM y reciba respuestas.
Paso 4: instale Ollama y descargue LLaMA 3
Una vez que la instalación de las bibliotecas funcionó exitosamente, instalamos Ollama y LLaMA 3 como LLM. Ollama es la herramienta que nos permite ejecutar LLMs de forma totalmente gratuita, de forma local en nuestro portátil y sin claves API.
Primero, instalamos Ollama. Si aún no lo has hecho, puedes descargar el instalador de Windows desde Ollama y ejecutarlo.
Luego descargamos LLaMA 3 usando el siguiente comando:
ollama tira llama3
Dependiendo de tu conexión a Internet, este paso puede tardar algún tiempo ya que se descargan aproximadamente 4,7 GB. Sin embargo, podemos ver una barra de progreso en la terminal.
Luego verificamos si todo funcionó:
lista de ollama
Si ve algo similar a la captura de pantalla, funcionó correctamente.
Paso 5: cree la carpeta del proyecto y genere archivos PDF de prueba
Para esta comparación, creamos dos formularios de pedido B2B para Alpha GmbH y Beta AG que contienen la misma información pero utilizan diseños diferentes. En este ejemplo, asumimos que los formularios de pedido son escaneados, por lo que previamente instalamos pdf2image (para archivos PDF digitales, esto también sería posible con bibliotecas como pdfplumber o PyMuPDF).
Primero, creamos una carpeta de proyecto para almacenar todos los archivos allí:
mkdir document_extractor cd document_extractor
A continuación, creamos un nuevo archivo llamado create_test_pdfs.py e insertamos el siguiente código que puedes encontrar en este GitHub-Gist. Guardamos este archivo dentro de la carpeta document_extractor creada previamente:
https://gist.github.com/Sari95/a52a62eb78e0604c4d8c64f5cdd1160a
Ahora volvemos a la terminal y ejecutamos el archivo:
Python create_test_pdfs.py
Dentro de la carpeta, ahora podemos ver los dos PDF recién creados:
En los dos PDF ya podemos ver el problema:
Contienen la misma información. Pero los PDF usan nombres de campos completamente diferentes y un formato de fecha diferente.
Enfoque 1: la forma tradicional (pytesseract + reglas Regex)
El enfoque tradicional funciona en dos pasos:
Primero, convertimos el PDF en una imagen. Luego, usamos pytesseract para leer la imagen y extraer el texto sin formato mediante OCR (reconocimiento óptico de caracteres). En pocas palabras, OCR significa que la herramienta "mira" la imagen e intenta reconocer letras a partir de píxeles. Bastante similar a cómo los humanos descifran las notas escritas a mano. En el segundo paso, usamos expresiones regulares. Son expresiones regulares que buscan patrones específicos dentro del texto. Por ejemplo, podemos definir: “Buscar todo lo que viene después del Número de orden de compra:”.
Ya en este segundo paso podemos identificar el primer problema: ¿Qué pasa si el cliente simplemente escribe “Referencia de pedido” en lugar de “Número de pedido:”?
En ese caso, el patrón de expresiones regulares no encuentra nada. Lo que entonces podemos hacer (o debemos hacer) es agregar una nueva regla.
Ejecute el script 1 para el método 1
A continuación, creamos un nuevo archivo llamado approach1_traditional.py con el siguiente código que puedes encontrar en GitHub-Gist dentro de la misma carpeta:
https://gist.github.com/Sari95/aa2be6938fbcb1c7f94b053d9046f55d
Ahora ejecutamos el archivo nuevamente dentro de la terminal:
enfoque de Python1_traditional.py
El resultado del enfoque 1
Para el Diseño A, todo funciona perfectamente:
¿Para el diseño B? No se reconoce ni un solo campo y todos los valores devuelven "Ninguno":
Y aquí es exactamente donde radica el problema. Para cada nuevo cliente, sería necesario escribir, probar e implementar nuevas reglas de expresiones regulares. Con 200 clientes, eso significa 200 patrones diferentes. Y cada vez que un cliente cambia ligeramente su forma, el sistema vuelve a fallar.
Enfoque 2: Un Nuevo Camino (pytesseract + Ollama + LLaMA 3)
En este segundo enfoque, mantenemos el paso OCR, pero reemplazamos las rígidas reglas de expresiones regulares con un LLM:
pytesseract todavía lee el texto del PDF. En lugar de decirle el código "Buscar número de orden de compra: ", le decimos al LLM: "Aquí hay un documento de pedido. Extraiga estos campos por mí, independientemente de cómo se nombren".
El LLM comprende el contexto semántico. Reconoce que "Referencia de pedido" y "Número de pedido" significan lo mismo, incluso sin una regla explícita.
Ejecute el script 2 para el método 2
Ahora, creamos un nuevo archivo llamado approach2_llm.py con el siguiente código que puedes encontrar en GitHub-Gist dentro de la misma carpeta:
https://gist.github.com/Sari95/d4e9e83490a9fbf34a3776d1604f8742
Ahora ejecutamos el archivo nuevamente dentro de la terminal. Asegúrese de que Ollama todavía se esté ejecutando en segundo plano:
enfoque de Python2_llm.py
El resultado del enfoque 2
Lo que ahora podemos ver es que ambos diseños se reconocen correctamente:
Para ambos diseños, la información de los campos con nombres diferentes se extrae y asigna correctamente, aunque no se ajustó ni una sola expresión regular ni se creó ninguna plantilla nueva. El LLM comprende ambos diseños porque lee el contexto. Además, el formato de fecha del Diseño B se normaliza directamente para que coincida con el formato del Diseño A.
2 – Comparación directa
Después de ambas pruebas, una cosa queda clara rápidamente: técnicamente, ambos enfoques resuelven el mismo problema.
Ambos enfoques tienen sus propias ventajas y desventajas:
Con las canalizaciones basadas en expresiones regulares, la complejidad reside en las reglas y el esfuerzo de mantenimiento. Con los procesos basados en LLM, la complejidad se desplaza hacia la infraestructura, el tiempo de inferencia y el comportamiento del modelo. Para las empresas medianas que procesan muchos diseños específicos de clientes, esa compensación puede volverse estratégicamente más importante que la pura precisión de la extracción.
3 – ¿Cuándo NO deberíamos utilizar un LLM?
En este momento, a menudo parece que todos los procesos de automatización existentes de repente necesitan ser reemplazados por IA o LLM.
Sin embargo, en la práctica esta no siempre es la mejor solución. Especialmente las medianas empresas no suelen necesitar construir la solución "más moderna", sino aquella que siga siendo estable, mantenible y económicamente razonable a largo plazo. Dependiendo de la situación, ese puede ser el enfoque tradicional basado en expresiones regulares, mientras que en otros casos cambiar a un LLM puede tener más sentido.
Algunas situaciones en las que el enfoque tradicional puede seguir siendo la opción más adecuada:
Los documentos son estables y estandarizados:
Si una empresa sólo procesa unos pocos diseños conocidos y estos rara vez cambian, las expresiones regulares suelen ser la mejor solución.
¿Por qué?
Porque el beneficio adicional de un LLM se vuelve pequeño, mientras que la complejidad general del sistema aumenta.
Un proceso estable basado en reglas, por otro lado, es más rápido, más barato, más fácil de depurar y más fácil de entregar a nuevas personas.
La velocidad y el rendimiento son fundamentales:
En nuestro ejemplo, el LLM procesa un documento en 20 a 40 segundos.
Al principio, eso suena aceptable. Pero una vez que nos imaginamos dentro de un entorno de producción real, la perspectiva cambia rápidamente.
Una mediana empresa probablemente procesa pedidos, albaranes, facturas, documentos aduaneros, justificantes, etc. Y no 10 veces al día, sino 10.000 veces al día.
En esta situación, el tiempo de inferencia se convierte de repente en un verdadero problema de infraestructura. Los sistemas basados en expresiones regulares se ejecutan significativamente más rápido, mientras que los LLM requieren más RAM, más potencia de CPU/GPU y, a menudo, mecanismos adicionales de procesamiento por lotes o colas.
La explicabilidad es más importante que la flexibilidad:
Especialmente en sectores regulados como el farmacéutico, el de seguros, el bancario o el sanitario, a menudo es necesario comprender plenamente por qué se extrajo un valor específico.
Las reglas de expresiones regulares son claramente deterministas: una línea de código produce un resultado claramente explicable. Los LLM, por otro lado, funcionan de forma probabilística: el modelo interpreta el contexto y devuelve el resultado más probable. Esto es exactamente lo que hace que los LLM sean flexibles, pero al mismo tiempo también más difíciles de auditar.
La empresa no cuenta con la infraestructura adecuada:
En nuestro ejemplo, utilizamos Ollama. En general, empezar fue sencillo. Sin embargo, no se debe subestimar que el consumo de memoria, los recursos de GPU, el monitoreo o los tiempos de respuesta bajo carga pueden verse muy diferentes cuando se trabaja con LLM.
En mi Substack Data Science Espresso, comparto guías prácticas y actualizaciones breves del mundo de la ciencia de datos, Python, la inteligencia artificial, el aprendizaje automático y la tecnología, diseñadas para mentes curiosas como la suya.
Eche un vistazo y suscríbase en Medium o en Substack si desea mantenerse informado.
4 – Pensamientos finales
Elegir el enfoque correcto no es necesariamente una cuestión técnica, sino estratégica.
El enfoque tradicional intenta describir explícitamente todos los documentos posibles. En cambio, el enfoque basado en LLM intenta comprender el significado y el contexto. Para entornos pequeños y estables, el enfoque tradicional suele ser completamente suficiente. Cuantos más diseños y casos extremos aparecen, más difícil resulta mantener las reglas sostenibles a largo plazo. Ahí es exactamente donde los LLM empiezan a volverse interesantes.
También puede ser un caso de uso de nivel inicial interesante para una empresa comenzar a trabajar con un LLM aquí y, al hacerlo, preparar la empresa para la IA y obtener experiencia práctica inicial.