O problema: volume e consistência na triagem de e-mails
Em operações B2B, uma caixa de e-mails comercial pode receber dezenas de mensagens por dia, vindas de diferentes canais e com intenções variadas: pedidos de orçamento, dúvidas de suporte, propostas de parceria, spam. Fazer essa triagem manualmente consome horas e introduz inconsistência: um vendedor pode classificar um lead como oportunidade enquanto outro o ignora. Um modelo de linguagem (LLM) pode acelerar a classificação e a extração de dados, mas não substitui o julgamento humano na resposta final.
Por que revisão humana obrigatória?
LLMs são bons em resumir e extrair, mas podem alucinar campos como CNPJ ou telefone, interpretar mal o tom do cliente e propor compromissos que a empresa não pode assumir. Em e-mails comerciais, um erro de promessa pode gerar problemas contratuais. Por isso, o fluxo deve sempre terminar com revisão e aprovação de uma pessoa antes do envio.
Arquitetura em três etapas
Recomendamos dividir o processamento em três chamadas separadas ao modelo, em vez de uma única chamada complexa:
- Classificação: decide se o e-mail merece atenção e qual o tipo.
- Extração de campos: transforma texto livre em dados estruturados.
- Geração de rascunho: escreve uma resposta inicial, que ficará em modo rascunho para revisão.
Essa separação permite usar temperaturas diferentes, validar cada etapa e registrar logs intermediários para auditoria.
Definindo o contrato de saída
Para garantir previsibilidade, use o modo JSON do modelo (response_format={'type': 'json_object'}) ou function calling com um schema explícito. No exemplo abaixo, definimos três funções Python que retornam objetos JSON com campos bem definidos.
Classificação
A classificação deve ter um conjunto fechado de categorias. Um exemplo para e-mail comercial B2B:
- oportunidade: lead com potencial de negócio
- suporte: dúvida ou problema com produto/serviço
- parceria: proposta de parceria ou integração
- spam: propaganda ou conteúdo irrelevante
- outro: não se encaixa nas anteriores
Exemplo de código com o SDK da OpenAI (as variáveis BASE_URL e API_KEY são fornecidas pela sua equipe de acesso):
import os, json
from openai import OpenAI
client = OpenAI(
base_url=os.environ['BASE_URL'],
api_key=os.environ['API_KEY'],
)
def classificar_email(assunto, corpo):
prompt = f'''
Classifique o e-mail abaixo em uma das categorias: oportunidade, suporte, parceria, spam, outro.
Retorne apenas um objeto JSON com as chaves categoria e resumo.
Assunto: {assunto}
Corpo:
{corpo}
'''
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[
{'role': 'system', 'content': 'Você é um assistente de triagem de e-mails B2B. Seja conservador e não invente informações.'},
{'role': 'user', 'content': prompt},
],
response_format={'type': 'json_object'},
temperature=0.2,
)
return json.loads(resp.choices[0].message.content)
Extração de campos
Após classificar como oportunidade ou suporte, extraia os campos relevantes. Exemplo de campos: empresa, contato, telefone, cnpj, produto_interesse, prazo_estimado, observacoes. Todos podem ser null se não estiverem no texto.
def extrair_campos(assunto, corpo):
prompt = f'''
Extraia do e-mail os campos abaixo. Se não encontrar, use null.
Campos: empresa (string ou null), contato (string ou null), telefone (string ou null), cnpj (string ou null), produto_interesse (string ou null), prazo_estimado (string ou null, como '30 dias' ou 'mês que vem'), observacoes (string ou null).
Retorne apenas um objeto JSON com esses campos.
Assunto: {assunto}
Corpo:
{corpo}
'''
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[
{'role': 'system', 'content': 'Extraia apenas o que está explícito no texto. Nunca invente valores.'},
{'role': 'user', 'content': prompt},
],
response_format={'type': 'json_object'},
temperature=0.0,
)
return json.loads(resp.choices[0].message.content)
Para campos sensíveis como CNPJ e telefone, valide o valor extraído com expressões regulares ou bibliotecas de validação antes de usar.
Geração de rascunho
Com a categoria e os dados extraídos, gere um rascunho de resposta. O prompt deve instruir o modelo a não prometer prazos, condições comerciais ou qualquer compromisso que exija aprovação de um humano.
def gerar_rascunho(categoria, extraido, assunto_original):
contexto = f'''
Categoria: {categoria}
Dados extraídos: {json.dumps(extraido, ensure_ascii=False)}
Assunto original: {assunto_original}
Escreva um rascunho de resposta em português do Brasil, tom profissional e cordial.
Não prometa prazos ou condições. Apenas acuse recebimento, faça uma pergunta de qualificação se necessário, e indique que um especialista entrará em contato.
Máximo de 3 parágrafos curtos.
'''
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[
{'role': 'system', 'content': 'Você escreve rascunhos para revisão humana. Não envie sem aprovação.'},
{'role': 'user', 'content': contexto},
],
temperature=0.7,
)
return resp.choices[0].message.content
Orquestração do fluxo com revisão humana
O pipeline pode ser orquestrado em uma função que encadeia as três etapas e cria uma tarefa de revisão:
def processar_email(assunto, corpo):
classificacao = classificar_email(assunto, corpo)
if classificacao['categoria'] not in ('oportunidade', 'suporte'):
return {'status': 'ignorado', 'motivo': classificacao['categoria']}
extraido = extrair_campos(assunto, corpo)
rascunho = gerar_rascunho(classificacao['categoria'], extraido, assunto)
# Cria tarefa para revisão humana em uma fila ou sistema de tickets
return {
'status': 'pendente_revisao',
'categoria': classificacao['categoria'],
'extraido': extraido,
'rascunho': rascunho,
}
Nesse ponto, o rascunho nunca é enviado automaticamente. Ele entra em uma fila de revisão, onde uma pessoa pode editar, aprovar ou descartar. O registro da decisão humana é importante para auditoria e melhoria contínua.
Armadilhas comuns e como mitigar
- Alucinação em campos estruturados: valide CNPJ, telefone e datas com regras locais. Se o modelo retornar um valor não plausível, marque o e-mail para revisão manual sem extração automática.
- Classificação excessivamente confiante: use temperature baixa e peça uma justificativa curta no campo
resumo. Revise periodicamente uma amostra dos e-mails classificados para calibrar. - Tom genérico ou inadequado: o rascunho pode soar impessoal. Mantenha um guia de tom para o revisor e permita edição livre antes do envio.
- Custo e latência: monitore o número de tokens consumidos por e-mail e defina limites por fila. Sem publicar números, o importante é ter um orçamento de tokens e alertas para evitar surpresas.
- Dependência de uma única chamada: separar classificação, extração e geração permite ajustar cada etapa sem refazer todo o prompt e facilita testes automatizados.
Conclusão
A triagem e o rascunho de e-mails comerciais com LLM trazem ganho de produtividade, mas exigem um desenho cuidadoso: classificação fechada, extração validada e revisão humana obrigatória. Com o SDK da OpenAI e variáveis de ambiente, a integração é direta. 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.