Cómo hacer que las imágenes de un PDF se puedan buscar en RAG, sin pagar para leerlas todas

compañero de Enterprise Document Intelligence, la serie que construye un sistema RAG empresarial a partir de cuatro ladrillos. Extiende el Artículo 5 (análisis de documentos) en una tabla: image_df, que ubica cada imagen en el PDF sin leer ninguna de ellas. Esta parte construye la caja de herramientas de lectura: una cascada ordenada por costos (un filtro barato, una verificación de tipo, OCR clásico, un modelo de visión) que convierte las pocas imágenes por las que vale la pena pagar en texto con capacidad de búsqueda.

donde se encuentra este compañero: extiende el Artículo 5 (análisis de documentos), dentro de la Parte II (los cuatro ladrillos), leyendo las imágenes que el analizador solo localizó – Imagen del autor

El bloque de análisis le proporciona image_df: una fila por imagen en el PDF, con su página, su cuadro delimitador, su tamaño y un hash de contenido. Eso ubica cada imagen. No dice lo que muestra cualquiera de ellos. Para la recuperación, eso es lo mismo que no tenerlos: un cuadro delimitador no es algo que un usuario pueda buscar, y el espacio de texto de la imagen, el lugar donde viviría una descripción, está vacío.

El reflejo es lanzar un modelo de visión a cada imagen y listo. Ésa es la opción predeterminada equivocada. Un documento real está lleno de imágenes que no contienen nada que un lector buscaría jamás: el logotipo de la empresa en cada encabezado de página, una regla horizontal dibujada como una imagen de 2 píxeles de alto, un glifo de viñeta, un banner decorativo. Subtitular a aquellos con una visión LLM es pagarle a un modelo para que describa un logotipo trescientas veces.

Entonces el trabajo se divide en dos. Primero, los métodos que convierten una imagen en texto y lo que cuesta cada uno: un filtro barato, una verificación de tipo, OCR clásico, un modelo de visión. En segundo lugar, en qué imágenes realmente vale la pena gastar en una tirada determinada. Esa segunda mitad está impulsada por el contexto. Una línea del cuerpo que dice "La Figura 3 a continuación muestra…" es la señal para leer esa figura con un modelo de visión, y no con sus vecinos; la pregunta que se hace lo limita aún más. Este artículo establece los métodos y muestra lo que devuelve cada uno, ordenados por costo. Elegir qué imágenes pagar, por documento y por consulta, es un análisis adaptativo y tiene su propio artículo (Artículo 10). Aquí construimos la caja de herramientas.

una imagen extraída, una descripción que se puede buscar, pagando el método más barato que pueda leerla – Imagen del autor

1. La mayoría de las imágenes no merecen una llamada de modelo.

El primer paso no gasta nada. Antes de cualquier OCR o llamada de visión, un filtro económico analiza las señales que ya están en image_df más un par de estadísticas de píxeles y elimina las imágenes sin valor de recuperación:

Demasiado pequeño. Una imagen cuyo lado más corto tiene unas pocas docenas de píxeles, o cuyo área total está debajo de un piso pequeño, es un ícono o una viñeta, no una figura. Un umbral de tamaño elimina la mayoría de ellos. La forma equivocada. Una imagen muy larga y muy fina es una regla o un divisor, no un contenido. Un guardia de proporción los atrapa. Repetido en todas partes. El mismo hash de contenido en la mayoría de las páginas del documento es Chrome: un logotipo de encabezado, una marca de pie de página, una marca de agua. Contar en cuántas páginas aparece un hash de imagen lo marca como decoración, no como información.

is_worth_analyzing aplica estas reglas de tamaño y forma por imagen, y flag_worth_analyzing primero deriva la frecuencia de repetición por página del hash del contenido y luego agrega una columna Worth_analyzing a image_df. Ambos viven en docintel.parsing.pdf.images. Los umbrales son deliberadamente flexibles: una retención falsa cuesta una llamada al modelo más tarde, una caída falsa pierde contenido sin dejar rastro, por lo que, en caso de duda, el filtro conserva la imagen. Las imágenes planas y sin contenido que son demasiado grandes para no pasar la prueba de tamaño (un panel de color sólido, por ejemplo) no son forzadas a pasar aquí; se toman un paso más tarde como decorativos y se omiten de todos modos.

En: image_df (+ estadísticas de píxeles por imagen). Fuera: la misma tabla con una bandera de análisis de valor.

En un informe típico, esto por sí solo elimina la gran mayoría de las imágenes antes de que se ejecute un solo modelo. Lo que queda es el puñado que realmente tiene significado.

2. ¿Qué tipo de imagen es?

No todas las imágenes que sobreviven al filtro se leen de la misma manera. Una captura de pantalla de una tabla es texto: el OCR clásico lo lee de forma económica y exacta. Un gráfico de líneas no es texto en absoluto; su significado está en los ejes y la tendencia, y sólo un modelo de visión puede expresarlo con palabras. Al enviar el gráfico a OCR se devuelven algunas etiquetas de ejes perdidas; enviar la captura de pantalla a un modelo de visión paga precios de gráfico por algo que OCR hace de forma gratuita.

Entonces, el segundo paso clasifica cada imagen guardada en un tipo:

decorativo: un panel en blanco o casi uniforme. Saltar. texto: una captura de pantalla, una región escaneada, una tabla representada como una imagen. Lee con OCR. gráfico/diagrama/foto: el significado es visual. Lee con un modelo de visión.

classify_image devuelve un ImageType a partir de señales de píxeles baratas: cuánto varían los píxeles, qué tan saturados están, qué parte de la imagen tiene un fondo casi blanco, qué tan densos son sus bordes. Un panel casi uniforme es decorativo. Vale la pena detenerse en la prueba, porque la versión obvia es errónea: no se puede detectar un panel en blanco contando sus colores. Una región real “completamente negra” o “completamente blanca” nunca tiene píxeles perfectos; El ruido del sensor y la compresión JPEG le dan cientos de colores casi idénticos, por lo que un recuento de colores lo supera. Lo que permanece cerca de cero en un panel en blanco, con ruido y todo, es la dispersión de los valores de los píxeles, su desviación estándar. Baja dispersión significa blanco, cualquiera que sea el número de colores, así que esa es la señal. La tinta negra sobre una página blanca, con una saturación casi nula con una estructura de trazo real, es texto. Una imagen saturada, sin márgenes blancos es una fotografía. Todo lo demás, cada caso incierto, queda reflejado en el gráfico.

Observe lo que no está en esa lista: un paso que decide "esto parece un logotipo". Esto es a propósito y es la misma lección que el panel en blanco. Un logotipo puede tener dos colores planos, una marca denominativa negra sobre blanco o un degradado a todo color con bordes suaves. El conteo de colores detecta el primero y omite el segundo y, lo que es peor, la prueba de dos colores también detecta un escaneo de dos niveles del texto real que deseaba leer. La apariencia no te dice que sea un logotipo. El comportamiento sí lo hace: un logotipo es cromado porque repite la misma marca en cada encabezado de página. Esa señal ya se ejecutó, nuevamente en el filtro, que arroja una imagen cuyo hash de contenido se repite en las páginas sin importar cuántos colores tenga. Un logotipo que aparece una sola vez, una marca en una portada, no merece caso especial; se lee como cualquier otra cosa, una marca denominativa que pasa a OCR gratuito, un gráfico a una llamada de visión única. La regla es la misma en todo momento: omita solo lo que esté seguro que está vacío o cromado, y lea todo lo demás, porque un salto incorrecto pierde contenido silenciosamente.

Esa caída en el gráfico es la otra elección de diseño importante. Clasificar un gráfico frente a un diagrama frente a una fotografía basándose únicamente en señales baratas no es confiable, por lo que el clasificador no intenta ser inteligente: solo desvía una imagen a OCR barato cuando está seguro de que la imagen es texto monocromático limpio y envía todo lo demás al modelo de visión, que lee gráficos, diagramas, fotografías y cualquier texto que contengan. El sesgo es asimétrico intencionadamente. Un atajo de OCR perdido cuesta una llamada de visión; La ejecución de OCR en un diagrama devuelve un puñado de etiquetas de ejes perdidas y tonterías. Por eso, en caso de duda, el clasificador paga por la visión. La clasificación en sí sigue siendo barata, sin necesidad de llamar a un modelo, porque tiene que ser más barata que el análisis que se pretende evitar.

En: una imagen que pasó el filtro. Fuera: su ImageType.

3. La cascada: el método más económico para leerlo

El tipo decide el método. METHOD_BY_TYPE asigna cada tipo a una de tres acciones, ordenadas por costo, y describe_figure se envía en ella. Toda la decisión, para los casos que realmente se encuentran en un documento, cabe en una tabla: qué capta la imagen, cuánto cuesta y qué se obtiene a cambio.

la decisión en cascada para cada tipo de imagen que encuentre en un documento real, desde gratuita hasta de pago – Imagen del autor

Léelo de arriba a abajo y leerás la cascada en orden. Las primeras tres filas nunca llegan a un modelo: el filtro las descarta según el tamaño, la forma o la repetición. El clasificador detecta la siguiente fila como un panel en blanco y también la omite. Sólo los cinco últimos cuestan algo, y de ellos sólo la imagen-texto genuina obtiene el camino libre. El resto llega al modelo de visión, que es exactamente hacia donde quiere que vaya su dinero.

Cuidado: figuras de lado. Una mesa ancha o un gráfico horizontal a menudo se colocan a 90 grados para que quepan en una página vertical. El giro rara vez aparece donde mirarías primero: el indicador de rotación de la página permanece en 0 y el ángulo se ubica en la propia matriz de ubicación de la imagen. Representada tal como está, la figura llega al OCR o al modelo de visión de su lado, donde el OCR devuelve ruido y un modelo de visión lo lee con una confianza fuera de lugar y sin previo aviso de que tuvo problemas. Entonces, la cascada lee el ángulo de ubicación y contrarrota la región antes de que cualquiera de los métodos la vea: automático, exacto, sin adivinar la orientación. El único caso residual es un escaneo con el giro grabado en sus píxeles, sin matriz para leer; allí, la rama de OCR vuelve a intentar los cuartos de vuelta y se queda con el que tiene mejor puntuación.

3.1. Saltar: no pagues nada por el ruido

decorativo: sin llamada. Un panel en blanco o casi uniforme mantiene su espacio de texto vacío. Junto con las imágenes que el filtro ya eliminó (las demasiado pequeñas, las de forma incorrecta, las cromadas repetidas), aquí es donde terminan la mayoría de las imágenes de un documento limpio, que es el punto.

3.2. OCR clásico para imágenes de texto

texto: una captura de pantalla, una tabla escaneada, una figura que en realidad es texto renderizado. El OCR clásico lo lee localmente, en milisegundos, de forma gratuita. La serie utiliza EasyOCR (docintel.parsing.pdf.easyocr); Tesseract es la otra opción común. El OCR es exacto en texto impreso limpio y nunca inventa palabras, que es exactamente lo que desea cuando la imagen es texto. Su artículo complementario (Artículo 5 quinquies) cubre completamente el OCR como un analizador back-end; Aquí hay una rama de la cascada.

El problema es la escritura a mano. Una nota escrita a mano parece texto para el clasificador, pero el OCR clásico se entrena en letra impresa y se lee en cursiva como una serie de conjeturas. La solución es permitir que OCR informe qué tan seguro es. EasyOCR devuelve una puntuación de confianza con cada línea, por lo que describe_figure lee el texto y su confianza media: una lectura segura se devuelve tal cual, una lectura de baja confianza se trata como un intento fallido y la imagen pasa al modelo de visión, que maneja mucho mejor la escritura a mano. La misma ruta cubre el caso más raro en el que el clasificador escribió mal una imagen que no es texto como texto. Por lo tanto, la rama de OCR no “confía ciegamente en OCR”; es “pruebe el lector gratuito, conserve su respuesta sólo cuando esté segura; de lo contrario, pague por la visión”.

3.3. Vision LLM para gráficos, diagramas y fotografías.

Cuadro, diagrama, fotografía: las únicas imágenes cuyo significado es genuinamente visual. Un modelo de visión mira la imagen y escribe una breve descripción, “un gráfico de líneas de los precios de las materias primas desde 2022, que aumenta y luego se mantiene estable después del tercer trimestre”, “la arquitectura Transformer, un codificador de N capas apiladas que alimenta un decodificador”. Esa oración es texto, por lo que la recuperación finalmente puede coincidir con ella. Esto es lo único que ningún analizador textual puede hacer y es el paso más costoso, por lo que toda la cascada existe para garantizar que solo lleguen estas imágenes. La llamada de visión en sí pasa por docintel.core.analyze_image, el único lugar donde reside cada llamada de modelo de la serie (junto con llm_parse y llm_chat); el coste que conlleva es el objeto del artículo 5quater (lectura visual).

El clasificador ya conoce el tipo, por lo que el mensaje se adapta a él en lugar de a un genérico "describe esta imagen". A un gráfico se le solicitan sus ejes, unidades y tendencia; un diagrama de sus componentes y cómo se conectan, con cada etiqueta transcrita; a una tabla representada como una imagen se le solicitan sus filas como rebajas; una foto de lo que muestra. La pregunta correcta obtiene la respuesta correcta: pregunte a un gráfico por su tendencia y obtendrá la tendencia, pídale que "describa la imagen" y obtendrá una oración sobre los colores. Una persona que llama aún puede pasar un mensaje explícito para anular los específicos del tipo, que es como fluye una instrucción con alcance de proyecto o editada por el usuario.

En: una imagen mecanografiada. Fuera: una breve descripción, o Ninguno para omitir.

4. Escribir la descripción nuevamente

La descripción sólo es útil si la recuperación puede encontrarla. La imagen ya tiene un espacio de línea en line_df (una imagen se encuentra en una posición en la página, por lo que ocupa una línea, con una celda de texto vacía, como se describe en el Artículo 5B (el modelo de datos relacionales)). La cascada escribe su descripción en esa celda. describe_image_df agrega una columna de descripción a image_df y la persona que llama vuelve a unirla a la línea de la imagen.

El efecto es que "el diagrama de arquitectura" o "el gráfico de ingresos" ahora recupera la página correcta, a través de la misma palabra clave y ruta de inserción que cualquier otra línea. Nada posterior necesita saber que el texto proviene de una imagen.

El enriquecimiento es incremental por diseño. Puede ejecutar la cascada en el momento del análisis para un corpus pequeño, o de forma perezosa, solo en las imágenes que una ejecución determinada realmente necesita. El espacio de texto está vacío hasta que algo lo llena, y llenarlo nunca cambia el contrato: sigue siendo una fila, una línea, un valor de texto. Cuándo llenarlo es la pregunta abierta que este artículo deja para el análisis adaptativo (Artículo 10): en lugar de leer cada figura desde el principio, el texto barato se lee primero, y una referencia cruzada en ese texto (“La Figura 3 a continuación muestra las ganancias”) es lo que desencadena una llamada de visión sobre la figura a la que apunta. Los métodos aquí son lo que llamará esa política; la política en sí es el siguiente artículo.

Toda la cascada se envía como una sola llamada. Entréguele el image_df de parse_pdf y el pdf_path desde el que se analizó, vuelva a leer el mismo cuadro con las tres nuevas columnas que llena la cascada.

parsed = parse_pdf("data/paper/1706.03762v7.pdf") # image_df localiza las imágenes enriquecidas = describe_image_df(parsed["image_df"], pdf_path="data/paper/1706.03762v7.pdf") # describe_image_df agrega tres columnas a image_df: enriched[["page_num", "worth_analyzing", "image_type", "description", "prompt"]].head() #worth_analyzing: veredicto del filtro barato (Verdadero/Falso) # image_type: "decorativo" | "texto" | "gráfico" | "diagrama" | "foto" | Ninguno # descripción: el texto buscable escrito en la ranura de línea de la imagen # mensaje: la instrucción enviada al modelo de visión (Ninguno para OCR/omitir)

Esta es también la parte de la cascada que un usuario puede ver y corregir. La siguiente captura de pantalla es una aplicación de documentos de escritorio que ejecuta el mismo proceso en NIST AI 100-1 (el marco de gestión de riesgos de IA, una obra del gobierno de EE. UU., dominio público): la pestaña Imágenes enumera cada figura que localizó el analizador, el diagrama seleccionado lleva la descripción que gpt-4.1 escribió para él y la descripción permanece editable. Los controles por imagen vuelven a ejecutar OCR o fuerzan el modelo de visión cuando la ruta barata se equivocó.

la cascada apareció ante el usuario: cada figura localizada, su descripción escrita en el modelo de documento y los controles por imagen para volver a ejecutar OCR o forzar visión – Imagen del autor

5. Costo y latencia: paga por imagen, no por página

El único propósito de la cascada es hacer que el costo siga el valor. El filtro económico y el clasificador se ejecutan en cada imagen guardada, pero no cuestan nada. OCR es local y gratuito. El modelo de visión, el elemento de una sola línea que en realidad cuesta dinero y segundos, se ejecuta sólo en cuadros, diagramas y fotografías, que en la mayoría de los documentos empresariales son una pequeña fracción de las imágenes y una pequeña fracción de las páginas.

La alternativa, subtitular cada imagen con un modelo de visión, cuesta lo mismo por imagen, ya sea un logotipo o un gráfico, y la mayoría de las imágenes son logotipos. La cascada reemplaza una factura de visión plana por imagen con un filtro, un clasificador barato y una llamada de visión solo donde nada más puede leer la imagen. En un informe con un logotipo por página y dos cifras reales, son dos llamadas de visión en lugar de docenas.

Tampoco se paga dos veces por la misma imagen. El filtro ya elimina el cromo que se repite en la mayoría de las páginas, pero aún puede aparecer una figura real en un puñado de páginas (un diagrama de referencia, una exhibición repetida). Las claves en cascada en el contenido son hash, por lo que una figura que aparece en diez páginas se lee una vez y la descripción se reutiliza para las otras nueve. Una imagen, una llamada de modelo, por muchas veces que aparezca.

6. Conclusión

image_df localiza cada imagen; no lee ninguno de ellos. Leerlos es un ladrillo separado, y este artículo establece sus métodos, ordenados por costo: eliminar el ruido de forma gratuita, clasificar lo que queda de forma económica, leer texto limpio con OCR y mantener el modelo de visión para los cuadros y diagramas donde el significado es genuinamente visual. Cada método deja su resultado en el espacio de texto de la imagen y, a partir de ahí, la imagen es solo otra línea de búsqueda. Lo que este artículo no establece deliberadamente es qué imágenes ejecutar en una pasada determinada: leer cada figura desde el principio rara vez es lo que se desea, y la elección basada en el contexto, dejando que el texto circundante y la pregunta decidan, es un análisis adaptativo (Artículo 10). Primero la caja de herramientas; la política a continuación.

Fuentes y lecturas adicionales

El artículo 5 (análisis) y el artículo 5B (las tablas relacionales) introducen image_df y la ranura de línea en la que se vuelve a escribir la descripción. El artículo 5 quater (lectura de la visión) cubre el back-end de vision-LLM y su costo. El artículo 5 quinquies (EasyOCR) cubre el OCR clásico como un analizador back-end. El artículo 10 (análisis adaptativo) es donde se realiza la elección que este artículo posterga: qué imágenes leer en una ejecución determinada, pasando de un texto barato a una visión visual solo cuando el contexto lo requiere.

Al principio de la serie:

Document Intelligence: introducción a la serie. Qué construye la serie, ladrillo a ladrillo y en qué orden. Baseline Enterprise RAG, desde PDF hasta respuesta resaltada. El canal de cuatro ladrillos de un extremo a otro: PDF de entrada, respuesta resaltada de salida. Las incrustaciones no son mágicas: los modos de falla predecibles de la recuperación de RAG. Dónde gana la incorporación de similitud (sinónimos, errores tipográficos, paráfrasis), dónde predeciblemente se rompe (términos desconocidos, negación, relevancia de término versus respuesta) y cómo usarlo de todos modos. Los rerankers tampoco son mágicos: cuando la capa de codificador cruzado vale la pena. Lo que agrega un codificador cruzado sobre las incorporaciones de codificador doble, medido y cuándo vale la pena la latencia. RAG no es aprendizaje automático y el conjunto de herramientas de ML resuelve el problema equivocado. Por qué los barridos y ajustes de tamaño de fragmentos optimizan lo incorrecto; en su lugar, ruta por tipo de pregunta. De expresiones regulares a modelos de visión: qué técnica RAG se adapta a qué problema. Dos ejes, complejidad documental y control de preguntas, que seleccionan la técnica para cada caso. 10 errores comunes de RAG que seguimos viendo en producción. Diez errores de producción, organizados ladrillo por ladrillo, con la solución para cada uno. Más allá de extract_text: las dos capas de un PDF que impulsan la calidad RAG. La primera mitad del bloque de análisis: la naturaleza del documento, las señales y el resumen. Deje de devolver texto plano desde un PDF: la forma relacional que RAG necesita. La segunda mitad del bloque de análisis: las tablas relacionales que lee cada bloque posterior.