01 - Arquitetura de Software e Fluxo de Inteligência Artificial
Este documento descreve detalhadamente a arquitetura de software, o ciclo de vida dos dados e o fluxo de integração com Inteligência Artificial (IA) no módulo de Cadastro de Produtos e Geração de Conteúdo Automático.
1. Visão Geral da Arquitetura Célula-IA
O sistema de cadastro e enriquecimento de conteúdo foi desenhado seguindo o padrão de microsserviços e processamento assíncrono baseado em filas (Event-Driven Architecture). A infraestrutura é totalmente isolada via Docker, garantindo que picos de requisições ou o processamento pesado de modelos de linguagem (LLMs) não afetem a performance do site principal ou do banco de dados relacional operacional.
O ecossistema é composto por quatro camadas principais: 1. Camada de Ingestão e Interface (Monolito Laravel): Responsável por receber os inputs dos usuários (via painel administrativo ou planilha em lote) e gerenciar os estados de aprovação humana. 2. Camada de Mensageria e Cache Rápidas (Redis): Gerencia as filas assíncronas de processamento e armazena em cache as respostas brutas das APIs externas para otimização de custos e performance. 3. Camada de Processamento Background (Laravel Workers & Scheduler): Consome as filas de IA e encapsula a inteligência de negócios. 4. Camada de Orquestração de IA (Flowise AI & ChatGPT): Fornece o motor cognitivo que realiza a engenharia de prompts e a estruturação de saídas rígidas em JSON Schema.
2. Componentes de Infraestrutura (Mapeamento Docker)
Baseado nas configurações de microsserviços declaradas no docker-compose.yml, os seguintes containers são diretamente responsáveis pela sustentação do motor de cadastro e IA:
┌────────────────────────────────────────────────────────────────────────┐
│ SUITE - IA │
├───────────────────┬────────────────────────────────────────────────────┤
│ Container │ Função Crítica no Fluxo de Cadastro │
├───────────────────┼────────────────────────────────────────────────────┤
│ foconopreco_app │ Aplicação Laravel principal (PHP-FPM). Renderiza o │
│ │ painel, valida inputs e gerencia o CRUD de │
│ │ templates e organizações. │
├───────────────────┼────────────────────────────────────────────────────┤
│ foconopreco_redis │ Broker de mensageria que sustenta as filas e o │
│ │ cache temporário de buscas do Google. │
├───────────────────┼────────────────────────────────────────────────────┤
│ foconopreco_db │ Banco de dados relacional principal (MySQL 8.0). │
│ │ Armazena filas, conteúdos finais e organizações. │
├───────────────────┼────────────────────────────────────────────────────┤
│ foconopreco_flowise│ Orquestrador de IA (Low-Code/API). Expõe o │
│ │ endpoint interno de predição cognitivo. │
├───────────────────┼────────────────────────────────────────────────────┤
│ laravel_worker_ │ Worker dedicado exclusivo para rodar a fila │
│ conteudo │ `fila_geracao_conteudo_ia`. Concurrency controlada.│
├───────────────────┼────────────────────────────────────────────────────┤
│ foconopreco_ │ Roda em loop infinito simulando um daemon Cron para│
│ scheduler │ rodar o comando `php artisan schedule:run`. │
└───────────────────┴────────────────────────────────────────────────────┘
3. O Ciclo de Vida do Dado: O Caminho do Input ao ERP
O fluxo de enriquecimento e automação de um produto cruza de forma síncrona e assíncrona os módulos do sistema. Abaixo está o mapeamento passo a passo desse ciclo:
Passo 1: Ingestão e Entrada de Dados
O operador do sistema possui duas portas de entrada no index.blade.php:
* Adição Manual: Informa um SKU e uma Palavra-Chave (ex: Furadeira Bosch 500W) vinculando opcionalmente a um Template de IA específico.
* Importação em Massa (Planilha Interativa): Utiliza o componente Jspreadsheet para colar centenas de SKUs e Palavras-Chave copiados diretamente do Excel.
Ao submeter, o ProdutoDashboardController executa uma trava de segurança máxima (Backend): filtra registros vazios e aplica um unique('sku') para impedir duplicidades no mesmo lote. O sistema cria ou recupera o registro na tabela Produtos e faz um INSERT INTO FilaGeracaoConteudo com o status inicial pendente.
Passo 2: Despacho para a Fila (Redis)
Imediatamente após a persistência no banco, o Laravel despacha o Job ProcessarConteudoProdutoIA passando o produtoId e o idTemplateIa. Este Job é serializado e empurrado para o Redis dentro da fila de prioridade alta fila_geracao_conteudo_ia.
(Nota: Caso algum item falte na fila por oscilações, o Artisan Command DispararJobsConteudo mapeia os itens órfãos com status pendente e força o redespacho via Scheduler).
Passo 3: Consumo e Coleta Externa (Minerador)
O container laravel_worker_conteudo captura o Job pendente e altera o status na tabela FilaGeracaoConteudo para processando. O Job invoca o ConteudoIAService, que inicia a mineração de dados em tempo real:
1. Busca de Contexto Textual: Dispara uma chamada à API do Google Custom Search com a palavra-chave informada para coletar os top 5 resultados indexados (títulos e snippets técnicos).
2. Busca de Imagens: Dispara uma segunda chamada simultânea ao Google com o parâmetro searchType => image para minerar os URLs originais das fotos do fabricante espalhadas na web.
Passo 4: Engenharia Reversa e Processamento Cognitivo
Com os dados brutos consolidados, o ConteudoIAService recupera as configurações do Template de IA associado (templates_ia). Ele constrói um Meta-Prompt Rígido unindo três blocos maciços de informação:
1. Instruções de Personalidade (prompt_sistema): O tom de voz e a persona comercial extraídos via engenharia reversa.
2. JSON Schema Restrito (json_schema_saida): A tipagem e os campos obrigatórios exigidos pela aplicação, injetando travas explícitas como a proibição de hifens nos títulos e regras matemáticas rígidas de cálculo de prazos de garantia.
3. Contexto Minerado: Os dados e especificações reais do produto trazidos pelo Google.
Este bloco massivo é transmitido via protocolo HTTP interno para o container do Flowise AI (/api/v1/prediction/...), que por sua vez se comunica com a API do ChatGPT. O modelo processa o prompt e devolve uma estrutura JSON purificada contendo toda a cópia comercial, metadados SEO e fichas técnicas limpas.
Passo 5: Sanitização de Resposta e Blindagem de Imagens
O Worker do Laravel recebe a resposta da IA, remove os delimitadores de bloco Markdown (```json), valida se o retorno é um array PHP tratável e persiste os dados na tabela conteudo_gerado_ia em formato nativo JSON. O status da fila é alterado para concluido e a flag ia_processado do produto vai para 1.
O Desafio Antibot e a Solução de Padronização:
Muitos URLs de imagens retornados pelo Google vêm em formatos modernos (.webp) ou protegidos por Firewalls/Antibot do fabricante original, o que causaria quebras massivas na integração com o banco de dados Oracle externo ou ERP. Para mitigar isso:
* Durante a abertura do modal de revisão pelo usuário, o método getConteudo varre os links dinamicamente.
* Os links externos válidos passam por um motor cURL customizado (baixarImagemSegura) que simula cabeçalhos reais de navegadores desktop e ignora travas de SSL.
* O arquivo binário é capturado, processado pela biblioteca Intervention/Image, onde é convertido para JPEG (qualidade 85%), redimensionado para uma proporção quadrada perfeita de 1000x1000 pixels, centralizado sob um fundo branco sólido (->pad(1000, 1000, 'ffffff')) e armazenado de forma estática no armazenamento do servidor local (public/uploads/ia/ready_...). Links corrompidos ou que retornam telas de bloqueio HTML são expurgados do JSON automaticamente para blindar a aplicação.
Passo 6: Curadoria Humana e Validação de Segurança
Nenhum dado gerado pela IA vai diretamente para o ambiente produtivo ou ERP externo sem antes passar pelo crivo de um operador. Na interface do Dashboard, o produto finalizado exibe um botão para abrir o Editor de Conteúdo IA.
O painel monta inputs individuais e expansíveis para cada chave gerada (titulo_produto, especificacoes_tecnicas, etc). O operador pode ajustar textos pontualmente ou gerenciar a galeria de fotos (excluir imagens inválidas por clique ou realizar o upload de arquivos .jpg e .png locais da sua máquina).
Ao clicar em "Salvar e Aprovar", uma trava de segurança no Frontend inspeciona a galeria:
1. Trava de Quantidade: É proibido aprovar produtos que não possuam pelo menos uma foto ativa.
2. Trava de Link Externo: O sistema varre o atributo src das imagens. Se qualquer imagem mantiver um link externo que não foi internalizado pelo servidor local (ou seja, que não contenha a assinatura de segurança uploads/ia/ready_), o botão é bloqueado exibindo uma mensagem de erro grave ao usuário. Isso garante o isolamento total da infraestrutura de mídia.
Após a validação bem-sucedida, o endpoint registrarAprovacao carimba a linha da fila com aprovado = 1 e data_aprovacao = NOW().
Passo 7: Distribuição e Ingestão no ERP (API Externa)
Sistema sankhya e as rotinas do banco de dados Oracle (sankhya) realizam requisições periódicas no endpoint de saída da aplicação (/api/v1/textos-ia). A requisição exige no cabeçalho um token de segurança X-API-KEY validado dinamicamente contra a tabela Organizacoes.
O ContentApiController@getConteudoCompleto faz a mágica final de distribuição:
* Realiza subqueries complexas para agrupar as SKUs e extrair estritamente a última versão do conteúdo aprovado de cada produto, ignorando rascunhos.
* Formatador de Listas e Pontuações: Aplica rotinas de regex estruturais baseadas em regras gramaticais severas:
* Substitui duplicidades de pontuação acidentais no meio do texto (como ., ou ,.).
* Varre as especificações técnicas e itens inclusos linha por linha, removendo hifens iniciais duplicados e marcadores genéricos.
* Força todas as linhas a iniciarem com letras maiúsculas e terminarem obrigatoriamente com ponto e vírgula (;), exceto a última linha da lista, que recebe um ponto final (.).
* Preserva de forma inteligente as linhas que terminam nativamente com pontos de interrogação ou exclamação (? ou !), pulando a injeção do caractere.
* Isola as notas de rodapé normativas (ex: *Imagens meramente ilustrativas.) removendo hifens de lista e mantendo a formatação limpa.
* O endpoint responde com um JSON contendo uma paginação robusta e os códigos de identificação interna perfeitamente formatados para consumo imediato.
4. Diagrama Conceitual do Fluxo Técnico
[Painel Admin / Planilha]
│
▼
(Fila Gerada: 'pendente')
│
▼
[Redis: fila_geracao_conteudo_ia] ◄─── [Artisan Command: conteudo:disparar]
│
▼
[Worker Laravel background] ───► Altera status para 'processando'
│
├─► [Verifica Cache API Google]
│ ├─► Encontrou? Usa os dados locais a custo zero.
│ └─► Não encontrou? Consulta Google Search API e salva em Cache.
│
▼
[Construção do Meta-Prompt] (Prompt de Sistema + Schema Rígido + Contexto Google)
│
▼
[Microsserviço Flowise AI] ───► [API ChatGPT]
│
▼
[Resposta JSON Purificada] ───► Salva em `conteudo_gerado_ia` & Status = 'concluido'
│
▼
[getConteudo (Processamento de Imagens)] ───► Normalização via cURL e Intervention/Image
│ (JPEG Quadrado 1000x1000 fundo branco)
▼
[Painel de Revisão Humana] ◄─── Trava de segurança (Bloqueia imagens externas ou vazias)
│
▼
[Aprovação / Carimbo de Sucesso] (aprovado = 1, data_aprovacao = NOW())
│
▼
[API Externa: /v1/textos-ia] ───► Higienização Gramatical Rígida ───► [Ingestão no ERP]