Personalização de currículo com IA privada: rode local com Ollama
IA privada para personalizar currículo: o que a nuvem recebe, como escolher um modelo no Ollama e os tradeoffs de velocidade, qualidade e timeout.
Toda vez que você pede a um modelo de IA para personalizar seu currículo, ele lê o documento inteiro: seu nome, telefone, e-mail, cada empregador e data, e o que mais você guarda no arquivo. Com um provedor na nuvem, esse texto sai da sua máquina. Personalização de currículo com IA privada significa rodar o modelo no seu próprio hardware, para que o currículo (CV) e a descrição da vaga nunca saiam dele. Este post cobre por que você pode querer isso, o que um provedor na nuvem recebe quando você não faz isso, como escolher um modelo local com Ollama e os tradeoffs em velocidade, qualidade e timeouts.
Os passos de configuração estão na documentação. Veja configuração do Ollama para o fluxo com Docker e traga sua própria chave de API para a página Configurações e as variáveis de ambiente. Este post é o porquê e o quê.
Por que manter seu currículo local
Um currículo é um dos documentos mais pessoais que você tem. Ele carrega seu nome completo, um telefone, um e-mail, sua cidade e um relato datado de onde você trabalhou. Se você mantém um currículo principal, ele pode guardar também coisas que você nunca colocaria em uma versão personalizada: notas sobre por que saiu de um emprego, o salário de uma proposta, o nome de um gestor. Cole isso em uma janela de chat e você acabou de enviar tudo para uma empresa cujos termos de tratamento de dados você talvez não tenha lido.
Três grupos têm um motivo concreto para se importar.
Quem tem obrigação de confidencialidade. Se o nome do seu empregador atual, codinomes de projetos ou a lista de clientes aparecem nos seus bullets, seu currículo contém informação que um contrato pode te obrigar a proteger.
Quem está em uma busca discreta. Você não quer um registro de “personalizando meu currículo para uma vaga no concorrente” em lugar nenhum além do seu próprio disco.
Quem lê as políticas dos provedores. Os termos variam por provedor e por plano. A página de produtos comerciais da Anthropic, por exemplo, declara que entradas e saídas da API e dos produtos para empresas não são usadas para treinamento por padrão, com exceções para feedback que você envia (central de privacidade da Anthropic, datada de agosto de 2026; os planos para consumidor estão em uma página separada). Outros provedores publicam seus próprios termos. Se você prefere não depender de ter lido tudo direito, um modelo local elimina a questão.
O que um provedor na nuvem recebe
O Resume Matcher é um harness: ele envia prompts ao modelo que você conectar e aplica verificações em código ao resultado. Ele não mascara nem remove nada antes de enviar. A tabela abaixo, tirada do código do projeto, lista o que cada recurso envia ao provedor que você escolheu.
| Recurso | Enviado ao provedor |
|---|---|
| Envio do currículo (parsing) | Texto completo extraído do currículo, incluindo nome, e-mail, telefone e links |
| Análise da descrição da vaga, título do currículo | A descrição da vaga |
| Personalização (plano de habilidades, edições em diff) | Descrição da vaga mais o currículo completo em JSON estruturado, dados pessoais incluídos |
| Passagem de palavras-chave após a personalização | JSON do currículo personalizado e do principal mais os primeiros 2.000 caracteres da descrição da vaga |
| Pontuação de bullets | Texto do bullet, descrição da vaga e palavras-chave extraídas |
| Carta de apresentação, mensagem de contato | JSON completo do currículo mais a descrição da vaga |
| Preparação para entrevista | JSON do currículo (até 30.000 caracteres) mais a descrição da vaga (até 12.000) |
| Aprimoramento, regenerar, Assistente de currículo | O currículo ou um item, mais suas respostas e instruções |
| Testar Conexão | A palavra “Hi” |
Nada vai para os autores do Resume Matcher; o app não contém código de analytics. Suas chaves de API de outros provedores, o banco de dados, o quadro de acompanhamento, as configurações e os PDFs renderizados ficam no disco. A única outra requisição de saída é a biblioteca de IA (LiteLLM) baixando uma lista pública de preços de modelos na inicialização, que não carrega nenhum dado seu e usa uma cópia embutida quando você está offline.
Colar à mão no ChatGPT ou no Claude envia as mesmas coisas, com menos estrutura. Qualquer fluxo em que um modelo na nuvem lê seu currículo envia seu currículo para essa nuvem.
Como é a personalização de currículo com IA privada
Aponte o mesmo harness para um modelo rodando na sua máquina e toda linha daquela tabela fica local. O modelo lê o currículo, propõe edições, o código confere, e nenhuma requisição de rede leva o texto para lugar nenhum.
No Resume Matcher isso significa um de dois provedores em Configurações:
- Ollama, uma ferramenta gratuita que baixa modelos abertos e os serve em
http://localhost:11434. - Qualquer servidor compatível com a API da OpenAI: llama.cpp, vLLM, LM Studio ou qualquer outro que fale a API Chat Completions da OpenAI.
Quatro detalhes qualificam a palavra “privado”.
Instalar precisa de internet; usar não. Você baixa o app, as dependências, o navegador que ele usa para exportar PDF e os pesos do modelo uma vez. Depois disso, o loop de personalização roda offline. A busca da lista de preços do LiteLLM na inicialização usa uma cópia embutida quando você está offline.
Seus dados ficam em uma pasta. Currículos, descrições de vaga, versões personalizadas e o quadro de acompanhamento vivem em um arquivo SQLite dentro do diretório de dados do app, ou em um volume Docker. As configurações ficam em um arquivo pequeno ao lado. As chaves de API, se você salvou alguma, são criptografadas com um arquivo de chave que só a sua conta de usuário consegue ler. O conteúdo do currículo em si fica como dado puro nesse arquivo SQLite, então a pasta é tão privada quanto o disco em que está; um notebook com criptografia de disco inteiro resolve.
Sem analytics no app. O código não contém nenhum SDK de rastreamento. A imagem Docker também desativa a telemetria do próprio framework Next.js; se você roda o frontend a partir do código-fonte com npm run dev, essa configuração do framework fica por sua conta.
Um servidor local nunca recebe sua chave da nuvem. Se você mantém a chave de um provedor pago no ambiente e troca para o Ollama, o backend segura essa chave e não a envia ao servidor local, então trocar de provedor não pode vazá-la.
Escolhendo um modelo local
Ollama é o caminho de menor resistência. Ele baixa modelos pelo nome e os serve em uma porta local. A página Configurações do Resume Matcher sugere gemma3:4b como padrão para Ollama, e o guia de configuração do projeto lista llama3.2 e mistral como outras opções. Qualquer modelo que o Ollama sirva pode ser digitado no campo de modelo.
Comece pelo padrão. gemma3:4b é o ponto de partida sugerido pelo projeto, e um download de 3,4 GB em outubro de 2026, segundo a página do modelo no Ollama. É um modelo pequeno, então leia o parágrafo sobre edições estruturadas abaixo para saber o que esperar dele.
Vá para um maior se o hardware permitir. A mesma página lista gemma3:12b com 8,2 GB e gemma3:27b com 17 GB. Esses são tamanhos de download, e a memória que um modelo precisa em execução é outro número, que depende de quantização e tamanho de contexto. A documentação do Resume Matcher não declara requisito de RAM, e eu não vou inventar um. O FAQ do Ollama explica como verificar se um modelo carregou na GPU, na memória do sistema ou numa mistura dos dois, que é o jeito mais rápido de descobrir se um dado tamanho cabe na sua máquina.
Espere que modelos pequenos penem com edições estruturadas. Esse é o problema conhecido. O Resume Matcher não pede ao modelo um currículo novo inteiro. Ele pede uma lista de edições pontuais em um formato rígido, cada uma citando o texto original para que o código possa verificar antes de aplicar. As notas de design do projeto registram que modelos menores têm dificuldade com esse formato: devolvem saída malformada, citam texto que não bate ou pulam a estrutura. O código tenta de novo um número limitado de vezes; se as tentativas falham, você recebe um erro e pode regenerar ou passar para um modelo maior. Um modelo fraco custa tempo, e as travas valem independentemente do modelo: nomes, empregadores, cargos, datas e formação travados, e números novos revertidos.
Duas coisas que o harness faz para ajudar modelos locais:
- Modo JSON sempre ligado para Ollama, com fallback só por prompt se o servidor rejeitar, para empurrar o modelo em direção a uma estrutura válida.
- Rastros de raciocínio são removidos. Alguns modelos de raciocínio emitem um bloco
<think>antes da resposta. O código remove esses blocos antes de interpretar, então um modelo que pensa não quebra o formato de edição.
Se o modelo padrão te dá prévias malformadas no seu currículo, tente um modelo de tamanho médio antes de culpar o prompt.
Os tradeoffs: velocidade, qualidade, timeouts
Velocidade. Um modelo na nuvem responde a uma requisição de personalização em segundos. Um modelo local na CPU de um notebook pode levar minutos para o mesmo prompt, e o pipeline de personalização faz várias chamadas ao modelo por execução: extração de palavras-chave da vaga, pontuação de relevância dos bullets, um plano de habilidades, a lista de edições e uma passagem de palavras-chave depois. Cada chamada espera a anterior. Um modelo cinco vezes mais lento por chamada deixa a execução inteira cinco vezes mais lenta.
Qualidade. Modelos maiores parafraseiam com mais fluência, ficam mais perto do vocabulário da vaga e produzem menos edições quebradas. Os menores produzem redação mais dura e mais mudanças rejeitadas. As verificações em código fazem o piso ser o mesmo para os dois: um modelo pequeno não consegue inventar uma métrica ou mudar suas datas mais do que um grande, porque essas edições são bloqueadas antes de chegar a você. O teto é diferente.
Timeouts. Toda requisição de IA no Resume Matcher roda sob um único prazo, REQUEST_TIMEOUT_SECONDS, que tem padrão de 240 segundos e aceita valores de 30 a 1.800. Esse prazo cobre a execução inteira de personalização, com todas as chamadas ao modelo. Provedores locais recebem um fator de timeout dobrado, mas um modelo grande em hardware modesto ainda pode estourá-lo. Se você vê timeouts, aumente REQUEST_TIMEOUT_SECONDS no ambiente do backend e NEXT_PUBLIC_REQUEST_TIMEOUT_MS no ambiente do frontend para bater; a página traga sua própria chave de API lista as duas.
Custo. Zero por requisição com um modelo local, contra uma cobrança por chamada de um provedor na nuvem. Em uma busca de emprego com quarenta candidaturas, cada uma com currículo personalizado, carta de apresentação e preparação para entrevista, a diferença é dinheiro de verdade para alguns e troco para outros. O argumento de privacidade se sustenta sozinho de qualquer jeito.
Como tudo se encaixa
Um parágrafo, para orientação; a documentação tem os comandos.
O Ollama roda na sua máquina e escuta na porta 11434. O Resume Matcher roda ao lado, a partir do código-fonte ou no Docker, e serve o app na porta 3000. Em Configurações você escolhe Ollama como provedor, digita o nome do modelo que baixou e clica em Testar Conexão, que envia a palavra “Hi” e informa se o modelo respondeu. A partir do Docker, o app alcança o Ollama por http://host.docker.internal:11434 em vez de localhost, já que o contêiner tem seu próprio namespace de rede. Depois disso, todo recurso do app (personalização, cartas de apresentação, preparação para entrevista, aprimoramento) usa o modelo local, e o navegador imprime seus PDFs na mesma máquina.
A página configuração do Ollama tem o passo a passo com Docker, e traga sua própria chave de API cobre Configurações, variáveis de ambiente e solução de problemas tanto para o caminho do código-fonte quanto para o do Docker.
Quando um modelo na nuvem é a melhor escolha
Local é um tradeoff, e para algumas pessoas o lado da nuvem ganha. Se o seu notebook é fraco, o modelo que você consegue rodar é pequeno, e modelos pequenos produzem edições rejeitadas com mais frequência do que úteis. Se você está se candidatando esta semana e cada execução leva quatro minutos, a velocidade importa mais do que o fluxo dos dados. Se o seu currículo não tem nada que você se importe que um provedor leia, e você leu os termos do provedor, o argumento de privacidade é acadêmico para você.
Um meio-termo também funciona. Rode o modelo local para o grosso da personalização e troque o provedor em Configurações para aquela candidatura em que quer a melhor prosa. O app guarda uma chave por provedor, então trocar é um dropdown. O código das travas continua constante: seja qual for o modelo conectado, seu nome, empregadores, cargos, datas e formação ficam travados, e qualquer número que o modelo inventar é revertido antes de chegar a você.
O Resume Matcher é gratuito, open source sob a licença Apache 2.0 e usado por mais de 200 mil candidatos. Ele não vem com nenhum modelo e não hospeda nenhum site, que é o ponto central deste post: o modelo é seu, e os dados também.
Se isso ajudou
Se rodar o modelo na sua própria máquina era a versão disso que você procurava, uma estrela no Resume Matcher no GitHub ajuda outros candidatos a encontrá-lo. Você pode me seguir, Saurabh Rai, no GitHub, no X e no LinkedIn.
[Este artigo foi redigido, traduzido e formatado com a ajuda de IA. Os dados do produto foram conferidos no código-fonte do Resume Matcher, e as fontes externas estão linkadas onde são usadas.]
Gostou deste artigo? Dê uma estrela ao Resume Matcher no GitHub e acompanhe o projeto