O que é Extrair Subprompt?
Extrair Subprompt (Extract Subprompt) é uma refatoração de IA para sistemas com LLM, do grupo Compondo prompts. Tirar uma responsabilidade do prompt principal e dar a ela uma chamada própria.
Extract Subprompt
Extrair Subprompt (Extract Subprompt) é uma refatoração de IA para sistemas com LLM, do grupo Compondo prompts. Tirar uma responsabilidade do prompt principal e dar a ela uma chamada própria.
Um prompt único cuida de várias responsabilidades, cresce sem parar e cada mudança afeta tudo. É o smell Prompt Inchado.
Pense no bot de suporte de um banco no WhatsApp. O mesmo system prompt classifica idioma, mascara cartão, escolhe entre fatura, pedido e Pix, aplica 14 regras de boleto e ainda pede a pesquisa de satisfação. Uma mudança na regra de multa de fatura quebra a detecção de cartão. Ninguém consegue testar uma parte sem as outras.
Tire uma responsabilidade do prompt principal e dê a ela uma chamada própria, com um prompt curto e uma saída definida. O prompt principal passa a receber o resultado dessa chamada, não as instruções para produzi-lo.
-SYSTEM = """Você é o assistente de suporte.
-Primeiro, identifique o idioma do cliente e responda nele.
-Detecte se a mensagem contém dados de cartão; se tiver, ignore-os.
-Classifique o assunto entre fatura, pedido e outro.
-Se for fatura, siga estas 14 regras: ...
-Se for pedido, siga estas 11 regras: ...
-Sempre termine com a pergunta de satisfação."""
+TRIAGE = """Leia a mensagem do cliente e devolva idioma, assunto
+e se contém dados de cartão.""" # subprompt extraído
+
+SUPPORT = {
+ "billing": "Você atende dúvidas de fatura. [regras de fatura]",
+ "orders": "Você atende dúvidas de pedido. [regras de pedido]",
+}
+
+t = llm_parse(TRIAGE, message, schema=Triage)
+clean = mask_card(message) if t.has_card_data else message
+reply = llm(SUPPORT[t.topic], clean, language=t.language)
Antes: uma chamada com todas as responsabilidades.
flowchart LR
IN(["1. Mensagem"]):::io --> M(["2. Prompt único: idioma, cartão, assunto, regras de tudo"]):::llm
M --> OUT(["3. Resposta"]):::io
Depois: a triagem tem sua própria chamada, e cada resposta tem um prompt focado.
flowchart LR
IN(["1. Mensagem"]):::io --> T(["2. Triagem: idioma, cartão, assunto"]):::llm
T --> C["3. Mascarar e escolher prompt"]:::tool
C --> M(["4. Prompt focado no assunto"]):::llm
M --> OUT(["5. Resposta"]):::io
Mensagem: “boa tarde, a multa do meu boleto PIX saiu errada, cartão 4111…”. A triagem devolve, por exemplo:
{ "language": "pt-BR", "topic": "billing", "has_card_data": true }
O código mascara o cartão. O prompt de fatura recebe o texto limpo e a língua, sem as 11 regras de pedido. Se a multa sair errada, o trace mostra se a triagem errou o assunto ou se o prompt de fatura errou a regra. Antes, os dois erros morriam no mesmo parágrafo.
Cada responsabilidade num prompt compete pela atenção do modelo com todas as outras. O paper “Lost in the Middle” (Liu et al., 2023) mostrou que modelos usam mal o que fica no meio de um contexto longo. Um prompt de 4 mil tokens com regras de fatura no meio é exatamente esse meio. Separar dá a cada responsabilidade um prompt pequeno, que o modelo segue com mais consistência e que o time consegue testar sozinho.
A saída da chamada extraída vira um contrato. Em vez de “identifique o idioma e responda nele” escondido no meio de um texto longo, existe um campo language que o código lê e passa adiante. Quando algo dá errado, o trace mostra se o erro foi na triagem ou na resposta.
Por fim, as partes passam a evoluir separadas. Mudar as regras de fatura não mexe nas regras de pedido. O destino natural é o Encadeamento de Prompts. Se a extração for uma classificação que escolhe o caminho, Introduzir Roteador deixa a decisão no código.
| Prompt único | Com subprompt extraído | |
|---|---|---|
| Teste | Um eval mistura triagem e resposta | Eval da triagem e eval da resposta, separados |
| Mudança | Regra de fatura pode quebrar detecção de cartão | Fatura muda no prompt dela |
| Trace | Um span só | Dois spans; o erro tem endereço |
A chamada extra paga quando o prompt principal encolhe de verdade e a saída extraída entra no código. Se depois da extração o prompt de resposta continua enorme, você só adicionou latência. Um modelo pequeno na chamada extraída costuma cobrir o round-trip a mais, desde que o prompt principal tenha perdido as regras que estavam lá. Meça tamanho, acurácia por categoria e p95 antes de extrair a próxima peça.
Checar se a ficha tem marca, modelo e voltagem não precisa de modelo. Extraí-la para um subprompt ainda deixa um LLM fazendo conta. O primeiro destino dessa responsabilidade é código. O subprompt fica para o que é linguagem: tom da descrição, palavras-chave, classificação ambígua.
Qual responsabilidade deste prompt de um gerador de descrições de produto você extrairia primeiro?
Você escreve descrições de produto para o e-commerce.
Leia a ficha técnica e escreva uma descrição de 80 a 120 palavras.
Verifique se a ficha tem todos os campos obrigatórios (marca, modelo,
voltagem, garantia); se faltar algum, não escreva e liste o que falta.
Use o tom da marca: direto, sem exageros.
Gere também 5 palavras-chave para SEO.
A checagem de campos obrigatórios. Ela tem resposta exata e decide se o resto acontece; aliás, nem precisa de modelo, porque é uma checagem de campos que o código faz sozinho. As palavras-chave são a segunda candidata: uma chamada separada, com saída em lista, testável à parte.
1. Código: validar campos obrigatórios da ficha. Se faltar, devolver a lista.
2. Chamada: escrever a descrição (só tom e tamanho no prompt).
3. Chamada: gerar palavras-chave em schema { keywords: list[str] (5) }.Extrair Subprompt (Extract Subprompt) é uma refatoração de IA para sistemas com LLM, do grupo Compondo prompts. Tirar uma responsabilidade do prompt principal e dar a ela uma chamada própria.
Trata Prompt Inchado.
Ao padrão de projeto Encadeamento de Prompts.