Menlo TechReal Estate
Case Remax

Tour de Algoritmos

Como a inteligência artificial está entrelaçada em tudo o que a Menlo Tech faz.

Role para começar o tour

Na Menlo Tech, transformamos dados de um negócio em páginas que as pessoas encontram — e que os mecanismos de IA citam. Nossos clientes têm milhares de assuntos legítimos para cobrir (cidades, bairros, produtos, integrações, regras), mas nenhuma equipe editorial consegue escrever, revisar e manter tudo isso à mão.

É aí que entram os algoritmos. Eles decidem quais assuntos merecem uma página própria, como ela deve ser montada, quando ela vai ao ar, se continua no ar e o que a plataforma aprende com cada resultado. Agentes de IA fazem o trabalho repetitivo; pessoas fazem o trabalho que exige julgamento. Os algoritmos escolhem quem faz o quê.

4.200
consultas brutas coletadas
38
intenções agrupadas
78%
páginas sem revisão humana
480
páginas no quarto lote

Números ilustrativos do exemplo percorrido neste tour.

  • Agrupamento de intenções
  • Pontuação de viabilidade
  • Atribuição por otimização
  • Orquestração de agentes
  • Detecção de duplicidade
  • Lançamento com portões
  • Cadeias de Markov
  • Previsão de demanda
  • Lote econômico
  • Infraestrutura de dados

Vamos acompanhar o caminho de um único conjunto de páginas — da ideia até a citação por uma IA — para ver alguns dos algoritmos envolvidos. Depois, vamos afastar a lente e olhar o sistema inteiro.

Capítulo 1

Descoberta de demanda

Tudo começa com uma pergunta simples: sobre o que as pessoas — e as IAs — realmente perguntam?

Coletamos sinais de busca de várias fontes: consultas do Search Console do cliente, sugestões de autocompletar, perguntas feitas a assistentes de IA e o que os concorrentes já cobrem. Cada ponto é uma consulta bruta — milhares delas, ruidosas e redundantes.

Consultas são transformadas em vetores com um modelo de linguagem. Frases diferentes com a mesma intenção (“apartamento em Botafogo”, “morar em Botafogo”, “Botafogo vale a pena?”) acabam próximas no espaço vetorial.

sim(q, p) = cos θ = (eq · ep) / (‖eq‖ ‖ep‖)

A proximidade é medida por similaridade de cosseno entre os vetores.

Um algoritmo de agrupamento junta as consultas em intenções. Cada grupo recebe um volume agregado, um nível de dificuldade e um tipo de intenção: informativa, comparativa, transacional.

vol(Ck) = Σq ∈ Ck vq  ·  Ck = { q : argmaxj sim(q, μj) = k }

Os grupos são cruzados com os dados que o cliente já tem. Um grupo de intenção com dados de suporte vira um candidato a tipo de página; um grupo sem dados vira uma lacuna a preencher — ou uma ideia descartada.

cobertura(k) = |colunas utilizáveis(k)| / |colunas exigidas(k)|  ·  construir ⇔ cobertura ≥ θ
Teste a similaridade interativo
q p
28°
0,80
0,88cos θ
simmesma intenção?
+0,08folga sobre τ
cos θ ≥ τ ⇒ q e p entram no mesmo grupo
“morar em botafogo” “escola bilíngue zona sul” “metro botafogo horário” “aluguel 2 quartos rj” dim 1 dim 2 cos θ morar no bairro 4.8k/mês · informativa escolas 1.1k/mês · comparativa transporte 2.3k/mês · informativa aluguel 9.6k/mês · transacional Intenção Dados do cliente Decisão morar no bairro tipo de página aluguel tipo de página transporte lacuna de dados escolas descartada Cada barra é uma coluna de dados utilizável para aquela intenção. Sem dados próprios, uma página seria só texto genérico — e não é construída.
Capítulo 2

Viabilidade página a página

Um tipo de página aprovado não significa que todas as linhas da tabela merecem uma página. Esta é a decisão mais importante de todo o sistema.

Imagine o tipo “Morar em [bairro]” para uma rede imobiliária. A matéria-prima é uma tabela: uma linha por bairro, uma coluna por fato — preço médio do m², número de imóveis, tempo até o centro, escolas, parques, estações.

Primeiro, classificamos cada coluna. Colunas-chave identificam a linha; colunas distintivas variam de verdade entre as linhas; colunas cosméticas mudam pouco ou nada. Só as distintivas sustentam uma página.

Depois, pontuamos cada linha: quantos fatos distintivos ela tem que diferem do valor mais comum da coluna? Uma linha com muitos valores próprios vira uma página rica; uma linha que só repete a moda viraria uma página rasa.

score(r) = Σc ∈ D [ vrc ≠ moda(c) ]

Linhas com fatos idênticos são agrupadas em uma única página, em vez de gerar cópias.

O resultado é um veredito em três níveis: construir todas, construir algumas (com a lista exata das que passam) ou construir só uma página-hub. É um filtro conservador por desenho — uma página a menos custa pouco; mil páginas finas podem custar o domínio inteiro.

P = { r : score(r) ≥ k }  ·  veredito = todas se |P| = n; algumas se 0 < |P| < n; hub se |P| = 0
Quantas linhas viram página? interativo
1 de 3
4 de 6linhas passam
4páginas finais
construir algumasveredito
P = { r : score(r) ≥ k }  ·  linhas com fatos idênticos contam como uma página
Morar em [bairro] bairrom² médioimóveismin centroescolasparques Botafogo14.2k81218113 Tijuca8.9k1.20425143 Leblon22.6k3403463 Vila Isabel8.9k3882563 Grajaú8.9k3882563 Barra11.1k2.95052223 chave distintivas cosméticas “parques” vale 3 em todas as linhas: não distingue nada. “escolas” varia pouco e depende de uma fonte frágil. 3/3 2/3 3/3 0/3 0/3 3/3 Vila Isabel e Grajaú têm fatos idênticos: viram uma página só. Pontuação = fatos distintivos que diferem da moda da coluna (8.9k, 388, 25). Veredito: construir algumas 4 páginas passam · 1 página agrupada (Vila Isabel + Grajaú) · 1 hub “Bairros do Rio” Linhas que não passam só voltam quando ganham dados novos.
Capítulo 3

Agentes + editores

Máquinas são ótimas em cálculo repetido. Pessoas são melhores em julgamento, contexto e tom. O trabalho é dividido por um algoritmo, não por um organograma.

Cada página aprovada recebe uma especificação: quais blocos devem vir diretamente dos dados da linha, qual parcela do texto precisa variar entre páginas (nossa meta é acima de 40%), quais blocos de enchimento são proibidos e qual o padrão de título e cabeçalho.

var(p) = |T(p) ∖ Tcomum| / |T(p)|  ≥  0,40

Um agente de pesquisa reúne os fatos da linha e as fontes externas permitidas. Um agente de redação monta o rascunho dentro da especificação. Um agente de verificação confere cada número contra a origem — um número sem fonte é marcado, nunca inventado.

Mas nem toda página é igual. Algumas são rotineiras; outras tocam em assuntos sensíveis, têm dados contraditórios ou pertencem a um cliente com voz editorial forte. Um classificador estima o risco de cada rascunho e decide se ele segue direto ou passa por um editor humano.

P(revisão) = σ(β₀ + β · x)  ·  revisar se P ≥ τ

Editores também não são intercambiáveis. Atribuímos rascunhos a editores com um problema de otimização parecido com o de atribuir clientes a armazéns: um custo por par (editor, página) que combina especialidade, histórico com o cliente e o tamanho da fila de cada um — e que é recalculado várias vezes por dia.

min Σi Σj aij cij  s.a.  Σj aij = 1,  Σi aij ≤ qj

O editor trabalha em uma interface construída para entender a página rapidamente: dados da linha de um lado, rascunho do outro, cada afirmação ligada à sua fonte. Testamos variações dessa interface o tempo todo; o que aprendemos sobre como editores decidem volta para melhorar os agentes.

Dimensione a revisão humana interativo
vão para revisão
páginas revisadas
horas de editor
editores (6 h/dia)
P(risco ≥ τ) = 1 − τ0,49  ·  H = N · P · t / 60  (risco ~ Beta(0,49; 1), ilustrativo)
Especificação do tipo “Morar em [bairro]” Blocos obrigatórios a partir de dados preço · estoque · deslocamento · mapa Texto variável por página meta ≥ 40% Proibido “neste guia completo…” · histórico genérico · FAQ inventada Título Morar em {bairro}: preços, imóveis e rotina em {ano} Pesquisa agente Redação agente Verificação agente “m² médio 14.2k” ✓ fonte: base do cliente, 10/2026 “18 min até o centro” ✓ fonte: matriz de rotas “inaugurado em 1890” ✗ sem fonte → [DADO NECESSÁRIO] risco? baixo · 78% das páginas publicar alto · 22% revisão humana O classificador usa: contradições entre fontes, assuntos sensíveis, histórico de edições do cliente e novidade do tipo de página. Custo (editor, página) p1p2p3p4 AnaBrunoCarla 0.2 0.7 0.9 0.5 0.6 0.1 0.4 0.3 0.8 0.5 0.2 0.9 fila: 3fila: 1fila: 5 min Σ a_ij · c_ij, cada página a um editor, respeitando as filas Dados da linha m2_medio 14.2k imoveis 812 min_centro 18 escolas 11 Rascunho azul: ligado a um dado · vermelho: pendente de fonte
Capítulo 4

Controle de qualidade

Antes de qualquer página ir ao ar, uma amostra do conjunto é testada contra os dois modos de falha que matam páginas programáticas: quase-duplicatas e páginas rasas.

Pegamos uma amostra de páginas prontas e substituímos o valor-chave de cada uma por um marcador. Se “Morar em Botafogo” e “Morar na Tijuca” ficam idênticas depois disso, a variação era só o nome — e isso é exatamente o que os mecanismos de busca penalizam.

Depois removemos as frases compartilhadas pela maioria das amostras. O que sobra é o texto realmente próprio de cada página. Medimos a parcela variável contra a meta de 40% e comparamos as páginas entre si por sequências de cinco palavras.

J(A, B) = |G5(A) ∩ G5(B)| / |G5(A) ∪ G5(B)|

Cada página recebe um de cinco rótulos — ok, quase-duplicata, variação só pela chave, parcela variável baixa ou rasa — e uma ação: manter, fundir com outra, ou publicar com noindex até ganhar conteúdo. Nada disso depende de alguém ler mil páginas.

Ajuste as regras de qualidade interativo
manter
fundir
noindex
fundir se máxj J(i, j) ≥ τJ; senão noindex se var(i) < vmín; senão manter
Antes Morar em Botafogo Botafogo é um bairro charmoso… Com m² médio de 14.2k, Botafogo… Morar em Botafogo é ideal para… Morar na Tijuca Tijuca é um bairro charmoso… Com m² médio de 8.9k, Tijuca… Morar na Tijuca é ideal para… Depois de trocar a chave por [X] Morar em [X] [X] é um bairro charmoso… Com m² médio de [N], [X]… Morar em [X] é ideal para… Morar em [X] [X] é um bairro charmoso… Com m² médio de [N], [X]… Morar em [X] é ideal para… Idênticas: variação só pela chave. Similaridade entre amostras (5-gramas) ABCDE ABCDE — .21 .18 .24 .17 .21 — .86 .20 .25 .18 .86 — .19 .22 .24 .20 .19 — .49 .17 .25 .22 .49 — Parcela variável A 58%B 31%C 29%D 44%E 12% meta 40% Verde: distintas. Vermelho: quase-duplicata. Âmbar: revisar. Rótulo → ação A ok → manter B quase-dup. → fundir com C C quase-dup. → fundir com B D revisar → manter E rasa → noindex A regra é aplicada a cada lote antes da publicação, sem leitura manual.
Capítulo 5

Lançamento em ondas

Mil páginas nunca sobem de uma vez. O lançamento é um experimento com portões, e o algoritmo decide quando abrir o próximo.

Primeiro, a hierarquia: um hub, categorias e as páginas folha, cada nível ligado ao de cima. Os sitemaps são divididos por tipo e por lote, dentro dos limites de arquivo do Google, para que possamos observar cada onda separadamente.

Um piloto pequeno vai ao ar — grande o bastante para ser estatisticamente legível, pequeno o bastante para não doer se der errado. A partir daí acompanhamos três contagens por lote: páginas publicadas, páginas indexadas, páginas indexadas sem nenhuma impressão.

Os critérios de parada são regras explícitas sobre essas razões. Se a taxa de indexação cai abaixo do limite, ou a parcela de páginas indexadas sem impressões sobe acima dele, a onda seguinte não abre. Cada causa tem sua própria ação de reversão: reforçar links internos, enriquecer dados, aplicar noindex ou fundir páginas.

abrir lote t+1 ⇔ idxt/pubt ≥ θ₁  ∧  zerot/idxt ≤ θ₂

Quando o lote passa, o próximo abre maior. O mesmo mecanismo que acelera um conjunto saudável freia um conjunto doente — e a decisão está registrada, lote a lote, para quem quiser auditar.

nt+1 = 2 · nt  se o portão abre;  pausa, caso contrário
Abra ou feche o portão interativo
páginas publicadas
próximo lote
abrir ⇔ idx/pub ≥ θ₁ ∧ zero/idx ≤ θ₂  ·  nt+1 = 2 nt
Hub: Bairros do Rio Zona Sul Zona Norte Zona Oeste … páginas folha sitemap-bairros-zs-lote1.xml sitemap-bairros-zn-lote1.xml sitemap-bairros-zo-lote1.xml ≤ 50.000 URLs · ≤ 50 MB por arquivo Lotes páginas piloto 60 publicadas60 indexadas51 indexadas sem impressão6 idx/pub = 0,85 · zero/idx = 0,12 60 120 240 portão fechado lote 3: idx/pub = 0,61 < 0,75 zero/idx = 0,31 > 0,20 Reversão por causa baixa indexação →links internos + sitemap sem impressões →enriquecer dados ou noindex 60 120 240 480 próximo ✓✓✓✓ Cada ✓ é uma decisão registrada com as contagens que a justificaram.
Capítulo 6

Aprender com o mercado

Publicar é o começo, não o fim. Cada página passa a gerar sinais — e esses sinais são a matéria-prima de todos os capítulos anteriores.

Uma vez no ar, cada página tem um estado: publicada, indexada, com impressões, com cliques, citada por uma IA. Registramos cada mudança de estado, junto com tudo o que aconteceu entre uma e outra — uma edição, um dado atualizado, um link novo.

Com milhares de páginas, as transições viram uma matriz. Ela nos diz, por exemplo, qual a probabilidade de uma página indexada passar a ser citada por um assistente de IA em 30 dias — e como essa probabilidade muda quando a página tem uma tabela de dados, uma resposta direta no topo ou uma fonte citada.

Mij = N(i → j) / Σk N(i → k)

Esse é um modelo de cadeia de Markov simples, e ele é surpreendentemente útil: deixa-nos simular o conjunto inteiro meses à frente, comparar tipos de página entre si e identificar quais características de uma página mais movem a probabilidade de citação.

πt+1 = πt M  ·  πt+k = πt Mk

O que o modelo aprende volta para os agentes de redação como regras de especificação, para o classificador de risco como novas variáveis e para a viabilidade como pesos de coluna. O ciclo fecha — e a próxima onda já começa melhor que a anterior.

O que move a chance de citação por IA? interativo
chance em 30 dias (indexada → IA)
citadas a cada 1.000 indexadas
razão de chances
logit(p) = logit(0,07) + Σ βi xi  ·  βi = logit(pi) − logit(0,07)
publicadaindexadaimpressõescliquescitada por IA /morar-em-botafogo 02 out publicada 05 out indexada 11 out 1ª impressão 19 out tabela de preços atualizada Toda transição e todo evento entre transições ficam registrados. Transições em 30 dias idximprcliqIA pubidximpr .82.05.00.00 —.64.11.07 ——.38.19 com tabela de dados: .07 → .13 com resposta direta no topo: .07 → .16 com fonte citada: .07 → .11 πt+1 = πt · M tipo “Morar em” tipo “Imóveis à venda” mês 0mês 6 Simulação da parcela de páginas citadas por IA, por tipo, a partir da matriz de transição observada. → regras de especificação (cap. 3) → variáveis do classificador de risco (cap. 3) → pesos de coluna na viabilidade (cap. 2) O ciclo fecha O que o mercado responde vira regra para a próxima onda.
Capítulo 7

Previsão e prioridade

Afastando a lente: com dezenas de clientes e centenas de milhares de páginas, o recurso escasso deixa de ser escrever e passa a ser atenção — de rastreadores, de editores e de computação.

Páginas envelhecem em ritmos diferentes. Um guia de bairro muda devagar; uma página de imóveis à venda muda todo dia. Cada página tem um modelo simples de “frescor”: quanto seus dados mudaram, quanto tráfego ela recebe e há quanto tempo foi revalidada.

frescor(p) = w₁ Δdados + w₂ tráfego + w₃ idade

Esse modelo decide a ordem de regeneração. Em vez de reconstruir tudo a cada hora, regeneramos primeiro as páginas em que o ganho esperado é maior — e o mesmo sinal alimenta o orçamento de rastreamento que pedimos aos mecanismos de busca.

Olhando ainda mais longe, a demanda de busca é sazonal e previsível. Com séries históricas por intenção, antecipamos quais conjuntos de páginas precisam estar prontos — e revisados por pessoas — meses antes do pico, para que a capacidade editorial esteja onde o tráfego vai estar.

yt = Tt + St + εt  (tendência + sazonalidade + ruído)
Monte o escore de frescor interativo
escore de frescor
quando regenerar
Fila de regeneração páginaΔ dadostráfegoidade /imoveis-a-venda/botafogoaltoalto6 h /morar-em-botafogobaixoalto3 d /morar-em-grajauzerobaixo9 d /escolas/tijucamédiomédio2 d frescor(p) = f(Δ_dados, tráfego, idade) Três sinais baratos de medir, combinados em um só escore. /imoveis-a-venda/botafogo0.92 /escolas/tijuca0.61 /morar-em-botafogo0.34 /morar-em-grajau0.08 Prioridade Regeneradas primeiro: as duas de cima. A última pode esperar dias. O mesmo escore ordena o sitemap e o lastmod enviados aos rastreadores. Demanda por intenção: “morar em” (Rio) pico previsto revisão humana janabrjuloutdez A capacidade editorial é reservada antes do pico, não depois.
Capítulo 8

Gestão de estoque

Cada venda tira um imóvel da carteira. O desafio é repor na hora certa e na quantidade certa.

Em cada bairro, a carteira de imóveis funciona como um estoque: cada venda ou locação retira uma unidade, e a captação de novos imóveis a repõe. Sem reposição, as páginas de “imóveis à venda” esvaziam e os corretores ficam sem o que oferecer.

O difícil é o momento e o tamanho da captação. Captar demais deixa imóveis parados, anúncios envelhecendo e capital imobilizado; captar de menos deixa o bairro sem oferta. Queremos minimizar a soma do custo de captação e do custo de carregar estoque — este proporcional à área sob a curva.

CT(Q) = K · D / Q + h · Q / 2

Somando os dois custos, aparece um tamanho de lote que os equilibra. Captar em lotes maiores dilui o custo fixo de cada campanha, mas infla o estoque; lotes menores fazem o oposto. O mínimo da curva é o lote econômico.

Q* = √(2 K D / h)  ·  CT* = √(2 K D h)

Mexa nos controles ao final deste capítulo para ver o mínimo se deslocar.

A pergunta real é maior: quanto captar de cada tipo, em qual bairro, e quais anúncios antigos baixar para abrir espaço. Respondemos com um modelo da dinâmica do sistema, ajustado ao histórico e usado em otimização robusta, com incerteza quantificada nas previsões de demanda.

∂x/∂t = f(xt, ut, wt)  ·  meses de estoque = x / d

x = níveis de estoque por bairro · u = captação, realocação e baixa · w = previsão de demanda. Na prática olhamos cada tipo de imóvel em cada bairro; aqui ficamos no caso simples.

Encontre o lote econômico interativo
K·D/Q h·Q/2 custo total lote Q Q*
lote ótimo Q* (imóveis)
custo mínimo CT* por mês
ciclo ótimo de captação
custo extra do seu Q
Q* = √(2KD/h)  ·  T* = Q*/D  ·  valores em R$, ilustrativos
tempo imóveis em estoque x(t) ↘ cada venda retira um imóvel ↑ captação repõe K K K área sob a curva = custo de carregar (h) cada captação paga um custo fixo K lote Q custo por mês captação K·D/Q carregar h·Q/2 custo total mínimo: Q* Meses de estoque por bairro alvo: 3 a 6 Botafogo1,8 · captar Tijuca4,7 · manter Leblon9,1 · baixar Barra3,2 · manter meses de estoque = imóveis em carteira ÷ vendas por mês ∂x/∂t = f(xt, ut, wt) x: estoque por bairro · u: captar, realocar, baixar · w: demanda prevista
Capítulo 9

Plataforma de dados

Nada disso funciona sem uma base que deixa cada equipe de algoritmos trabalhar de ponta a ponta sem pedir permissão a ninguém.

Os dados do cliente entram por conectores e viram tabelas versionadas: cada linha carrega a fonte e a data de origem. É essa linhagem que permite ao agente de verificação dizer “este número vem daqui” e ao editor confiar nele.

Em cima disso, uma camada de serviços internos: viabilidade, geração, controle de qualidade, lançamento e aprendizado são serviços independentes, cada um com sua fila e seus registros. As equipes de algoritmos escrevem a lógica; a plataforma cuida de escalar, repetir e observar.

Na ponta, as páginas são servidas estaticamente e regeneradas de forma incremental, página a página, na ordem que o modelo de frescor decide. Para o visitante — e para o rastreador — a página sempre existe e sempre responde rápido; a complexidade fica toda atrás dela.

R/dia = N · q · 24 / T
Quanto custa regenerar? interativo
regenerações por dia
se regenerasse tudo
CPU·h por dia (~0,4 s/página)
R = N · q · 24 / T  ·  economia = 1 − q
Dados versionados bairros@2026-10-19 · fonte: CRM do cliente rotas@2026-10-12 · fonte: matriz de deslocamento CRM Planilhas APIs Conectores Toda linha sabe de onde veio e quando. tabelas · linhagem · versões Serviços internos viabilidade geração qualidade lançamento aprendizado Cada serviço: fila própria, registros próprios, escala própria. As equipes de algoritmos escrevem a lógica; a plataforma cuida do resto. fila → execução → registro Entrega Páginas estáticas · regeneração incremental por página revalidate(p) = f(frescor) · resposta em milissegundos

Há muita coisa acontecendo

Para recapitular o caminho de um único conjunto de páginas: descobrimos uma intenção com demanda real, verificamos linha a linha se há dados para sustentá-la, deixamos agentes montarem rascunhos dentro de uma especificação, roteamos para editores só o que exige julgamento, testamos a amostra contra duplicidade e rasura, lançamos em ondas com portões explícitos, dimensionamos a captação de imóveis contra o custo de manter estoque — e usamos o que o mercado responde para começar a próxima onda melhor.

Esse trabalho está dividido em quatro equipes, três delas alinhadas a uma etapa do negócio e uma transversal a todas.

  • Algoritmos de DemandaDescoberta de intenções, viabilidade página a página, previsão sazonal e gestão de estoque de imóveis. Decidem o que vale construir e o que captar.
  • Algoritmos de ConteúdoEspecificação, orquestração de agentes, classificação de risco, atribuição de editores. Decidem como construir e quem revisa.
  • Algoritmos de DistribuiçãoControle de qualidade, lançamento em ondas, modelos de estado e frescor. Decidem quando publicar, quando parar e o que regenerar.
  • Plataforma de DadosConectores, linhagem, serviços internos e entrega. Não carregam lógica de negócio: constroem a base para que as outras três trabalhem de ponta a ponta.

A pergunta que atravessa tudo isso é sempre a mesma: entre o que uma máquina faz bem e o que uma pessoa faz melhor, onde fica a linha — e como medir se ela está no lugar certo?