Para uma PME brasileira, atender clientes no WhatsApp é essencial. Integrar um LLM pode automatizar respostas, mas exige arquitetura robusta e controle de custos. Neste artigo, mostramos um fluxo prático, com uma API compatível com OpenAI, para construir um chatbot eficiente.
Arquitetura básica: webhook, fila e modelo
O fluxo começa quando o cliente envia uma mensagem pelo WhatsApp. A Meta entrega essa mensagem ao seu webhook (um endpoint HTTPS na sua aplicação). Em vez de chamar o LLM diretamente no webhook, você coloca a mensagem em uma fila. Isso evita timeouts, distribui carga e permite retentativas.
Por que fila? Se o modelo demorar ou o provedor estiver instável, o webhook não fica bloqueado. A fila também permite processar mensagens em paralelo, mantendo a experiência fluida.
Exemplo de webhook que enfileira a mensagem
// webhook.js (Node.js + Express)
app.post('/whatsapp-webhook', async (req, res) => {
const { from, text } = req.body; // dados vindos da Meta
// Enfileira a tarefa para processamento assíncrono
await queue.add('process-message', { from, text });
res.sendStatus(200); // responde rápido à Meta
});
O worker consome a fila, chama o LLM e envia a resposta de volta via API do WhatsApp. O endereço da API (BASE_URL) e a chave (API_KEY) são fornecidos pela sua equipe de acesso; mantenha os dois em variáveis de ambiente.
Worker que chama o LLM
// worker.js
import { Queue, Worker } from 'bullmq';
import fetch from 'node-fetch';
const queue = new Queue('messages');
const worker = new Worker('messages', async job => {
const { from, text } = job.data;
const response = await fetch(`${process.env.BASE_URL}/chat/completions`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
model: 'gpt-4o-mini', // exemplo de modelo de baixo custo
messages: [{ role: 'user', content: text }],
max_tokens: 150,
temperature: 0.7
})
});
const data = await response.json();
const answer = data.choices[0].message.content;
// Envia resposta pelo WhatsApp (código omitido)
await sendWhatsAppMessage(from, answer);
});
Controle de custo por conversa
Cada chamada ao modelo tem um custo associado, que depende do modelo escolhido e do número de tokens processados (entrada + saída). Para uma PME, é fundamental evitar surpresas na fatura. Algumas práticas:
- Defina
max_tokensbaixo: respostas curtas reduzem tokens de saída. Para perguntas frequentes, 100–150 tokens costumam bastar. - Use modelos menores para tarefas simples: classificação de intenção ou respostas de FAQ podem usar modelos mais leves. Reserve modelos maiores para casos complexos.
- Cache de contexto: se o cliente pergunta sobre o mesmo assunto, reaproveite o histórico em vez de reenviar tudo.
- Monitore o uso: a resposta da API inclui
usage.total_tokens. Registre esse valor por conversa para identificar picos e ajustar prompts.
Registre o consumo por conversa e acompanhe os modelos disponíveis no seu contrato, mas lembre-se: o custo real varia conforme o volume de tokens. Não há economia garantida; apenas uma gestão consciente.
Exemplo de monitoramento de tokens
const data = await response.json();
const totalTokens = data.usage.total_tokens;
console.log(`Conversa com ${from} consumiu ${totalTokens} tokens`);
// Salve em banco para análise posterior
await saveUsage({ from, totalTokens, timestamp: new Date() });
Boas práticas de fallback
Nem sempre o LLM responde bem. Problemas de rede, timeout ou baixa confiança podem ocorrer. Um fallback planejado evita que o cliente fique sem resposta.
- Timeout e retry: defina um timeout (ex.: 10 segundos). Se exceder, tente mais uma vez com backoff exponencial. Se falhar de novo, ative o fallback.
- Detecção de baixa confiança: para perguntas fora do escopo, o modelo pode gerar respostas incorretas. Use um classificador simples (palavras-chave) para redirecionar a um FAQ ou atendente humano.
- Fallback para FAQ ou humano: mantenha uma base de respostas prontas para as dúvidas mais comuns. Se o LLM não tiver certeza, responda com uma mensagem padrão e ofereça contato humano.
Trecho de código com fallback
async function getAnswerWithFallback(text) {
try {
const answer = await callLLM(text); // timeout 10s
if (isLowConfidence(answer)) {
return getFAQAnswer(text) || 'Posso transferir para um atendente? Digite SIM.';
}
return answer;
} catch (error) {
console.error('Erro no LLM, usando fallback:', error);
return 'Desculpe, estou com dificuldades. Tente novamente em instantes ou fale com nossa equipe.';
}
}
Cenário ilustrativo: clínica odontológica
Imagine uma clínica odontológica com 5 funcionários. O chatbot no WhatsApp responde perguntas sobre horários, agendamento e valores (sem números exatos, apenas faixas). A arquitetura:
- Webhook recebe a mensagem e enfileira no Redis.
- Worker chama o LLM com prompt específico: "Você é assistente de uma clínica odontológica. Responda de forma curta e educada."
- Controle de custo:
max_tokens=120, modelo leve. Uso médio por conversa fica em torno de 300 tokens (estimativa conservadora, sem garantia). - Fallback: se o cliente pergunta algo fora do escopo (ex.: "preciso de nota fiscal"), o chatbot responde com um link para o FAQ ou oferece falar com a recepção.
Esse fluxo reduz a carga da equipe e mantém o cliente atendido 24/7, com custo previsível e sem depender de um humano para todas as mensagens.
Conclusão
Montar um chatbot de WhatsApp com LLM para PMEs é viável com a arquitetura certa: webhook, fila e modelo. O controle de custo por conversa exige disciplina no uso de tokens e monitoramento constante. E o fallback garante que o cliente nunca fique sem resposta.
Quer entender como a sua empresa pode usar modelos de IA com atendimento e faturamento no Brasil? Fale com a gente — a equipe da TokenRecarga responde em português.