Plataforma PIM multi-tenant — enriquecimento com IA & sync multicanal

Para uma marca de e-commerce com milhares de produtos ativos construí uma plataforma de Product Information Management que centraliza os dados de produto, os enriquece com IA e os mantém sincronizados entre Shopify, marketplaces e ERP — com uma pessoa a verificar cada alteração antes de ir para o ar.

PIM multi-tenant
Enriquecimento com IA
Pesquisa vetorial / RAG
Sync multicanal

Função & âmbito

Totalmente concebida e construída, e desenvolvida continuamente desde então: uma plataforma PIM multi-tenant com isolamento de tenants (super admin, admin de tenant, utilizador), um fluxo de rascunho/publicação para que cada alteração seja revista antes de ir para o ar, e registo de auditoria completo com snapshots de antes e depois.

  • Sincronização Shopify-first, a par de uma integração com o ERP NetSuite e exportação para a Amazon e outros marketplaces através do ChannelEngine.
  • Enriquecimento com IA de títulos, descrições, textos de SEO e traduções — com um passo de revisão antes de o conteúdo gerado ser publicado.
  • Um assistente RAG integrado que permite à equipa de produto pesquisar e trabalhar no catálogo por chat: pesquisa vetorial sobre os dados de produto, com chamadas a ferramentas para ações que o utilizador tem de aprovar primeiro.
  • Uma extensão do Chrome separada que permite à equipa enviar produtos das páginas de marketplace diretamente para a fila de enriquecimento.
  • Um módulo de conformidade com o GPSR europeu, um módulo de SEO com validação do volume de palavras-chave e tarefas em segundo plano (sync vetorial, enriquecimento, agendador) através de uma fila com retentativas.

Impacto

  • Mais de 3.400 produtos ativos no mercado principal, com fluxos de exportação para centenas de listagens adicionais em marketplaces como a Amazon.
  • Um pipeline de tradução por IA que sobrescrevia em silêncio os URLs de categoria foi revertido e substituído por uma versão que cria redirecionamentos e regista tudo num rasto de auditoria.
  • Um bug de sincronização em que cada ligação ao NetSuite sobrescrevia o conteúdo gerado por IA e as alterações no Shopify foi resolvido estruturalmente, em vez de ser reparado à mão de cada vez.
  • Mais de 350 commits ao longo de oito meses de desenvolvimento contínuo — não uma entrega pontual, mas um sistema que cresce com o sortido.

Arquitetura

Um monorepo Turborepo com backend NestJS e frontend Next.js 14 (App Router), um pacote de base de dados Prisma partilhado e tipos comuns. O PostgreSQL com a extensão pgvector guarda tanto os dados de produto como os embeddings, pelo que a pesquisa vetorial e as consultas normais correm sobre a mesma base de dados. O trabalho em segundo plano (sync vetorial, enriquecimento com IA, sync de marketplaces) passa por filas suportadas em Redis com retentativas automáticas e backoff exponencial, desacopladas da interface para que uma sincronização lenta de marketplace não bloqueie o resto da plataforma.

Escolha do modelo

O assistente RAG integrado é deliberadamente multifornecedor: tarefas diferentes passam por modelos diferentes (de um modelo barato para conversa de rotina até variantes mais pesadas do Claude e do GPT para trabalhos de enriquecimento mais complexos), com o preço por tokens registado por modelo, para que o custo por conversa seja visível em vez de uma caixa negra. O conteúdo gerado (títulos, descrições, traduções) passa sempre primeiro por um passo de revisão — o modelo propõe, uma pessoa aprova; a mesma razão pela qual, noutros projetos, a lógica de preços também nunca passa diretamente por um modelo de linguagem.

Custos & latência

  • O custo em tokens por conversa é registado por modelo, para que os modelos mais caros sejam usados de forma deliberada e visível, e não por defeito.
  • As tarefas em segundo plano (sync vetorial, enriquecimento) correm de forma assíncrona com um máximo de 3 retentativas e backoff exponencial, para que uma falha temporária de um marketplace não cause de imediato perda de dados.
  • A pesquisa vetorial e as consultas normais de produto correm sobre a mesma instância PostgreSQL (pgvector), o que torna desnecessária uma base de dados vetorial separada e a respetiva camada de sincronização.

Lições aprendidas

O pipeline de tradução por IA sobrescrevia os URLs de categoria sem aviso assim que uma tradução era gerada de novo — à primeira vista bom para SEO, mas partia os links externos existentes. Resolvido restaurando os URLs históricos, acrescentando redirecionamentos e construindo um rasto de auditoria que passa a tornar essas alterações visíveis antes de irem para o ar. Um segundo bug: cada sincronização com o NetSuite sobrescrevia o conteúdo gerado por IA e as alterações no Shopify assim que um produto era ligado ao NetSuite — não um incidente, mas um padrão estrutural, resolvido revendo o sentido da sincronização em vez de reparar à mão de cada vez. E um terceiro, menor mas revelador: o pipeline traduzia mal abreviaturas de materiais como «RVS» (aço inoxidável), resolvido com uma regra de glossário explícita em vez de confiar que o modelo adivinhasse o conhecimento do domínio.