Design de prompts
Fazer prompting é como web design. Vamos chamar isso de design de prompts e criar ferramentas melhores para isso.
Normalmente sou avesso ao hábito comum de tentar encontrar análogos do “mundo antigo” para fenômenos do “mundo novo”. Então tenha um pouco de paciência comigo enquanto cometo exatamente esse pecado: deixe-me apresentar o argumento de por que prompting deveria ser chamado de design de prompts e ser comparado a web design.
Encaro prompting como me comunicar com um humano com tempo limitado. Embora técnicas específicas para LLMs sejam certamente úteis (especialmente chain-of-thought), descobri que uma das melhores maneiras de melhorar o desempenho é simplesmente ter instruções extremamente claras e de alta qualidade, de forma semelhante a como clareza e concisão também ajudam humanos reais a entender melhor.
Prompting-como-comunicação-clara faz prompting soar como redação. A maior parte do prompting que faço, porém, é paramétrico: tenho várias variáveis de entrada e preciso adaptar dinamicamente meu prompt a elas.
Assim, prompting-como-comunicação-clara-com-entrada-dinâmica parece ser a caracterização mais precisa.
Que outro campo é sobre comunicar com clareza a partir de entrada dinâmica? Web design.
Vamos listar todas as semelhanças. Prompting e web design:
-
exigem clareza e têm a comunicação como objetivo principal;
-
precisam responder a conteúdo dinâmico, ao contrário de redação ou diagramação de revista; e
-
precisam adaptar seu conteúdo a diferentes tamanhos — tamanhos de tela para web design, janelas de contexto para prompting.
Pela minha experiência fazendo tanto prompting quanto web design, também notei que tenho preferências de desenvolvedor semelhantes nas duas áreas:
-
Olhar para o prompt real é superimportante, assim como olhar para o site renderizado é superimportante. Não consigo projetar um site se tiver que simular o processo de renderização de HTML e CSS na minha cabeça. Da mesma forma, é muito difícil escrever prompts bons e claros sem ver a saída renderizada de um prompt com todas as variáveis de entrada preenchidas.
-
Por exemplo, o prompt
"Hi ${username} ${message}"pode parecer razoável, até você renderizá-lo e perceber que o nome de usuário se confunde com a mensagem. -
Componentes componíveis são úteis tanto em prompting quanto em web design.
-
Declarativo é melhor do que imperativo para ambos. É muito difícil alterar um site em que todos os elementos HTML são criados com chamadas a
document.createElement. Da mesma forma, ler e alterar um prompt que consiste em uma longa sequência destr += "..."facilmente se torna algo impossível de gerenciar. -
Em ambos, às vezes quero alcançar “perfeição em nível de pixel”. Ao fazer prompting com modelos menos capazes (GPT-3.5 e piores), quero garantir que não haja quebras de linha extras nem outros tipos de formatação imperfeita e, ao projetar um site, às vezes cada pixel importa.
Para agentes de LLM, é possível levar a analogia ainda mais longe: prompting de agentes pode ser visto como construir um site interativo para os agentes, em que eles podem “clicar em botões” chamando funções, e em que o prompt é re-renderizado em resposta a uma chamada de função, assim como um site é re-renderizado em resposta a um clique de botão.
Claro, há diferenças entre design de prompts e web design:
-
Prompting lida apenas com texto (por enquanto!).
-
O uso de cache é diferente: para agentes em particular, você quer garantir que seus re-renders sejam baratos, alterando apenas as partes finais do prompt. Há um paralelo forçado aqui com a web (você quer otimizar o cache do seu site), mas acho que é, fundamentalmente, um desafio bem diferente.
Ainda assim, as semelhanças me convenceram de que prompting deveria ser chamado de design de prompts, não engenharia de prompts. Escrever um prompt parece exatamente como projetar um site e, portanto, deveria ser chamado da mesma forma.
A perspectiva de design de prompts me inspirou a criar o Priompt, uma biblioteca de design de prompts baseada em JSX e similar ao React.
Priompt v0.1: uma primeira tentativa de criar uma biblioteca de design de prompts
Priompt é uma primeira tentativa de criar uma biblioteca de design de prompts inspirada em princípios modernos de design da web. Nós a usamos internamente no Cursor e gostamos bastante.
Acho que provavelmente ela não está exatamente correta em todas as suas abstrações, mas estou pelo menos convencido de que JSX é uma forma muito mais ergonômica de escrever prompts do que templates de string. Mesmo a coisa simples de poder comentar facilmente partes do seu prompt já torna o ciclo de iteração muito mais rápido.

Priompt também vem com um site de preview (montado bem às pressas), onde você pode visualizar seu prompt com dados reais. Ao desenvolver sua aplicação, você pode registrar em log os props serializados que entram em um componente a cada requisição. Depois, quando vir um comportamento inesperado, você pode ir ao preview do Priompt, olhar o prompt exato e alterar o código-fonte, fazendo com que o prompt seja atualizado com os mesmos props da requisição real. Temos percebido que isso facilita iterar nos prompts.

Se você experimentar, me conte o que achou! Eu adoraria ver mais ideias nessa mesma linha — ou simplesmente ser informado de que estou completamente errado e que design de prompt é uma besteira :).
Advertências
Os modelos mudam rapidamente, e as técnicas de prompting também precisam mudar. Dito isso, acho que há algumas ressalvas em relação à caracterização de prompt design:
-
Designs pixel perfect são pouco importantes para o GPT-4 e provavelmente serão obsoletos para o GPT-4.5 ou modelos melhores.
-
A restrição de janela de contexto pode desaparecer, se extrapolarmos a tendência recente de modelos com contexto longo. Porém, não estou convencido disso.
-
A OpenAI parece estar caminhando na direção de oferecer cada vez menos controle sobre o prompt para desenvolvedores; é possível que, em um ano, nem exista mais o conceito de prompt, com a chamada da API apenas nos pedindo os dados brutos de entrada mais uma instrução. Essa tendência de menos controle começou com o formato de chat e continuou com a chamada de funções anunciada recentemente.
-
É possível que o uso de cache seja um dos aspectos mais importantes do prompting, caso em que isso começa a soar um pouco mais como engenharia do que como design.
-
Talvez o prompt design seja baixo nível demais e devesse ser delegado a um framework ou compilador de nível mais alto (por exemplo, langchain). Acho que isso pode ser verdade, mas, dada a natureza em rápida evolução dos LLMs, eu pessoalmente prefiro ficar o mais próximo possível do modelo bruto.
Última observação obrigatória
...porque eu adoraria trabalhar com você: Na Cursor, estamos construindo a Cursor, um editor de código com foco em IA. Se você se empolga com design de prompts, LLMs para programação ou com a criação de produtos incríveis, envie um e-mail para arvid@cursor.com. Somos 5 pessoas em São Francisco, todos os meus colegas são excepcionais e queremos mais algumas pessoas excepcionais — desenvolvedores e designers — para se juntarem a nós na construção do futuro da programação.