Phase 19 - Lesson 04
Capstone 04 — Multimodal Document QA (Vision-First PDF, Tables, Charts)
A fronteira de sistemas de perguntas e respostas (QA) sobre documentos em 2026 distanciou-se do modelo clássico OCR-seguido-de-texto e migrou para a recuperação baseada em visão com interação tardia (vision-first late interaction). ColPali, ColQwen2.5 e ColQwen3-omni tratam cada página de um arquivo PDF como uma imagem isolada, geram embeddings usando representações multi-vetoriais de interação tardia e permitem que a consulta faça atenção diretamente sobre as regiões (patches) da imagem. Em relatórios financeiros complexos (10-Ks), artigos científicos e anotações manuscritas, esse padrão supera largamente as pipelines baseadas em OCR. Construa essa pipeline de ponta a ponta para 10 mil páginas e publique um relatório comparativo direto contra uma pipeline baseada em OCR de texto.
Type: Capstone Languages: Python (pipeline), TypeScript (viewer UI) Prerequisites: Phase 4 (computer vision), Phase 5 (NLP), Phase 7 (transformers), Phase 11 (LLM engineering), Phase 12 (multimodal), Phase 17 (infrastructure) Phases exercised: P4 · P5 · P7 · P11 · P12 · P17 Time: 30 hours
Problem
As empresas possuem uma imensa quantidade de PDFs que as pipelines clássicas de OCR distorcem ou falham em ler: relatórios 10-Ks com tabelas rotacionadas, artigos científicos densos em equações matemáticas, gráficos que só fazem sentido visualmente e anotações manuscritas nas margens. Tratar esses documentos com abordagens focadas em texto significa perder metade do sinal relevante. A resposta de 2026 para esse problema é a recuperação baseada em representações multi-vetoriais com interação tardia sobre imagens brutas das páginas. O ColPali (Illuin Tech) introduziu esse conceito, enquanto o ColQwen2.5-v0.2 e o ColQwen3-omni aprimoraram a precisão. No benchmark ViDoRe v3, sistemas baseados em visão obtêm desempenho substancialmente superior em relação a modelos com OCR prévio — e a diferença aumenta significativamente em gráficos, tabelas e manuscritos.
O contrapeso dessa abordagem é o custo de armazenamento e latência. Um embedding gerado via ColQwen resulta em aproximadamente 2048 vetores de patch por página, em vez de um único vetor denso de 1024 dimensões. O espaço bruto em disco cresce exponencialmente. O DocPruner (2026) viabiliza uma compactação de 50% sem perdas mensuráveis de precisão. Você indexará 10 mil páginas, medirá o nDCG@5 do ViDoRe v3, responderá a consultas em menos de 2s e realizará um comparativo direto com uma linha de base baseada em OCR de texto.
Concept
Interação tardia (late interaction) significa que cada token da consulta é pontuado em relação a cada token de patch da imagem da página, e a pontuação máxima (MaxSim) obtida por token da consulta é somada no final. Isso possibilita correspondências altamente detalhadas sem a necessidade de reduzir as informações a um único vetor médio. Um índice multi-vetorial (Vespa, Qdrant multi-vector ou AstraDB) armazena os embeddings gerados para cada patch e executa o cálculo de MaxSim no momento da recuperação.
O gerador de respostas é um modelo de linguagem e visão (VLM) que recebe a consulta juntamente com as imagens das melhores (top-k) páginas recuperadas e redige a resposta final acompanhada por regiões de evidência (caixas delimitadoras ou referências de página). Qwen3-VL-30B, Gemini 2.5 Pro e InternVL3 são as principais escolhas de fronteira em 2026. Para equações complexas e notações científicas, uma pipeline de OCR de fallback (como Nougat ou dots.ocr) é incorporada como um canal de texto opcional.
A avaliação baseia-se em uma matriz bidimensional. Um eixo: o tipo de conteúdo (parágrafos de texto puro, tabelas densas, gráficos de barras/linhas, anotações manuscritas, equações matemáticas). O outro eixo: a abordagem de recuperação (recuperação baseada em visão com interação tardia vs OCR-seguido-de-texto vs modelo híbrido). Cada célula da matriz deve conter o nDCG@5 e a precisão da resposta. Esse relatório constitui a entrega obrigatória.
Architecture
PDFs -> page renderer (PyMuPDF, 180 DPI)
|
v
ColQwen2.5-v0.2 embed (multi-vector per page, ~2048 patches)
|
+------> DocPruner 50% compression
|
v
multi-vector index (Vespa or Qdrant multi-vector)
|
query ----+----> retrieve top-k pages (MaxSim)
|
v
VLM answerer: Qwen3-VL-30B | Gemini 2.5 Pro | InternVL3
inputs: query + top-k page images + optional OCR text
|
v
answer with cited page numbers + evidence regions
|
v
Streamlit / Next.js viewer: highlighted boxes on source page
Stack
- Renderização de páginas: PyMuPDF (fitz) a 180 DPI, com normalização de retrato
- Modelo de interação tardia: ColQwen2.5-v0.2 ou ColQwen3-omni (disponibilizado pela equipe vidore no Hugging Face)
- Banco de dados vetorial: Vespa com suporte a campos multi-vetoriais, Qdrant com suporte a multi-vector ou AstraDB com MaxSim
- Compactação/Poda: Algoritmo DocPruner (versão 2026, mantém patches com alta variância, comprimindo em 50% com perda de precisão inferior a 0,5%)
- Fallback de OCR (equações/tabelas complexas): dots.ocr ou Nougat
- VLM respondedor: Qwen3-VL-30B hospedado localmente ou Gemini 2.5 Pro gerenciado; InternVL3 como alternativa de contingência
- Avaliação: benchmark ViDoRe v3, M3DocVQA para raciocínio de páginas múltiplas
- UI do visualizador: Next.js 15 com sobreposição gráfica de canvas para exibir as regiões de evidência
Build It
Ingestão. Varra um corpus contendo 10 mil páginas de PDFs compostas por relatórios 10-Ks, artigos científicos e documentos escaneados. Renderize cada página como uma imagem PNG de resolução de 1536x2048 pixels. Persista
{doc_id, page_num, image_path}.Geração de embeddings. Execute o modelo ColQwen2.5-v0.2 sobre as imagens das páginas. Cada página deve gerar cerca de 2048 embeddings de patches com dimensão igual a 128. Aplique o algoritmo DocPruner para preservar apenas a metade dos vetores com maior sinal. Armazene as informações no Vespa ou Qdrant usando campos multi-vetoriais.
Consulta. Para cada consulta recebida, gere os embeddings usando a torre de consultas correspondente (embeddings no nível de token). Execute a operação MaxSim contra o índice: para cada token da pergunta, obtenha o maior produto escalar encontrado entre os vetores de patch da página e some esses valores. Retorne as melhores páginas (top-k).
Síntese. Chame o Qwen3-VL-30B fornecendo a consulta e as imagens das top-5 páginas retornadas na busca. Prompt: "Responda utilizando exclusivamente as páginas fornecidas. Cite cada afirmação usando (doc_id, página) e indique o local da evidência (gráfico, tabela, parágrafo)."
Regiões de evidência. Processe o texto de resposta para extrair as coordenadas das regiões citadas. Se o VLM emitir coordenadas de caixas delimitadoras (bounding boxes, como o Qwen3-VL faz), renderize essas caixas como overlays transparentes na interface do usuário.
Fallback de OCR. Para páginas identificadas heuristicamente como densas em equações (baseando-se na variância da imagem), processe a página com o Nougat ou dots.ocr e passe o texto extraído como um canal de dados adicional ao VLM.
Avaliação. Execute testes usando o ViDoRe v3 (para nDCG@5 de recuperação) e o M3DocVQA (para a precisão do QA multirpáginas). Paralelamente, execute uma pipeline comum de OCR-seguido-de-texto no mesmo corpus de dados e com o mesmo VLM respondedor. Gere a matriz de resultados do tipo categoria de conteúdo × abordagem de recuperação.
Interface do usuário. Crie um protótipo inicial em Streamlit; posteriormente, desenvolva a versão final em Next.js 15 exibindo o PDF renderizado com as caixas de evidência destacadas sobre o documento original.
Use It
$ doc-qa ask "what was the 2024 operating margin change for segment EMEA?"
[retrieve] top-5 pages in 320ms (ColQwen2.5, MaxSim, Vespa)
[synth] qwen3-vl-30b, 1.4s, cited (form-10k-2024, p. 88) + (..., p. 92)
answer:
EMEA operating margin moved from 18.2% to 16.8%, a 140bp decline.
cited: 10-K-2024.pdf p.88 (Table 4, Segment Operating Margin)
10-K-2024.pdf p.92 (MD&A, Operating Performance)
[viewer] open with highlighted bounding boxes overlaid on p.88 Table 4
Ship It
O produto entregável é o documento de habilidade outputs/skill-doc-qa.md. Ele descreve a arquitetura montada para o QA de documentos baseado em visão, com dados reais do corpus e avaliação comparativa de desempenho contra o baseline de OCR no ViDoRe v3. Rúbrica:
| Weight | Criterion | How it is measured |
|---|---|---|
| 25 | ViDoRe v3 / M3DocVQA accuracy | Desempenho obtido frente à pipeline baseada em OCR e rankings públicos |
| 20 | Evidence-region grounding | Proporção de caixas delimitadoras que de fato contêm as informações que fundamentam as alegações |
| 20 | Storage and latency engineering | Eficiência na compactação do DocPruner, latência de recuperação p95 e tempo de síntese p95 |
| 20 | Multi-page reasoning | Precisão das respostas em um conjunto contendo 100 perguntas com respostas baseadas em múltiplas páginas |
| 15 | Source-inspection UX | Fluidez na interface de visualização do Next.js, precisão dos overlays e comparativos lado a lado |
Exercises
Execute um comparativo de desempenho entre o ColQwen2.5-v0.2 e o ColQwen3-omni no mesmo corpus. Identifique quais páginas cada modelo acerta ou erra e insira tags de tipo de conteúdo na indexação para roteamento inteligente de consultas.
Aumente o nível de poda (pruning) do DocPruner para 75% e 90%. Localize a queda acentuada de desempenho (cliff): o nível de compressão a partir do qual o nDCG@5 do modelo cai abaixo do baseline de OCR tradicional.
Monte um sistema híbrido: execute a busca baseada em OCR comum e ColQwen em paralelo, realize a mesclagem usando RRF (Reciprocal Rank Fusion) e aplique reordenação com um cross-encoder. Esse sistema supera as pipelines isoladas? Indique quais formatos de documentos obtêm os maiores benefícios.
Substitua o Qwen3-VL-30B por um modelo menor (Qwen2.5-VL-7B). Trace a relação de custo-benefício (precisão obtida versus custo financeiro de processamento).
Adicione suporte para documentos contendo escrita à mão. Indexe o corpus manuscrito, gere embeddings via ColQwen e meça a taxa de recuperação em comparação com ferramentas clássicas de OCR de caligrafia.
Key Terms
| Term | What people say | What it actually means |
|---|---|---|
| Late interaction | "Busca no estilo ColPali" | Abordagem onde cada token da consulta é comparado de forma independente contra os patches de imagem do documento; MaxSim realiza o agregamento final |
| Multi-vector | "Embeddings por patch" | Modelo onde cada página do documento é representada por um conjunto de múltiplos vetores, em vez de comprimida em um único vetor global |
| MaxSim | "Cálculo de interação tardia" | Algoritmo que calcula para cada token da pergunta a similaridade máxima encontrada contra os vetores do documento e realiza o somatório final |
| DocPruner | "Compactação de patches" | Técnica de poda lançada em 2026 que descarta metade dos vetores irrelevantes de patch da imagem mantendo a qualidade da busca |
| ViDoRe v3 | "Benchmark de recuperação visual" | Padrão consolidado de avaliação de qualidade de sistemas de recuperação sobre documentos complexos baseados em imagem |
| Evidence region | "Caixa de evidência" | Coordenadas geométricas que delimitam exatamente onde está a informação consultada na página do documento original |
| OCR fallback | "Canal de equações" | Pipeline secundária de OCR textual executada em conjunto com o modelo de visão para assegurar fidelidade de fórmulas e caracteres densos |
Further Reading
- ColPali (Illuin Tech) repository — repositório do modelo de referência de busca visual
- ColPali paper (arXiv:2407.01449) — artigo teórico fundador da busca tardia sobre imagens
- ColQwen family on Hugging Face — repositório de checkpoints de produção do ColQwen
- M3DocRAG (Adobe) — baseline de RAG multimodal para documentos com páginas múltiplas
- Vespa multi-vector tutorial — tutorial de indexação ColPali com o Vespa
- Qdrant multi-vector support — documentação do suporte multi-vector do Qdrant
- AstraDB multi-vector — suporte a consultas tardias no AstraDB
- Nougat OCR — extrator de fórmulas matemáticas Nougat (OCR fallback)