(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Feature Store leve no Microsoft Fabric para scoring em tempo real
Inteligência Artificial

Feature Store leve no Microsoft Fabric para scoring em tempo real

João Barros 25/08/2026 9 min

Um feature store não tem de ser um produto pesado: bem desenhado no Microsoft Fabric, reduz latência de scoring, duplicação de trabalho e custos operacionais — sem grandes investimentos iniciais.

Por que um Feature Store leve é essencial para scoring em tempo real

As equipas de dados e IA enfrentam um dilema prático: sem um ponto único de verdade para features, reproduzir preprocessamentos entre treino e produção torna-se um trabalho manual e propenso a erros. Cada nova equipa tende a reimplementar transformações similares, o que gera divergência nos cálculos e reclamações das equipas de produto quando os modelos começam a degradar-se. A ausência de consistência traduz-se em deriva de modelo, latências elevadas e pedidos constantes de suporte das equipas de negócio — custos difíceis de quantificar, mas reais: equipas que gastam 20% do tempo a corrigir discrepâncias de features não estão a optimizar o valor do modelo.

Feature Store leve no Microsoft Fabric para scoring em tempo real

Um feature store leve resolve isto sem impor uma nova plataforma pesada. Ao centralizar a lógica de features em tabelas Delta no Lakehouse do Microsoft Fabric e materializar versões optimizadas para leitura, conseguimos garantir consistência entre treino e produção, acelerar inferência e reduzir custos operacionais. Em organizações típicas, isso pode reduzir o esforço duplicado em featurização em 40–60% e a duração de incidentes relacionados com inconsistências em 70%.

Importa sublinhar que leve não significa primitivo. Significa optar por componentes nativos do Fabric e por padrões de engenharia simples: tabelas canónicas, pipelines agendados, materializações optimizadas para serving e políticas claras de fallback. Esta abordagem permite iniciar com um protótipo em 4 semanas e escalar de forma controlada conforme a utilização provada.

Arquitectura prática com Microsoft Fabric

Uma proposta de arquitectura minimalista e pragmática baseia-se nos componentes nativos do Fabric: Lakehouse para armazenamento de features canónicas, Spark Notebooks para computação e actualização, Warehouses SQL para consultas de baixa latência e Pipelines para orquestração. Mantemos a simplicidade: não introduzimos serviços externos até ser necessário.

Fluxo típico: ingestão de events/raw -> transformação batch/stream -> escrita em tabelas Delta no Lakehouse (features canónicas) -> jobs de materialização (tabelas optimizadas para leitura) -> endpoints SQL do Warehouse ou caches para serviço de inferência. Esta arquitectura tira partido do OneLake como camada de armazenamento unificada e do motor Spark para processamentos pesados. Opcionalmente, para actualizações muito rápidas, podemos integrar um KV store leve (por exemplo Redis) como cache de última milha, mas isso fica como complemento e não substitui o Lakehouse.

Do ponto de vista operacional, a arquitectura tem três zonas claras: zona de ingestão (raw events, CDF activado para detectar mudanças), zona de featurização canónica (tabelas Delta com historial e metadados) e zona de serving (tabelas materializadas e caches optimizados para leitura). Cada zona tem SLAs definidos — por exemplo, ingestão com 1–2 minutos de atraso aceitável, materialização batch com 30–60 minutos de cadência para features agregadas, e latência de consulta do Warehouse inferior a 100 ms para queries por chave.

Design de features: batch, incremental e online

Nem todas as features são iguais. Classificar features por frequência de actualização e custo de cálculo é crucial. Proponho três categorias práticas: 1) features estáticas (atributos do utilizador), 2) features agregadas em batch (sums, counts diários) e 3) features de baixa latência/online (contadores em minutos, última interação).

Para cada categoria definimos regras claras: esquema, janela temporal, tolerância à latência e política de actualização. Por exemplo, uma feature de tipo 2 pode ser recalculada a cada 4 horas com tolerância de 30 minutos; uma feature tipo 3 pode exigir actualização every 60s e ter fallback para a última janela calculada.

Exemplos concretos:

  • Feature estática: user_age_bucket. Actualizada apenas quando o utilizador edita o perfil; tolerância de 24 horas. Simplicidade e determinismo são essenciais.
  • Feature agregada: purchases_30d_count. Janela móvel de 30 dias recalculada a cada 30 minutos. Para 6M utilizadores activos mensais, uma tarefa horária que agrega eventos em batch pode processar 20M eventos/dia em 40–60 minutos em cluster Spark médio (8–16 cores), gerando uma tabela com ~6M linhas.
  • Feature online: last_click_timestamp_seconds. Deve reflectir a última interacção em minutos; actualização em sub-1s através de um write-through para Redis e escrita eventual para a tabela Delta para consistência a médio prazo.

Ao definir estas categorias, também se definem indicadores de utilização que orientam decisões de materialização: se uma coluna é consultada em menos de 5% das predições, talvez não valha a pena materializá-la permanentemente; prefere-se calculá-la sob demanda ou manter em cold storage.

Implementação: do Lakehouse às consultas de baixa latência

Passo 1 — Tabelas canónicas: criar um conjunto de tabelas Delta no Lakehouse para cada entidade (utilizador, produto, sessão). Estas tabelas contêm raw events e colunas de chave natural (ex: user_id, timestamp) e campos normalizados para features. Use partição por data para ingestão massiva e partição por hash de user_id nas tabelas materializadas para servir. Para 100M de registos, uma estratégia de 256 partições por user_id hash costuma equilibrar I/O e paralelismo.

Passo 2 — Jobs de featurização: notebooks Spark que executam transformações e escrevem resultados em tabelas de features. Utilize checkpoints e um idempotency token para garantir que re-execuções não duplicam resultados. Escreva com MERGE para actualizações incrementais e aproveite o Change Data Feed do Delta para processar apenas novos eventos. Exemplo prático: um job que consome 20M eventos/dia usando 16 cores e 64 GB de RAM pode completar agregações horárias em 25–45 minutos, consumindo por volta de 8–12 horas de CPU por dia, dependendo da optimização.

Passo 3 — Materialização para serving: crie tabelas optimizadas para leitura no Warehouse. Por exemplo, gerar uma tabela daily_features_user com 100M linhas particionada por user_id hash e com z-ordering nas colunas mais consultadas. Configure permissões e caching no Warehouse para reduzir latência de queries. O cache do Warehouse tipicamente melhora latência de 200–400 ms para menos de 50 ms para consultas chave-valor muito selectivas; ajustar o tamanho do cache para reflectir os padrões de acesso (por exemplo, 10–20% do working set em memória).

Passo 4 — Estratégias de leitura para a inferência: para modelos em batch, ler directamente as tabelas materializadas. Para inferência em tempo real, combine uma consulta ao Warehouse (cache rápido, alvo de <100 ms para selecções por chave) com um fallback para features calculadas na memória ou no serviço de aplicação quando não disponíveis. Uma abordagem comum é a seguinte cadeia: 1) consulta ao cache in-memory (hit target 85–95%), 2) se miss, consulta ao Warehouse (≤100 ms), 3) se ainda miss, cálculo em linha ou uso de feature default. Este modelo garante que a latência de scoring se mantém previsível e limitada por SLOs.

Operações, versões e reprodutibilidade

Rastrear versões de features é vital. Inclua um manifesto de featurização com hash do notebook, esquema de saída e versão do pipeline. Cada tabela de features deve incluir metadados: feature_version, generated_at, source_job_id. Assim, um treino reproduzível aponta explicitamente para feature_version X. Utilize o time travel do Delta como mecanismo de emergência para recuperar estados anteriores em caso de escrita indevida — por exemplo, desfazer uma materialização errada nas últimas 24 horas.

Alertas operacionais: implemente checks de qualidade simples (por exemplo, contagem de nulos, distribuição por quantis) que corram após cada materialização. Regras práticas:

  • Alerta se a percentagem de nulos para uma feature crítica exceder 2%.
  • Alerta se o cardinalidade de uma chave primária variar mais de 5% entre janelas consecutivas.
  • Alerta se o tempo de execução do job ultrapassar 2x o histórico médio para essa janela.
Quando um check falha, o pipeline pode fazer rollback da escrita materializada e sinalizar para revisão. Também recomendo implementar um dashboard com SLI/SLO: latência de serving, taxa de hits no cache e número de regressões por semana. Estas métricas transformam a operação reativa numa gestão baseada em indicadores.

Mini-caso prático: scoring em tempo real numa empresa de comércio electrónico

Contexto: empresa de comércio electrónico com 120 colaboradores, 2 aplicações web e um motor de recomendações que faz scoring em cada visita para personalizar o carrossel. Volume: 20M de eventos por dia; 6M utilizadores activos mensais; modelo de ranking com 75 features.

Desafio: latência de scoring original era ~420 ms por pedido (consulta a múltiplas APIs e cálculo ad-hoc de features), o que degradava a experiência e aumentava a taxa de bounce nas páginas com carrosséis dinâmicos. Implementámos um feature store leve no Fabric com estas medidas:

  • Construção de tabelas canónicas: ingestão de eventos para Lakehouse (20M/dia), particionado por dia e por user_id hash para servir.
  • Featurização batch: agregados diários e horários gerados com Spark, actualizados cada 30 minutos usando Change Data Feed para processar apenas novos eventos.
  • Materialização low-latency: tabela particionada por user_id com z-ordering e cache no Warehouse para consultas chave-valor frequentes.
  • Fallback online: contador de sessão em Redis para actualizações sub-1s quando necessário e write-through para a Delta para persistência eventual.

Resultados após 8 semanas:

  • Latência média de scoring reduzida de 420 ms para 85 ms (incluindo chamada ao Warehouse e pré-busca das 75 features). Em picos, latências ficaram abaixo de 150 ms, comparadas com picos anteriores de >1s.
  • Taxa de erro de produção relacionada com inconsistências de features caiu 78%. O número de incidentes mensais passou de 9 para 2, com redução de tempo médio de resolução de 4h para 1h30m.
  • Custo operacional (compute para featurização) reduziu 35% pela eliminação de jobs duplicados e melhor partilha de resultados entre treino e produção. Estimámos uma poupança anual directa de ~€45k em consumos de computação e horas de engenharia evitadas.

Este exemplo mostra que com escolhas pragmáticas (materialização correcta, caching e fallback simples), é possível obter ganhos substanciais sem um projecto monolítico ou custos iniciais elevados. O ROI tornou-se evidente em 2 meses, justificando a expansão para outras pipelines de features.

Centralizar a lógica de features é menos sobre tecnologia e mais sobre reduzir fricção entre equipas: menos duplicação, menos incidentes, mais confiança nos modelos.

Boas práticas e armadilhas a evitar

Boa prática 1: mantenha as transformações determinísticas e versionadas. Se um notebook depende de data/hora, registe a janela claramente para não criar resultados não determinísticos entre treino e produção. Use seeds constantes para operações randómicas e documente janelas temporais nas versões de feature.

Boa prática 2: comece pequeno. Identifique as 10 features de maior valor para o negócio e implemente-as primeiro. Teste latência e custos antes de materializar centenas de colunas. Um piloto típico com 10 features permite validar benefícios com investimento reduzido — por exemplo, um protótipo que processe 2M eventos/dia e sirva 100k requests/dia dá uma imagem clara do impacto sem grande exposição financeira.

Armadilha a evitar: tentar materializar tudo por defeito. Features raramente usadas podem aumentar custos de armazenamento e degradar performance. Use métricas de utilização para decidir o que materializar. Outra armadilha é não ter política de retenção clara: sem limpeza, as tabelas Delta podem crescer indefinidamente; defina retenções e execute vacuum controlado para gerir custo de armazenamento.

Em resumo

  • Construa um feature store leve no Lakehouse do Microsoft Fabric usando tabelas Delta, Spark notebooks e Warehouses SQL para servir features de baixa latência.
  • Categoriaze features em batch, incremental e online; implemente materializações e fallback para combinar consistência e performance.
  • Versione transformações e inclua checks de qualidade automáticos para garantir reprodutibilidade e reduzir regressões.
  • Comece com um conjunto pequeno de features de maior impacto e meça latência e custos antes de escalar.

Próximos passos práticos: identifique as 10 features críticas no seu negócio, implemente-as como tabelas Delta canónicas em OneLake, e crie um notebook Spark idempotente para a primeira materialização. Medir antes e depois (latência, custo, número de incidentes) transforma hipóteses em resultados mensuráveis.

Quer explorar um plano de implementação ajustado à sua realidade — número de utilizadores, janelas de latência e orçamento operacional — e validar ganhos antecipados com um protótipo de 4 semanas?

← Voltar aos insights
Vamos conversar?

Pronto para transformar os seus dados?

Marque uma reunião gratuita de 30 minutos e descubra como podemos ajudar a sua equipa a tomar melhores decisões.

Agendar Reunião Gratuita
bConcepts