Disclaimer
Este texto foi inicialmente concebido pela IA Generativa em função da transcrição de um vídeo do canal Dev + Eficiente. Se preferir acompanhar por vídeo, é só dar o play.
Introdução
No desenvolvimento de software, frequentemente nos deparamos com um desafio interessante: como permitir que usuários façam buscas usando texto livre, enquanto nossos dados estão armazenados de forma estruturada em um banco de dados relacional? Neste post, vou mostrar uma solução que implementei utilizando LLM como intermediário entre a entrada não estruturada e a busca estruturada.
O Problema
Tenho uma plataforma que conecta alunos e alunas do Dev Mais Eficiente com empresas do mercado. As empresas me fizeram um pedido: facilitar a busca dentro do universo de candidatos. Elas queriam poder escrever coisas como "Java pleno com X anos de experiência" ou "JavaScript backend sênior".
O problema é que essas informações não estavam estruturadas dentro da plataforma. Eu tinha informações sobre os cursos que a pessoa fez, as áreas de conhecimento, mas não tinha de forma organizada as linguagens de programação, senioridade, anos de experiência, etc.
Eu também não queria criar um filtro ultra estruturado com dezenas de campos: não sei quantas linguagens de programação numa caixa de seleção, níveis como júnior, pleno, estagiário, sênior, staff, anos de experiência... Isso poderia crescer de maneira indefinida.
A Solução em Duas Partes
Parte 1: Extraindo Informações dos Currículos
O primeiro passo foi perceber que os alunos já enviam seus currículos pela plataforma. Dentro desses currículos geralmente estão as linguagens e tecnologias que a pessoa tem experiência, os empregos pelos quais passou (permitindo calcular anos de experiência), e às vezes até a senioridade explícita.
Criei então uma migração que extrai o texto de cada currícculo e utiliza um LLM para retornar uma versão estruturada dessas informações. Utilizei o recurso de output estruturado do Spring AI para extrair: tecnologias, senioridade, anos de experiência e área de foco (backend, frontend, fullstack, etc.).
Essas informações são salvas como tags no perfil da pessoa. Perceba que não é nada muito robusto: tecnologias é uma lista de strings simples, senioridade e área de foco são campos que podem ser nulos dependendo do que foi possível extrair do currículo.
Parte 2: Estruturando a Query de Busca
Aqui está o pulo do gato. Quando a empresa escreve uma busca como "JavaScript pleno backend com mais de cinco anos de experiência", eu pego essa query e uso o LLM para transformá-la em uma estrutura que eu consigo buscar no banco.
O prompt é simples: informo que há uma query de busca escrita por alguém procurando devs, passo a query, e peço para extrair tecnologias, senioridade, anos de experiência e área de foco. Também adiciono um direcionamento importante: caso alguma palavra esteja escrita errada, aproximar para o que considerar mais correto.
Por exemplo, se alguém escrever "java cript" (faltando o 's'), o LLM consegue entender que é "JavaScript". Se eu fizesse uma query SQL tradicional com LIKE '%java cript%', não encontraria nada porque a palavra correta é "JavaScript".
O Meio do Caminho
Importante ressaltar que não estou usando Elasticsearch ou soluções similares que tokenizam a entrada e fazem relevância. Também não estou usando banco de dados vetorial com embeddings para fazer RAG. Essa é uma primeira iteração, um meio do caminho.
Tenho entrada não estruturada (texto livre da empresa), estruturo através do LLM, e faço uma busca normal usando Specifications do Spring Data JPA. A busca verifica se as tecnologias batem, se a senioridade corresponde, se os anos de experiência são maiores ou iguais ao solicitado.
Para soluções mais robustas, você precisaria adicionar ferramentas que tokenizam a entrada, pegam os radicais das palavras, fazem relevância e ordenação por similaridade. Mas com LLM, você consegue entregar esse meio do caminho que já resolve o problema de forma satisfatória.
Conclusão
Essa abordagem mostra como você pode trazer o LLM para dentro do seu software para gerar mais valor. A ideia é simples: usar o LLM como tradutor entre o que o usuário quer expressar em linguagem natural e o que seu sistema estruturado consegue entender e buscar.
É uma primeira iteração, não a solução definitiva. Depois dá para evoluir, criar embeddings, fazer busca por similaridade ainda mais refinada. Mas para validar se a funcionalidade gera valor antes de investir em uma solução mais complexa, essa abordagem funciona muito bem.
Dev+ Eficiente
Se você quer ir mais a fundo em como integrar LLMs no seu software, a Especialização Engenharia de AI Dev + Eficiente, fruto de uma parceria com Daniel Romero, te prepara para tomar conta de tudo que envolve essa integração: arquitetar seu RAG, fazer busca estendida, e muito mais. É um caminho para quem quer batalhar pelas oportunidades que o mercado classifica como AI Engineers.
Top comments (0)