Todos os artigos
llmemailsb2bclassificacao

Triagem e rascunho de e-mails B2B com LLM: classificação, extração e resposta assistida

Como usar LLM para classificar e-mails, extrair dados e sugerir respostas em operações B2B, com revisão humana obrigatória. Exemplo com SDK OpenAI. Guia prático.

4 min de leitura

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:

  1. Classificação: decide se o e-mail merece atenção e qual o tipo.
  2. Extração de campos: transforma texto livre em dados estruturados.
  3. 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):

python
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.

python
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.

python
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:

python
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.

Quer usar isso na sua empresa?

Conte o que sua equipe precisa e preparamos uma proposta.

Continue lendo