housing-pro-api online runtime Hono rotas 3 embeddings Ollama ROI Labs

Backend do Housing Pro

Achar o texto sem a palavra.

A busca por palavra-chave falha exatamente onde o usuário mais precisa: quando ele descreve o que quer com as palavras dele, e não com as do artigo.

Cada conteúdo é convertido em vetor pelo Ollama e guardado no Postgres com pgvector. A pergunta vira vetor pelo mesmo caminho, e o que volta é o que está mais próximo em significado — não o que repete o termo.

POST /search similaridade de cosseno sobre PostEmbedding

Nenhum resultado abaixo repete a frase da pergunta.  

O caminho de uma busca

Quatro passos, nenhum deles no cliente

Embedding é caro e determinístico: gerar de novo o mesmo vetor para o mesmo texto é desperdício. Por isso o conteúdo é vetorizado uma vez, na ingestão, e só a pergunta paga o custo na hora.

  1. O conteúdo entra e vira vetor

    Uma vez só, na ingestão. O resultado fica em PostEmbedding, ao lado do texto.

  2. A pergunta chega em /search

    O mesmo modelo do Ollama gera o vetor da pergunta — tem que ser o mesmo, senão os espaços não se comparam.

  3. O Postgres ordena por distância

    pgvector faz a comparação dentro do banco. Não há re-ranqueamento em memória na aplicação.

  4. Volta a lista, com a similaridade junto

    Quem chama decide o corte. A API não esconde o score atrás de um "relevante / não relevante".

Superfície

Três rotas, e é isso

É um backend pequeno de propósito. O que não é busca semântica nem e-mail transacional mora em outro lugar.

RotaMétodoFaz
/searchPOSTBusca semântica sobre PostEmbedding, por similaridade de vetor.
/contactPOSTRecebe o lead, grava em Contact e dispara o e-mail pelo Resend.
/healthGETHealth check.

Stack

Escolhas, e o motivo de cada uma

Nada aqui é padrão de mercado por si só — cada peça está aqui resolvendo um problema específico deste backend.

Hono

Servidor HTTP mínimo sobre @hono/node-server. Três rotas não justificam um framework com opinião sobre pastas.

Prisma 5 + pgvector

O mesmo Postgres guarda os dados e os embeddings. Um banco a menos para operar, e a busca acontece onde os dados já estão.

Ollama

Embeddings gerados localmente, sem custo por token e sem rate limit — o que importa quando se vetoriza um acervo inteiro de uma vez.

Resend + React Email

O e-mail transacional é escrito como componente em src/emails, versionado junto com o código que o dispara.

ioredis

Cache e fila. Evita reprocessar o que já foi respondido e segura picos sem derrubar a ingestão.

TypeScript

O contrato das três rotas é tipado ponta a ponta — inclusive o formato do vetor, que é onde erro silencioso costuma nascer.

Rodar

Postgres com a extensão ligada

O único passo fácil de esquecer é a extensão: sem vector habilitada, a migration do Prisma sobe e a busca falha só na primeira consulta.

# 1 · extensão no banco
psql $DATABASE_URL -c "CREATE EXTENSION IF NOT EXISTS vector"

# 2 · schema + modelo de embedding
npx prisma migrate deploy
ollama pull nomic-embed-text

# 3 · subir
npm run dev
Ler o código no GitHub