Um tutorial detalha a construção, em Python, de um pipeline de geração aumentada por recuperação (RAG) multimodal, capaz de pesquisar e raciocinar tanto sobre texto como sobre imagens extraídas de documentos complexos. O princípio visa os PDF que misturam prosa, tabelas e gráficos, formatos onde um RAG clássico tem dificuldades se basear apenas no texto.
O RAG consiste em recuperar excertos de um documento para os transmitir a um modelo de linguagem antes que este formule a sua resposta. Aplicado apenas a texto, o processo dá bons resultados. Por outro lado, uma segmentação baseada apenas no texto destrói a formatação das tabelas e deixa de lado as imagens, de modo que o sistema responde a partir de uma visão incompleta do documento. O pipeline descrito trata, pelo contrário, as imagens como objetos interrogáveis da mesma forma que o texto.
A realização baseia-se no LangChain, na biblioteca unstructured e na API da OpenAI. O tutorial descreve quatro etapas: analisar o documento, resumir as imagens, armazenar o conjunto e interrogar o sistema. O pacote poppler-utils, uma dependência do sistema, é necessário para o unstructured extrair as imagens dos PDF.
Separar o texto e as imagens
A função partition_pdf() do unstructured lê o documento e classifica cada elemento por tipo: parágrafos, tabelas e imagens incorporadas. As imagens são guardadas numa pasta dedicada, enquanto os blocos de texto são agrupados em fragmentos de 4000 caracteres no máximo, de acordo com os títulos. Um ciclo separa depois os fragmentos textuais dos caminhos de acesso às imagens.
Uma base vetorial clássica não sabe indexar diretamente uma imagem. Cada imagem é, portanto, transmitida ao GPT-4o, com a instrução «Describe this image in detail for use in a search system», de modo a obter uma descrição detalhada que serve de substituto interrogável. O tutorial assinala um custo nesta etapa: cada imagem desencadeia uma chamada à API. Para os documentos que contêm muitos logótipos ou ícones, sugere filtrar as imagens mais pequenas antes deste tratamento.
Um armazenamento a dois níveis
A arquitetura assenta num MultiVectorRetriever, que gere dois espaços de armazenamento. O primeiro, uma base vetorial Chroma, contém os fragmentos de texto e as descrições de imagens, transformados em vetores com o modelo de embeddings text-embedding-3-small. O segundo, uma loja de documentos em memória, conserva o conteúdo bruto. Cada entrada está ligada ao seu equivalente por um identificador único. Uma vez realizada a pesquisa sobre as descrições, o sistema recupera assim o fragmento de texto ou o ficheiro de imagem original.
Durante uma consulta, a pergunta é ela própria vetorizada e comparada com os elementos indexados. Os fragmentos de texto são transmitidos tal como estão, enquanto as imagens recuperadas são abertas e depois codificadas em base64, um formato de texto que permite juntá-las à consulta. O conjunto é enviado ao GPT-4o, que produz uma resposta baseada nos dois tipos de conteúdos. O tutorial ilustra a abordagem com a pergunta «What does the revenue chart show for Q3?», que pode assim ser reutilizada tal como está como exemplo.
Pistas de evolução
O autor menciona várias extensões possíveis: adicionar uma etapa de reclassificação (re-ranking) para melhorar a precisão da pesquisa, guardar a base Chroma em disco para uso em produção, ou explorar os modelos visão-linguagem como o ColPali, que integram diretamente as páginas de documentos sob a forma de imagens e dispensam assim a etapa de análise.





