passei os últimos meses aplicando pra empresas de tech enquanto
trabalhava como dev numa empresa de construção civil. 50+
currículos. 3 rejeições automáticas. nada mais.
pedi pra um dev sênior revisar. ele disse que estava bom.
fui investigar.
a maioria das empresas médias e grandes roda os currículos num
ATS antes de qualquer humano ver. o sistema compara o texto do
seu currículo com a descrição da vaga e gera um score. abaixo
de um threshold você é arquivado automaticamente.
meu currículo tinha "PostgreSQL" e "MySQL". a vaga pedia
"bancos de dados relacionais". pra qualquer dev é a mesma coisa.
pro sistema são strings diferentes.
o motor de scoring
não queria uma IA "achando" que estava bom ou ruim. queria
métrica real.
embeddings com voyage-3-lite, cosine similarity no postgres
via pgvector com índice HNSW, mais keyword matching explícito
porque boa parte dos ATS brasileiros ainda usa sistemas simples que não entendem equivalências semânticas.
score com 5 componentes auditáveis: keywords (40pts), título
e senioridade (20pts), estrutura (20pts), experiência (15pts),
requisitos obrigatórios (5pts).
a otimização
o problema de usar LLM pra reescrever é alucinação. você pede
pra injetar "kubernetes" e ele acha um jeito mesmo que você nunca tenha tocado nisso.
solução: separar classificação de reescrita.
haiku com temperatura 0.3 analisa os gaps e identifica quais
keywords têm evidência real no currículo. pra keywords sem evidência ele gera perguntas pro usuário antes de otimizar.
sonnet recebe o currículo filtrado mais as respostas confirmadas
e faz a reescrita. o validador depois confere se cada keyword
declarada no output realmente aparece no texto. score não
melhorou, otimização rejeitada.
custo por otimização separando os dois modelos: ~$0.059.
stack: node.js 22 + fastify 5, next.js 15, supabase + pgvector,
redis + bullmq, voyage AI, anthropic API, SSE pra streaming
em tempo real, VPS hostinger 4GB.
o produto se chama kore, está em beta com plano free. se quiser discutir a arquitetura estou nos
comentários.
Top comments (0)