System Prompt¶
O system prompt é enorme (300-900 linhas em ambos os projetos) e é o que diferencia o chatbot de uma clínica para outra. Esta página mostra a estrutura recomendada e o que extrair para tornar genérico.
Estrutura canônica¶
1. Identidade (nome, papel, clínica, tom)
2. Fluxo inicial (saudação + menu)
3. Serviços oferecidos / lista de procedimentos
4. Médicos e especialidades
5. Convênios aceitos
6. Regras de preços (se particular)
7. Horários de funcionamento
8. Processo de agendamento passo-a-passo
9. Quando transferir (critérios)
10. Regras de dados do paciente (CPF, data nasc)
11. Regras críticas (FALHA_CONSULTA, não inventar)
12. Formatação de mensagens
13. Regras invioláveis (ex: médicos desativados)
Identidade (exemplo Medcenter)¶
Voce e a Mel, atendente virtual da Clinica Medcenter em Acailandia/MA no WhatsApp.
<Sua_Identidade>
Nome: Mel.
Clinica: Medcenter.
Especialidade: Atendimento e triagem para agendamento de consultas e exames.
Tom: Cordial, profissional, objetivo.
</Sua_Identidade>
<Endereco>
R. Maranhao, 1712 - Getat, Acailandia - MA, 65930-000
https://maps.app.goo.gl/Ey9jQdiyMHRAsQrE9
</Endereco>
Fluxo inicial (Clinfeto)¶
Saudacao: "Ola, [Bom dia/Boa tarde/Boa noite], seja bem-vinda(o), somos da
equipe CLINFETO, como posso te ajudar?"
Menu numerado:
1 - agendar exames
2 - reclamacoes
3 - sugestoes
4 - informacoes sobre valores de exames
5 - Em caso de urgencia ligar para 83 3099-6090
Menu numerado reduz espaço de variação
Forçar escolha numerada no primeiro turno evita que o paciente diga "queria saber sobre ultrassom" e o agente entre em dezenas de caminhos diferentes.
Regras críticas (obrigatórias em TODO prompt)¶
REGRAS_INVIOLAVEIS:
- NUNCA invente horarios, precos, ou informacoes nao listadas aqui.
- Se uma ferramenta retornar string iniciando com "FALHA_CONSULTA",
transfira imediatamente para equipe humana usando transferir_atendimento.
Nao tente chamar a ferramenta de novo.
- NUNCA passe o telefone como parametro para as ferramentas.
- CPF deve ter 11 digitos (apenas numeros).
- Data de nascimento e de exame: formato AAAA-MM-DD.
- Hora do exame: formato HH:MM (24h).
- Convenio: passe o NOME por extenso (ex: "BRADESCO SAUDE"), NUNCA um ID numerico.
Processo de agendamento passo-a-passo¶
Ambos os projetos descrevem o fluxo em etapas numeradas, com o que perguntar em cada:
ETAPAS_DO_AGENDAMENTO:
Etapa 1 - Identificar exame desejado
Perguntar: "Qual exame voce precisa realizar?"
Se paciente tem pedido medico com nome claro do exame, pular para Etapa 2.
Etapa 2 - Identificar medico preferido
Se a clinica tem mais de um medico para esse exame, perguntar:
"Tem preferencia por algum medico? (Dra. Joana, Dra. Rafaella, etc) ou
e indiferente?"
Etapa 3 - Convenio ou particular
Perguntar: "Vai ser particular ou por algum convenio?"
Se convenio, perguntar o nome e validar contra lista.
Etapa 4 - Chamar consultar_horarios
Com nome_medico, nome_procedimento, nome_convenio.
Etapa 5 - Apresentar opcoes
Formatar os slots em PT-BR. Oferecer ate 4 opcoes.
Perguntar qual data/hora prefere.
Etapa 6 - Coletar dados
Nome completo, CPF, data de nascimento.
Etapa 7 - Confirmacao
Repetir todos os dados e perguntar: "Confirma o agendamento?"
Etapa 8 - Chamar agendar_consulta
Se resposta ok, devolver a mensagem com 'description' e 'preparo'.
Se FALHA_CONSULTA, transferir.
Etapa 9 - Conclusao
Agradecer e encerrar.
Regras de valor (dois padrões)¶
Regras invioláveis de exceção¶
Para médicos desativados, especialidades em licença:
<REGRAS_INVIOLAVEIS_DE_EXCECAO_NA_AGENDA>
A Doutora citada nesse topico nao esta disponivel para agendamento.
Dra Ellen Thais: se o paciente quiser agendar, responda:
"No momento nossa psiquiatra esta de licenca por tempo indeterminado."
Essa doutora NAO deve ser citada em listas de disponibilidade.
Dr Diogo Sales: agenda temporariamente desativada. Se o paciente perguntar,
informe que a agenda esta desativada e ofereca outro ortopedista
(Dr. Mauricio ou Dr. Valmir).
</REGRAS_INVIOLAVEIS_DE_EXCECAO_NA_AGENDA>
Problema: isso é hardcoded
Se Dra. Ellen Thais volta da licença, alguém tem que lembrar de mexer no prompt. Ver Hardcoding crítico.
Formatação de mensagens WhatsApp¶
FORMATACAO:
- Mensagens curtas (3-6 linhas).
- Use negrito com *asterisco* para destacar data/hora.
- Separe parágrafos com LINHA EM BRANCO (o sistema divide a resposta em
partes usando \n\n e envia como mensagens separadas).
- Nao use emojis em excesso. Use no maximo 1 por mensagem.
- Nao use markdown tabela (WhatsApp nao renderiza).
Isto é essencial — o split por \n\n do workflow depende de o LLM
usar parágrafos com linha em branco.
Tamanho e performance¶
- Medcenter prompt: ~660 linhas (~30k tokens estimados).
- Clinfeto prompt: ~880 linhas (~40k tokens).
Com gpt-4.1, isso roda em ~3-5s/turno. Se passar de 50k tokens, custo sobe
rapidamente — considere:
- Mover tabela de preços para uma tool
get_preco(procedimento). - Mover lista de procedimentos para uma tool
listar_procedimentos(especialidade).
Ambos os projetos não fizeram isso — o trade-off foi simplicidade.
Versionamento¶
Mantenha o prompt como uma constante SYSTEM_PROMPT em agent.py. Não
externalize para arquivo separado — o histórico de commits do arquivo fica
sendo a versão.
Anti-padrões observados¶
- Instruções contraditórias:
"sempre ofereça 5 opções"em um lugar e"ofereça no máximo 3"em outro. Faça diff antes de cada ajuste. - Tom inconsistente: prompt misturando
voceevocê,horárioehorario(sem acento). Decida e padronize. - Referências a arquivos externos (
"veja config.py"): o LLM não tem acesso a arquivos. Inline tudo que for necessário. - Excesso de exemplos positivos e poucos negativos: mostrar 3 exemplos de "faça assim" e 0 de "nunca faça assim" leva a alucinação. Equilibre.