Case 03IA e inteligência comercial
LeadSpector
De 300 mil CNPJs à abordagem certa, com a IA citando a fonte.
Plataforma de prospecção que cruza a base da Receita Federal com reclamações do Reclame Aqui e avaliações do Glassdoor para mostrar onde cada empresa sofre e o que oferecer a ela. O vendedor filtra 300 mil empresas em segundos, abre um diagnóstico com score de oportunidade e sai com o email de abordagem pronto.
- Cliente
- Software house B2B · time comercial interno
- Período
- 2025 — 2026
- Equipe
- Squad de 6 pessoas
- Papel
- Engenheiro full stack · frontend, RAG, insights e busca
- Stack
- Go · Rod · Apache Spark · PostgreSQL · Neo4j · Elasticsearch
- Confidencialidade
- Dados de clientes preservados
Resultados em números
- 300 milempresas pesquisáveis em segundosbase da Receita Federal sincronizada com o Elasticsearch
- 15 minpara preparar a abordagem de uma contaantes, cerca de 2 horas de pesquisa manual
- 13 filtroscombináveis na busca de leadsregião, porte, CNAE, capital, tempo de atividade, score e status
- 4 fatoresno score de oportunidade de 0 a 100dor, amplitude da oferta, fit de porte e confiança dos sinais
O contexto do negócio
- Cliente
- Software house B2B · time comercial interno
- Período
- 2025 — 2026
A software house vende modernização de sistemas, integração, dados e IA para empresas médias e grandes. O gargalo do time comercial não era fechar negócio: era chegar na conta certa com o argumento certo. Cada SDR montava listas na mão, pesquisava a empresa, lia reclamações de clientes e avaliações de funcionários atrás de sistema legado, processo manual ou instabilidade, e só então escrevia o primeiro email. Eram horas por conta, pouca cobertura de mercado e abordagens genéricas.
O desafio
Os sinais existem, mas estão em três lugares que não conversam: o cadastro oficial de CNPJs, em dumps brutos com milhões de linhas; o Reclame Aqui, com a dor do cliente final; e o Glassdoor, com a dor de quem opera os sistemas por dentro. Era preciso unir tudo pelo CNPJ, pesquisar centenas de milhares de empresas em segundos e transformar texto solto em oportunidade comercial, sem deixar a IA inventar um problema que a empresa não tem.
Três fontes, três formatos
Dumps da Receita em lote, Reclame Aqui em HTML com JSON-LD e Glassdoor em GraphQL paginado. Cada fonte ganhou coletor próprio, ritmo próprio e status de coleta por CNPJ.
Busca comercial em 300 mil empresas
O vendedor combina região, porte, CNAE, capital social, tempo de atividade e score de IA na mesma consulta, e a lista precisa chegar em segundos, já sem leads de outro SDR.
IA que não pode inventar
Um diagnóstico errado queima a conta. Toda evidência citada pelo modelo precisa existir no texto recuperado daquele CNPJ; o que não tem âncora é descartado antes de chegar à tela.
O que entreguei
Dividi a plataforma em coleta, preparação, recuperação e uso. Um ETL em Spark limpa a base da Receita, um daemon mantém o Elasticsearch sincronizado com o PostgreSQL e crawlers em Go levam reclamações e avaliações para um grafo Neo4j com embeddings locais. Sobre esse grafo rodam o chat RAG e o motor de insights, que pontua cada empresa de 0 a 100. No topo, um workspace em React reúne busca, perfil, funil, agenda e emails.
Busca em 300 mil empresas
Índice Elasticsearch com 13 filtros combináveis, taxonomia CNAE em quatro níveis e filtros salvos por usuário.
Diagnóstico com score de oportunidade
Três frentes de análise por empresa, evidências auditadas e um score de 0 a 100 que ordena a fila do time.
Chat RAG que cita a fonte
Perguntas livres sobre uma empresa ou um setor, respondidas com trechos recuperados e tabela de evidências.
Workspace de prospecção
Funil com cinco status, agenda, cadências, emails gerados por IA com disparo SMTP e controle de prompts.
Como funciona
Siga o trabalho atravessando o sistema, etapa por etapa, ou clique em qualquer componente do quadro para ver o que ele faz.
arraste para ver o fluxo
Legenda
- Síncrono
- Assíncrono
- Canal seguro
- Integração externa
Descrição textual do fluxo
- De Crawler Glassdoor para Grafo de contexto — Avaliações (assíncrono).
- De Crawler Reclame Aqui para Embeddings locais — Reclamações (síncrono).
- De Base da Receita para Worker de resumos — Dados cadastrais (síncrono).
- De Base da Receita para Índice de busca — Sync a cada 5 min (assíncrono).
- De Embeddings locais para Grafo de contexto — Chunks + vetores (assíncrono).
- De Worker de resumos para Grafo de contexto — Perfil por CNPJ (assíncrono).
- De Grafo de contexto para Chat RAG — Contexto (síncrono).
- De Grafo de contexto para Motor de insights — Sinais de dor (síncrono).
- De Índice de busca para Busca de leads — Resultados (síncrono).
- De Chat RAG para Workspace de vendas — Respostas com fonte (síncrono).
- De Motor de insights para Workspace de vendas — Diagnóstico (síncrono).
- De Motor de insights para Prospecção e emails — Rascunho de abordagem (assíncrono).
- De Busca de leads para Workspace de vendas — Leads filtrados (síncrono).
- De Workspace de vendas para Prospecção e emails — Lead em prospecção (síncrono).
Percorra o fluxo
←→trocam de etapa
6 etapas
Do começo ao fim
Escolha uma etapa ou pressione Reproduzir para acompanhar o fluxo inteiro. Enquanto isso, o quadro destaca por onde o trabalho passa.
Componentes do sistema
Crawler Glassdoor
- O que resolve
- Trazer a visão de quem opera os sistemas por dentro: avaliações de funcionários ligadas ao CNPJ.
- Como funciona
- Um pool de goroutines, com três workers por padrão, lê as empresas ativas do PostgreSQL. Para cada uma, o resolvedor encontra o empregador no Glassdoor cruzando nome e domínio do site, o que elimina homônimos. O interceptor captura as respostas GraphQL paginadas, até 100 avaliações por empresa, com timeout de 30 s por página e retry com backoff exponencial. O status de cada empresa fica no PostgreSQL e as avaliações vão para o Neo4j.
Go · Rod · PostgreSQL · Neo4j
Coleta de reputação
- O que resolve
- Levar a dor do cliente final para um corpus pesquisável, sem leitura manual.
- Como funciona
- O crawler do Reclame Aqui, em Go com navegador headless, descobre a página da empresa, extrai as reclamações do JSON-LD e guarda até 10 por CNPJ, com 15 s entre empresas e 3 s entre reclamações. Um daemon leva o material coletado para o grafo em lotes de 50: ritmo reduzido no horário comercial, velocidade total fora dele.
Go · Rod · PostgreSQL · Neo4j
Base cadastral e índice
- O que resolve
- Deixar a base inteira de empresas ativas pesquisável com filtros comerciais.
- Como funciona
- Um job Apache Spark lê os dumps da Receita, deduplica por CNPJ base, mantém só empresas ativas e grava no PostgreSQL. Um daemon de sincronização roda a cada 5 minutos: indexa o que mudou em lotes bulk e, a cada ciclo, reconcilia o conjunto completo de CNPJs entre PostgreSQL e Elasticsearch, para nenhuma empresa ficar invisível na busca.
Java · Apache Spark · PostgreSQL · Elasticsearch
Chunking e embeddings
- O que resolve
- Transformar texto coletado em trechos recuperáveis, sem enviar dado bruto para fora.
- Como funciona
- O texto é segmentado por sentenças em português e agrupado em chunks de até 1.000 caracteres, com uma sentença de sobreposição e hash de conteúdo para evitar duplicatas. Os vetores saem do nomic-embed-text rodando no Ollama, dentro da nossa infraestrutura, e ficam no próprio nó do Neo4j, com busca por similaridade de cosseno.
TypeScript · Ollama · Neo4j
Resumo institucional
- O que resolve
- Entregar ao vendedor um primeiro parágrafo sobre quem é a empresa antes de qualquer pergunta.
- Como funciona
- Um worker em Go encontra empresas sem resumo no grafo, ancora segmento e site no PostgreSQL, junta os dados da Receita e gera o perfil com um LLM open-weight via Groq. Cadência fixa entre empresas, backoff maior para erros 429 e nenhuma empresa marcada como enriquecida se a escrita no grafo falhar.
Go · Groq · PostgreSQL · Neo4j
Chat RAG
- O que resolve
- Responder perguntas comerciais com trechos da própria empresa e mostrar de onde veio cada afirmação.
- Como funciona
- Saudações são respondidas sem chamar o modelo. Um classificador separa pergunta sobre uma empresa de busca ampla. No primeiro caso, a recuperação traz chunks por similaridade restritos aos 8 dígitos do CNPJ base, mais resumo institucional e firmografia do PostgreSQL. No segundo, setor e UF são reconhecidos de forma determinística e viram os mesmos filtros da tela de leads. Citações sem âncora no contexto são removidas e um segundo modelo confere se a resposta está sustentada. Limite de 30 perguntas por minuto e timeout de 75 s.
TypeScript · Fastify · LangChain · Neo4j · Elasticsearch
Motor de insights e score
- O que resolve
- Dizer ao vendedor onde a empresa sofre, com qual evidência, e quanto vale a pena abordá-la.
- Como funciona
- Três frentes de análise (Arquitetura e Escalabilidade, IA e Automação, Modernização e Engenharia) rodam em paralelo. Cada uma recupera até 8 reclamações e 6 avaliações de funcionários acima do limiar de similaridade, e o modelo devolve criticidade, evidências e serviços recomendados. Evidência sem âncora é descartada; frente sem evidência não acende. O score soma dor (40%), amplitude da oferta (25%), fit de porte (20%) e confiança dos sinais (15%). Um lease com fencing token no PostgreSQL garante uma única geração por empresa entre rota individual, lote de até 200 e job em background.
TypeScript · LangChain · Neo4j · PostgreSQL
Workspace comercial
- O que resolve
- Levar o vendedor da lista ao email enviado sem trocar de ferramenta.
- Como funciona
- React 19 com TanStack Router e Query. Busca com filtros em abas e taxonomia CNAE; perfil da empresa com sócios, contatos, resumo, insights e chat; funil de cinco status com Kanban; agenda do SDR e visão do gestor; cadências multicanal; emails gerados a partir das frentes acesas, com disparo SMTP e resposta rastreada por IMAP. Os prompts do chat e de cada frente são editáveis na tela, com validação dos campos obrigatórios.
React · TypeScript · TanStack Router · Fastify
Decisões que sustentam o sistema
Grafo para contexto, índice para busca
O Neo4j conecta empresa, chunks, resumo e avaliações pelo CNPJ, com o vetor no mesmo nó: a recuperação encontra os trechos certos da empresa certa. O Elasticsearch responde 13 filtros sobre 300 mil documentos. Cada um faz o que faz melhor.
Auditoria antes da tela
Toda evidência e toda citação é comparada com o contexto entregue ao modelo, por trecho literal ou sobreposição de palavras. O que não bate é removido. O vendedor só vê afirmações que consegue rastrear até a fonte.
Embeddings locais, prompts na mão do time
Vetores gerados no Ollama mantêm o dado coletado dentro da infraestrutura e zeram o custo por documento. Os prompts ficam no banco, editáveis pela tela, com os placeholders obrigatórios validados ao salvar: o time ajusta tom e foco sem quebrar a geração.
Uma geração por empresa, mesmo sob concorrência
Insights saem por três caminhos: clique no perfil, lote na listagem e job em background com 10 workers e checkpoint persistente. Um lease com fencing token no PostgreSQL impede gerações e emails duplicados, e o job retoma de onde parou depois de um deploy.
Resultado para o negócio
O vendedor monta uma lista qualificada em segundos, como indústrias de médio porte no Sul com mais de dez anos de atividade e score alto, em vez de garimpar planilhas.
Cada conta chega com o diagnóstico pronto: onde a empresa sofre, a evidência que comprova e qual serviço da casa resolve.
A preparação de uma abordagem caiu de cerca de duas horas de pesquisa para 15 minutos de leitura.
Pesquisa, funil, agenda e email no mesmo lugar: a gestão enxerga a carteira de cada SDR e nenhum contexto se perde entre ferramentas.
Meu papel
- Papel
- Engenheiro full stack · frontend, RAG, insights e busca
- Equipe
- Squad de 6 pessoas
Construí o crawler do Glassdoor e o frontend inteiro do LeadSpector. No backend, o leadspector-rag, desenhei e implementei o chat RAG, o motor de insights com score de oportunidade, a listagem de leads sobre Elasticsearch, a gestão de prospecção, a geração de emails a partir das oportunidades encontradas e o controle de prompts que deixa o time comercial ajustar cada geração sem esperar deploy.
Pelo que respondi
- Escrevi o crawler do Glassdoor em Go: pool de workers, resolução do empregador por nome e domínio, captura do GraphQL paginado e retry com backoff exponencial.
- Construí o frontend em React 19 com TanStack Router e Query: busca com filtros inteligentes, perfil da empresa, funil, agenda, emails e configurações.
- Implementei o chat RAG: classificação de intenção, recuperação restrita ao CNPJ, busca por setor e UF, auditoria de citações e verificação da resposta por um segundo modelo.
- Criei o motor de insights: três frentes de análise, auditoria anti-alucinação, score ponderado e lease no PostgreSQL para nunca gerar duas vezes a mesma empresa.
- Levei a listagem de leads para o Elasticsearch, com 13 filtros, ordenação por score e visibilidade por papel de usuário.
- Desenvolvi a geração e o disparo de emails, o rastreio de respostas por IMAP e o controle de prompts com campos obrigatórios validados ao salvar.
Stack por camada
Coleta
- Go
- Rod
- Java
- Apache Spark
Dados e busca
- PostgreSQL
- Neo4j
- Elasticsearch
- Redis
IA
- RAG
- LangChain
- Ollama
- nomic-embed-text
- Groq
Produto
- TypeScript
- Fastify
- React 19
- TanStack Router
- TanStack Query
- Tailwind CSS
Infra
- Docker
- AWS EC2
- Caddy
- GitHub Actions
- Prometheus
- Grafana
O que levo deste projeto
IA comercial ganha a confiança do time quando mostra a prova. A tabela de evidências com a fonte de cada trecho valeu mais para a adoção do que qualquer troca de modelo.
Escopo por CNPJ precisa de trava dupla: filtro na consulta e sanitização depois da recuperação. Misturar duas empresas num diagnóstico é o pior erro possível em prospecção.
Colocar o controle de prompts na mão do time comercial cortou pedidos de ajuste ao time técnico e deixou cada frente de análise falar a língua de quem vende.