Conhecimento de domínio carregado sob demanda
"Don't put everything in the system prompt. Load on demand."
A armadilha de "jogar tudo no system prompt"
Você tem 20 skills, cada uma bem detalhada: pdf-processing (como ler PDFs), code-review (checklist de review), git-workflow (padrões de git comuns)... A abordagem intuitiva: colocar tudo no system prompt para o modelo consultar a qualquer hora.
O resultado:
- Cada chamada queima 15-30K tokens de entrada (mesmo que a pergunta não use nenhuma skill).
- A atenção do modelo se dilui — regras mencionadas em system prompts longos têm menos obediência.
- Alterar uma skill invalida o cache de todas as conversas históricas.
A abordagem do s05 é dividir em duas camadas.
Arquitetura em duas camadas
Layer 1 · barata: o system prompt contém apenas nome e uma descrição de uma linha de cada skill (cerca de 100 tokens por skill). 20 skills = 2K tokens, aceitável.
# lista de skills no system prompt
Skills available:
- pdf: Process PDF files. Extract text, tables, metadata.
- code-review: Systematic code review checklist.
- git-workflow: Common git branching and rebase patterns.
Layer 2 · sob demanda: quando o modelo precisa de uma skill, chama load_skill(name="pdf"), e o corpo completo (pode ter 5-10K tokens) é inserido no contexto via tool_result. Skills não utilizadas nunca carregam nenhum token.
# tool_result retorna o skill completo
<skill name="pdf">
Step 1: Use pdfplumber for extraction...
Step 2: Handle OCR fallback when needed...
Step 3: Structure output as Markdown table...
</skill>
Comparando o custo em tokens
Teste com um cenário real. Suponha 20 skills, cada corpo com média de 3.000 tokens. O usuário faz uma pergunta (por exemplo, "corrija um bug na API de login") — provavelmente sem usar nenhuma skill.
Formato do SKILL.md
Arquivos de skill usam YAML frontmatter + corpo:
--- name: pdf description: Process PDF files. Extract text, tables, metadata. tags: document,parsing --- Step 1: Use pdfplumber for extraction. Handle multi-column layouts... Step 2: For scanned PDFs, fall back to OCR via tesseract...
O frontmatter é para a Layer 1 (name/description/tags), o corpo é para a Layer 2. O formato é inspirado em geradores de sites estáticos (Jekyll, Hugo) — quem já usou reconhece na hora.