Integrar IA generativa para descrever produtos em lote e atender clientes por chat em tempo real.
Por que isto importa
IA em e-commerce não é enfeite, é alavanca de produtividade e conversão. Descrever quinhentos produtos à mão consome semanas do lojista; uma IA faz o rascunho em minutos e ele só revisa. No atendimento, um chat que responde na hora, conhece o catálogo e captura o contato do visitante recupera vendas que se perderiam no silêncio. Mas IA mal integrada é cara, lenta e frágil: chamada síncrona que trava a página, custo de token que explode, resposta que vem fora do formato e quebra o parser. Este bloco mostra como integrar dois usos comprovados em operação real, geração de descrição em lote e chat de atendimento, com a engenharia que os torna confiáveis em produção.
DescricaoIaService com Anthropic
Para descrições, o padrão usa a API da Anthropic via mozex/anthropic-php. O serviço recebe o contexto do produto (nome, categoria, cores, SKU), monta um prompt com tom configurável e pede a resposta em JSON estruturado, com descrição curta para a listagem e descrição completa em HTML para a página.
$response = $this->client->messages()->create([
'model' => 'claude-haiku-4-5-20251001',
'max_tokens' => 1024,
'messages' => [
['role' => 'user', 'content' => $prompt],
],
]);
$dados = $this->parsearResposta($response->content[0]->text);
O segredo está no prompt e no parser. O prompt fixa a persona da loja, o tom e o formato JSON exato, instruindo a IA a não escrever nada fora do JSON. O parser remove cercas de código eventuais, decodifica e, se o JSON vier inválido, lança exceção em vez de salvar lixo no banco. Use um modelo barato como o Haiku para essa tarefa de volume, porque a qualidade necessária para um rascunho revisável não exige o modelo mais caro.
Geração em lote via fila
Gerar uma descrição é rápido; gerar quinhentas no request trava o navegador e estoura o tempo limite do PHP. A geração em lote precisa rodar na fila. No painel, uma ação em massa seleciona produtos sem descrição e despacha um job por produto (ou em pequenos blocos), respeitando o rate limit da API.
foreach ($produtos as $produto) {
GerarDescricaoIaJob::dispatch($produto)
->onQueue('ia');
}
O job chama o DescricaoIaService, salva o resultado no produto e marca o item como processado. Use uma fila própria (ia) para não competir com e-mails, e aplique RateLimited ou Bus::throttle para não bater no teto da API. Assim o lojista clica em "gerar descrições", continua trabalhando, e os textos aparecem aos poucos sem nenhum travamento.
ChatIaService com OpenAI
O atendimento em tempo real usa a API da OpenAI via openai-php/laravel. O ChatIaService monta o histórico (system prompt + estado da coleta + últimas mensagens), chama o modelo e devolve a resposta. Com modelos da família gpt-5, os parâmetros mudam: usa-se max_completion_tokens e reasoning_effort em vez de max_tokens e temperature.
$payload = [
'model' => $modelo,
'messages' => $this->montarHistorico($chat),
'response_format' => $this->jsonSchemaResposta(),
'max_completion_tokens' => 800,
'reasoning_effort' => 'low',
];
$resposta = OpenAI::chat()->create($payload);
O system prompt define a persona, o catálogo resumido (categorias, destaques, promoções) e a estratégia de coleta de dados. O response_format com json_schema em modo strict força a IA a devolver dois campos: a mensagem natural para o cliente e os dados que ela conseguiu capturar (nome, e-mail, interesse). Limite o histórico às últimas dez mensagens para conter o custo de token a cada turno.
Persistir a conversa
A conversa precisa virar dado, não evaporar. Use dois models: Chat, que representa a sessão com o visitante e guarda os dados capturados, e ChatMensagem, uma linha por mensagem com autor, conteúdo, modelo usado e tokens consumidos.
ChatMensagem::create([
'chat_id' => $chat->id,
'autor' => 'atendente',
'is_ia' => true,
'mensagem' => $textoResposta,
'modelo_ia' => $modelo,
'tokens_ia' => $tokens,
]);
Persistir tudo dá três benefícios: a IA monta o histórico para responder com contexto, o atendente humano assume a conversa pelo inbox do painel quando necessário, e os dados capturados alimentam o CRM da loja. Os dados sensíveis (nome, e-mail, WhatsApp) são validados antes de gravar e nunca sobrescrevem o que já existe.
Custo, limites e falhas
IA cobra por token e pode falhar, então trate as duas coisas como requisito. Para custo: limite o histórico, use modelos baratos onde a tarefa permite, cacheie partes estáticas do prompt (como o resumo de catálogo) e registre tokens_ia por mensagem para acompanhar o gasto. Para rate limit: aplique throttle nos jobs e um limitador por sessão de chat para conter abuso.
Para falhas, jamais deixe a IA derrubar o fluxo do usuário. Envolva toda chamada em try/catch, registre o erro com Log::error e devolva um fallback gracioso, como uma mensagem pedindo o contato para um humano responder.
} catch (\Throwable $e) {
Log::error('Falha na resposta IA do chat', ['chat_id' => $chat->id, 'erro' => $e->getMessage()]);
return null;
}
Esse cuidado mantém a loja funcionando mesmo quando a API da IA está fora do ar, fica lenta ou estoura cota. A IA agrega valor quando funciona, e nunca atrapalha quando não funciona.
Critérios de qualidade
- O DescricaoIaService gera descrição curta e completa válidas, com parser que rejeita JSON inválido.
- A geração em lote roda na fila, sem travar o painel, respeitando o rate limit da API.
- O ChatIaService responde com contexto do catálogo e devolve mensagem em formato estruturado.
- Toda a conversa é persistida em Chat e ChatMensagem, com tokens registrados por mensagem.
- O custo é controlado por limite de histórico, cache de prompt e escolha de modelo adequada à tarefa.
- Falhas de IA são capturadas e logadas sem quebrar o checkout, o painel ou o chat do cliente.