O que é Onboarding conversacional?
Onboarding conversacional (Conversational onboarding) é um estudo de caso real de sistema com LLM, do grupo Produto. Cadastrar clientes pelo WhatsApp, coletar documentos e retomar dias depois.
Conversational onboarding
Onboarding conversacional (Conversational onboarding) é um estudo de caso real de sistema com LLM, do grupo Produto. Cadastrar clientes pelo WhatsApp, coletar documentos e retomar dias depois.
Uma fintech brasileira de crédito para pequenos negócios abre contas pelo WhatsApp. O cadastro tem etapas obrigatórias: dados do sócio, CPF, CNPJ, comprovante de endereço, foto do documento, faturamento médio e aceite dos termos. Muitos clientes começam no celular durante o expediente e só terminam dias depois, quando acham o comprovante no fundo de uma gaveta.
WhatsApp é o canal padrão de empresa no Brasil. O cliente já está lá, o sócio não quer baixar um app só para enviar um PDF, e o time comercial já conversa por ali. O custo dessa escolha é o cadastro virar uma conversa longa, interrompida, fora de ordem, com documentos no meio de áudios e “oi, ainda está aí?”.
O objetivo é conduzir o cadastro em conversa natural, aceitar respostas fora de ordem, retomar de onde parou dias depois e nunca expor ou guardar dados pessoais além do necessário. LGPD pede minimização: o modelo, os logs e o time de suporte não precisam ver o CPF inteiro para perguntar o que falta.
Há ainda a janela de 24 horas da API de nuvem do WhatsApp: depois de um dia sem mensagem do cliente, a empresa só envia templates pré-aprovados, não prosa livre do modelo. Um cadastro que dorme três dias precisa de um motor que lembre o estado e de um template que chame o cliente de volta, não de um prompt que releia o histórico.
O que este cenário mede: cadastros concluídos, abandono por etapa e dados pessoais expostos.
A versão 1 era um prompt bem escrito, e funcionou bem em testes curtos. O roteiro cabia num parágrafo, o modelo parecia educado, e o comercial mandava o link do WhatsApp no mesmo dia da reunião.
Você conduz o cadastro da fintech. Siga esta ordem e não pule etapas:
1. Nome do sócio
2. CPF
3. CNPJ
4. Comprovante de endereço
5. Foto do documento
6. Faturamento médio mensal
7. Aceite dos termos
Se o cliente já enviou algo, não peça de novo.
Grave cada dado com a ferramenta salvar_campo.
Seja natural.
flowchart LR
W(["1. Mensagem no WhatsApp"]):::io --> H[("2. Histórico inteiro da conversa")]:::store
H --> P(["3. Prompt com o roteiro do cadastro"]):::llm
P --> R(["4. Resposta"]):::io
P --> DB[("5. Grava o que achar que coletou")]:::store
O teste interno usava conversas de cinco minutos, com uma pessoa do time respondendo na ordem do roteiro. O modelo pedia o CPF, recebia o CPF, pedia o CNPJ. Ninguém voltou no dia seguinte, ninguém mandou três campos numa frase, ninguém anexou um documento ilegível.
Quem escreve o roteiro em prosa está tentando poupar um grafo. “Não pule etapas” e “não peça de novo” soam como regras. Para o modelo, são duas frases no mesmo bloco de tokens, competindo com o histórico, com o áudio transcrito e com o “pode aprovar” do cliente. O guia “Building effective agents”, da Anthropic (dezembro de 2024), descreve exatamente esse atalho: colocar o controle do fluxo no prompt em vez de no código.
Semana 1. Clientes relataram que o bot pediu o CPF três vezes. Em outros casos, ele pulou o comprovante de endereço e foi direto para os termos. O mesmo prompt, as duas falhas. Quando o cliente mandava nome e CPF juntos, o modelo às vezes gravava o nome, esquecia o CPF e perguntava o CPF de novo. Quando o cliente dizia “depois eu mando o comprovante”, o modelo às vezes tratava a promessa como o documento.
Semana 3. Clientes que voltavam depois de dois ou três dias encontravam um bot confuso. O histórico já tinha dezenas de mensagens, um áudio, um print ilegível e duas tentativas de CNPJ. O modelo perguntava de novo o que já tinha recebido, ou retomava numa etapa errada. Liu e colegas, no paper “Lost in the Middle” (2023), mostraram que modelos usam mal o que fica no meio de um contexto longo. O CPF enviado no primeiro dia estava exatamente ali: no meio.
Semana 4. O time descobriu CPFs e fotos de documentos inteiros nos logs de observabilidade e no histórico enviado ao modelo em toda mensagem, inclusive em conversas de suporte depois do cadastro. O dado pessoal tinha virado contexto permanente. Em 2023, a Samsung restringiu o ChatGPT depois que funcionários colaram código confidencial no modelo. Aqui o equivalente é o CPF do sócio viajando para o provedor a cada “oi”.
Semana 6. Um cliente mandou “já mandei tudo, pode aprovar”. O modelo respondeu que o cadastro estava completo, sem o comprovante. A ferramenta salvar_campo nunca tinha recebido o arquivo. Quem decidiu o fim foi a prosa do cliente, não o estado.
As quatro semanas apontam para o mesmo desenho: o roteiro e a memória do cadastro vivem no texto que o modelo relê. Texto se perde, se contradiz e se deixa convencer.
O roteiro de etapas vivia no prompt. “Não pule” e “não peça de novo” são regras de grafo escritas em português. O modelo as aplica quando lembra, e as esquece quando o cliente improvisa. Causou as perguntas repetidas e as etapas puladas das semanas 1 e 6.
Um estado de verdade tem um lugar por campo:
nome_socio: validado
cpf: validado
cnpj: recebido
comprovante: faltando
documento: faltando
faturamento: faltando
termos: faltando
O prompt da versão 1 não tem essa tabela. Tem um parágrafo que pede para o modelo fingir que ela existe.
O histórico completo de dias de conversa ia em toda mensagem. Causou a confusão na retomada da semana 3 e espalhou dados pessoais pela semana 4. Cada “ainda está aí?” reenviava o CPF, a foto do RG e o comprovante com endereço, para o modelo e para o coletor de traces.
As etapas viraram um grafo em código, com o estado de cada campo: faltando, recebido, validado. O modelo passou a ter um papel menor: entender a mensagem e extrair os dados, em qualquer ordem. O código decide a próxima pergunta olhando o que ainda está faltando.
Recebido não é validado. Um CNPJ com dígito verificador errado fica em recebido até o código recusar ou uma pessoa olhar. O modelo não “valida” CNPJ: ele devolve os dígitos que leu.
O modelo recebe o estado do cadastro, um resumo curto (“cliente Ana, retomando depois de três dias, falta comprovante e foto”) e as últimas mensagens. Dados pessoais ficam no estado, mascarados. O texto da conversa enviado ao modelo não carrega o CPF inteiro nem a imagem do documento.
Cada cadastro é um workflow que persiste o estado a cada etapa e pode esperar dias por um documento sem perder nada. A espera não é um bot “lembrando” da conversa. É um timer e um estado no banco. Quando o cliente volta, ou quando o template de 24 horas dispara, o workflow acorda no mesmo objeto.
flowchart TD
W(["1. Mensagem ou documento"]):::io --> G["2. Guardrail: mascarar e guardar dados pessoais"]:::tool
G --> X(["3. Extrair campos da mensagem"]):::llm
X --> V["4. Validar: CPF, CNPJ, documento"]:::tool
V --> S[("5. Estado do workflow")]:::store
S --> N{"6. Próxima etapa em código"}
N -->|"falta campo"| A(["7. Perguntar de forma natural"]):::llm
N -->|"caso fora do roteiro"| H((("8. Atendente humano"))):::human
N -->|"tudo validado"| T(["9. Termos e conclusão"]):::io
A --> OUT(["Resposta no WhatsApp"]):::io
O modelo nunca declara o cadastro completo. Completo é um predicado no código: todos os campos obrigatórios estão validado, os termos têm aceite com carimbo de tempo, e nenhum campo está recebido parado sem validação.
Suponha a quarta mensagem da sexta-feira, depois de três dias e um comprovante novo. A versão 1 reenviava tudo. A final manda só o que o passo precisa:
| Versão 1 | Arquitetura final | |
|---|---|---|
| Texto ao modelo | Histórico desde o “oi” da terça, com CPF, CNPJ, foto em base64 e o PDF | Estado mascarado + resumo de uma linha + a mensagem nova |
| Quem decide a próxima pergunta | O modelo, relendo o roteiro | O grafo, olhando comprovante: recebido |
| Onde está o CPF | Em toda chamada, em claro | No cofre; o modelo vê ***8909 |
A diferença não é “menos tokens por educação”. É o CPF sair do caminho do provedor e o próximo passo deixar de depender de o modelo achar uma frase no meio do contexto.
Recebido e validado também não são sinônimos. O comprovante acaba de chegar: o estado vira recebido, um validador tenta ler um endereço no PDF, e só então vira validado. Se a imagem estiver escura, o campo não anda sozinho. Vai para a pessoa, com o arquivo no cofre. O modelo da pergunta seguinte não “chuta” que o endereço estava lá.
A cliente Ana escreve: “sou a Ana Souza, CPF 123.456.789-09, CNPJ 12.345.678/0001-95, faturamento uns 40 mil”.
O guardrail troca os identificadores por referências antes de o texto chegar ao extrator:
sou a Ana Souza, CPF {{cpf:p_92}}, CNPJ {{cnpj:p_93}}, faturamento uns 40 mil
O extrator devolve um objeto:
{
"nome_socio": "Ana Souza",
"cpf_ref": "vault:p_92",
"cnpj_ref": "vault:p_93",
"faturamento_mensal_centavos": 4000000,
"faturamento_incerto": true
}
O código valida os dígitos do CPF e do CNPJ no cofre, consulta a Receita para o CNPJ, e marca faturamento como recebido com uma flag de incerteza, porque “uns 40 mil” não é um valor fechado. A próxima pergunta que o grafo pede não é o CPF. É o comprovante de endereço, a foto do documento, e uma confirmação do faturamento em número. Uma mensagem, quatro campos tocados, zero repetição.
Na quinta o workflow dispara um template aprovado: “Oi Ana, ainda falta o comprovante de endereço e a foto do documento para concluir sua conta.” Não é o modelo inventando a frase longa depois da janela de 24 horas. É o estado dizendo o que falta, e o template preenchendo dois buracos.
Ana manda o PDF. O guardrail guarda o arquivo no cofre, o validador de documento confere se dá para ler um endereço, o campo passa a validado ou vai para uma pessoa se a imagem estiver escura. O modelo da pergunta seguinte só vê: comprovante validado, falta foto, termos ainda não.
O cofre guarda o valor. Os logs mostram cpf=***8909. O modelo vê mascara=***.***.***-09. O atendente humano, na passagem, recebe o estado e um link temporário para o documento, não um dump do histórico. Isso atende minimização da LGPD e corta a classe de vazamento da semana 4. Transferir CPF inteiro a um provedor de modelo a cada mensagem é transferência de dado pessoal; a referência mascarada não é.
Sócio com passaporte, empresa em recuperação judicial, dois sócios que precisam assinar: o grafo tem uma aresta explícita para pessoa. A passagem leva o estado, não um resumo em prosa do tipo “acho que falta um documento”. A pessoa vê o mesmo objeto que o código vê. O modelo não improvisa uma exceção à regra de KYC.
As métricas deste cenário são cadastros concluídos, abandono por etapa e dados pessoais expostos, comparando a versão 1 com a arquitetura final num conjunto de conversas simuladas, incluindo retomadas depois de dias e respostas fora de ordem.
As três se leem juntas. Subir conclusão empurrando o cliente para “aceitar os termos agora”, sem comprovante, infla a primeira métrica e esconde um cadastro inválido. Abandono por etapa mostra onde o grafo pede demais ou pede de novo. Dados pessoais expostos conta identificadores e imagens que chegaram a log, a trace ou ao provedor do modelo. Se essa terceira não for zero no conjunto de teste, o restante não segura uma auditoria de LGPD.
O conjunto precisa incluir, no mínimo, o que quebrou a versão 1: dois campos na mesma frase, volta depois de dias, “já mandei tudo”, documento ilegível, sócio fora do roteiro, e uma conversa de suporte depois do cadastro para ver se o CPF ainda viaja no histórico. Também precisa do caminho feliz, senão qualquer mascaramento parece vitória.
Os números ainda não foram publicados. Eles virão do código de referência executável, rodando as duas versões contra o mesmo conjunto, e esta seção será atualizada com o resultado e o script que gera os números. Até lá, nenhum número aparece aqui.
| Padrão | Papel no sistema |
|---|---|
| Workflow Durável | O cadastro sobrevive a dias de espera, a falhas e à janela de 24 horas |
| Memória de Curto Prazo | Estado explícito do cadastro em vez do histórico bruto |
| Memória de Longo Prazo | Preferências do cliente para o atendimento depois do cadastro, sem reabrir o cofre |
| Guardrails de Entrada | Detecção de CPF, CNPJ e documentos antes do modelo |
| Mascaramento de Dados Pessoais | Valor no cofre, máscara no texto, referência no estado |
| Passagem entre Agentes | Casos fora do roteiro passam para uma pessoa com o mesmo estado |
A lista completa de padrões ligados a este cenário está em Relações, abaixo.
Guardrail e mascaramento trabalham em sequência: o primeiro acha o dado, o segundo decide o que o modelo pode ver. Workflow durável e memória de curto prazo são o mesmo objeto visto de dois lados: persistência entre dias, e o que o modelo recebe agora. Sem a passagem para pessoa, o grafo tenta cobrir exceção de KYC com mais prosa, e o prompt máquina de estados volta pela porta dos fundos.
O sistema completo, com as duas versões, as conversas simuladas e o script que gera os números desta página, fica no repositório de código de referência do ai-guru, em scenarios/conversational-onboarding/. O repositório está sendo preparado, e o link entra aqui quando for publicado.
Onboarding conversacional (Conversational onboarding) é um estudo de caso real de sistema com LLM, do grupo Produto. Cadastrar clientes pelo WhatsApp, coletar documentos e retomar dias depois.
Memória de Curto Prazo, Memória de Longo Prazo, Workflow Durável, Passagem entre Agentes, Guardrails de Entrada e Mascaramento de Dados Pessoais.