1

Fiz um indexador de documentos que roda tudo offline e queria que rodassem fora da minha máquina

Comecei isso porque tinha uma pasta com algumas centenas de documentos digitalizados que eu não podia subir pra lugar nenhum. Quase nenhum tinha camada de texto, então nem buscar dentro dava.

O que ele faz

Você aponta pra pasta. Ele varre, roda OCR só nas páginas que realmente não têm texto (detecta arquivo por arquivo e pula o resto), fatia PDF grande demais, lê página por página e classifica cada uma num item com tipo, data, autor e resumo. No fim escreve quatro arquivos markdown: índice, cronologia por data, um relatório de conferência com tudo que falhou, e um texto de instruções pra colar num projeto de IA. Os originais não são tocados, tudo sai numa pasta separada.

A classificação roda num modelo aberto via Ollama, na própria máquina. O endereço fica fixo em 127.0.0.1 no código, não vem de configuração. Tem também um motor de regras determinístico que não usa modelo nenhum, pra quem não quer nem baixar nada.

Stack: Python 3.12, FastAPI, HTMX, SQLite e Ollama. 456 testes, CI rodando no Windows. Interface em português, inglês e espanhol.

Duas coisas que aprendi, e que talvez sirvam mais que o projeto em si

O num_gpu: -1 do Ollama não faz o que o nome sugere

Eu achava que significava "usa o máximo de GPU que der". Não é isso. Ele entrega a decisão pro escalonador do Ollama, que dimensiona o cache KV pra 4 requisições paralelas por padrão, guarda uma margem de segurança em cima disso e arredonda pra baixo. Resultado que eu media: placa com vários GB livres e o modelo rodando metade na CPU.

O que resolveu não foi mexer na opção da requisição. Foi setar variáveis de ambiente do servidor, que o ollama serve lê uma única vez quando sobe. Um modelo carregado, um slot paralelo, flash attention ligado e cache KV quantizado liberaram VRAM suficiente pra várias camadas a mais, sem mudar nada na saída.

Um detalhe que me custou uma tarde: se você medir a VRAM livre com o modelo já carregado, você está orçando contra um número que já inclui ele. Aí pede menos camadas do que cabe, o Ollama recarrega menor, sobra menos livre, e na próxima execução pede menos ainda. Vira uma catraca que empurra pra fora da GPU um modelo que cabia.

Modelo maior não ganhou

Medi cinco modelos sobre as mesmas janelas de um documento de 31 páginas, todos cabendo inteiros numa placa de 8 GB:

ModeloTamanhoTipo preenchidos/janela
qwen3.5:4b3,0 GB100%30,8
gemma4:e4b3,1 GB79,5%38,5
qwen3.5:9b5,3 GB79,5%86,2
qwen3:8b5,4 GB100%108,8
granite4.2:8b5,7 GB100%116,9

O 4b ganhou do 9b da mesma família. Descrever uma página é leitura e disciplina de formato, não raciocínio pesado, então tamanho ali só custa tempo.

O que eu preciso

Gente rodando em máquina que não seja a minha. Foi construído e testado essencialmente num computador só, e tenho certeza que tem coisa quebrada em GPU diferente, versão de Windows diferente, formato de arquivo que nunca passou por aqui. Issue, PR, ou só um "rodei e deu isso" já ajuda bastante.

Limitações, pra não gastar seu tempo

É Windows apenas, e não é questão de recompilar: lê WMI, registro e Performance Counters direto.

E a nota de qualidade que ele mostra na tela de resultado mede a confiança que o próprio motor declarou e quantos campos ele preencheu. Não mede se acertou. Isso está escrito no código que calcula a nota, não só no README.

GPL-3, sem monetização de nenhum tipo: https://github.com/alexccastilho/gclaude-indexer

Carregando publicação patrocinada...