Pitch: Como construí a arquitetura de um SaaS de WhatsApp usando RAG (e parei as alucinações da IA)
Se você acompanha o mercado de microsaas, já deve ter percebido que 9 em cada 10 projetos novos hoje prometem automatizar o atendimento com IA. O problema é que a esmagadora maioria é apenas um wrapper (um "envoltório") da API da OpenAI.
O resultado na prática? O bot inventa preços, promete serviços que a empresa não faz e deixa o cliente frustrado.
Eu queria construir algo diferente. Desenvolvi um SaaS para automatizar o WhatsApp de clínicas e negócios B2B, mas o requisito número 1 era: a IA não pode alucinar em hipótese alguma.
Neste post, vou detalhar como estruturei a arquitetura usando RAG (Retrieval-Augmented Generation) para garantir respostas blindadas ao escopo do negócio.
O Problema do "Prompt Gigante"
A primeira tentativa ingênua de qualquer dev é colocar todas as regras da empresa no System Prompt.
Exemplo: "Você é um atendente da Clínica X. Nossos preços são Y. Nossos horários são Z..."
Isso funciona para uma padaria de bairro com 3 produtos. Mas quando você lida com uma clínica que tem 50 especialidades, dezenas de convênios e regras específicas de preparo para exames, você estoura o limite de tokens rapidamente e a IA "esquece" as regras do início do prompt. Além disso, a latência vai nas alturas e o custo por mensagem fica insustentável.
A Solução: Arquitetura RAG na Prática
A premissa do RAG é simples: não envie toda a informação de uma vez. Faça o sistema "pesquisar" no banco de dados apenas o que é relevante para a pergunta do usuário e injete isso no prompt antes de chamar a LLM.
Como estruturei o fluxo no meu SaaS (usando Node.js):
- Vetorização do Conhecimento (Ingestão)
Quando o cliente faz o upload de um PDF com as regras do negócio dele ou cadastra um FAQ, o backend não salva apenas o texto.
Eu quebro esse texto em pequenos blocos (chunks).
Passo esses blocos por um modelo de embeddings.
Salvo esses vetores em um Banco de Dados Vetorial.
- A Chegada do Webhook (WhatsApp)
O WhatsApp dispara o webhook avisando que o usuário mandou: "Vocês atendem Unimed para cardiologia?"
O sistema pega essa mensagem e também a transforma em um vetor.
Faço uma busca de similaridade (Cosine Similarity) no banco vetorial: "Traga os 3 blocos de texto mais parecidos com essa pergunta".
O banco me devolve instantaneamente apenas o trecho do documento que fala sobre convênios.
- O Prompt Blindado
Agora sim, eu monto a chamada para a LLM (OpenAI/Claude). O prompt final fica mais ou menos assim:
"Você é um atendente. Responda à pergunta do usuário baseando-se ÚNICA E EXCLUSIVAMENTE no contexto abaixo. Se a resposta não estiver no contexto, diga que não sabe e transfira para um humano.
Contexto recuperado: [Injeção do trecho sobre convênios]
Pergunta do usuário: Vocês atendem Unimed?"
Os Desafios e Aprendizados
Handoff (Transbordo): A IA precisa saber a hora de calar a boca. Implementei um sistema onde, se a intenção do cliente for falar com um humano, o bot pausa a própria execução e envia um alerta para o painel de atendimento (WebSocket) para um operador real assumir.
Latência: A API oficial do WhatsApp exige respostas rápidas. Fazer a busca vetorial e a geração da LLM precisa acontecer em poucos segundos, senão a UX do cliente final fica péssima. Otimizar as queries no banco e usar modelos mais rápidos para tarefas simples foi essencial.
O Resultado
Todo esse trabalho de bater a cabeça com embeddings, webhooks e gerenciamento de estado culminou no lançamento da Weppy (weppy.com.br).
Hoje é uma plataforma SaaS rodando em produção, permitindo que negócios subam seus próprios documentos e tenham um agente de IA no WhatsApp em minutos, sem precisar escrever uma linha de código, e com a transição fluida para o atendimento humano num painel próprio.
Se alguém aqui estiver construindo algo parecido com Node/NestJS e quiser trocar figurinhas sobre redução de latência nas APIs de IA ou sobre a integração com o WhatsApp, só chamar. Feedbacks sobre a landing page também são muito bem-vindos!