Phase 12 - Lesson 23
ColPali e RAG de Documentos Nativo de Visão
This lesson includes a graded coding exercise that runs in your browser, unlocked with lifetime access.
O RAG tradicional analisa PDFs em texto, divide em partes (chunks), incorpora (embeds) as partes e armazena vetores. Cada etapa perde sinal: o OCR descarta dados de gráficos, a divisão quebra linhas de tabelas, os embeddings de texto ignoram figuras. O ColPali (Faysse et al., julho de 2024) fez a pergunta mais simples: por que extrair texto afinal? Incorpore a imagem da página diretamente via PaliGemma, use interação tardia (late interaction) no estilo ColBERT para recuperação e mantenha todo o layout, figuras, fontes e sinais de formatação que o documento carrega. Benchmarks publicados: precisão de ponta a ponta 20-40% melhor do que o RAG de texto em documentos visualmente ricos. ColQwen2, ColSmol e VisRAG estenderam o padrão. Esta lição lê a tese do RAG nativo de visão e constrói um indexador simples semelhante ao ColPali.
Tipo: Construir Idiomas: Python (stdlib, indexador multi-vetor + pontuador MaxSim) Pré-requisitos: Fase 11 (Engenharia de LLM — conceitos básicos de RAG), Fase 12 · 05 (LLaVA) Tempo: ~180 minutos
Objetivos de Aprendizado
- Explicar a diferença entre recuperação por bi-encoder (um vetor por documento) e recuperação por interação tardia (muitos vetores por documento).
- Descrever a operação MaxSim do ColBERT e como o ColPali a generaliza de tokens de texto para patches de imagem.
- Construir um pequeno indexador semelhante ao ColPali: página → embeddings de patches → MaxSim sobre embeddings de termos da consulta → top-k páginas.
- Comparar o gerador ColPali + Qwen2.5-VL com RAG de texto + GPT-4 em um caso de uso de faturas / relatórios financeiros.
O Problema
O RAG de texto em PDFs descarta a maior parte do documento. O crescimento de receita do terceiro trimestre (Q3) de um relatório financeiro geralmente está em um gráfico; as descobertas de um relatório médico estão em imagens anotadas; o bloco de assinatura de um contrato legal é um fato de layout, não um fato de texto.
O pipeline de RAG de texto:
- PDF → texto via OCR / pdftotext.
- Texto → chunks de 300-500 tokens.
- Chunk → embedding de bi-encoder (um vetor).
- Consulta do usuário → embedding → similaridade de cosseno → top-k chunks.
- Chunks + consulta → LLM.
Cinco etapas com perda de dados. Gráficos não capturados. Tabelas quebradas entre chunks. Layout de várias colunas achatado. Anotações de figuras desaparecem.
A solução do ColPali: pular o OCR, incorporar a imagem da página diretamente. Usar a interação tardia no estilo ColBERT para recuperação para que o modelo possa focar em patches detalhados no momento da consulta.
O Conceito
ColBERT (2020)
ColBERT (Khattab & Zaharia, arXiv:2004.12832) é um método de recuperação de texto. Em vez de um vetor por documento, ele produz um vetor por token. No momento da consulta:
- Os tokens da consulta recebem seus próprios embeddings (N_q vetores).
- Os tokens do documento recebem embeddings (N_d vetores, normalmente armazenados em cache).
- Pontuação = soma sobre os tokens da consulta do máximo sobre os tokens do documento da similaridade de cosseno: Σ_i max_j cos(q_i, d_j).
Esta é a operação MaxSim. Cada token de consulta "escolhe" seu token de documento com melhor correspondência. A pontuação final é a soma.
Prós: recuperação (recall) forte, lida com semântica no nível do termo. Contras: N_d vetores por documento, armazenamento caro.
ColPali
O ColPali (Faysse et al., arXiv:2407.01449) aplica o padrão ColBERT a imagens.
- Cada página é codificada pelo PaliGemma (ViT + linguagem) em embeddings de patches: N_p vetores por página.
- Cada consulta do usuário (texto) é codificada em embeddings de tokens de consulta: N_q vetores.
- Pontuação = Σ_i max_j cos(q_i, p_j), ou seja, MaxSim sobre os tokens de texto de consulta e patches de imagem de página.
- Recupera as top-k páginas pela pontuação total.
No momento da ingestão do documento: incorpore cada página com PaliGemma, armazene todos os embeddings de patches. No momento da consulta: incorpore os tokens da consulta, compute MaxSim em relação a todos os embeddings de páginas armazenados, retorne as top-k páginas.
Prós: ponta a ponta supera RAG de texto em 20-40% em documentos visualmente ricos. Cada vetor de patch captura layout e conteúdo locais.
Contras: N_p patches × 4-byte floats × D-dim vetores por página = o armazenamento cresce rapidamente. Mitigado por quantização PQ / OPQ.
ColQwen2 e ColSmol
O ColQwen2 (illuin-tech, 2024-2025) troca PaliGemma por Qwen2-VL. Melhor codificador base, melhor recuperação.
O ColSmol é a variante de menor escala para uso local / borda (edge). Um recuperador ColSmol com ~1B de parâmetros roda em GPU de consumidor.
VisRAG
O VisRAG (Yu et al., arXiv:2410.10594) é uma variante diferente: em vez de MaxSim em patches, consolida (pool) cada página em um único vetor com um VLM e depois recupera usando bi-encoder. Indexação mais rápida + menor armazenamento, recuperação (recall) mais fraca.
A relação de compromisso qualidade vs custo: ColPali para qualidade, VisRAG para escala.
M3DocRAG
O M3DocRAG (Cho et al., arXiv:2411.04952) estende a recuperação multimodal para raciocínio de múltiplas páginas e múltiplos documentos. Recupera páginas entre documentos, compondo um contexto de múltiplas páginas para o VLM.
ViDoRe — o benchmark
O benchmark complementar do ColPali. Avaliação de Recuperação de Documentos Visuais (Visual Document Retrieval Evaluation). As tarefas incluem relatórios financeiros, artigos científicos, documentos administrativos, prontuários médicos, manuais. Métrica: nDCG@5.
O ColPali-v1 alcança pontuação de ~80% nDCG@5 no ViDoRe; o RAG de texto nos mesmos documentos pontua ~50-60%.
O pipeline de RAG ponta a ponta
Para um RAG nativo de visão:
- Ingestão: PDF → imagens das páginas → codificação PaliGemma → armazenar todos os embeddings de patches.
- Consulta: texto do usuário → embeddings de tokens de consulta → MaxSim em relação a todas as páginas indexadas → top-k páginas.
- Geração: imagens das top-k páginas + consulta → VLM (Qwen2.5-VL ou Claude) → resposta.
Nenhum OCR em lugar nenhum. Figuras, gráficos, fontes e layout fluem para a resposta.
Matemática de armazenamento
Um relatório financeiro de 50 páginas com 729 patches por página e embeddings de 128 dimensões:
- ColPali: 50 * 729 * 128 * 4 bytes = ~18 MB brutos, ~4 MB após PQ.
- RAG de texto: 50 chunks * 768-dim * 4 bytes = ~150 kB.
O ColPali consome cerca de 30 vezes mais armazenamento por documento. Em escala, OPQ / PQ reduz isso para cerca de 5-10 vezes, geralmente tolerável.
Quando o RAG de texto ainda vence
- Documentos de texto puro sem sinal de layout (artigos de wiki, logs de chat). O RAG de texto é mais simples e mais barato em termos de armazenamento.
- Arquivos de múltiplos milhões de páginas onde o armazenamento domina os custos.
- Requisitos regulatórios estritos que exigem texto OCR extraível juntamente com a recuperação.
Para tudo mais em 2026 — relatórios financeiros, artigos científicos, contratos legais, prontuários médicos, documentação de UX — o RAG nativo de visão vence.
Use-o
code/main.py:
- Codificador de patches de brinquedo (toy): mapeia uma "página" (pequena grade de vetores de características) para um array de embeddings de patches.
- Pontuador MaxSim: calcula a pontuação no estilo ColBERT entre um conjunto de embeddings de tokens de consulta e um conjunto de patches de página.
- Indexa 5 páginas de brinquedo, executa 3 consultas, retorna as top-k com pontuações.
Envie-o
Esta lição produz outputs/skill-vision-rag-designer.md. Dado um projeto de RAG de documentos, escolhe ColPali / ColQwen2 / VisRAG / RAG de texto e dimensiona o armazenamento.
Exercícios
Um relatório anual de 200 páginas com 729 patches por página, emb de 128 dim e floats de 4 bytes. Calcule o armazenamento bruto e o armazenamento comprimido com PQ (8x).
MaxSim é Σ_i max_j cos(q_i, p_j). O que essa soma captura que uma similaridade média simples não captura?
O ColPali indexa páginas como conjuntos de patches. O que muda se, em vez disso, indexarmos no nível da palavra (como o ColBERT faz)? Quais são as relações de compromisso?
Projete o pipeline de ponta a ponta para um corpus de 1 milhão de páginas com um orçamento de latência de 500ms por consulta. Escolha ColQwen2 / VisRAG e justifique.
Leia o M3DocRAG (arXiv:2411.04952). Descreva o padrão de atenção de múltiplas páginas e como ele difere da recuperação ColPali de página única.
Termos-Chave
| Termo | O que as pessoas dizem | O que realmente significa |
|---|---|---|
| Interação tardia | "Estilo ColBERT" | Recuperação usando embeddings por token ou por patch + MaxSim, não um único vetor de doc |
| MaxSim | "Máximo sobre patches" | Para cada token de consulta, escolhe o token do documento de maior similaridade; soma sobre a consulta |
| Bi-encoder | "Vetor único" | Um vetor por documento; mais rápido, mas perde granularidade |
| Multi-vetor | "Muitos vetores por doc" | Armazena N_p vetores por documento / página; o custo de armazenamento cresce, mas a recuperação melhora |
| Embedding de patch | "Característica da página" | Um vetor por patch de imagem de um codificador VLM, armazenado em cache por página |
| ViDoRe | "Bench de doc de visão" | A suíte de benchmarks do ColPali para recuperação de documentos visuais |
| Quantização PQ | "Quantização de produto" | Compressão que mantém a similaridade vetorial enquanto encolhe o armazenamento em ~8x |