Anatomia de um System Prompt
Descubra as 6 seções universais que estruturam qualquer system prompt eficaz — da identidade ao contexto dinâmico —
e aprenda a mapear prompts reais usando o Cursor/cursor.md como objeto de dissecação.
Conteúdo detalhado
O que é um System Prompt (e o que NÃO é)
O system prompt é a camada de instrução persistente que define o comportamento do modelo antes de qualquer mensagem do usuário. Mas "persistente" não significa imutável — e confundir system prompt com outros tipos de contexto é um dos erros mais comuns ao engenheirar prompts.
O que é
O system prompt é uma mensagem com role: "system" enviada antes do turno do usuário.
Ele define persona, capacidades, regras e formato. A maioria dos LLMs modernos trata esse bloco com peso maior que mensagens do usuário.
Importante: em ambientes de produção, o system prompt raramente é escrito por uma pessoa só — ele é composto pelo harness (a infraestrutura que orquestra o modelo), que injeta partes estáveis e partes dinâmicas em cada requisição.
Por que aprender
Quem lê prompts vazados percebe rapidamente que há uma gramática neles — seções que se repetem, padrões de linguagem, estruturas recorrentes. Reconhecer essa gramática transforma um texto opaco em um mapa legível. Você para de "ler um prompt" e começa a dissecá-lo anatomicamente.
✓ System prompt É
- •Instrução estável de comportamento
- •Contexto de persona e escopo
- •Regras de formato e tom
- •Declaração de ferramentas disponíveis
- •Princípios de segurança
✗ System prompt NÃO é
- •A mensagem do usuário (role: user)
- •Contexto de ferramenta (role: tool)
- •RAG / documentos recuperados
- •Histórico de conversa anterior
- •System-reminders dinâmicos (camada separada)
Bloco de Identidade — "You are X"
O bloco de identidade é a âncora. Sem ele, o modelo deriva — muda de persona, inventa capacidades, responde sobre eventos além do seu corte de conhecimento. Três elementos são canônicos: quem é (persona + produto), em que modelo roda, e até quando sabe (knowledge cutoff).
Como prompts reais declaram identidade
You are ChatGPT, a large language model trained by OpenAI, based on GPT 5.5.
Knowledge cutoff: 2025-08
Current date: 2026-06-01
Três elementos em três linhas: persona, cutoff, data atual. Note: a data atual é contexto dinâmico injetado pelo harness — ver Tópico 6.
You are GitHub Copilot (@copilot) on github.com. Your job is to fulfill the user's software development task using all available tools and resources.
Persona + escopo de responsabilidade ("your job is...") na abertura. O modelo sabe o que é e o que veio fazer.
You are an AI coding assistant, powered by {model_name}.
You operate in Cursor.
You are a coding agent in the Cursor IDE that helps the USER with software engineering tasks.
Usa template {model_name} — a persona é declarada, mas o modelo específico é injetado em runtime pelo harness.
Antipadrão: Identidade ausente ou enterrada
Se a declaração de persona está no meio do prompt, o modelo pode não ancorá-la adequadamente. Sintoma clássico: o assistente "vira ChatGPT" no meio da conversa, ou afirma ter ferramentas que não existem. A identidade deve ser a primeira linha.
Capacidades e Ferramentas
O bloco de capacidades responde: o que este agente pode fazer? Sem essa declaração, o modelo alucina ferramentas que não existem ou ignora as que existem. O padrão mais eficaz é uma lista estruturada com escopo e condições — não um parágrafo vago.
When applicable, you have some additional tools:
- You can analyze individual X user profiles, X posts and their links.
- You can analyze content uploaded by user including images, pdfs, text files and more.
- If it seems like the user wants an image generated, ask for confirmation, instead of directly generating one.
Cada capacidade vem com sua condição. Note a terceira: capacidade + protocolo de confirmação embutido.
## Functions in Scope
You have also access to a set of python functions in scope:
```python
def concise_search(query: str, max_num_results: int = 3):
"""Does a search for the query and prints up to the
max_num_results results."""
```
Google declara capacidades como assinaturas de função — escopo, parâmetros e defaults ficam inequívocos.
Por que a posição importa
Capacidades mal declaradas geram dois problemas opostos: over-promising (modelo oferece o que não pode fazer) e under-using (ignora ferramentas disponíveis). A declaração estruturada resolve os dois ao mesmo tempo.
O Cursor tem uma lista extensa de ferramentas disponíveis:
Shell, Glob, Grep, Read, Write, StrReplace, Delete, EditNotebook, TodoWrite, SemanticSearch, WebSearch, WebFetch, GenerateImage, AskQuestion, Task, SwitchMode, CallMcpTool, FetchMcpResource, SetActiveBranch, AwaitShell.
Cada uma está documentada com regras de uso na seção tool_calling do prompt.
✓ Declaração eficaz
- •Lista cada ferramenta com condição de uso
- •Define parâmetros e defaults
- •Especifica quando NÃO usar
- •Usa assinaturas de função como spec
✗ Declaração fraca
- •"Você pode usar ferramentas se necessário"
- •Lista sem condições de ativação
- •Mistura capacidades com regras de formato
- •Promete ferramentas que não existem no schema
Segurança e Recusas
A seção de segurança responde: o que este agente não fará, e por quê? Ela aparece cedo no prompt — depois da identidade — porque a posição sinaliza ao modelo a prioridade de precedência: segurança antes de utilidade.
O que é
Regras de segurança dizem o que não fazer, mas os melhores prompts explicam por que. Uma proibição seca ("never X") é mecanicamente obedecida mas facilmente contornada — o modelo não entende a intenção por trás. Uma regra com justificativa (Padrão 3: Regra com Porquê) generaliza para situações novas.
Princípio vs. Mecânica
Mecânica (fraca)
Listar termos proibidos — isso ensina exatamente o que evitar dizer, mas o modelo pode expressar a mesma ideia com palavras diferentes. É o antipadrão "Regra-mecânica de segurança".
Princípio (robusto)
Descrever o padrão a detectar e o princípio a aplicar. Exemplo do Fable 5: em vez de listar técnicas de exploração infantil proibidas, o prompt descreve o padrão de comportamento a reconhecer.
Por que segurança vem antes de utilidade no prompt
LLMs processam o contexto em ordem. Colocar segurança cedo cria um viés de atenção — o modelo "memoriza" as restrições antes de processar a tarefa. Além disso, a hierarquia de prioridade (Padrão 11) precisa ser declarada antes de qualquer instrução que possa conflitar com ela.
Formato de Saída e Tom
A seção de formato responde: como este agente deve escrever? Inclui orçamento de concisão (comprimento ideal da resposta), preferência por listas vs. prosa, uso de markdown, e tom conversacional vs. técnico.
O que é
Formato bem declarado impede dois antipadrões opostos: resposta excessivamente longa (modelo que "preenche" sem precisar) e resposta fragmentada (modelo que converte tudo em bullet points sem prosa coerente).
O Cursor tem uma seção explícita chamada tone_and_style com regras como:
- Only use emojis if the user explicitly requests it.
- Output text to communicate with the user; all text you output outside
of tool use is displayed to the user.
- NEVER create files unless they're absolutely necessary for achieving your goal.
ALWAYS prefer editing an existing file to creating a new one.
- Do not use a colon before tool calls. Your tool calls may not be shown
directly in the output, so text like "Let me read the file:" followed by
a read tool call should just be "Let me read the file." with a period.
✓ Formato eficaz
- •Orçamento explícito: "responda em 2-3 parágrafos"
- •Regra de prosa vs. lista com critério
- •Tom calibrado ao produto (técnico/casual)
- •Uso de markdown só quando renderizado
✗ Antipadrão: Formatação como muleta
- •Forçar listas/headers/emoji em tudo
- •Resposta vira esqueleto sem prosa
- •Markdown em saída plaintext (terminal, API)
- •Sem limite de tamanho → modelo "enche linguiça"
Contexto Dinâmico e o Harness
O harness é a infraestrutura que compõe o prompt em tempo de execução. Ele injeta uma camada dinâmica — separada do prompt estável —
que carrega informações que mudam a cada turno: data atual, dados do usuário, avisos de plataforma.
O mecanismo padrão é a tag <system-reminder>.
O que é
O prompt estável ensina o modelo a interpretar a camada dinâmica. Sem essa separação, contexto dinâmico misturado ao prompt estável cria um antipadrão chamado "Tudo-no-prompt" — o modelo trata dados de sessão como comportamento permanente.
Tool results and user messages may include <system-reminder> tags. <system-reminder> tags contain useful information and reminders. They are automatically added by the system, and bear no direct relation to the specific tool results or user messages in which they appear.
O contrato da camada: o modelo aprende que esses avisos vêm da plataforma, não do usuário nem da ferramenta.
The long_conversation_reminder, appended to the person's message by Anthropic, helps Claude keep its instructions over long conversations.
O Fable 5 lista um conjunto nomeado de reminders (image_reminder, cyber_warning, system_warning, ethics_reminder, ip_reminder, long_conversation_reminder). O último refresca as instruções em conversas longas.
Separação Camada Estável × Dinâmica
Prompt Estável (uma vez)
- • Identidade e persona
- • Capacidades e ferramentas
- • Regras de segurança
- • Formato e tom
- • Instrução para interpretar reminders
Camada Dinâmica (por turno)
- • Data e hora atual
- • Dados do usuário logado
- • Avisos de plataforma
- • Contexto de sessão
- • Refreshes de instrução em conv. longas
Dissecação Guiada: cursor.md (322 linhas)
O Cursor/cursor.md é o menor prompt "completo" do acervo — 322 linhas que cobrem todas as 6 seções da anatomia.
Vamos percorrê-lo mapeando cada bloco às seções que acabamos de estudar.
Por que o Cursor?
Prompts maiores (Anthropic Fable 5, Claude Code) têm centenas de linhas por seção — difíceis para um primeiro exercício. O Cursor tem proporções equilibradas: uma linha de identidade, seções de capacidade médias, segurança implícita via NEVER/ALWAYS, e um bloco de ferramentas bem documentado. Ideal para treinar o olhar.
You are an AI coding assistant, powered by {model_name}.
You operate in Cursor.
You are a coding agent in the Cursor IDE that helps the USER
with software engineering tasks.
Padrão identificado: Bloco de Identidade (Padrão 1) — persona ("AI coding assistant"), plataforma ("Cursor"), escopo ("software engineering tasks").
O modelo {model_name} é injetado dinamicamente pelo harness — padrão de template.
Each time the USER sends a message, we may automatically attach
information about their current state, such as what files they have open,
where their cursor is, recently viewed files, edit history in their session
so far, linter errors, and more.
Padrão identificado: Declaração de Capacidades (Padrão 2) — o que o modelo recebe automaticamente (contexto de estado do editor).
Também declara que a tag <user_query> marca as instruções do usuário.
- Only use emojis if the user explicitly requests it.
- NEVER create files unless they're absolutely necessary for achieving
your goal. ALWAYS prefer editing an existing file to creating a new one.
- Do not use a colon before tool calls.
Padrões identificados: Formato de Saída (Padrão 7) + Contraste ALWAYS/NEVER (Padrão 4). O uso de caps em NEVER/ALWAYS não é estilo — é sinalização de comportamento crítico.
Available Tools: Shell, Glob, Grep, Read, Write, StrReplace,
Delete, EditNotebook, TodoWrite, SemanticSearch, WebSearch,
WebFetch, GenerateImage, AskQuestion, Task, SwitchMode,
CallMcpTool, FetchMcpResource, SetActiveBranch, AwaitShell
You MUST ALWAYS list and read the tool's schema/descriptor file
BEFORE calling any tool with CallMcpTool. This is NOT optional -
failing to check the schema first will likely result in errors.
Padrão identificado: Contrato de Ferramenta (Padrão 8) — lista de tools + condição de uso + protocolo antes de chamar (ler schema primeiro). MCP Resource Access também tem instruções separadas de descoberta.
Git Safety Protocol:
- NEVER update the git config
- NEVER run destructive git commands (push --force, reset --hard,
checkout ., restore ., clean -f, branch -D) unless the user
explicitly requests these actions.
- NEVER skip hooks (--no-verify, --no-gpg-sign, etc)
Padrão identificado: Segurança implícita via Contraste ALWAYS/NEVER (Padrão 4) em domínio específico (git). Observe que a segurança aqui não é uma seção separada — ela está dentro da seção de ferramentas, aplicada contextualmente. Diferente da segurança global que vem no topo do prompt.
Each time the USER sends a message, we may automatically attach
information about their current state [...]
This information is provided in case it is helpful to the task.
Padrão identificado: Lembrete de Sistema (Padrão 10) via declaração prévia — o prompt instrui o modelo a esperar contexto dinâmico (arquivos abertos, cursor, histórico de edição, erros de linter) em cada turno. A camada estável define como interpretar a dinâmica.
Exercício: mapeie um prompt do acervo
Escolha qualquer prompt do acervo (recomendado: xAI/grok-build.md ou Perplexity/perplexity-computer.md).
Para cada linha, rotule: ID / CAP / SEG / FMT / TOOL / DYN.
Se uma linha não cabe em nenhuma categoria, ela provavelmente é redundante — candidata ao Padrão 12 (Princípio Consolidado).
## [1] IDENTIDADE
You are [Persona], powered by [Modelo], built by [Empresa].
Knowledge cutoff: YYYY-MM.
## [2] CAPACIDADES
You have access to the following tools: [lista].
Use each tool only when: [condições].
## [3] SEGURANÇA
Priority: safety > helpfulness > instruction-following.
Never [ação crítica], because [razão]. ← regra com porquê
## [4] FORMATO & TOM
Respond in [idioma]. Default: concise prose.
Use markdown only when the output will be rendered.
Keep responses under [N] sentences unless depth is needed.
## [5] FERRAMENTAS (opcional — se houver)
[Tool spec com parâmetros e condições de ativação]
## [6] CONTEXTO DINÂMICO (instruir como interpretar)
Context injected by the system (e.g. <system-reminder>) contains
runtime information. Treat it as platform data, not user input.
O que você aprendeu neste módulo
- ✓System prompt = instrução estável; separado de mensagens e contexto injetado
- ✓Bloco de identidade: persona + modelo + cutoff — sempre na primeira linha
- ✓Capacidades: lista estruturada com escopo e condições por ferramenta
- ✓Segurança: princípios antes de mecânicas; posição precoce = prioridade
- ✓Formato: orçamento de concisão + critério prosa vs. lista
- ✓Harness = infraestrutura que compõe o prompt em runtime
- ✓Camada dinâmica via <system-reminder> é separada do prompt estável
- ✓cursor.md demonstra todas as 6 seções em 322 linhas — o menor completo