Assistentes de IA para suporte em e-commerce precisam responder com precisão, evitar alucinações e saber quando transferir para um atendente humano. Este artigo apresenta uma arquitetura prática usando RAG (Geração Aumentada por Recuperação) sobre uma base de FAQ, com decisão de escalonamento e um método para estimar custo por atendimento. Imagine uma loja virtual de médio porte com um FAQ de 200 perguntas frequentes.
Visão geral da solução
O assistente recebe a pergunta do cliente, busca trechos relevantes no FAQ, monta um prompt com contexto e pede ao modelo de linguagem uma resposta. Se a confiança for baixa ou o cliente pedir um humano, o sistema encaminha para a fila de atendimento.
A arquitetura se divide em quatro componentes principais: interface de chat, serviço de orquestração, base vetorial para o FAQ e integração com o sistema de tickets. O componente de IA usa um modelo de linguagem compatível com o SDK da OpenAI, acessível por variáveis de ambiente.
Arquitetura em camadas
- Canal de entrada: chat no site, WhatsApp ou aplicativo. Normaliza a mensagem e envia para o orquestrador.
- Orquestrador: coordena o fluxo, chama o recuperador, monta o prompt, decide escalonamento e registra métricas.
- Base vetorial: armazena embeddings das perguntas e respostas do FAQ. Pode ser um banco como pgvector, Qdrant ou Weaviate.
- Modelo de linguagem: gera a resposta final com base no contexto recuperado.
- Sistema de tickets: fila de atendimento humano, acionado quando necessário.
Pipeline RAG sobre FAQ
O passo inicial é indexar o FAQ. Cada entrada é convertida em embeddings (vetores) e armazenada com metadados, como categoria e resposta canônica. Durante a consulta, a pergunta do cliente é transformada em embedding e comparada por similaridade de cosseno com os vetores armazenados. Os trechos mais relevantes (top-k) são inseridos no prompt do modelo.
Exemplo de código para inicializar o cliente e buscar contexto:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ['API_KEY'],
base_url=os.environ['BASE_URL']
)
def buscar_contexto(pergunta, top_k=3):
# Suponha que embedding_pergunta e busca_vetorial já estejam implementados
vetor_pergunta = gerar_embedding(pergunta)
resultados = busca_vetorial(vetor_pergunta, top_k=top_k)
contexto = chr(10).join([item['texto'] for item in resultados])
return contexto, resultados
O prompt final combina instruções, contexto e a pergunta. É importante incluir uma instrução para o modelo admitir quando não souber a resposta, reduzindo alucinações.
def gerar_resposta(pergunta, contexto):
prompt = f'''
Você é um assistente de suporte de uma loja virtual.
Use apenas as informações do contexto para responder.
Se a informação não estiver no contexto, diga que não sabe e sugira falar com um atendente.
Contexto:
{contexto}
Pergunta: {pergunta}
'''
resposta = client.chat.completions.create(
model='nome-do-modelo-fornecido',
messages=[{'role': 'user', 'content': prompt}],
temperature=0.2
)
return resposta.choices[0].message.content
Estratégia de escalonamento para humano
Nem toda pergunta deve ser respondida automaticamente. Critérios comuns para escalonamento:
- Baixa similaridade: se a pontuação do trecho mais relevante for inferior a um limiar (ex.: 0,75), o sistema encaminha para humano.
- Pedido explícito: frases como 'quero falar com uma pessoa' acionam transferência imediata.
- Sentimento negativo: detecção de frustração pode antecipar o escalonamento.
- Tópicos sensíveis: reembolsos, cancelamentos e problemas de pagamento podem exigir atenção humana.
O orquestrador pode avaliar esses critérios antes de gerar a resposta final. Uma abordagem simples é usar a similaridade do RAG como proxy de confiança. Para casos intermediários, o assistente pode pedir confirmação ou oferecer a opção de falar com atendente.
Exemplo de decisão no orquestrador:
def decidir_escalonamento(resultados, pergunta):
if not resultados:
return True
melhor_score = resultados[0]['score']
if melhor_score < 0.75:
return True
if any(termo in pergunta.lower() for termo in ['humano', 'atendente', 'pessoa']):
return True
return False
Estimativa de custo por atendimento
Para estimar o custo por atendimento, é necessário medir o consumo de tokens em cada etapa:
- Embedding da pergunta: o texto do cliente é convertido em vetor. O custo depende do número de tokens da pergunta e do custo por token do modelo de embeddings.
- Recuperação: a busca vetorial em si tem custo de infraestrutura (banco de dados), geralmente fixo ou proporcional ao volume de dados.
- Geração da resposta: o prompt completo (instruções + contexto recuperado + pergunta) conta como tokens de entrada; a resposta gerada conta como tokens de saída. O custo total é a soma dos dois.
- Armazenamento dos embeddings: o FAQ indexado ocupa espaço no banco vetorial, com custo mensal por GB ou por vetor.
Uma forma prática de chegar a uma ordem de grandeza é instrumentar a aplicação para registrar, por atendimento, o total de tokens de entrada e saída do modelo de geração, e o total de tokens processados pelo modelo de embeddings. Multiplicando pelo custo unitário do provedor (que varia por modelo e contrato), obtém-se o custo variável por atendimento. A esse valor somam-se os custos fixos de infraestrutura e, se houver, o custo do atendente humano quando ocorre escalonamento.
É importante tratar essa estimativa como um exercício de orçamento, não como promessa de economia. O valor real depende do volume, da complexidade das perguntas e da taxa de escalonamento.
Considerações finais
A arquitetura descrita permite iniciar com um FAQ simples e evoluir para bases maiores, múltiplos modelos e políticas de escalonamento mais sofisticadas. O uso do SDK da OpenAI facilita a troca de provedores, mantendo o código portável. Ao medir tokens e custos desde o início, a equipe consegue ajustar o modelo e o limiar de escalonamento para equilibrar qualidade e despesa.
A TokenRecarga fornece acesso a modelos de IA para empresas brasileiras, com atendimento e faturamento no Brasil.
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.