Busca e recomendação de serviços públicos
Busca que entende "quero parar de fumar" e encontra o Programa Antitabagismo.
Meu papel
Autor principal da camada de descoberta, com 73 dos 106 commits. Antes dela, mantive a busca anterior sobre Typesense.
- 519
- req/s de pico no teste de carga
- 0%
- de erro em 238 mil requisições
- 3
- listas combinadas por RRF
Problema
O cidadão escreve do jeito dele e o catálogo usa o nome oficial do serviço, então a busca textual sozinha não achava. Serviços, cursos e vagas ainda ficavam em bases separadas.
Solução
Camada de descoberta em Go sobre PostgreSQL com pgvector, pg_trgm e unaccent. A consulta é expandida com sinônimos e dispara, em paralelo, o embedding da pergunta e um HyDE, um documento hipotético gerado pelo Gemini e também vetorizado. Busca textual em português, vetor da pergunta e vetor do HyDE são combinados por Reciprocal Rank Fusion, e os 20 primeiros passam por um reranker cross-encoder.
Destaques
- Degradação em etapas. Se o Vertex AI não responde em 4 s, a busca cai para duas listas e, se preciso, para texto puro.
- Recomendação por perfil do cidadão em 6 dimensões (escolaridade, renda, território, acessibilidade, faixa etária e contexto).
- CPF nunca é gravado em claro. Entra como hash com sal, tanto no banco quanto no cache.
- Na versão anterior, sobre Typesense, adicionei crawling e um serviço de LLM para ingestão de documentos.
Resultado
No teste de carga em staging foram 238 mil requisições, pico de 519 req/s e nenhum erro. A análise também apontou a causa da cauda lenta, retries contra um endpoint de embedding descontinuado.