Pular para conteúdo

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)

<VALORES_CONSULTAS_PARTICULAR>
Juliana Dos Santos Araujo - R$500,00 em ate 2x ou R$450,00 a vista
Felipe Xavier - R$350,00 em ate 2x ou R$320,00 a vista
...
</VALORES_CONSULTAS_PARTICULAR>

Prós: simples. Contras: qualquer mudança de preço = redeploy. Prompt fica gigante (~300 linhas só de tabela).

Se o paciente perguntar valor, informe os que estao no prompt para os
~100 procedimentos mais comuns. Para qualquer exame fora da lista,
transfira para atendimento.

Mais limpo. Tabela de preços menor.

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 voce e você, horário e horario (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.