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:

  1. PDF → texto via OCR / pdftotext.
  2. Texto → chunks de 300-500 tokens.
  3. Chunk → embedding de bi-encoder (um vetor).
  4. Consulta do usuário → embedding → similaridade de cosseno → top-k chunks.
  5. 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:

  1. Ingestão: PDF → imagens das páginas → codificação PaliGemma → armazenar todos os embeddings de patches.
  2. Consulta: texto do usuário → embeddings de tokens de consulta → MaxSim em relação a todas as páginas indexadas → top-k páginas.
  3. 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

  1. 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).

  2. MaxSim é Σ_i max_j cos(q_i, p_j). O que essa soma captura que uma similaridade média simples não captura?

  3. 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?

  4. 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.

  5. 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

Leituras Adicionais

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).