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.