Phase 12 - Lesson 23
ColPali y RAG de Documentos Nativo de Visión
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
El RAG tradicional analiza PDFs en texto, los divide en fragmentos (chunks), genera embeddings de los fragmentos y almacena vectores. Cada paso pierde señal: el OCR descarta datos de gráficos, la fragmentación rompe filas de tablas, los embeddings de texto ignoran figuras. ColPali (Faysse et al., julio de 2024) hizo la pregunta más simple: ¿por qué extraer texto de todos modos? Genera el embedding de la imagen de la página directamente a través de PaliGemma, utiliza interacción tardía (late interaction) al estilo ColBERT para la recuperación y conserva todo el diseño (layout), figuras, fuentes y señales de formato que contiene el documento. Benchmarks publicados: precisión de extremo a extremo 20-40% mejor que RAG de texto en documentos visualmente ricos. ColQwen2, ColSmol y VisRAG extendieron el patrón. Esta lección lee la tesis de RAG nativo de visión y construye un indexador pequeño similar a ColPali.
Tipo: Construir Idiomas: Python (stdlib, indexador multivectorial + puntuador MaxSim) Prerrequisitos: Fase 11 (Ingeniería de LLM — conceptos básicos de RAG), Fase 12 · 05 (LLaVA) Tiempo: ~180 minutos
Objetivos de Aprendizaje
- Explicar la diferencia entre recuperación por bi-encoder (un vector por documento) y recuperación por interacción tardía (muchos vectores por documento).
- Describir la operación MaxSim de ColBERT y cómo ColPali la generaliza de tokens de texto a parches de imagen (image patches).
- Construir un indexador pequeño similar a ColPali: página → embeddings de parches → MaxSim sobre embeddings de términos de consulta → páginas top-k.
- Comparar el generador ColPali + Qwen2.5-VL vs RAG de texto + GPT-4 en un caso de uso de facturas / informes financieros.
El Problema
El RAG de texto en PDFs descarta la mayor parte del documento. El crecimiento de ingresos del tercer trimestre (Q3) de un informe financiero suele estar en un gráfico; los hallazgos de un informe médico están en imágenes anotadas; el bloque de firma de un contrato legal es un hecho de diseño (layout), no un hecho de texto.
El pipeline de RAG de texto:
- PDF → texto a través de OCR / pdftotext.
- Texto → fragmentos (chunks) de 300-500 tokens.
- Fragmento → embedding de bi-encoder (un vector).
- Consulta del usuario → embedding → similitud de coseno → fragmentos top-k.
- Fragmentos + consulta → LLM.
Cinco pasos con pérdida de información. Gráficos no capturados. Tablas divididas entre fragmentos. El diseño de múltiples columnas se aplana. Las anotaciones de las figuras desaparecen.
La solución de ColPali: omitir el OCR, generar el embedding de la imagen de la página directamente. Usar interacción tardía al estilo ColBERT para la recuperación de modo que el modelo pueda atender a parches detallados en el momento de la consulta.
El Concepto
ColBERT (2020)
ColBERT (Khattab & Zaharia, arXiv:2004.12832) es un método de recuperación de texto. En lugar de un vector por documento, produce un vector por token. En el momento de la consulta:
- Los tokens de consulta obtienen sus propios embeddings (N_q vectores).
- Los tokens del documento obtienen embeddings (N_d vectores, normalmente almacenados en caché).
- Puntuación = suma sobre los tokens de consulta del máximo sobre los tokens del documento de la similitud de coseno: Σ_i max_j cos(q_i, d_j).
Esta es la operación MaxSim. Cada token de consulta "elige" su token de documento con mejor coincidencia. La puntuación final es la suma.
Pros: recuperación (recall) sólida, maneja semántica a nivel de término. Contras: N_d vectores por documento, almacenamiento costoso.
ColPali
ColPali (Faysse et al., arXiv:2407.01449) aplica el patrón ColBERT a las imágenes.
- Cada página es codificada por PaliGemma (ViT + lenguaje) en embeddings de parches: N_p vectores por página.
- Cada consulta del usuario (texto) se codifica en embeddings de tokens de consulta: N_q vectores.
- Puntuación = Σ_i max_j cos(q_i, p_j), es decir, MaxSim sobre los tokens de texto de consulta y los parches de imagen de la página.
- Recupera las páginas top-k por puntuación total.
En el momento de la ingesta del documento: genera los embeddings de cada página con PaliGemma, almacena todos los embeddings de parches. En el momento de la consulta: genera los embeddings de los tokens de consulta, calcula MaxSim contra todos los embeddings de página almacenados, devuelve las páginas top-k.
Pros: de extremo a extremo supera a RAG de texto en un 20-40% en documentos visualmente ricos. Cada vector de parche captura el diseño y el contenido locales.
Contras: N_p parches × floats de 4 bytes × vectores D-dim por página = el almacenamiento crece rápidamente. Mitigado por cuantización PQ / OPQ.
ColQwen2 y ColSmol
ColQwen2 (illuin-tech, 2024-2025) reemplaza PaliGemma por Qwen2-VL. Mejor codificador base, mejor recuperación.
ColSmol es la variante a menor escala para uso local / edge. Un recuperador ColSmol de ~1B de parámetros se ejecuta en una GPU de consumo.
VisRAG
VisRAG (Yu et al., arXiv:2410.10594) es una variante diferente: en lugar de MaxSim en parches, agrupa (pool) cada página en un solo vector con un VLM y luego recupera con bi-encoder. Indexación más rápida + menor almacenamiento, menor recuperación (recall).
El balance calidad-vs-costo: ColPali para calidad, VisRAG para escala.
M3DocRAG
M3DocRAG (Cho et al., arXiv:2411.04952) extiende la recuperación multimodal al razonamiento de múltiples páginas y múltiples documentos. Recupera páginas a través de documentos, componiendo un contexto de múltiples páginas para el VLM.
ViDoRe — el benchmark
El benchmark complementario de ColPali. Evaluación de Recuperación de Documentos Visuales (Visual Document Retrieval Evaluation). Las tareas incluyen informes financieros, artículos científicos, documentos administrativos, registros médicos, manuales. Métrica: nDCG@5.
ColPali-v1 obtiene una puntuación de ~80% nDCG@5 en ViDoRe; el RAG de texto en los mismos documentos obtiene ~50-60%.
El pipeline de RAG de extremo a extremo
Para un RAG nativo de visión:
- Ingesta: PDF → imágenes de páginas → codificación PaliGemma → almacenar todos los embeddings de parches.
- Consulta: texto del usuario → embeddings de tokens de consulta → MaxSim contra todas las páginas indexadas → páginas top-k.
- Generación: imágenes de páginas top-k + consulta → VLM (Qwen2.5-VL o Claude) → respuesta.
Sin OCR en ninguna parte. Figuras, gráficos, fuentes y diseño fluyen hacia la respuesta.
Matemática de almacenamiento
Un informe financiero de 50 páginas con 729 parches por página y embeddings de 128 dimensiones:
- ColPali: 50 * 729 * 128 * 4 bytes = ~18 MB sin procesar, ~4 MB después de PQ.
- RAG de texto: 50 fragmentos * 768-dim * 4 bytes = ~150 kB.
ColPali requiere aproximadamente 30 veces más almacenamiento por documento. A gran escala, OPQ / PQ lo reduce a unas 5-10 veces, lo cual suele ser tolerable.
Cuándo RAG de texto sigue ganando
- Documentos de texto puro sin señal de diseño (artículos de wiki, registros de chat). El RAG de texto es más simple y más barato en almacenamiento.
- Archivos de millones de páginas donde el almacenamiento domina el costo.
- Requisitos regulatorios estrictos que exigen texto OCR extraíble junto con la recuperación.
Para todo lo demás en 2026 — informes financieros, artículos científicos, contratos legales, registros médicos, documentación de UX — el RAG nativo de visión gana.
Úsalo
code/main.py:
- Codificador de parches de juguete (toy): mapeia una "página" (pequeña cuadrícula de vectores de características) a un array de embeddings de parches.
- Puntuador MaxSim: calcula la puntuación al estilo ColBERT entre un conjunto de embeddings de tokens de consulta y un conjunto de parches de página.
- Indexa 5 páginas de juguete, ejecuta 3 consultas, devuelve las páginas top-k con puntuaciones.
Envíalo
Esta lección produce outputs/skill-vision-rag-designer.md. Dado un proyecto de RAG de documentos, elige ColPali / ColQwen2 / VisRAG / RAG de texto y calcula el tamaño de almacenamiento necesario.
Ejercicios
Un informe anual de 200 páginas con 729 parches por página, embeddings de 128 dimensiones y floats de 4 bytes. Calcula el almacenamiento sin procesar y el almacenamiento comprimido con PQ (8x).
MaxSim es Σ_i max_j cos(q_i, p_j). ¿Qué captura esta suma que una simple similitud promedio no captura?
ColPali indexa las páginas como conjuntos de parches. ¿Qué cambia si en su lugar indexamos a nivel de palabra (como lo hace ColBERT)? ¿Cuáles son los pros y contras?
Diseña el pipeline de extremo a extremo para un corpus de 1 millón de páginas con un presupuesto de latencia de 500ms por consulta. Elige ColQwen2 / VisRAG y justifica.
Lee M3DocRAG (arXiv:2411.04952). Describe el patrón de atención de múltiples páginas y cómo difiere de la recuperación de una sola página de ColPali.
Términos Clave
| Término | Lo que la gente dice | Lo que realmente significa |
|---|---|---|
| Interacción tardía | "Estilo ColBERT" | Recuperación utilizando embeddings por token o por parche + MaxSim, no un solo vector de documento |
| MaxSim | "Máximo sobre parches" | Para cada token de consulta, elige el token de documento con mayor similitud; suma a lo largo de la consulta |
| Bi-encoder | "Vector único" | Un vector por documento; más rápido pero pierde granuralidad |
| Multivector | "Muchos vectores por doc" | Almacena N_p vectores por documento / página; el costo de almacenamiento crece pero la recuperación mejora |
| Embedding de parche | "Característica de página" | Un vector por parche de imagen de un codificador VLM, almacenado en caché por página |
| ViDoRe | "Banco de docs de visión" | La suite de benchmarks de ColPali para recuperación de documentos visuales |
| Cuantización PQ | "Cuantización de producto" | Compresión que mantiene la similitud de los vectores mientras reduce el almacenamiento ~8x |